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.00nota 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>
usingnamespace 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);
return0;
}
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";
return0;
}
// 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 realaelsecout << 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 dimensiunefor (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; // initializareawhile (d * d <= n) { // conditiaif (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>
usingnamespace 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';
return0;
}
C++
// Varianta scrisa de mana: sortare prin selectia minimuluifor (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 frecventaint 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.