Stringek - karakterek és karaktersorok feldolgozása

Feladatok

1. (HF) Adott egy karakter. Döntsük el, hogy betű (kicsi/nagy), számjegy, vagy más karakter-e és írjunk ki megfelelő üzenetet! (“kisbetu”, “nagybetu”, “szamjegy”, “mas”)

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

int main()
{
    char c;
    cin >> c;

    if (c >= 'a' && c <= 'z')
        cout << "kisbetu" << endl;
    else if (c >= 'A' && c <= 'Z')
        cout << "nagybetu" << endl;
    else if (c >= '0' && c <= '9')
        cout << "szamjegy" << endl;
    else
        cout << "mas" << endl;

    return 0;
}

2. (HF) Adott egy karakter. Döntsük el, hogy magánhangzó-e, mássalhangzó, vagy nem betű (“maganhangzo”, “massalhangzo”, “nem betu” üzeneteket kiírva).

 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
#include <iostream>
using namespace std;

int main()
{
    char c;
    cin >> c;

    if ((c >= 'a' && c <= 'z')
        || (c >= 'A' && c <= 'Z') )
    {
        if (c == 'a' || c == 'A'
            || c == 'e' || c == 'E'
            || c == 'i' || c == 'I'
            || c == 'o' || c == 'O'
            || c == 'u' || c == 'U')
        {
            cout << "maganhangzo" << endl;
        }
        else
            cout << "massalhangzo" << endl;
    }
    else
        cout << "nem betu" << endl;

    return 0;
}

3. (HF) Adott egy kisbetű, írjuk ki a nagybetű megfelelőjét!

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

int main()
{
    char c;
    cin >> c;

    if (c >= 'a' && c <= 'z') {

        c = 'A' + (c - 'a');

    }
    cout << c << endl;

    return 0;
}

4. Írjunk függvényt, ami visszatéríti egy paraméterként megkapott karaktersor hosszát.

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

int hossz(char s[])
{
    int i = 0;

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

    return i;
}


int main()
{
    char str[100] = "hello, world!";

    cout << hossz(str) << endl; // 13

    return 0;
}

5. Írjunk függvényt, ami adott string-et lemásol egy másik tömbbe.

 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
#include <iostream>
using namespace std;

void masol(char hova[], char honnan[])
{   int i;
    for(i=0;honnan[i]!='\0';i++){
        hova[i]=honnan[i];

    }
    hova[i]='\0';
}


int main()
{
    char str1[100], str2[100];

    cin.getline(str1, 100);

    masol(str2, str1);

    cout << str2 << endl;

    return 0;
}

6. Írjunk függvényt, ami egy karaktersorhoz hozzáragaszt egy másikat!

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
void ragaszt(char hova[], char honnan[])
{
    int i_hova = 0;
    while (hova[i_hova] != '\0')
        i_hova++;

    int i_honnan = 0;

    while (honnan[i_honnan] != '\0') {
        hova[i_hova] = honnan[i_honnan];
        i_hova++;
        i_honnan++;
    }

    hova[i_hova] = '\0';
}

7. Írjunk programot, amely két karaktersort összehasonlít (szótári sorrend szerint). Az eredmény legyen:

Példák

    "a", "korte"              -1
    "almafagyökér", "korte"   -1
    "alma", "abc"             +1
    "alma", "almafa"          -1
    "alma", "alma"             0
 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>
using namespace std;

int hasonlit(char s1[], char s2[])
{
    int i = 0;

    while (s1[i] != '\0' || s2[i] != '\0') {
        if (s1[i] > s2[i])
            return 1;
        else if (s1[i] < s2[i])
            return -1;

        i++;
    }

    return 0;
}

int main()
{
    char str1[100];
    char str2[100];

    cin.getline(str1, 100);
    cin.getline(str2, 100);

    cout << hasonlit(str1, str2) << endl;

    return 0;
}

8. Adott string-ből töröljük ki az ismétlődő szóközöket!

Pl. "abc  de f     1234"  ->  "abc de f 1234"

Első ötlet: töröljünk minden olyan szóközt, ami előtt szintén szóköz van.

 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>
