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

Ora 13: Recapitulare generală

Ce vei învăța astăzi: Să recapeți toate conceptele modulului: modelul liniar al șirurilor (conceptul că un șir este o succesiune ordonată de caractere, fiecare cu poziția sa), funcțiile din cstring, conversiile, palindromul și dicționarul cu tablouri paralele

Rezultat practic: Rezolvi probleme recapitulative care combină funcțiile și tehnicile modulului și construiești un tabel rezumativ (un tabel de sinteză care reunește toate funcțiile și tehnicile învățate) de referință pentru BAC (Competența 5.4).

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

Înainte de a începe

De ce contează? Aceasta este ultima șansă de a lega totul într-o singură imagine înainte de evaluarea finală: greșelile descoperite acum nu mai costă note, iar tabelul rezumativ rămâne de referință pentru BAC.

Ce știi deja?

Înainte de recapitulare, răspunde rapid: cu ce funcție afli lungimea unui șir, cu ce funcție compari două șiruri și cum transformi caracterul '7' în valoarea numerică 7?

Ideea-cheie: Tot modulul se reduce la trei instrumente: modelul liniar cu poziții și terminator, funcțiile din <cstring> pentru operații și dicționarul cheie-valoare pentru frecvențe — orice problemă de text combină aceste trei.
SINTEZĂ TEORETICĂ ȘI EXEMPLE GHIDATE

Ce vei învăța astăzi?

După această lecție vei avea harta completă a modulului: de la modelul conceptual liniar la dicționar, cu toate funcțiile și operațiile manuale, și vei rezolva probleme recapitulative în stil BAC.

Harta conceptuală a modulului
Tabelul rezumativ al funcțiilor
Operații manuale vs. funcții
Probleme recapitulative combinate

Harta conceptuală a modulului

Definiție: Modulul 2 a construit, pas cu pas, următorul traseu: (1) șirul de caractere este un model liniar — caractere ordonate, cu poziții de la 0 și terminator '\0'; (2) declarare și citire (cin, cin.getline); (3) parcurgere și lungime (strlen); (4) copiere și concatenare (strcpy, strcat); (5) căutare (strchr, strstr); (6) comparare (strcmp); (7) conversii șir-cifră; (8) palindrom și separarea cuvintelor; (9) dicționarul — model asociativ cheie-valoare cu tablouri paralele.

Fiecare tehnică rămâne disponibilă și poate fi combinată cu celelalte: o singură problemă poate cere separarea cuvintelor, măsurarea lungimii și numărarea frecvențelor în același program.

Analogia: harta unui oraș

Tehnicile modulului sunt ca străzile unui oraș: fiecare duce la un rezultat precis (lungime, copiere, căutare, comparare). Harta întreagă îți arată că orice punct al prelucrării textului este accesibil, iar problemele complexe sunt doar drumuri care leagă mai multe străzi între ele.

Măsurare

strlen - cât de lung este șirul

Construire

strcpy, strcat - copiere, lipire

Căutare

strchr, strstr - caracter, subșir

Comparare

strcmp - ordinea lexicografică

Tabelul rezumativ al funcțiilor și operațiilor

Toate funcțiile din tabel fac parte din biblioteca <cstring>. Alături de ele, o serie de operații se implementează manual, prin parcurgerea cu for: palindromul, conversiile șir-număr, separarea cuvintelor și normalizarea textului.

Operație Funcție / tehnică Exemplu Lecția
Lungimea șirului strlen(s) strlen("bac") = 3 Ora 3
Copierea strcpy(a, b) strcpy(d, s) Ora 4
Concatenarea strcat(a, b) strcat(d, s) Ora 4
Căutarea unui caracter strchr(s, c) strchr(s, 'a') Ora 5
Căutarea unui subșir strstr(s, sub) strstr(s, "bac") Ora 5
Compararea strcmp(a, b) strcmp(a, b) < 0 Ora 6
Caracter-cifră în valoare manual: s[i] - '0' '5' - '0' = 5 Ora 7
Verificarea palindromului manual: perechi s[i], s[n-1-i] capac → palindrom Ora 8
Separarea cuvintelor manual sau strtok strtok(text, " ") Ora 8
Frecvența cuvintelor dicționar cu tablouri paralele cuvinte[i] + frecventa[i] Ora 9

