InfoBook.ro ← Harta anului
Test inițial · Clasa a X-a
InfoBook · Evaluare inițială · materia clasei a IX-a

Test inițial — Clasa a X-a

Verifică dacă ai bagajul complet din clasa a IX-a: baze de numerație, operatori, instrucțiuni, prelucrarea cifrelor, vectori, subprograme, sortări, structuri de date și fișiere text. Tot ce urmează anul acesta se sprijină pe ele.

1 pdin oficiu
5 × 0,2 pgrile = 1 p
4 × 2 pprobleme = 8 p
10 ptotal
timp de lucru: 50 de minute · oficiu + grile complete = nota 2
1.00 nota curentă oficiu 1.00 · grilă 0.00 · probleme 0.00
Cum se rezolvă: problemele se scriu în C++. Fiecare subpunct are punctajul lui, iar baremul conține rezolvarea completă, comentată. Rezolvi întâi singur, apoi deschizi baremul și te autoevaluezi cinstit — testul e pentru tine, nu pentru catalog.

Recapitulare — bagajul minim

9 noțiuni · fără notă
Înainte de test, treci prin noțiunile din clasa a IX-a pe care se construiește tot anul acesta. Cele marcate ★ sunt fundamentale. Bifează sincer ce știi — la final vezi unde stai. Nu e notă, e diagnoză.
📊

Vectori

clasa a IX-a
★ ESENȚIAL
  • Declarare, citire, afișare
  • Indice, dimensiune, acces direct
  • Sumă, minim, maxim, numărare
  • Căutare secvențială
  • Vector de frecvență
int v[100], n;
cin >> n;
for (int i = 0; i < n; i++)
cin >> v[i];

De ce contează acum: Căutarea binară, interclasarea și matricea pornesc toate de la vector. Fără el, nimic din anul acesta.

🧩

Subprograme

clasa a IX-a
★ ESENȚIAL
  • Antet: tip, nume, parametri
  • return vs void
  • Parametri prin valoare vs referință (&)
  • Variabile locale și globale
int suma(int v[], int n) {
int s = 0;
for (int i = 0; i < n; i++)
s += v[i];
return s;
}

De ce contează acum: Recursivitatea e tot un subprogram — unul care se cheamă pe sine. Se predă în semestrul al doilea.

🔀

Structuri de control

clasa a IX-a
  • if / else if / else
  • while, for, do-while
  • break și continue
  • Condiții compuse cu && și ||
for (int i = 1; i <= n; i++)
if (i % 2 == 0)
cout << i << " ";

De ce contează acum: Tot ce urmează se scrie cu ele. Dacă bucla nu e sigură, algoritmul nu are pe ce sta.

🔢

Prelucrarea cifrelor

clasa a IX-a
  • n % 10 dă ultima cifră
  • n / 10 taie ultima cifră
  • Suma cifrelor, numărul de cifre, inversul
int s = 0;
while (n > 0) {
s += n % 10;
n = n / 10;
}

De ce contează acum: Același șablon îl vei folosi la conversii, la validări și în probleme cu text.

➗

Divizori și numere prime

clasa a IX-a
  • Divizor: n % d == 0
  • Prim: exact doi divizori
  • Cauți doar până la radical din n
for (int d = 2; d * d <= n; d++)
if (n % d == 0)
prim = false;

De ce contează acum: Prima lecție de eficiență — ideea „de ce până la radical" revine la căutarea binară.

🔀

Metode de sortare

clasa a IX-a
  • Selecția minimului
  • Metoda bulelor
  • De ce contează numărul de comparații
for (int i = 0; i < n - 1; i++)
for (int j = i + 1; j < n; j++)
if (v[i] > v[j]) swap(v[i], v[j]);

De ce contează acum: Căutarea binară cere vector SORTAT. Iar sortarea prin interclasare e primul Divide et impera.

🥞

Stivă și coadă

clasa a IX-a
  • Stiva: LIFO · Coada: FIFO
  • Adăugare și extragere
  • Unde se folosesc
st[vf] = x; vf++; // pun in stiva
vf--; x = st[vf]; // scot din stiva

De ce contează acum: Recursivitatea folosește chiar stiva de apeluri — o vei vedea desenată pas cu pas.

🔟

Baze de numerație

clasa a IX-a
  • Bit, octet, baza 2
  • 10 → 2: împărțiri succesive, resturile invers
  • 2 → 10: suma puterilor lui 2
// 13 in baza 2
13 : 2 = 6 rest 1
6 : 2 = 3 rest 0
3 : 2 = 1 rest 1
1 : 2 = 0 rest 1 -> 1101

De ce contează acum: Revine la operațiile pe biți și la înțelegerea modului în care se stochează datele.

➕

Tipuri de date și operatori

clasa a IX-a
  • int, double, char, bool
  • / pe întregi TAIE zecimalele: 7/2 = 3
  • % dă restul: n % 2 == 0 înseamnă par
  • == compară, = atribuie
