Școala Româno-Britanică
Modulul 2 Clasa a X-a | C++

Ora 10: Recapitulare și test

Ce vei învăța astăzi: Recapitularea funcțiilor pentru șiruri (revizuirea sistematică a tuturor funcțiilor învățate) din întregul modul și rezolvarea de probleme combinate (probleme care folosesc împreună mai multe funcții și tehnici)

Rezultat practic: Rezolvi probleme combinate care folosesc împreună funcțiile pentru șiruri învățate în modul și îți verifici cunoștințele cu un test final (Competența 5.4).

Competența 5.4 Săptămâna 9

Înainte de a începe

De ce contează? Recapitularea scoate la lumină exact tehnicile cerute la test: problemele combinate folosesc mai multe funcții deodată, iar aici le vezi împreună, exact așa cum apar la evaluarea modulului.

Ce știi deja?

Ai parcurs nouă lecții despre șiruri. Verifică-te: numește din memorie funcțiile din <cstring> (lungime, copiere, lipire, comparare, căutare) și spune ce întoarce fiecare.

Ideea-cheie: Orice problemă combinată de șiruri urmează același tipar: citește textul, separă în cuvinte dacă este nevoie, prelucrează cu funcții din <cstring> și afișează exact formatul cerut de enunț.
SINTEZĂ TEORETICĂ ȘI EXEMPLE GHIDATE

Ce vei învăța astăzi?

După această lecție vei recapitula toate funcțiile pentru șiruri învățate în modul, vei rezolva probleme combinate și vei susține un test final de verificare.

Funcțiile pentru șiruri
Probleme combinate
Tabel rezumativ
Test de verificare

Tabel rezumativ al funcțiilor

Toate funcțiile din tabel se găsesc în biblioteca <cstring>. Le folosim la fel la BAC: #include <iostream> și #include <cstring>, using namespace std;, int main().

Funcție Ce face Exemplu
strlen(s) lungimea șirului (fără terminator) strlen("bac") = 3
strcpy(a, b) copiază b în a strcpy(d, s)
strcat(a, b) lipește b la sfârșitul lui a strcat(d, s)
strcmp(a, b) compară a cu b (negativ, 0, pozitiv) strcmp(a, b) < 0
strchr(s, c) caută caracterul c strchr(s, 'a')
strstr(s, sub) caută subșirul sub strstr(s, "bac")

Reține: la verificarea palindromului și la conversiile șir-număr nu folosim funcții speciale, ci parcurgerea manuală cu for.

Problemă combinată: cel mai lung cuvânt

Combinăm separarea cuvintelor după spații cu determinarea lungimii (strlen) pentru a găsi cuvântul cel mai lung dintr-un text.

Algoritm celMaiLungCuvânt citește text n = strlen(text) inceput = 0 maxim = 0 i = 0 cât timp i <= n execută dacă text[i] = ' ' sau text[i] = '\0' atunci lungime = i - inceput dacă lungime > maxim atunci maxim = lungime sfârșit dacă inceput = i + 1 sfârșit dacă i = i + 1 sfârșit cât timp scrie maxim Sfârșit algoritm
C++ - lungimea celui mai lung cuvânt
#include <iostream>
#include <cstring>
using namespace std;

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

    int n = strlen(s);
    int inceput = 0;
    int maxim = 0;
    int i = 0;

    while (i <= n)
    {
        if (s[i] == ' ' || s[i] == '\0')
        {
            int lungime = i - inceput;
            if (lungime > maxim)
            {
                maxim = lungime;
            }
            inceput = i + 1;
        }
        i++;
    }

    cout << "Cea mai lunga secventa de litere are "
         << maxim << " caractere" << endl;

    return 0;
}

Ce învățăm: parcurgem textul; la fiecare spațiu (sau la final) comparăm lungimea cuvântului curent, i - inceput, cu maximul.

Problemă combinată: inversarea unui cuvânt

Inversarea unui șir folosește parcurgerea cu for până la jumătate și interschimbarea perechilor simetrice, exact ca la verificarea palindromului, dar de data aceasta modificăm șirul.

C++ - inversarea unui cuvânt
#include <iostream>
#include <cstring>
using namespace std;

int main()
{
    char s[101];
    cin >> s;

    int n = strlen(s);

    for (int i = 0; i < n / 2; i++)
    {
        char aux = s[i];
        s[i] = s[n - 1 - i];
        s[n - 1 - i] = aux;
    }

    cout << s << endl;

    return 0;
}

Ce învățăm: pentru intrarea bac, programul afișează cab. Aceeași tehnică servește și la conversia număr în șir.

Exercițiu de completare

Completează enunțul rezumativ:

Lungimea unui șir se află cu ______, copierea cu ______, concatenarea cu ______, iar compararea cu ______.

Bancă de cuvinte:
strlen strcpy strcat strcmp

Exercițiu de completare a codului

