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

Ora 14: Evaluare finală a modulului

Ce vei învăța astăzi: Structura evaluării finale a modulului 2, baremul de notare (sistemul oficial de punctaj, care arată câte puncte primești pentru fiecare cerință) și rezolvarea de probleme model (exerciții asemănătoare celor de la examen) în stilul examenului

Rezultat practic: Susții evaluarea finală: un subiect de teorie (partea scrisă, cu întrebări despre concepte și funcții) și două probleme de programare cu șiruri, rezolvate integral în C++ (Competența 6.2).

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

Înainte de a începe

De ce contează? Evaluarea finală verifică exact competențele cerute la BAC: alegerea tehnicii potrivite și construirea unui program corect, pas cu pas — de aceea antrenamentul de acum contează direct pentru nota ta.

Ce știi deja?

La ora 13 ai recapitulat tot modulul. Scrie din memorie antetul complet al unui program BAC (#include-uri, using namespace std;, int main) și listează principalele funcții din <cstring>.

Ideea-cheie: 70 de puncte vin din două probleme de programare; strategia care aduce punctaj maxim este: citește enunțul de două ori, identifică tehnica necesară, scrie pseudocodul, apoi codul și testează pe exemplul dat.
SINTEZĂ TEORETICĂ ȘI EXEMPLE GHIDATE

Ce vei învăța astăzi?

După această lecție vei cunoaște structura exactă a evaluării, vei înțelege baremul de punctaj și vei rezolva probleme model de dificultate similară cu cele din subiectul de examen.

Structura evaluării finale
Baremul de notare
Probleme model rezolvate
Strategia de rezolvare la examen

Structura evaluării finale

Definiție: Evaluarea finală a modulului 2 verifică toate competențele acumulate și are următoarea structură: Subiectul I — cinci întrebări de teorie, cu răspuns scurt (definiții, funcții, secvențe de cod), în total 30 de puncte; Subiectul II — două probleme de programare rezolvate în C++, în total 70 de puncte. Nota finală se obține împărțind punctajul total la 10.

Problemele acoperă: parcurgerea și funcțiile din <cstring>, palindromul, conversiile șir-cifră, separarea cuvintelor și dicționarul cu tablouri paralele.

Subiect Conținut Punctaj Ce verifică
Subiectul I 5 întrebări de teorie 30 puncte definiții, funcții, secvențe
Subiectul II - Problema 1 problemă de prelucrare a unui șir 35 puncte parcurgere, funcții, condiții
Subiectul II - Problema 2 problemă combinată (text, dicționar) 35 puncte separare cuvinte, frecvențe, rapoarte

Reține: nota finală = punctajul total împărțit la 10. Un punctaj de 80 de puncte înseamnă nota 8.

Problema model 1: palindrom și cifre

Cerință model: Se citește un cuvânt format din litere mici și cifre. Să se afișeze pe prima linie DA sau NU după cum cuvântul este palindrom (comparând toate caracterele, inclusiv cifrele), iar pe a doua linie suma cifrelor din cuvânt. Problema combină verificarea palindromului (ora 8) cu conversiile caracter-cifră (ora 7).

Algoritm palindromȘiCifre citește s n = strlen(s) palindrom = adevărat pentru i = 0, n / 2 - 1 execută dacă s[i] != s[n - 1 - i] atunci palindrom = fals sfârșit dacă sfârșit pentru suma = 0 pentru i = 0, n - 1 execută dacă s[i] este cifră atunci suma = suma + (s[i] - '0') sfârșit dacă sfârșit pentru dacă palindrom atunci scrie "DA" altfel scrie "NU" scrie suma Sfârșit algoritm
C++ - palindrom și suma cifrelor
#include <iostream>
#include <cstring>
using namespace std;

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

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

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

    int suma = 0;

    for (int i = 0; i < n; i++)
    {
        if (s[i] >= '0' && s[i] <= '9')
        {
            suma = suma + (s[i] - '0');
        }
    }

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

    return 0;
}

Ce învățăm: pentru intrarea ab2c2ba răspunsul este DA (perechile coincid) și 4 (2 + 2). Cele două parcurgeri sunt independente și pot fi scrise în aceeași buclă.

Problema model 2: frecvența literelor

Cerință model: Se citește un text format din litere mici, fără spații. Să se afișeze litera care apare de cele mai multe ori și numărul ei de apariții, separate printr-un spațiu; la egalitate se afișează litera alfabetic cea mai mică. Problema folosește dicționarul de frecvențe (ora 9) și căutarea maximului (ora 12).

Algoritm literaCeaMaiFrecventă citește text frec[26] = 0 pentru i = 0, strlen(text) - 1 execută frec[text[i] - 'a'] = frec[text[i] - 'a'] + 1 sfârșit pentru pozMax = 0 pentru i = 1, 25 execută dacă frec[i] > frec[pozMax] atunci pozMax = i sfârșit dacă sfârșit pentru scrie (char)('a' + pozMax), frec[pozMax] Sfârșit algoritm
C++ - litera cea mai frecventă dintr-un text
#include <iostream>
#include <cstring>
using namespace std;

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

    int frec[26] = {0};

    for (int i = 0; i < strlen(text); i++)
    {
        frec[text[i] - 'a']++;
    }

    int pozMax = 0;

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

    cout << (char)('a' + pozMax) << " "
         << frec[pozMax] << endl;

    return 0;
}

