Feladatok stringekkel

Gyakorlatok kézzel

Lásd: https://www.pbinfo.ro/?pagina=itemi-evaluare-lista&disciplina=0&clasa=10&tag=10&subtag=-1&eticheta=0

Néhány megoldás:

    ideale
                 111111
       0123456789012345
    a: clasa a-XII-a A

       CLASA A-XII-A A
    ******
    varianta 2
    roton
    acat
    i=0:  aamara
    i=1:  ammara
    i=2:  amaara
    s egy 6 hosszú string

    bemenet: EAENMX
    kimenet: EXAMEN

    s[0] s[5] s[1] s[4] s[2] s[3]
    s: examen
       ExNMeA
    info
    jogp
    tarta
    11BAAARET

HF

Programozás feladatok

1.

https://www.pbinfo.ro/probleme/11/vocale
A szöveg minden magánhangzóját cseréljük ki a neki megfelelő nagybetűre.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <cstring>
#include <cctype>
using namespace std;

int main()
{
    char s[21];
    cin.getline(s, 21);

    for (int i = 0; s[i] != '\0'; i++) {
        if (strchr("aeiou", s[i]) != NULL) {
            s[i] = toupper(s[i]);
        }
    }

    cout << s << endl;

    return 0;
}

2.

https://www.pbinfo.ro/probleme/972/pozitii
Hány olyan magánhangzó van egy szövegben, ami két mássalhangzó között található?

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <iostream>
#include <cstring>
#include <cctype>
using namespace std;

int main()
{
    char s[256];
    cin.getline(s, 256);

    int n = strlen(s);

    int db = 0;

    // másodiktól az utolsó előttiig
    for (int i = 1; i <= n-2; i++) {

        if (strchr("aeiou", s[i]) != NULL
            && isalpha(s[i-1])
            && strchr("aeiou", s[i-1]) == NULL
            && isalpha(s[i+1])
            && strchr("aeiou", s[i+1]) == NULL)
        {
            db++;
        }
    }

    cout << db << endl;

    return 0;
}

3.

https://www.pbinfo.ro/probleme/4184/bacnume
Kell írni egy függvényt, ami egy névből megtartja a vezetéknevet és hozzáragasztja a “2022”-t.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#include <iostream>
#include <cstring>
using namespace std;

void FNume(char s[], char id[])
{
    strcpy(id, strchr(s, ' ')+1);
    strcat(id, "2022");
}

/*
void FNume(char s[], char id[])
{
    char *p = strtok(s, " ");
    p = strtok(NULL, " ");
    strcpy(id, p);
    strcat(id, "2022");
}
*/

/*
void FNume(char s[], char id[])
{
    int i = 0;

    while (s[i] != ' ')
        i++;

    i++;
    int j = 0;

    while (s[i] != '\0') {
        id[j] = s[i];
        j++;
        i++;
    }

    id[j] = '2';
    j++;
    id[j] = '0';
    j++;
    id[j] = '2';
    j++;
    id[j] = '2';
    j++;
    id[j] = '\0';
}
*/

int main()
{
    char s[100] = "David Popovici";
    char id[100] = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaa";

    FNume(s, id);

    cout << id << endl;
    return 0;
}

4.

https://www.pbinfo.ro/probleme/973/cuvinte1
Egy szövegből ki kell írni azokat a szavakat, amik csak magánhangzókból állnak.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <iostream>
#include <cstring>
using namespace std;

int main()
{
    char s[256];
    cin.getline(s, 256);

    char *p = strtok(s, " ");

    while (p != NULL) {

        bool ok = true;
        for (int i = 0; p[i] != '\0'; i++)
            if (strchr("aeiouAEIOU", p[i]) == NULL)
                ok = false;

        if (ok) // csak mgh
            cout << p << endl;

        p = strtok(NULL, " ");
    }

    return 0;
}

5.

https://www.pbinfo.ro/probleme/2803/elimp
Egy szövegnek rendre eltávolítjuk a p hosszú részeit. Írjuk ki az összes maradékot!

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <cstring>
using namespace std;

int main()
{
    int p;
    char s[256];

    cin >> p;
    cin >> s;

    int n = strlen(s);

    for (int start = 0; start <= n-p; start++) {
        for (int i = 0; i < n; i++) {
            if (i < start || i >= start+p)
                cout << s[i];
        }
        cout << endl;
    }
}

6.

https://www.pbinfo.ro/probleme/12/initiale
A szöveg minden szavának első és utolsó betűjét alakítsuk nagybetűvé.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <iostream>
#include <cstring>
#include <cctype>
using namespace std;

int main()
{

    char s[256];
    cin.getline(s, 256);

    int n = strlen(s);

    for (int i = 0; i < n; i++) {
        // első betű
        if (isalpha(s[i]) && (i == 0 || s[i-1] == ' '))
            s[i] = toupper(s[i]);

        // utolsó betű
        if (isalpha(s[i]) && (i == n-1 || s[i+1] == ' '))
            s[i] = toupper(s[i]);
    }

    cout << s << endl;
    return 0;
}