int a = 7, b = 2;
cout << a / b; // 3 (nu 3.5!)
cout << (double)a / b; // 3.5
cout << a % b; // 1

De ce contează acum: Cea mai frecventă sursă de rezultate greșite — și la teme, și la bacalaureat.

Cât de pregătit ești0 / 9

Bifează noțiunile pe care le stăpânești, apoi treci la test.


Subiectul I — grilă

5 × 0,2 p = 1 p

Un singur răspuns corect. Apeși pe variantă și afli imediat dacă ai nimerit, cu explicație.

Subiectul II — probleme

4 × 2 p = 8 p

Fiecare problemă e împărțită pe subpuncte cu punctaj propriu. Rezolvi pe hârtie sau în editor, apoi deschizi baremul și te autoevaluezi: apasă pe butonul din dreapta fiecărui subpunct pentru nerezolvat → parțial (jumătate) → corect.

1.

Suma cifrelor, ca subprogram

M03 · M052 p

Se cere folosirea unui subprogram propriu — nu se acceptă rezolvarea cu tot codul în main().

a)Scrie funcția int sumaCifrelor(int n) care întoarce suma cifrelor lui n.0,5 p
b)Scrie programul complet care citește un număr natural n și afișează suma cifrelor lui, folosind funcția de la a).0,75 p
c)Citind două numere naturale n și k, afișează toate numerele din intervalul [1, n] care au suma cifrelor egală cu k. Dacă nu există niciunul, afișează mesajul NU EXISTA.0,75 p

Barem de corectare & rezolvare

a)  0,5 p
Șablonul de aur al clasei a IX-a: n % 10 ia ultima cifră, n / 10 o taie, bucla merge cât timp mai există cifre.
C++
int sumaCifrelor(int n) {
    int s = 0;
    while (n > 0) {
        s += n % 10;   // adaug ultima cifra
        n /= 10;       // o elimin
    }
    return s;
}
b)  0,75 p
Atenție la două detalii de barem: #include <iostream> și using namespace std;, plus faptul că funcția se declară înainte de main().
C++
#include <iostream>
using namespace std;

int sumaCifrelor(int n) {
    int s = 0;
    while (n > 0) { s += n % 10; n /= 10; }
    return s;
}

int main() {
    int n;
    cin >> n;
    cout << sumaCifrelor(n);
    return 0;
}
c)  0,75 p
Refolosirea funcției este exact ideea subprogramelor: se scrie o dată, se apelează de n ori. Contorul gasit rezolvă cerința cu mesajul.
C++
int main() {
    int n, k, gasit = 0;
    cin >> n >> k;
    for (int x = 1; x <= n; x++)
        if (sumaCifrelor(x) == k) {
            cout << x << ' ';
            gasit++;
        }
    if (gasit == 0) cout << "NU EXISTA";
    return 0;
}

// Exemplu: n = 30, k = 5  ->  5 14 23
2.

Prelucrări pe vector

M04 · M082 p

Se citește un număr natural n (n ≤ 100) și apoi n numere naturale, care se memorează într-un vector v.

Exemplun = 7
v = 4 9 6 9 3 2 9

a) media elementelor pare = (4+6+2)/3 = 4
b) maximul este 9, pe pozițiile 1, 3, 6
c) vectorul rămas: 4 6 3 2
a)Afișează media aritmetică a elementelor pare. Dacă nu există elemente pare, afișează 0.0,5 p
b)Determină valoarea maximă din vector și afișează toate pozițiile pe care apare.0,75 p
c)Șterge din vector toate elementele egale cu maximul și afișează vectorul rămas.0,75 p

Barem de corectare & rezolvare

a)  0,5 p
Se acumulează suma și contorul în aceeași parcurgere. Împărțirea trebuie făcută real, altfel media 4,67 devine 4.
C++
int n, v[105];
cin >> n;
for (int i = 0; i < n; i++) cin >> v[i];

int s = 0, c = 0;
for (int i = 0; i < n; i++)
    if (v[i] % 2 == 0) { s += v[i]; c++; }

if (c > 0) cout << (double)s / c;   // conversie -> impartire reala
else       cout << 0;
b)  0,75 p
Maximul se caută cu șablonul clasic (pornind de la primul element), iar pozițiile se află într-o a doua parcurgere — nu poți afișa pozițiile în prima, pentru că nu știi încă valoarea finală a maximului.
C++
int mx = v[0];
for (int i = 1; i < n; i++)
    if (v[i] > mx) mx = v[i];

cout << "Maxim = " << mx << ", pozitiile: ";
for (int i = 0; i < n; i++)
    if (v[i] == mx) cout << i << ' ';
c)  0,75 p
Metoda cea mai sigură este rescrierea vectorului cu doi indici: i parcurge, k scrie doar ce se păstrează. La final n devine k. (Varianta cu ștergere element cu element și mutarea cozii este corectă, dar mai lentă și mai ușor de greșit — indicele trebuie să NU crească după o ștergere.)
C++
int k = 0;
for (int i = 0; i < n; i++)
    if (v[i] != mx) v[k++] = v[i];