Ce învățăm: parcurgerea crescătoare a pozițiilor 0-25 garantează că, la egalitate, rămâne litera alfabetic cea mai mică; comparația > nu o înlocuiește pe prima găsită.

Exercițiu de completare

Completează enunțul despre evaluare:

Evaluarea finală are două subiecte: teorie, în total ______ de puncte, și programare, în total ______ de puncte. Nota finală se calculează împărțind punctajul total la ______. Problemele verifică parcurgerea, funcțiile din ______ și dicționarul cu tablouri paralele.

Bancă de cuvinte:
30 70 10 cstring

Exercițiu de completare a codului

Completează programul care afișează cifrele unui cuvânt, în ordine:
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
    char s[101];
    cin.getline(s, 101);
    for (int i = 0; i < ______(s); i++)
    {
        if (s[i] >= ______ && s[i] <= '9')
        {
            cout << ______;
        }
    }
    return ______;
}
Bancă de cuvinte:
strlen '0' s[i] 0

Test de înțelegere

Test final - structura evaluării:

1. Ce punctaj are partea de programare a evaluării?

2. Cum se calculează nota finală?

3. Care este primul pas recomandat la o problemă de programare?

Ai grijă la: cel mai frecvent mod de a pierde puncte este nerespectarea formatului de ieșire: litere mari sau mici în DA/NU, separatorul dintre valori, ordinea liniilor — urmează exact cerința și exemplul din enunț.

Aprofundare

Cazuri particulare și strategii de examen:

  • Citește enunțul de două ori. Cele mai multe puncte pierdute la evaluare vin din nerespectarea formatului de ieșire (ordinea liniilor, separatorul, litere mari/mici în DA/NU).
  • Identifică tehnica înainte de cod: „cel mai lung" sugerează parcurgere + maxim; „de câte ori apare" sugerează dicționar; „palindrom" sugerează perechi simetrice.
  • Scrie întâi pseudocodul: un plan corect în pseudocod valorează puncte și previne greșelile de logică în codul final.
  • Testează pe exemplul din enunț și pe cazuri-limită: text cu un singur cuvânt, cuvânt de o literă, fără cifre, toate cuvintele identice.
  • Verifică acoladele și parantezele: un program cu int main() și acolade echilibrate se compilează fără erori de structură, primind punctajul de funcționare.
  • Gestionează timpul: rezolvă mai întâi problema pe care o stăpânești cel mai bine, apoi revino la cealaltă.

Evaluarea finală nu testează doar memorarea funcțiilor, ci capacitatea de a alege tehnica potrivită și de a construi un program corect, pas cu pas — exact abilitatea cerută la BAC și în programarea reală.

APLICARE ȘI REZOLVARE DE PROBLEME

PbInfo - Codul de acces

Enunț:

Cerință: Se citește un cod format din litere mici și cifre. Să se afișeze VALID dacă primul caracter este literă și ultimul este cifră, iar numărul de cifre din cod este par; altfel se afișează INVALID.

Date de intrare:

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

Date de ieșire:

Programul va afișa mesajul VALID sau INVALID.

Restricții și precizări:

Codul are cel mult 100 de caractere și conține doar litere mici și cifre.

Exemplu:

Intrare:

a2b45c

Ieșire:

VALID
Cum gândim soluția:
  1. Citim codul și calculăm lungimea cu strlen
  2. Verificăm primul caracter și ultimul caracter
  3. Numărăm cifrele într-o parcurgere
  4. Afișăm mesajul potrivit
Scrie soluția în C++:
Soluție corectă:
#include <iostream>
#include <cstring>
using namespace std;

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

    int n = strlen(s);
    int cifre = 0;

    for (int i = 0; i < n; i++)
    {
        if (s[i] >= '0' && s[i] <= '9')
        {
            cifre++;
        }
    }

    bool primaLitera = (s[0] >= 'a' && s[0] <= 'z');
    bool ultimaCifra = (s[n - 1] >= '0' && s[n - 1] <= '9');

    if (primaLitera && ultimaCifra && cifre % 2 == 0)
    {
        cout << "VALID" << endl;
    }
    else
    {
        cout << "INVALID" << endl;
    }

    return 0;
}

Ce învățăm: pentru a2b45c: primul caracter a este literă, ultimul c nu este cifră, deci răspunsul ar fi INVALID; pentru a2b45 codul este valid (3 cifre, impar — INVALID); testăm cu a2b4: literă + cifră + 2 cifre pare → VALID.

PbInfo - Textul fără cifre

Enunț:

Cerință: Se citește un text format din litere mici și cifre, fără spații. Să se afișeze textul din care au fost eliminate toate cifrele.

Date de intrare:

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