Reține: funcțiile acoperă operațiile „de bibliotecă"; palindromul, conversiile și dicționarul se construiesc manual, iar această distincție apare frecvent la BAC.

Problemă recapitulativă: raportul cuvintelor

Combinăm totul într-o singură problemă: citim un text, separăm cuvintele, construim dicționarul de frecvențe, găsim cuvântul cel mai frecvent și afișăm raportul lui (frecvența împărțită la numărul total de cuvinte). Este modelul complet al unei analize statistice de text.

Algoritm raportCuvântFrecvent citește text n = 0, totalCuvinte = 0 pentru fiecare cuvânt din text execută totalCuvinte = totalCuvinte + 1 caută cuvântul în dicționar dacă există atunci incrementează frecvența altfel adaugă pereche nouă cu frecvența 1 sfârșit pentru găsește poziția pozMax cu frecvența maximă raport = frecventa[pozMax] / totalCuvinte scrie cuvinte[pozMax], frecventa[pozMax], raport Sfârșit algoritm
C++ - raportul cuvântului cel mai frecvent
#include <iostream>
#include <cstring>
using namespace std;

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

    char cuvinte[501][101];
    int frecventa[501] = {0};
    int n = 0;
    int totalCuvinte = 0;

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

    while (p != NULL)
    {
        totalCuvinte++;
        int i;
        for (i = 0; i < n; i++)
        {
            if (strcmp(cuvinte[i], p) == 0)
            {
                frecventa[i]++;
                break;
            }
        }
        if (i == n)
        {
            strcpy(cuvinte[n], p);
            frecventa[n] = 1;
            n++;
        }
        p = strtok(NULL, " ");
    }

    int pozMax = 0;

    for (int i = 1; i < n; i++)
    {
        if (frecventa[i] > frecventa[pozMax])
        {
            pozMax = i;
        }
    }

    double raport = (double)frecventa[pozMax] / totalCuvinte;

    cout << cuvinte[pozMax] << " apare de "
         << frecventa[pozMax] << " ori din "
         << totalCuvinte << " cuvinte" << endl;
    cout << "Raport de aparitie: " << raport << endl;

    return 0;
}

Ce învățăm: conversia (double)frecventa[pozMax] înainte de împărțire produce un raport cu zecimale; altfel, împărțirea a două numere întregi ar da doar câtul.

Exercițiu de completare

Completează enunțul recapitulativ:

Lungimea unui șir se află cu ______, copierea cu ______, iar compararea cu ______. Palindromul se verifică comparând perechile ______, iar frecvența cuvintelor se reține în ______.

Bancă de cuvinte:
strlen strcpy strcmp simetrice tablouri paralele

Exercițiu de completare a codului

Completează programul care verifică dacă un cuvânt este palindrom:
#include <iostream>
#include <______>
using namespace std;
int main()
{
    char s[101];
    cin.getline(s, 101);
    int n = ______(s);
    bool palindrom = ______;
    for (int i = 0; i < n / ______; i++)
    {
        if (s[i] != s[______])
        {
            palindrom = false;
        }
    }
    if (palindrom) cout << "DA"; else cout << "NU";
    return 0;
}
Bancă de cuvinte:
cstring strlen true 2 n - 1 - i

Test de înțelegere

Test recapitulativ - modulul 2:

1. Care pereche (funcție, operație) este corectă?

2. Cum se verifică palindromul?

3. Care este cheia dicționarului la frecvența literelor?

Ai grijă la: nu memoriza coduri pe de rost — memorează ideile: perechi simetrice pentru palindrom, numar * 10 + cifra pentru conversie, cheie-valoare pentru frecvențe. Codul se reconstruiește din idei, iar la testul scris greșelile de „memorare" nu se iartă.

Aprofundare

