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
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).
#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).
#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:
Exercițiu de completare a codului
Completează programul care afișează cifrele unui cuvânt, în ordine:
Bancă de cuvinte:
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?
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ă.
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:
- Citim codul și calculăm lungimea cu
strlen - Verificăm primul caracter și ultimul caracter
- Numărăm cifrele într-o parcurgere
- 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:
- Declarăm un șir
rezultatpentru textul curățat - Parcurgem textul și copiem doar caracterele care nu sunt cifre
- Î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ț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.