Vissza

Karakterláncok (stringek)

Házi feladatok:

  1. Írjunk programot, mely meghatározza, hogy egy szövegállomány hány szót  tartalmaz. Szóelválasztó karakternek csak a space-et tekintjük.
  2. Írjunk programot, mely egy szövegállomány minden egyes "m" magánhangzóját kicseréli "mpm"-re, (azaz írjuk át madárnyelvre a szöveget).
  3. Írjunk programot, mely egy szövegállomány egy megadott szavát kicseréli egy másik szóra (megadjuk, hogy mit és azt is hogy mire).
  4. Írjunk programot, mely egy szövegállományban felcseréli a kisbetűket nagybetűkre és a nagybetűket kisbetűkre.
  5. Írjunk programot, mely meghatározza, hogy milyen karakterek nem szerepelnek egy adott szövegállomány karakterei között.
  6. Írjunk programot, mely megkeresi, hogy egy adott szó hányszor fordul elő egy szövegállományban.
  7. Írjunk programot, mely megkeresi, hogy egy adott szó milyen pozíciókon fordul elő egy szövegállományban.
  8. A szövegállományban különböző típusú telefonszámok vannak: rds, romtelecom, orange. Írjuk át különböző állományokba az rds, a romtelecom és az  orange telefonszámokat. A romtelecom 265-tel, az rds 365-tel, az orange számok 74-gyel kezdődnek, ahol egy telefonszámot karakterlánc típusú tömbe tároljunk.

Megoldott feladatok:

1. Írjunk programot, mely beolvas egy karakterláncot a billentyűzetről és meghatározza a karakterlánc hosszát. Alkalmazzuk a könyvtárfüggvény length-t., a string hosszának a meghatározására.
#include <iostream>
#include <string>
using namespace std;

int main()
{
    string kars;
    int l;
    cout << "Kerek egy karakterlancot: ";
    cin >> kars;
    l = kars.length();
    cout << "A karakterlanc hossza: "<< l << endl;
    cout << "A beolvasott karakterlanc: " << kars << endl << endl;
    return 0;
}


2. Írjunk programot, mely beolvas egy karakterláncot a billentyűzetről és meghatározza a karakterlánc hosszát. Alkalmazzunk saját függvényt a string hosszának a meghatározására.
#include <iostream>
#include <string>
using namespace std;
int my_length(string kars);

int main()
{
    string kars;
    int l;
    cout << "Kerek egy karakterlancot: ";
    cin >> kars;
    l = my_length(kars);
    cout << "A karakterlanc hossza: "<< l << endl;
    cout << "A beolvasott karakterlanc: " << kars << endl << endl;
    return 0;
}

int my_length(string s){
    int i;
    for(i=0; s[i] != '\0'; ++i);
    return i;
}

3. Írjunk programot, mely adott szövegállomány minden egyes sorára meghatározza a sorokban levő karakterek számát, illetve megadja, hogy hány karakter van az állományban. Az eredményt a bemeneti állomány soraival együtt írjuk ki egy másik állományba.
#include <iostream>
#include <fstream>
#include <string>
using namespace std;

int main(){
    string kars;
    int l, k;
    ifstream fin;
    ofstream fout;
    fin.open("main.cpp");
    fout.open("ki.txt");
    if ( !fin.good() ){
        cout << "Megnyitasi hiba!!" << endl;
        return 0;
    }
    if ( !fout.good() ){
        cout << "Megnyitasi hiba!!" << endl;
        return 0;
    }
    k = 0;
    while(1){
        fin >> kars;
        if ( fin.eof() ) break;
        l = kars.length();
        k += l;
        fout << l << " ";
        fout << kars << endl;
    }
    fout << "A karakterek szama: " << k << endl;
    fin.close();
    fout.close();
    return 0;
}

4. Adott egy szövegállomány. Készítsünk karakter előfordulási statisztikát.
#include <iostream>
#include <iomanip>
#include <fstream>

using namespace std;

int main(){
    char kar;
    int i, stat[256];
    ifstream fin;
    fin.open("be.txt");
    if ( !fin.good() ){
        cout << "Megnyitasi hiba!!" << endl;
        return 0;
    }
    for (i=0; i<256; i++)
        stat[i] = 0;
    while (1){
        fin >> kar;
        if ( fin.eof() ) break;
        stat[kar] ++;
    }
    fin.close();
    cout << "A karakterek elofordulasi szama: " << endl;
    for (i = 32; i<256; i++)
        if( stat[i] != 0) {
                cout << setw(7) << (char) i;
                cout << setw(10) << stat[i] << endl;
        }
    cout << endl << endl;
    return 0;
}

5. Írjunk programot, mely adott szövegállomány minden egyes kisbetűjét kicseréli nagybetűre.
#include <iostream>
#include <fstream>
using namespace std;