Cazuri particulare și detalii avansate:

  • Funcție sau manual? Regula de aur: funcțiile strlen, strcpy, strcat, strcmp, strchr, strstr acoperă operațiile de bibliotecă; palindromul, conversiile și dicționarul se implementează manual.
  • Combinarea clasică la BAC: separare + lungime + maxim (cel mai lung cuvânt), palindrom + numărare (vocale), dicționar + raport (frecvențe), conversie + sumă (cifre).
  • Eficiența parcurgerii: calculează n = strlen(s) o singură dată, înaintea buclei; apelul funcției în condiția for dublează parcurgerea.
  • Textul cu diacritice: caracterele ă, â, î, ș, ț au coduri diferite de literele simple; restricțiile BAC folosesc de regulă alfabetul englez.
  • Verificarea pe cazuri-limită: text gol, un singur cuvânt, cuvânt de o literă, toate cuvintele identice — fiecare caz poate dezvălui o eroare de logică.

Recapitularea generală îți oferă panorama completă a modulului: orice problemă de text, oricât de complexă, se descompune în tehnicile învățate, iar ordinea pașilor (citește, separă, prelucrează, afișează) rămâne aceeași.

APLICARE ȘI REZOLVARE DE PROBLEME

PbInfo - Cuvintele în ordine inversă

Enunț:

Cerință: Se citește un text format din cuvinte despărțite prin câte un spațiu. Să se afișeze cuvintele textului în ordine inversă, 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 în ordine inversă, 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:

mere
are
ana
Cum gândim soluția:
  1. Separăm cuvintele cu strtok și le copiem într-un tablou bidimensional
  2. Numărăm cuvintele pe măsură ce le citim
  3. Afișăm tabloul de la ultimul cuvânt către primul
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 cuvinte[501][101];
    int n = 0;

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

    while (p != NULL)
    {
        strcpy(cuvinte[n], p);
        n++;
        p = strtok(NULL, " ");
    }

    for (int i = n - 1; i >= 0; i--)
    {
        cout << cuvinte[i] << endl;
    }

    return 0;
}

Ce învățăm: reținem cuvintele într-un tablou bidimensional, apoi le afișăm parcurgând pozițiile de la n - 1 la 0.

PbInfo - Cuvântul cu aceeași literă la capete

Enunț:

Cerință: Se citește un text format din cuvinte despărțite prin câte un spațiu. Să se afișeze numărul de cuvinte care încep și se termină cu aceeași literă.

Date de intrare:

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

Date de ieșire:

Programul va afișa numărul cerut.

Restricții și precizări:

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

Exemplu:

Intrare:

ana are mere alune

Ieșire:

2
Cum gândim soluția:
  1. Separăm cuvintele cu strtok
  2. Pentru fiecare cuvânt, comparăm p[0] cu p[strlen(p) - 1]
  3. Numărăm potrivirile și le afișăm
Scrie soluția în C++:
Soluție corectă:
#include <iostream>
#include <cstring>
using namespace std;

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

    int contor = 0;

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

    while (p != NULL)
    {
        int n = strlen(p);
        if (p[0] == p[n - 1])
        {
            contor++;
        }
        p = strtok(NULL, " ");
    }

    cout << contor << endl;

    return 0;
}

Ce învățăm: pentru ana și alune capetele coincid (2 cuvinte); are și mere nu respectă condiția.

EXERCIȚII PRACTICE

Exercițiul Practic: recapitularea modulului

Sarcini de lucru

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

Sarcina 1: Numărul de palindromuri

Cerință: Scrie un program C++ complet care citește un text de cuvinte și afișează numărul de cuvinte palindrom. Pentru intrarea capac ana mere se afișează 2.

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

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

    int contor = 0;

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

    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)
        {
            contor++;
        }

        p = strtok(NULL, " ");
    }

    cout << contor << endl;

    return 0;
}

Verifică: capac și ana sunt palindromuri; mere nu este, deci răspunsul este 2.

Sarcina 2: Cel mai lung palindrom

Cerință: Scrie un program C++ complet care citește un text de cuvinte și afișează cel mai lung cuvânt palindrom (la egalitate, primul întâlnit). Pentru intrarea ana capac ele se afișează capac.

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

