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

Ora 10: Test final sumativ

Ce vei învăța astăzi: Structura testului final sumativ (testul care evaluează toate competențele modulului), baremul de evaluare (sistemul de punctaj pe pași logici) și sfaturi pentru rezolvare

Rezultat practic: Te pregătești pentru testul sumativ rezolvând probleme cu funcții recursive în C++ (Competența 6.5)

Competența 6.5 Săptămâna 29

Înainte de a începe

De ce contează? Cunoașterea structurii testului și a baremului îți permite să îți aloci timpul corect și să câștigi puncte parțiale la fiecare item.

Ce știi deja?

Din ora 9, poți rescrie din memorie cazurile de bază ale funcțiilor recursive esențiale? Ce conține tabelul rezumativ al modulului?

Ideea-cheie: Testul sumativ verifică atât teoria (caz de bază, stivă, recurențe (relații care exprimă o valoare prin valorile anterioare)), cât și scrierea de funcții recursive complete stil BAC, iar baremul punctează fiecare pas logic.
SINTEZĂ TEORETICĂ ȘI EXEMPLE GHIDATE

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
Baremul de evaluare
Rezolvarea problemelor de test
Sfaturi pentru examen

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.

Algoritm numar_cifre(n): dacă n < 10 atunci returnează 1 altfel returnează 1 + numar_cifre(n / 10)
Program C++ - numărul de cifre (test)
#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.

Program C++ - suma elementelor pare (test)
#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:
recursive 10 vectorul BAC

Exercițiu de completare

Completează funcția de test numar_cifre:
int numar_cifre(int n)
{
    if (n < ______)
        ______ 1;
    return 1 + numar_cifre(______);
}
Bancă de cuvinte:
10 return n / 10

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:

Ai grijă la: baremul - un caz de bază corect aduce puncte chiar dacă restul funcției are greșeli, deci scrie întotdeauna fiecare componentă, oricât de mică.

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ă.

APLICARE ȘI REZOLVARE DE PROBLEME

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:
  1. Definim funcția numar_cifre(n)
  2. Cazul de bază: dacă n < 10, întoarcem 1
  3. Altfel întoarcem 1 + numar_cifre(n / 10)
  4. Î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:
  1. Definim funcția suma_pare(v, i, n)
  2. Cazul de bază: dacă i == n, întoarcem 0
  3. Calculăm recursiv suma pentru restul vectorului
  4. 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ȚII PRACTICE

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;
}

Scrie pe caiet

Titlul lecției

Test final sumativ. A zecea lecție din Modulul 5 te pregătește pentru testul care evaluează toate competențele modulului.

Definiția lecției

Testul final sumativ evaluează competențele dobândite în clasa a X-a, cu accent pe subprogramele recursive. Structura recomandată are patru itemi: teorie cu definiții, o funcție recursivă pe un număr, un program cu vector și o problemă din oficiu. Funcția numar_cifre(n) are cazul de bază n < 10, când întoarce 1, și pasul recursiv 1 + numar_cifre(n / 10). Suma elementelor pare dintr-un vector se calculează parcurgând recursiv vectorul cu un filtru. Sintaxa BAC impune include, using namespace std, int main și return 0. Pentru punctaj maxim, scrie întâi cazul de bază, verifică pe un exemplu simplu și respectă formatul cerut.

Definiții esențiale

Algoritmul cheie - pseudocod

Algoritm numar_cifre(n): dacă n < 10 atunci returnează 1 altfel returnează 1 + numar_cifre(n / 10)

Algoritmul cheie - cod C++

Program C++ - numărul de cifre (test)
#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;
}

Greșeli comune de evitat

Exemplu practic

Scenariu real: la test, itemul 2 cere numărul de cifre al anului 2026; răspunsul este 4. Funcția recursivă rezolvă cerința:

Program C++ - numărul de cifre (exemplu practic)
int numar_cifre(int n)
{
    if (n < 10)
        return 1;
    return 1 + numar_cifre(n / 10);
}

Apelul numar_cifre(2026) întoarce 4.

Sfaturi practice și trucuri