Completează programul care afișează lungimea unui șir:
#include <iostream>
#include <______>
using namespace std;
int main()
{
    char s[101];
    cin.getline(s, 101);
    int n = ______(s);
    cout << ______;
    return 0;
}
Bancă de cuvinte:
cstring strlen n

Test de înțelegere

Test final - modulul 2:

1. Care secvență afișează lungimea șirului s?

2. Care funcție caută un subșir într-un șir?

3. Care este ordinea corectă pentru inversarea unui șir?

Ai grijă la: la test, punctele se pierd cel mai des în detalii: lipsa #include <cstring>, uitarea cin.ignore() la citirea mixtă, formatul de ieșire greșit sau compararea șirurilor cu == în loc de strcmp.

Aprofundare

Cazuri particulare și detalii avansate:

  • Problemele combinate cer alegerea funcției potrivite: pentru lungime folosim strlen, pentru copiere strcpy, pentru lipire strcat, pentru comparare strcmp, pentru căutare strchr/strstr. Alege funcția după operația cerută, nu după numele problemei.
  • Textul cu mai multe spații consecutive: algoritmul cu strtok tratează automat spațiile multiple; cel manual trebuie să evite cuvintele vide (lungime 0).
  • Parcurgerea până la '\0' inclusiv (condiția i <= n) este cheia pentru a procesa ultimul cuvânt al textului, care nu are spațiu după el.
  • Combinațiile clasice la BAC: numărare + maxim (cuvinte și cea mai lungă), palindrom + vocale, conversie + suma cifrelor, frecvență + sortare. Fiecare problemă nouă este o combinație a pașilor învățați.
  • Corectitudinea se verifică pe exemple cu cazuri-limită: text cu un singur cuvânt, text cu spații la început sau la final, cuvânt de o literă, text gol.

Recapitularea nu înseamnă doar reluarea funcțiilor, ci învățarea de a combina tehnici: separare + lungime, palindrom + numărare, dicționar + raport. Astfel se rezolvă orice problemă de șiruri de la BAC.

APLICARE ȘI REZOLVARE DE PROBLEME

PbInfo - Cuvântul cu cele mai multe vocale

Enunț:

Cerință: Se citesc două cuvinte, formate din litere mici. Să se afișeze cuvântul care conține mai multe vocale (dacă au același număr, se afișează primul).

Date de intrare:

Programul citește de la tastatură cele două cuvinte, separate printr-un spațiu.

Date de ieșire:

Programul va afișa cuvântul cu mai multe vocale.

Restricții și precizări:

Cuvintele au cel mult 100 de caractere.

Exemplu:

Intrare:

bacalaureat calculator

Ieșire:

bacalaureat
Cum gândim soluția:
  1. Scriem o funcție care numără vocalele unui cuvânt
  2. Numărăm vocalele ambelor cuvinte
  3. Afișăm cuvântul cu mai multe vocale
Scrie soluția în C++:
Soluție corectă:
#include <iostream>
#include <cstring>
using namespace std;

int numaraVocale(char s[101])
{
    int contor = 0;
    for (int i = 0; i < strlen(s); i++)
    {
        if (s[i] == 'a' || s[i] == 'e' || s[i] == 'i' ||
            s[i] == 'o' || s[i] == 'u')
        {
            contor++;
        }
    }
    return contor;
}

int main()
{
    char a[101], b[101];
    cin >> a >> b;

    if (numaraVocale(a) >= numaraVocale(b))
    {
        cout << a;
    }
    else
    {
        cout << b;
    }

    return 0;
}

Ce învățăm: împărțim problema în subprobleme: o funcție care numără vocalele și o comparație simplă în main.

PbInfo - Cuvintele inversate

Enunț:

Cerință: Se citește un text format din cuvinte despărțite prin câte un spațiu. Să se afișeze fiecare cuvânt inversat, pe câte o linie.

Date de intrare:

Programul citește de la tastatură textul, pe o singură linie.

Date de ieșire:

Programul va afișa fiecare cuvânt inversat, pe câte o linie.

Restricții și precizări:

Textul are cel mult 1000 de caractere; cuvintele au cel mult 100 de litere.

Exemplu:

Intrare:

ana are mere

Ieșire:

ana
era
erem
Cum gândim soluția:
  1. Despărțim textul în cuvinte cu strtok
  2. Pentru fiecare cuvânt îl inversăm caracter cu caracter
  3. Afișăm cuvântul inversat pe o linie nouă
Scrie soluția în C++:
Soluție corectă:
#include <iostream>
#include <cstring>
using namespace std;

int main()
{
    char text[1001];
    cin.getline(text, 1001);

    char *p = strtok(text, " ");
    while (p != NULL)
    {
        int n = strlen(p);
        for (int i = 0; i < n / 2; i++)
        {
            char aux = p[i];
            p[i] = p[n - 1 - i];
            p[n - 1 - i] = aux;
        }
        cout << p << endl;
        p = strtok(NULL, " ");
    }

    return 0;
}

Ce învățăm: strtok ne dă pe rând fiecare cuvânt, iar inversarea se aplică fiecăruia înainte de afișare.

