Felmérő - stringek

2 pont hivatalból.

1.

Legalább hány byte memóriára van szükség a “bailando” karaktersor tárolásához C++-ban? (1 pont)

Válasz: 9, mert 8 karakter + egy nulla és minden karakter egy byte.

2.

Írjuk meg az strcat és strchr függvények egy-egy saját implementációját! (2x1 pont)

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
char *my_strcat(char *a, const char *b)
{
    int i = 0;
    while (a[i] != '\0')
        i++;

    int j = 0;
    while (b[j] != '\0') {
        a[i] = b[j];
        i++;
        j++;
    }

    a[i] = '\0';
    return a;
}

char *my_strchr(char *str, char c)
{
    for (int i = 0; str[i] != '\0'; i++)
        if (str[i] == c)
            return str+i;

    return NULL;
}

3.

Legyen s egy string; n, i egész számok. Mit írnak ki az alábbi kódrészletek?

a. (1 pont)

1
2
3
4
strcpy(s, "string");
s[strlen(s) - 1] = s[0];
strcat(s, "1+2");
cout << s << endl;

Válasz: strins1+2

b. (1 pont)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
strcpy(s, "abbacdde");
i = 0;
while (i < strlen(s)  1) {
    if (s[i] == s[i+1]) {
        strcpy(s+i, s+i+2);
        if (i > 0)
            i = i - 1;
    }
    else {
        i = i + 1;
    }
    cout << s << endl;
}

Válasz:

    abbacdde
    aacdde
    cdde
    cdde
    ce
    ce

c. (1 pont)

1
2
3
4
5
6
strcpy(s, "macskasvideo");
n = 0;
for (i = 0; i < strlen(s); i++)
    if (strchr("aei", s[i]) == NULL)
        n++;
cout << n << endl;

Válasz: 8

4.

Írjunk programot, mely beolvas egy (maximum 200 karakteres) betűkből és szóközökből álló sort és kiírja a páros hosszú szavait megfordítva. (1 pont)

Példa:

    bemenet:  geza kek az eg
    kimenet:  azeg za ge
 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>
#include <cstring>
using namespace std;

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

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

        if (n % 2 == 0) {
            for (int i = n-1; i >= 0; i--)
                cout << p[i];
            cout << " ";
        }

        p = strtok(NULL, " ");
    }

    cout << endl;
    return 0;
}

5.

A bemeneten adott az n pozitív egész szám (n <= 100), majd n darab szó (mindegyik legfeljebb 30 kisbetűből áll). Írjuk ki a szavakat ábécérendben! (1 pont)

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

int main()
{
    int n;
    cin >> n;

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

    for (int i = 0; i < n; i++)
        for (int j = i+1; j < n; j++)
            if (strcmp(szavak[i], szavak[j]) > 0) {
                char temp[31];
                strcpy(temp, szavak[i]);
                strcpy(szavak[i], szavak[j]);
                strcpy(szavak[j], temp);
            }

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

    return 0;
}

6.

(+0.5 pont bónusz) Mi a hatása az alábbi függvénynek és miért? (magyarázat, nyomonkövetés egy példára)

1
2
3
4
5
6
7
8
9
void sajat(char *a, char *b)
{
    while (*b) {
        *a = *b;
        a++;
        b++;
    }
    *a = *b;
} 

Válasz: stringet másol b-ből a-ba. A *a = *b utasítás egy-egy karaktert helyez át, majd a pointereket léptetjük, míg a b végére nem érünk (a végén pedig a nullkaraktert is átmásoljuk).

Példa:

    'm' 'i' 'n' 'd' 'e' 'g' 'y' '\0'          'h' 'e' 'l' 'l' 'o' '\0'
    a^                                        ^b
    
    'h' 'i' 'n' 'd' 'e' 'g' 'y' '\0'          'h' 'e' 'l' 'l' 'o' '\0'
        a^                                        ^b
    
    'h' 'e' 'n' 'd' 'e' 'g' 'y' '\0'          'h' 'e' 'l' 'l' 'o' '\0'
            a^                                        ^b
    
    'h' 'e' 'l' 'd' 'e' 'g' 'y' '\0'          'h' 'e' 'l' 'l' 'o' '\0'
                a^                                        ^b
    
    'h' 'e' 'l' 'l' 'e' 'g' 'y' '\0'          'h' 'e' 'l' 'l' 'o' '\0'
                    a^                                        ^b
    
    'h' 'e' 'l' 'l' 'o' 'g' 'y' '\0'          'h' 'e' 'l' 'l' 'o' '\0'
                        a^                                        ^b
    
    'h' 'e' 'l' 'l' 'o' '\0' 'y' '\0'          'h' 'e' 'l' 'l' 'o' '\0'
                        a^                                         ^b