int main(){
    char kar;
    int i;
    ifstream fin;
    ofstream temp;
    fin.open("be.txt");
    temp.open("temp.txt");
    if ( !fin.good() ){
        cout << "Megnyitasi hiba!!" << endl;
        return 0;
    }
    while(1){
        fin >> noskipws >> kar;
        //kiolvassa a feher karaktereket(space, enter, stb) is
        if (fin.eof() ) break;
        if (kar >= 'a' && kar <= 'z') kar = kar - 32;
        temp << kar;
    }
    fin.close();
    temp.close();
    remove("be.txt");
    rename("temp.txt", "be.txt");
    return 0;
}

A fenti feladatok standard C író/olvasó függvényekkel

1. Írjunk programot, mely beolvas egy karakterláncot a billentyűzetről és meghatározza a karakterlánc hosszát. Alkalmazzuk a könyvtárfüggvény strlen-t., a string hosszának a meghatározására.
#include <stdio.h>
#include <string.h>

int main(){
    char kars[80];
    int l;
    printf("Kerek egy karakterlancot: ");
    gets(kars);
    l = strlen(kars);
    printf("A karakterlanc hossza: %i\n", l);
    printf("A beolvasott karakterlanc: %s", kars);
    return 0;
}


2. Írjunk programot, mely beolvas egy karakterláncot a billentyűzetről és meghatározza a karakterlánc hosszát. Alkalmazzunk saját függvényt a string hosszának a meghatározására.
#include <stdio.h>
#include <stdlib.h>

int my_strlen(char []);

int main(){
    char kars[80];
    int l;
    printf("Kerek egy karakterlancot: ");
    gets(kars);
    l = my_strlen(kars);
    printf("A karakterlanc hossza: %i\n", l);
    system("pause");
    return 0;
}

int my_strlen(char s[]){
    int i;
    for(i=0; s[i] != '\0'; ++i);
    return i;
}

3. Írjunk programot, mely adott szövegállomány minden egyes sorára meghatározza a sorokban levő karakterek számát, illetve megadja, hogy hány karakter van az állományban. Az eredményt a bemeneti állomány soraival együtt írjuk ki egy másik állományba.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(){
    char kars[80];
    int l, k;
    FILE * F = fopen("be.txt", "r");
    if (F == NULL){   // hibakezeles
        printf("Megnyitasi hiba!!\n");
        system("pause");
        return 0;
    }
    FILE * G = fopen("ki.txt", "w");   
    if (G == NULL){
        printf("Megnyitasi hiba!!\n");
        system("pause");
        return 0;
    }
    k = 0;
    while(1){
        fgets(kars, 80, F);
        if (feof(F)) break;
        l = strlen(kars);
        k += l; // soronkent osszeadjuk a karakterek szamat
        fprintf(G, "%4i  ", l);
        fputs(kars, G);

    }
    fprintf(G, "A karakterek szama: %i\n", k);
    fclose(F);
    fclose(G);
    return 0;
}


4. Adott egy szövegállomány. Készítsünk karakter előfordulási statisztikát.
#include <stdio.h>
#include <stdlib.h>

int main(){
    char kar;
    int stat [256];
    int i;
    FILE * F = fopen("be.txt", "r");
    if (F == NULL){
        printf("Megnyitasi hiba!!\n");
        system("pause");
        return 0;
    }
   
    for (i=0; i<256; i++)
        stat[i] = 0;
   
    while(1){
        fscanf(F, "%c", &kar);
        if (feof(F)) break;
        stat[ kar ] ++;
    }
    fclose(F);
    printf("\nkarakter   elofordulasi_szam\n");
    for(i = 32; i<256; i++)
    //a 32-nel nagyobb ASCII kodú karakterek elofordulasi
    //szamat irjuk ki
        if( stat[i] != 0) printf("%7c %10i\n", i, stat[i]);
    printf("\n\n");
    return 0;
}

5. Írjunk programot, mely adott szövegállomány minden egyes kisbetűjét kicseréli nagybetűre.
#include <stdio.h>
#include <stdlib.h>

int main(){
    char kar;
    int i;
    FILE * F = fopen("be.txt", "r");
    FILE * G = fopen("temp.txt", "w");
    if (F == NULL){
        printf("Megnyitasi hiba!!\n");
        system("pause");
        return 0;
    }
    
    while(1){
        fscanf(F, "%c", &kar);
        if (feof(F)) break;
        if(kar >='a' && kar <='z') kar = kar - 32;
        fprintf(G, "%c", kar);
    }
    fclose(F);
    fclose(G);    
    remove ("be.txt");
    rename("temp.txt", "be.txt");
    return 0;
}