using namespace std;

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

    int i = 1; // a másodiktól

    while (s[i] != '\0') {
        if (s[i] == ' ' && s[i-1] == ' ')
        {
            // s[i]-t töröljük
            for (int j = i; s[j]!='\0'; j++)
                s[j] = s[j+1];
        }
        else {
            i++;
        }
    }

    cout << s << endl;

    return 0;
}

Másképp: két indexet használunk és egyből a helyükre rakjuk a karaktereket.

 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
#include <iostream>
using namespace std;

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

    int i_olvas = 0;
    int i_ir = 0;

    while (s[i_olvas] != '\0') {
        if (s[i_olvas] != ' '
            || (i_olvas == 0 || s[i_olvas-1] != ' '))
        {
            s[i_ir] = s[i_olvas];
            i_ir++;
            i_olvas++;
        }
        else {
            i_olvas++;
        }
    }
    s[i_ir] = '\0';


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

9. https://www.pbinfo.ro/probleme/2678/formnr
Ki kell számolni egy szövegdarabban előforduló természetes számok összegét.

Megoldás (Ágnes):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
using namespace std;
int main()
{
    char t[256];
    cin.getline(t, 256);
    int i=0;
    int s=0;
    int szam=0;
    while(t[i]!=0){
        if(t[i]>='0' && t[i]<='9')
            szam=szam*10+(t[i]-'0');
        else{
            s+=szam;
            szam=0;
        }
        i++;
    }
    s+=szam;
    cout<<s<<endl;
    return 0;
}

10. https://www.pbinfo.ro/probleme/97/anagrame
Adott két szó. Határozzuk meg, hogy egymás anagrammái-e!

Ötlet: egy-egy frekvenciatömbben követjük, hogy melyik betűből hány van a stringekben.

 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
#include <iostream>
using namespace std;

int main()
{
    char s1[21], s2[21];
    cin >> s1 >> s2;

    int f1[256] = {};
    int f2[256] = {};

    for (int i = 0; s1[i] != '\0'; i++)
        f1[s1[i]]++;

    for (int i = 0; s2[i] != '\0'; i++)
        f2[s2[i]]++;

    bool jo = true;
    for (int i = 0; i < 256; i++)
        if (f1[i] != f2[i])
            jo = false;

    if (jo)
        cout << 1 << endl;
    else
        cout << 0 << endl;

    return 0;
}

Más ötlet: ha rendezzük a karaktertömböket, akkor már csak összehasonlítani kell.

 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
#include <iostream>
using namespace std;

int hossz(char s[])
{
    int i = 0;

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

    return i;
}

void rendez(char s[])
{
    int n = hossz(s);

    for (int i = 0; i < n; i++)
        for (int j = i+1; j < n; j++)
            if (s[i] > s[j])
            {
                char temp = s[i];
                s[i] = s[j];
                s[j] = temp;
            }
}

int hasonlit(char s1[], char s2[])
{
    int i = 0;

    while (s1[i] != '\0' || s2[i] != '\0') {
        if (s1[i] > s2[i])
            return 1;
        else if (s1[i] < s2[i])
            return -1;

        i++;
    }

    return 0;
}

int main()
{
    char s1[21], s2[21];
    cin >> s1 >> s2;

    rendez(s1);
    rendez(s2);

    if (hasonlit(s1, s2) == 0)
        cout << 1 << endl;
    else
        cout << 0 << endl;

    return 0;
}

11. https://www.pbinfo.ro/probleme/1270/b16
Adott egy 16-os számrendszerbeli érték. Írjuk fel 10-es számrendszerben!

Megoldás (Jázmin):

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

int main() {
    int tizes = 0;
    char szo[100];
    cin >> szo;

    for (int i = 0; szo[i] != '\0'; i++) {
        char hex = szo[i];
        int szam;

        if (hex >= '0' && hex <= '9') {
            szam=hex-'0';
        } else if (hex >= 'A' && hex <= 'F') {
            szam=10+(hex - 'A');
        }

        tizes=tizes*16+szam;
    }

    cout<<tizes<<endl;
    return 0;
}