7.

https://www.pbinfo.ro/probleme/975/cuvinte2
Keressük meg a szöveg palindrom szavai közül az abc sorrendben elsőt!

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <iostream>
#include <cstring>
using namespace std;

int main ()
{
    char s[256];
    cin.getline(s, 256);

    char szo[11] = "";

    char *p = strtok(s, " ,.");
    while (p != NULL) {

        int n = strlen(p);

        bool palindrom = true;
        for (int i = 0; i < n/2; i++)
            if (p[i] != p[n-1-i])
                palindrom = false;

        if (palindrom
            && (szo[0] == '\0' || strcmp(p, szo) < 0))
        {
            strcpy(szo, p);
        }

        p = strtok(NULL, " ,.");
    }

    if (szo[0] == '\0')
        cout << "IMPOSIBIL" << endl;
    else
        cout << szo << endl;
    return 0;
}

Más megoldás:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
// Ágnes és Fruzsina (végül, de nem utolsó sorban,
// meg még az ötletgazda is ő volt meg a bug is az övé)
#include <iostream>
#include <cstring>
#include <cctype>
using namespace std;
int main()
{
    char s[256];
    char legelso[256];
    cin.getline (s, 256);
    char *p=strtok(s, " ,.");
    bool elso=false;
    bool volt=false;
    while(p!=NULL){
        int n=strlen(p);
        bool pal=true;
        for(int i=0; i<=n/2; i++){
            if( p[i]!=p[n-1-i] ) pal=false;
        }
        if(pal){
            volt=true;
            if(!elso){
                strcpy(legelso, p);
            }
            else if( strcmp(legelso, p)>0 ){
                strcpy(legelso, p);
            }
            elso=true;
        }
        p=strtok(NULL, " ,.");
    }
    if(!volt) cout<<"IMPOSIBIL"<<endl;
    else cout<<legelso<<endl;
    return 0;
}

8.

https://www.pbinfo.ro/probleme/101/sortarecuvinte
Írjuk ki egy mondat szavait abc-rendben!

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;

int main ()
{
    ifstream fin("sortcuv.in");
    ofstream fout("sortcuv.out");

    char s[251];
    fin.getline(s,251);

    char szavak[250][21];
    int n = 0;

    char *p = strtok(s, " ");
    while (p != NULL) {

        strcpy(szavak[n], p);
        n++;

        p = strtok(NULL, " ");
    }

    for (int i = 0; i < n; i++)
        for (int j = i+1; j < n; j++)
            if (strcmp(szavak[i], szavak[j]) > 0) { // rossz a sorrend
                // csere
                char seged[21];
                strcpy(seged, szavak[i]);
                strcpy(szavak[i], szavak[j]);
                strcpy(szavak[j], seged);
            }

    for (int i = 0; i < n; i++)
        fout << szavak[i] << endl;

    return 0;
}

Trükkösebb megoldás pointerekkel:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;

int main ()
{
    //ifstream fin("sortcuv.in");
    //ofstream fout("sortcuv.out");

    char s[251];
    cin.getline(s,251);

    char *szavak[250];
    int n = 0;

    char *p = strtok(s, " ");
    while (p != NULL) {

        szavak[n] = p;
        n++;

        p = strtok(NULL, " ");
    }

    for (int i = 0; i < n; i++)
        for (int j = i+1; j < n; j++)
            if (strcmp(szavak[i], szavak[j]) > 0) { // rossz a sorrend
                // csere
                char *seged = szavak[i];
                szavak[i] = szavak[j];
                szavak[j] = seged;
            }

    for (int i = 0; i < n; i++)
        cout << szavak[i] << endl;

    return 0;
}

9.

https://www.pbinfo.ro/probleme/188/inlocuirecuvant
Cseréljük ki egy szó minden előfordulását egy másikra a megadott szövegben!

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;

int main()
{
    ifstream fin("inlocuirecuvant.in");
    ofstream fout("inlocuirecuvant.out");

    char mit[11], mire[11];
    fin >> mit >> mire;

    fin.get(); // '\n'

    char mondat[101];
    fin.getline(mondat, 101);

    char eredmeny[1000];
    int ne = 0;

    int start = 0;
    while (mondat[start] != '\0') {
        if (start == 0 || mondat[start-1] == ' ') {
            int i = 0;
            while (mondat[start+i] != '\0'
                   && mit[i] != '\0'
                   && mondat[start+i] == mit[i])
            {
                i++;
            }

            if (mit[i] == '\0'
                && (mondat[start+i] == ' '
                   || mondat[start+i] == '\0')) // talált
            {
                for (int j = 0; mire[j] != '\0'; j++) {
                    eredmeny[ne] = mire[j];
                    ne++;
                }

                start = start + i;
            }
            else { // nem talált
                eredmeny[ne] = mondat[start];
                ne++;
                start++;
            }

        }
        else { // nem lehet kezdőpozíció
            eredmeny[ne] = mondat[start];
            ne++;
            start++;
        }
    }

    eredmeny[ne] = '\0';
    fout << eredmeny << endl;

    return 0;
}