Date de ieșire:

Programul va afișa textul rămas după eliminarea cifrelor.

Restricții și precizări:

Textul are cel mult 100 de caractere și conține doar litere mici și cifre.

Exemplu:

Intrare:

ba2c2026al

Ieșire:

bacal
Cum gândim soluția:
  1. Declarăm un șir rezultat pentru textul curățat
  2. Parcurgem textul și copiem doar caracterele care nu sunt cifre
  3. Închidem șirul rezultat cu '\0' și îl afișăm
Scrie soluția în C++:
Soluție corectă:
#include <iostream>
#include <cstring>
using namespace std;

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

    int n = strlen(s);
    int k = 0;

    for (int i = 0; i < n; i++)
    {
        if (s[i] < '0' || s[i] > '9')
        {
            rezultat[k] = s[i];
            k++;
        }
    }

    rezultat[k] = '\0';

    cout << rezultat << endl;

    return 0;
}

Ce învățăm: filtrăm textul copiind doar caracterele care nu sunt cifre și închidem șirul nou cu terminatorul '\0'; altfel ar rămâne resturi din memorie.

EXERCIȚII PRACTICE

Exercițiul Practic: antrenament pentru evaluare

Sarcini de lucru

Completează următoarele sarcini în condiții de examen

Sarcina 1: Statistica finală

Cerință: Scrie un program C++ complet care citește un text de cuvinte și afișează pe prima linie numărul de cuvinte, pe a doua linie cuvântul cel mai frecvent, iar pe a treia linie numărul de apariții ale acestuia. Pentru intrarea ana are ana si ana se afișează 5, ana, 3.

Soluție pentru Sarcina 1:
#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;
        }
    }

    cout << totalCuvinte << endl;
    cout << cuvinte[pozMax] << endl;
    cout << frecventa[pozMax] << endl;

    return 0;
}

Verifică: textul are 5 cuvinte, ana apare de 3 ori, are de 2 ori.

Sarcina 2: Verificarea codului

Cerință: Scrie un program C++ complet care citește un cod de litere și cifre și afișează DA dacă începe cu literă, se termină cu cifră și conține cel puțin o vocală; altfel afișează NU. Pentru intrarea abc2 se afișează DA.

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

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

    int n = strlen(s);
    bool vocala = false;

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

    bool primaLitera = (s[0] >= 'a' && s[0] <= 'z');
    bool ultimaCifra = (s[n - 1] >= '0' && s[n - 1] <= '9');

    if (primaLitera && ultimaCifra && vocala)
    {
        cout << "DA" << endl;
    }
    else
    {
        cout << "NU" << endl;
    }

    return 0;
}

Verifică: abc2 începe cu a, se termină cu 2 și conține vocalele a, a → DA.

Scrie pe caiet - De reținut

Titlul lecției

Ora 14: Evaluare finală a modulului

Definiția lecției

Evaluarea finală a modulului 2 verifică toate competențele acumulate și are o structură clară: Subiectul I, cu cinci întrebări de teorie și 30 de puncte, și Subiectul II, cu două probleme de programare și 70 de puncte. Nota finală se obține împărțind punctajul total la 10. Baremul de notare arată câte puncte primești pentru fiecare cerință, deci pseudocodul aduce puncte, nu doar codul final. Problemele acoperă parcurgerea, funcțiile din <cstring>, palindromul, conversiile șir-cifră, separarea cuvintelor și dicționarul cu tablouri paralele. Strategia care aduce punctaj maxim este: citește enunțul de două ori, identifică tehnica necesară, scrie pseudocodul, apoi codul și testează pe exemplul dat. Testarea pe cazuri-limită, precum un cuvânt sau o singură literă, previne pierderile de puncte.

Definiții esențiale

Algoritmul cheie - pseudocod

Algoritm palindromȘiCifre citește s n = strlen(s) palindrom = adevărat pentru i = 0, n / 2 - 1 execută dacă s[i] != s[n - 1 - i] atunci palindrom = fals sfârșit pentru suma = 0 pentru i = 0, n - 1 execută dacă s[i] este cifră atunci suma = suma + (s[i] - '0') sfârșit pentru dacă palindrom atunci scrie "DA" altfel scrie "NU" scrie suma Sfârșit algoritm

Algoritmul cheie - cod C++

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

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

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

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

    int suma = 0;

    for (int i = 0; i < n; i++)
    {
        if (s[i] >= '0' && s[i] <= '9')
        {
            suma = suma + (s[i] - '0');
        }
    }

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

    return 0;
}

Greșeli comune de evitat

Sfaturi practice și trucuri

Exemplu practic

Scrie un program care citește un cuvânt și afișează DA dacă este palindrom, altfel NU, apoi suma cifrelor din cuvânt. Pentru cuvântul radar2026, programul afișează: DA, apoi 10.

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

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

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

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

    int suma = 0;

    for (int i = 0; i < n; i++)
    {
        if (s[i] >= '0' && s[i] <= '9')
        {
            suma = suma + (s[i] - '0');
        }
    }

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

    return 0;
}