Ce vei învăța astăzi?
După această lecție vei cunoaște structura testului final sumativ, vei înțelege baremul de evaluare și vei rezolva probleme de test cu funcții recursive în C++.
Structura testului sumativ
Testul final sumativ evaluează competențele dobândite în clasa a X-a, cu accent pe subprogramele recursive. Iată structura recomandată:
| Item | Conținut | Punctaj |
|---|---|---|
| Itemul 1 | Teorie: definiții și întrebări (recursivitate, caz de bază, stivă) | 1 punct |
| Itemul 2 | Funcție recursivă: numărul de cifre al lui n | 2 puncte |
| Itemul 3 | Program cu vector: suma elementelor pare, recursiv | 2 puncte |
| Itemul 4 | Problema din oficiu: corectitudinea rezolvării | 1 punct |
Problema 1 de test: Numărul de cifre
Cerință: Scrieți o funcție recursivă numar_cifre(n) care întoarce numărul de cifre ale numărului natural n, precum și programul principal care citește n și afișează rezultatul.
#include <iostream>
using namespace std;
int numar_cifre(int n)
{
if (n < 10)
return 1;
return 1 + numar_cifre(n / 10);
}
int main()
{
int n;
cout << "n = ";
cin >> n;
cout << numar_cifre(n);
return 0;
}
Verificare
- numar_cifre(0) = 1
- numar_cifre(7) = 1 (cazul de bază n < 10)
- numar_cifre(12345) = 5
Problema 2 de test: Suma elementelor pare
Cerință: Scrieți o funcție recursivă suma_pare(v, i, n) care întoarce suma elementelor pare dintr-un vector, precum și programul principal care citește vectorul și afișează rezultatul.
#include <iostream>
using namespace std;
int suma_pare(int v[], int i, int n)
{
if (i == n)
return 0;
int s = suma_pare(v, i + 1, n);
if (v[i] % 2 == 0)
s = s + v[i];
return s;
}
int main()
{
int n, v[1001];
cin >> n;
for (int i = 0; i < n; i++)
cin >> v[i];
cout << suma_pare(v, 0, n);
return 0;
}
Verificare
Pentru v = {1, 4, 3, 8}, suma elementelor pare este 4 + 8 = 12.
Sfaturi pentru test
Cum obții punctaj maxim?
- Citește cu atenție cerința și identifică datele de intrare și de ieșire
- Scrie întâi cazul de bază al funcției recursive
- Verifică pe un exemplu simplu înainte de a trimite
- Respectă sintaxa BAC (formatul standard cerut la examen: include, using namespace std, int main, return 0)
Exercițiu de completare
Completează enunțul despre testul sumativ cu cuvintele potrivite:
Testul sumativ evaluează competențele din clasa a X-a, cu accent pe subprogramele ______. Funcția numar_cifre(n) are cazul de bază atins când n < ______. Suma elementelor pare dintr-un vector se calculează parcurgând recursiv ______. Pentru punctaj maxim, respectăm sintaxa ______.
Bancă de cuvinte:
Exercițiu de completare
Completează funcția de test numar_cifre:
Bancă de cuvinte:
Test de înțelegere
Test rapid - test final:
1. Cazul de bază al funcției numar_cifre este:
2. Pentru v = {1, 4, 3, 8}, suma elementelor pare este:
3. Într-un program BAC, sintaxa obligatorie include:
Aprofundare
Strategia de rezolvare a testului. Începe cu Subiectul I (teorie), unde punctele se obțin rapid și sigur, apoi treci la funcțiile recursive simple și abia la final la problema integrată. Pentru fiecare funcție, scrie întâi cazul de bază, apoi pasul recursiv, și verifică pe un exemplu mic înainte de a trece mai departe.
Cazurile limită în barem. Evaluatorii verifică explicit comportarea pentru valori extreme: n = 0, n = 1, numere foarte mari, vectori cu un singur element. O funcție corectă pentru cazurile obișnuite dar greșită la limita domeniului pierde puncte la testele ascunse. Verifică întotdeauna n = 0 și n = 1.
Legătura dintre cerințe și competențe. Fiecare item al testului corespunde unei competențe specifice: definițiile verifică Competența 1.5 (identificarea elementelor de sintaxă), urmărirea pe stivă verifică 2.5 (explicarea mecanismului), funcțiile aplicate verifică 3.5 și 4.5 (utilizarea și analiza), iar problema integrată verifică 5.5 și 6.5 (evaluarea și integrarea în proiecte).
Prevenirea depășirilor. În problemele de test, alege tipurile cu grijă: long long pentru factorial și Fibonacci, int pentru sume de cifre și CMMDC. Pentru vectori mari, limitează adâncimea recursivității sau folosește parcurgerea iterativă.
PbInfo - Numărul de cifre al lui n
Enunț:
Cerință: Se citește un număr natural n. Să se afișeze numărul de cifre al lui n, folosind o funcție recursivă.
Date de intrare:
Programul citește de la tastatură numărul natural n.
Date de ieșire:
Programul va afișa pe ecran numărul de cifre al lui n.
Restricții și precizări:
0 ≤ n ≤ 2.000.000.000.
Exemplu:
Intrare:
12345
Ieșire:
5
Cum gândim soluția:
- Definim funcția
numar_cifre(n) - Cazul de bază: dacă
n < 10, întoarcem 1 - Altfel întoarcem
1 + numar_cifre(n / 10) - În main citim n și afișăm rezultatul
Scrie soluția în C++:
Soluție corectă:
#include <iostream>
using namespace std;
int numar_cifre(int n)
{
if (n < 10)
return 1;
return 1 + numar_cifre(n / 10);
}
int main()
{
int n;
cin >> n;
cout << numar_cifre(n);
return 0;
}
Ce învățăm: pentru 0, funcția întoarce 1, deoarece 0 < 10, ceea ce este corect.
PbInfo - Suma elementelor pare dintr-un vector
Enunț:
Cerință: Se citește n și apoi n numere naturale. Să se afișeze suma elementelor pare, folosind o funcție recursivă de parcurgere a vectorului.
Date de intrare:
Programul citește de la tastatură numărul n, apoi n numere naturale.
Date de ieșire:
Programul va afișa pe ecran suma elementelor pare.
Restricții și precizări:
1 ≤ n ≤ 1000, elemente numere naturale.
Exemplu:
Intrare:
4 1 4 3 8
Ieșire:
12
Cum gândim soluția:
- Definim funcția
suma_pare(v, i, n) - Cazul de bază: dacă
i == n, întoarcem 0 - Calculăm recursiv suma pentru restul vectorului
- Dacă v[i] este par, îl adăugăm la sumă
Scrie soluția în C++:
Soluție corectă:
#include <iostream>
using namespace std;
int suma_pare(int v[], int i, int n)
{
if (i == n)
return 0;
int s = suma_pare(v, i + 1, n);
if (v[i] % 2 == 0)
s = s + v[i];
return s;
}
int main()
{
int n, v[1001];
cin >> n;
for (int i = 0; i < n; i++)
cin >> v[i];
cout << suma_pare(v, 0, n);
return 0;
}
Ce învățăm: problema combină parcurgerea recursivă cu o condiție de filtrare a elementelor pare.
Exercițiul Practic: Antrenament pentru test
Sarcini de lucru
Rezolvă sarcinile următoare ca antrenament pentru testul sumativ
Sarcina 1: Inversul unui număr recursiv
Cerință: Scrie un program C++ care afișează inversul unui număr natural n, folosind o funcție recursivă. Pentru n = 1234, rezultatul este 4321.
Soluție pentru Sarcina 1:
#include <iostream>
using namespace std;
int invers(int n, int r)
{
if (n == 0)
return r;
return invers(n / 10, r * 10 + n % 10);
}
int main()
{
int n;
cin >> n;
cout << invers(n, 0);
return 0;
}
Verifică: pentru n = 1234, inversul este 4321.
Sarcina 2: Numărul de cifre pare dintr-un vector
Cerință: Scrie un program C++ care afișează numărul de elemente pare dintr-un vector, folosind o funcție recursivă. Pentru v = {2, 5, 8, 3}, rezultatul este 2.
Soluție pentru Sarcina 2:
#include <iostream>
using namespace std;
int numara_pare(int v[], int i, int n)
{
if (i == n)
return 0;
int c = numara_pare(v, i + 1, n);
if (v[i] % 2 == 0)
c++;
return c;
}
int main()
{
int n, v[1001];
cin >> n;
for (int i = 0; i < n; i++)
cin >> v[i];
cout << numara_pare(v, 0, n);
return 0;
}