bool estePalindrom(char s[101])
{
    int n = strlen(s);
    for (int i = 0; i < n / 2; i++)
    {
        if (s[i] != s[n - 1 - i])
        {
            return false;
        }
    }
    return true;
}

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

    char celMaiLung[101] = "";

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

    while (p != NULL)
    {
        if (estePalindrom(p) && strlen(p) > strlen(celMaiLung))
        {
            strcpy(celMaiLung, p);
        }
        p = strtok(NULL, " ");
    }

    cout << celMaiLung << endl;

    return 0;
}

Verifică: palindromurile sunt ana (3), capac (5), ele (3); cel mai lung este capac. Funcția estePalindrom modularizează verificarea.

Scrie pe caiet - De reținut

Titlul lecției

Ora 13: Recapitulare generală

Definiția lecției

Modulul 2 a construit, pas cu pas, un traseu complet prin prelucrarea textului: șirul de caractere ca model liniar, declarare și citire, parcurgere și lungime, copiere și lipire, căutare, comparare, conversii, palindrom și separarea cuvintelor, apoi dicționarul cu tablouri paralele. Totul se reduce la trei instrumente: modelul liniar cu poziții și terminator, funcțiile din <cstring> pentru operații și dicționarul cheie-valoare pentru frecvențe. Fiecare tehnică poate fi combinată cu celelalte într-o singură problemă. Tabelul rezumativ reunește funcțiile strlen, strcpy, strcat, strcmp, strchr și strstr, cu ce face fiecare și cu un exemplu. Problema recapitulativă tipică cere separarea cuvintelor, măsurarea lungimii și numărarea frecvențelor în același program. Aceasta este ultima șansă de a lega totul într-o singură imagine înainte de evaluarea finală.

Definiții esențiale

Algoritmul cheie - pseudocod

Algoritm raportCuvântFrecvent citește text n = 0, totalCuvinte = 0 pentru fiecare cuvânt din text execută totalCuvinte = totalCuvinte + 1 dacă cuvântul există în dicționar atunci incrementează frecvența altfel adaugă pereche nouă cu frecvența 1 sfârșit dacă sfârșit pentru găsește poziția cu frecvența maximă raport = frecvență maximă / totalCuvinte scrie cuvântul, frecvența, raportul Sfârșit algoritm

Algoritmul cheie - cod C++

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

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

    char cuvinte[501][101];
    int frecventa[501] = {0};
    int n = 0;

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

    while (p != NULL)
    {
        int i;
        for (i = 0; i < n; i++)
        {
            if (strcmp(cuvinte[i], p) == 0)
            {
                frecventa[i]++;
                break;
            }
        }
        if (i == n)
        {
            strcpy(cuvinte[n], p);
            frecventa[n] = 1;
            n++;
        }
        p = strtok(NULL, " ");
    }

    int pozMax = 0;

    for (int i = 1; i < n; i++)
    {
        if (frecventa[i] > frecventa[pozMax])
        {
            pozMax = i;
        }
    }

    cout << cuvinte[pozMax] << " " << frecventa[pozMax] << 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ă cuvântul cel mai frecvent, împreună cu numărul de apariții. Pentru textul bac bac notele bac, programul afișează: bac, de 3 ori.

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

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

    char cuvinte[501][101];
    int frecventa[501] = {0};
    int n = 0;

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

    while (p != NULL)
    {
        int i;
        for (i = 0; i < n; i++)
        {
            if (strcmp(cuvinte[i], p) == 0)
            {
                frecventa[i]++;
                break;
            }
        }
        if (i == n)
        {
            strcpy(cuvinte[n], p);
            frecventa[n] = 1;
            n++;
        }
        p = strtok(NULL, " ");
    }

    int pozMax = 0;

    for (int i = 1; i < n; i++)
    {
        if (frecventa[i] > frecventa[pozMax])
        {
            pozMax = i;
        }
    }

    cout << cuvinte[pozMax] << ", de " << frecventa[pozMax]
         << " ori" << endl;

    return 0;
}