EXERCIȚII PRACTICE

Exercițiul Practic: recapitularea modulului

Sarcini de lucru

Completează următoarele sarcini pentru a consolida întregul modul

Sarcina 1: Cuvinte și cel mai lung

Cerință: Scrie un program C++ complet care citește un text de cuvinte și afișează pe o linie numărul de cuvinte, iar pe următoarea linie lungimea celui mai lung cuvânt. Pentru intrarea ana are mere verzi se afișează 4 și 5.

Soluție pentru Sarcina 1:
#include <iostream>
#include <cstring>
using namespace std;

int main()
{
    char text[1001];
    cin.getline(text, 1001);

    char *p = strtok(text, " ");
    int cuvinte = 0;
    int maxim = 0;

    while (p != NULL)
    {
        cuvinte++;
        if (strlen(p) > maxim)
        {
            maxim = strlen(p);
        }
        p = strtok(NULL, " ");
    }

    cout << cuvinte << endl;
    cout << maxim << endl;

    return 0;
}

Verifică: ana are mere verzi are 4 cuvinte, iar cel mai lung (verzi) are 5 litere.

Sarcina 2: Palindrom și vocale

Cerință: Scrie un program C++ complet care citește un cuvânt, afișează pe prima linie DA sau NU dacă este palindrom, iar pe a doua linie numărul de vocale. Pentru intrarea capac se afișează DA și 2.

Soluție pentru Sarcina 2:
#include <iostream>
#include <cstring>
using namespace std;

int main()
{
    char s[101];
    cin >> s;

    int n = strlen(s);
    bool palindrom = true;
    int vocale = 0;

    for (int i = 0; i < n; i++)
    {
        if (s[i] == 'a' || s[i] == 'e' || s[i] == 'i' ||
            s[i] == 'o' || s[i] == 'u')
        {
            vocale++;
        }
    }

    for (int i = 0; i < n / 2; i++)
    {
        if (s[i] != s[n - 1 - i])
        {
            palindrom = false;
        }
    }

    if (palindrom)
    {
        cout << "DA" << endl;
    }
    else
    {
        cout << "NU" << endl;
    }
    cout << vocale << endl;

    return 0;
}

Verifică: capac este palindrom și are vocalele a, a, deci 2 vocale.

Scrie pe caiet - De reținut

Titlul lecției

Ora 10: Recapitulare și test

Definiția lecției

Această lecție reunește toate funcțiile și tehnicile modulului: lungimea cu strlen, copierea cu strcpy, concatenarea cu strcat, compararea cu strcmp și căutarea cu strchr și strstr. Toate se găsesc în biblioteca <cstring> și se folosesc la fel la BAC. O problemă combinată folosește împreună mai multe tehnici, de exemplu separarea cuvintelor cu strtok și măsurarea lungimii cu strlen. Rezolvarea oricărei probleme urmează același tipar: citește textul, separă în cuvinte dacă este nevoie, prelucrează cu funcțiile potrivite și afișează exact formatul cerut. Testul final verifică atât cunoașterea funcțiilor, cât și capacitatea de a le combina într-un program corect. Recapitularea scoate la lumină exact tehnicile cerute la evaluarea modulului.

Definiții esențiale

Algoritmul cheie - pseudocod

Algoritm celMaiLungCuvânt citește text n = strlen(text) inceput = 0 maxim = 0 pentru i = 0, n execută dacă text[i] = ' ' sau text[i] = '\0' atunci lungime = i - inceput dacă lungime > maxim atunci maxim = lungime sfârșit dacă inceput = i + 1 sfârșit dacă sfârșit pentru scrie maxim Sfârșit algoritm

Algoritmul cheie - cod C++

#include <iostream>
#include <cstring>
using namespace std;

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

    int n = strlen(s);
    int inceput = 0;
    int maxim = 0;
    int i = 0;

    while (i <= n)
    {
        if (s[i] == ' ' || s[i] == '\0')
        {
            int lungime = i - inceput;
            if (lungime > maxim)
            {
                maxim = lungime;
            }
            inceput = i + 1;
        }
        i++;
    }

    cout << "Cea mai lunga secventa de litere are "
         << maxim << " caractere" << endl;

    return 0;
}

Greșeli comune de evitat

Sfaturi practice și trucuri

Exemplu practic

Scrie un program care citește un text și afișează lungimea celui mai lung cuvânt. Pentru textul ana are mere verzi, programul afișează: cel mai lung cuvânt are 5 litere.

#include <iostream>
#include <cstring>
using namespace std;

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

    int n = strlen(s);
    int inceput = 0;
    int maxim = 0;
    int i = 0;

    while (i <= n)
    {
        if (s[i] == ' ' || s[i] == '\0')
        {
            int lungime = i - inceput;
            if (lungime > maxim)
            {
                maxim = lungime;
            }
            inceput = i + 1;
        }
        i++;
    }

    cout << "Cel mai lung cuvant are " << maxim
         << " litere" << endl;

    return 0;
}