Az alábbi strtok-os megoldás nem jó, mert nem tartunk meg az eredetivel azonos számú space-t a szavak között:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;

int main()
{
    ifstream fin("inlocuirecuvant.in");
    ofstream fout("inlocuirecuvant.out");

    char mit[11], mire[11];
    fin >> mit >> mire;

    fin.get(); // '\n'

    char mondat[101];
    fin.getline(mondat, 101);

    char eredmeny[1000] = "";

    char *p = strtok(mondat, " ");
    while (p != NULL) {
        if (strcmp(p, mit) == 0) {
            strcat(eredmeny, mire);
        }
        else {
            strcat(eredmeny, p);
        }

        strcat(eredmeny, " ");
        p = strtok(NULL, " ");
    }

    eredmeny[strlen(eredmeny)-1] = '\0';
    fout << eredmeny << endl;
    return 0;
}

10. HF (+pont)

https://www.pbinfo.ro/probleme/2304/cuvinte7
Adott n, majd n darab szó, végül egy k szám. Építsünk a szavakból egy szöveget, melyben a k betűs szavak elöl vannak a többi pedig ezek után!

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <iostream>
#include <cstring>
using namespace std;

int main()
{
    int n, k;
    char szavak[21][21], papanasi[500]="";

    cin >> n;

    for (int i = 0; i < n; i++)  cin >> szavak[i];

    cin >> k;

    for (int i = 0; i < n; i++) {
        if (strlen(szavak[i]) == k){
            strcat (papanasi, szavak[i]);
            strcat (papanasi, " ");
        }
    }

    for (int i = 0; i < n; i++) {
        if (strlen(szavak[i]) != k){
            strcat (papanasi, szavak[i]);
            strcat (papanasi, " ");
        }
    }

    papanasi[strlen(papanasi)-1]='\0';

    cout << papanasi;
    cout << endl;

    return 0;
}

11.

https://www.pbinfo.ro/probleme/2666/trim
Egy függvényt kell írni, amely a paraméterként kapott string elején és végén levő szóközöket törli (megváltoztatva ugyanazt a stringet).

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#include <iostream>
#include <cstring>
using namespace std;

void Trim1(char *s)
{
    int hol_elso = 0;

    while (s[hol_elso] == ' ')
        hol_elso++;

    int hol_utolso = strlen(s)-1;
    while (hol_utolso >= 0 && s[hol_utolso] == ' ')
        hol_utolso--;

    if (s[hol_elso] == '\0')
        s[0] = '\0';
    else {
        // s[hol_elso ... hol_utolso]
        int c = 0;
        for (int i = hol_elso; i <= hol_utolso; i++) {
            s[c] = s[i];
            c++;
        }
        s[c] = '\0';
    }
}

void Trim2(char *s)
{
    char seged[101];

    while (s[0] == ' ') {
        strcpy(seged, s+1);
        strcpy(s, seged);
    }

    int n = strlen(s);
    while (s[n-1] == ' ') {
        s[n-1] = '\0';
        n--;
    }
}

void Trim3(char *s)
{
    char seged[101];

    while (s[0] == ' ') {
        for (int i = 0; s[i] != '\0'; i++)
            s[i] = s[i+1];
    }

    int n = 0;
    while (s[n] != '\0')
        n++;

    while (s[n-1] == ' ') {
        s[n-1] = '\0';
        n--;
    }
}


int main()
{
    char s[100] = "   ana   are   mere        ";
    Trim3(s);
    //cout << s << endl;
    //cout << strlen(s) << endl;

    for (int i = 0; s[i] != '\0'; i++)
        if (s[i] == ' ')
            cout << "#";
        else
            cout << s[i];

    cout << endl;


    return 0;
}

12.

https://www.pbinfo.ro/probleme/3243/path
Egy fájlrendszerbeli elérési útvonalából ki kell gyűjteni a folderneveket a példának megfelelően és visszatéríteni ezek számát.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <iostream>
#include <cstring>
using namespace std;

int Path(const char cale[], char d[101][101])
{
    char masolat[101];
    strcpy(masolat, cale);

    int db = 0;

    char *p = strtok(masolat, "\\");

    while (p != NULL) {

        strcpy(d[db], p);
        db++;

        p = strtok(NULL, "\\");
    }

    return db;
}

int main()
{
    char cale[101];
    char d[101][101];

    cin.getline(cale, 101);

    int n = Path(cale, d);
    cout << n << endl;

    for (int i = 0; i < n; i++) {
        cout << d[i] << endl;

    }

    return 0;
}