Ce vei învăța astăzi?
După această lecție vei cunoaște structura evaluării finale sumative, vei înțelege baremul de notare și vei rezolva o problemă integrată completă cu funcții recursive în C++.
Structura evaluării finale sumative
Definiție: Evaluarea finală sumativă verifică toate competențele clasei a X-a. Este organizată pe două subiecte: Subiectul I (teorie, 30 de puncte) și Subiectul II (trei probleme C++ integrate, 70 de puncte), la care se adaugă 10 puncte din oficiu. Nota finală se acordă după un barem explicit, pe itemi.
| Subiect | Conținut | Punctaj |
|---|---|---|
| Subiectul I | Cinci întrebări de teorie: definiții, caz de bază, stivă, recurențe | 30 de puncte |
| Subiectul II - Problema 1 | Funcție recursivă pe un număr (factorial, suma cifrelor, CMMDC) | 20 de puncte |
| Subiectul II - Problema 2 | Funcție recursivă pe un vector sau șir de caractere | 20 de puncte |
| Subiectul II - Problema 3 | Problemă integrată: matrice sau proiect cu meniu, cu mai multe funcții recursive | 30 de puncte |
| Oficiu | Punctaj acordat pentru parcurgerea completă a lucrării | 10 puncte |
Analogia: cursa cu ștafetă
Evaluarea finală este ca o cursă cu ștafetă în patru etape: întâi teoria (etapa ușoară, puncte sigure), apoi funcțiile pe numere, apoi funcțiile pe vectori și șiruri, și la final problema integrată. Fiecare etapă predă „ștafeta" celei următoare: cunoștințele de la teorie se folosesc la funcții, iar funcțiile se integrează în problema finală.
Problema integrată rezolvată: meniu cu prelucrări recursive
Cerință: Se citește un vector cu n elemente. Să se afișeze suma elementelor pare (funcție recursivă) și cel mai mare element (funcție recursivă), folosind un program cu două funcții recursive și apeluri din main, stil BAC.
#include <iostream>
using namespace std;
// Pasul 1: suma elementelor pare, recursiv
int suma_pare(int v[], int i, int n)
{
// Pasul 2: cazul de baza
if (i == n)
return 0;
// Pasul 3: calculam recursiv suma pentru restul vectorului
int s = suma_pare(v, i + 1, n);
// Pasul 4: daca elementul curent este par, il adaugam la suma
if (v[i] % 2 == 0)
s = s + v[i];
return s;
}
// Pasul 5: maximul elementelor, recursiv
int maxim(int v[], int i, int n)
{
// Pasul 6: cazul de baza - un singur element
if (i == n - 1)
return v[i];
// Pasul 7: maximul pentru restul vectorului
int m = maxim(v, i + 1, n);
// Pasul 8: comparam cu elementul curent
if (v[i] > m)
m = v[i];
return m;
}
int main()
{
int n, v[1001];
// Pasul 9: citim vectorul
cin >> n;
for (int i = 0; i < n; i++)
cin >> v[i];
// Pasul 10: afisam rezultatele
cout << "Suma parelor = " << suma_pare(v, 0, n) << endl;
cout << "Maximul = " << maxim(v, 0, n);
return 0;
}
Verificare pe exemplu
Pentru n = 4 și v = {1, 4, 3, 8}:
- Suma parelor = 4 + 8 = 12
- Maximul = 8
Baremul și strategia de rezolvare
Baremul: punctajul se acordă pe pași logici: definirea corectă a funcției, cazul de bază, pasul recursiv, citirea datelor, apelul corect și afișarea rezultatului. Un caz de bază corect valorează puncte chiar dacă restul funcției are mici greșeli.
Cum obții punctaj maxim?
- Scrie întâi
#include <iostream>,using namespace std;,int main()șireturn 0;- sintaxa BAC completă. - Definițiile și cazurile de bază se punctează separat: scrie-le întotdeauna.
- La problema integrată, rezolvă fiecare funcție separat, apoi le combină în main.
- Verifică pe exemplul din enunț înainte de a trece la următorul item.
De reținut
- Punctele din oficiu se acordă pentru parcurgerea completă a lucrării.
- O funcție corectă parțial (caz de bază + pas recursiv greșit) primește puncte parțiale.
- Erorile de compilare elimină punctele pentru acel item: verifică sintaxa cu atenție.
- Nu lăsa itemuri neîncercate: orice pas scris corect aduce puncte.
Exercițiu de completare
Completează enunțul despre evaluarea finală cu cuvintele potrivite:
Evaluarea finală sumativă are Subiectul I (teorie, 30 de ______) și Subiectul II (trei probleme, 70 de puncte). Punctajul se acordă conform ______, pe pași logici. Sintaxa BAC include ______, using namespace std, int main și return 0. O funcție cu caz de bază corect primește puncte ______.
Bancă de cuvinte:
Exercițiu de completare
Completează funcțiile problemei integrate:
Bancă de cuvinte:
Test de înțelegere
Test rapid - evaluare finală:
1. Punctajul Subiectului I (teorie) este:
2. Cazul de bază al funcției suma_pare este:
3. Pentru v = {1, 4, 3, 8}, suma parelor este:
Aprofundare
Baremul detaliat al unei funcții recursive. La corectare, punctele se împart astfel: antetul funcției (tip de return corect, parametri corecți) valorează aproximativ un sfert din punctaj; cazul de bază un sfert; pasul recursiv un sfert; iar integrarea în main (citire, apel, afișare) ultimul sfert. Scrierea corectă a oricărei componente aduce punctele ei, independent de restul.
Cazuri limită verificate în barem. Evaluatorii testează valorile extreme: n = 0, n = 1, vectori cu toate elementele impare, matrice 1 × 1. O funcție care tratează corect aceste cazuri primește punctaje complete chiar dacă nu este optimă din punct de vedere al vitezei.
Strategia de gestionare a timpului în evaluare. Alocă prioritar timp pentru Subiectul I (răspunsuri scurte, puncte sigure), apoi pentru funcțiile simple și abia la final pentru problema integrată. Rămâne timp de verificare: compilează mental fiecare funcție și urmărește execuția pe exemplul din enunț.
Prevenirea pierderilor de puncte. Cele mai frecvente pierderi vin din: omiterea #include sau a return 0;, caz de bază greșit, parametri transmiși în ordine greșită și lipsa tratării cazului n = 0. Un checklist de cinci puncte înainte de predare elimină aceste pierderi.
PbInfo - Suma elementelor pare dintr-un vector
Enunț:
Cerință: Se citesc n și 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: parcurgerea recursivă cu filtru: suma se construiește la întoarcerea din apeluri, adăugând doar elementele pare.
PbInfo - Maximul dintr-un vector, recursiv
Enunț:
Cerință: Se citesc n și n numere naturale. Să se afișeze valoarea maximă din vector, folosind o funcție recursivă.
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 valoarea maximă din vector.
Restricții și precizări:
1 ≤ n ≤ 1000, elemente numere naturale mai mici decât 1.000.000.
Exemplu:
Intrare:
4 1 7 3 5
Ieșire:
7
Cum gândim soluția:
- Definim funcția
maxim(v, i, n) - Cazul de bază: dacă
i == n - 1, întoarcem v[i] - Calculăm recursiv maximul pentru restul vectorului
- Întoarcem cea mai mare valoare dintre v[i] și maximul restului
Scrie soluția în C++:
Soluție corectă:
#include <iostream>
using namespace std;
int maxim(int v[], int i, int n)
{
if (i == n - 1)
return v[i];
int m = maxim(v, i + 1, n);
if (v[i] > m)
m = v[i];
return m;
}
int main()
{
int n, v[1001];
cin >> n;
for (int i = 0; i < n; i++)
cin >> v[i];
cout << maxim(v, 0, n);
return 0;
}
Ce învățăm: cazul de bază este un singur element (i == n - 1); la fiecare întoarcere comparăm elementul curent cu maximul restului.
Exercițiul Practic: Antrenament pentru evaluarea finală
Sarcini de lucru
Rezolvă sarcinile următoare ca antrenament complet pentru evaluarea finală sumativă
Sarcina 1: Numărul de cifre pare ale unui număr
Cerință: Scrie un program C++ care afișează numărul de cifre pare ale unui număr natural n, folosind o funcție recursivă. Pentru n = 1234, cifrele pare sunt 2 și 4, deci rezultatul este 2.
Soluție pentru Sarcina 1:
#include <iostream>
using namespace std;
int cifre_pare(int n)
{
if (n == 0)
return 0;
int c = cifre_pare(n / 10);
if (n % 2 == 0)
c++;
return c;
}
int main()
{
int n;
cin >> n;
cout << cifre_pare(n);
return 0;
}
Verifică: cifra curentă este ultima cifră a lui n (n % 10); paritatea ei este n % 2 == 0.
Sarcina 2: Verificarea sortării unui vector recursiv
Cerință: Scrie un program C++ care verifică dacă un vector este sortat crescător, folosind o funcție recursivă. Pentru v = {1, 2, 3, 4} răspunsul este DA, pentru v = {1, 3, 2, 4} este NU.
Soluție pentru Sarcina 2:
#include <iostream>
using namespace std;
int sortat(int v[], int i, int n)
{
if (i == n - 1)
return 1;
if (v[i] > v[i + 1])
return 0;
return sortat(v, i + 1, n);
}
int main()
{
int n, v[1001];
cin >> n;
for (int i = 0; i < n; i++)
cin >> v[i];
if (sortat(v, 0, n))
cout << "DA";
else
cout << "NU";
return 0;
}
Verifică: dacă orice pereche vecină este în ordine, vectorul este sortat; altfel funcția întoarce imediat 0.