n = k;                       // noua dimensiune

for (int i = 0; i < n; i++) cout << v[i] << ' ';
3.

Citirea unui program

M02 · M03 · subiectul II de BAC2 p

Se dă secvența de mai jos, în care n este un număr natural nenul citit de la tastatură:

Exempluint n, s = 0;
cin >> n;
for (int d = 1; d * d <= n; d++)
    if (n % d == 0) {
        s += d;
        if (d != n / d) s += n / d;
    }
cout << s;
a)Ce se afișează pentru n = 12? Justifică prin tabel de urmărire.0,75 p
b)Ce calculează secvența, în general? De ce este necesar testul d != n / d?0,5 p
c)Rescrie instrucțiunea for folosind o instrucțiune while echivalentă.0,75 p

Barem de corectare & rezolvare

a)  0,75 p
Bucla merge cât timp d·d ≤ 12, adică d ∈ {1, 2, 3}.
d = 1 :  12 % 1 == 0  ->  s += 1        s = 1
         12/1 = 12 != 1  ->  s += 12    s = 13
d = 2 :  12 % 2 == 0  ->  s += 2        s = 15
         12/2 = 6  != 2  ->  s += 6     s = 21
d = 3 :  12 % 3 == 0  ->  s += 3        s = 24
         12/3 = 4  != 3  ->  s += 4     s = 28
d = 4 :  4*4 = 16 > 12  ->  STOP

Se afiseaza: 28
b)  0,5 p
Secvența calculează suma tuturor divizorilor lui n (inclusiv 1 și n). Divizorii vin în perechi (d, n/d), de aceea se adună amândoi dintr-o dată — asta face algoritmul O(√n) în loc de O(n).
Testul d != n/d este necesar pentru pătratele perfecte: la n = 36 și d = 6 avem n/d = 6, iar fără test 6 s-ar aduna de două ori.
c)  0,75 p
Conversia cerută la BAC: inițializarea iese înainte de while, condiția rămâne condiția lui while, iar pasul coboară ca ultimă instrucțiune din corp.
C++
int d = 1;                       // initializarea
while (d * d <= n) {             // conditia
    if (n % d == 0) {
        s += d;
        if (d != n / d) s += n / d;
    }
    d++;                         // pasul
}
cout << s;
4.

Fișiere text, sortare și frecvențe

M08 · M09 · M042 p

Fișierul text date.txt conține pe prima linie un număr natural n (n ≤ 1000), iar pe a doua linie n numere naturale, separate prin spații, fiecare cel mult egal cu 1000.

Exempludate.txt
8
7 3 7 1 3 7 9 1

a) 1 1 3 3 7 7 7 9
b) valoarea 7, apare de 3 ori
c) rezultat.txt: 1 3 7 9
a)Citește datele din fișier într-un vector și afișează numerele sortate crescător.0,75 p
b)Determină și afișează valoarea care apare de cele mai multe ori, împreună cu numărul de apariții.0,75 p
c)Scrie în fișierul rezultat.txt valorile distincte, în ordine crescătoare.0,5 p

Barem de corectare & rezolvare

a)  0,75 p
Se acceptă atât sort din <algorithm>, cât și o sortare scrisă de mână (selecție sau bule). Obligatoriu: deschiderea fișierului cu ifstream și includerea <fstream>.
C++
#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;

ifstream fin("date.txt");
ofstream fout("rezultat.txt");
int n, v[1005], f[1001];

int main() {
    fin >> n;
    for (int i = 0; i < n; i++) fin >> v[i];
    fin.close();

    sort(v, v + n);                       // varianta cu <algorithm>
    for (int i = 0; i < n; i++) cout << v[i] << ' ';
    cout << '\n';
    return 0;
}
C++
// Varianta scrisa de mana: sortare prin selectia minimului
for (int i = 0; i < n - 1; i++)
    for (int j = i + 1; j < n; j++)
        if (v[j] < v[i]) swap(v[i], v[j]);
b)  0,75 p
Aici strălucește vectorul de frecvență: valorile sunt ≤ 1000, deci un vector f[1001] numără totul într-o singură parcurgere, în O(n). Fără el ar fi nevoie de două bucle imbricate, O(n²).
C++
for (int i = 0; i < n; i++) f[ v[i] ]++;   // vectorul de frecventa

int val = 0;
for (int x = 0; x <= 1000; x++)
    if (f[x] > f[val]) val = x;

cout << val << " apare de " << f[val] << " ori\n";
c)  0,5 p
Vectorul de frecvență rezolvă și asta gratuit: parcurs de la 0 la 1000, el dă valorile deja sortate și fără dubluri. Nu uita fout.close() — fără el datele pot rămâne în buffer și fișierul iese gol.
C++
for (int x = 0; x <= 1000; x++)
    if (f[x] > 0) fout << x << ' ';

fout.close();

Nota ta

1.00
Începe cu grila — nota pornește de la 1 punct din oficiu.
← Recapitulează materia
InfoBook · infobook.ro — Informatică pentru liceu · toate clasele