12 greșeli care te costă puncte la BAC la informatică (cu exemple de cod)
Greșelile de C++ și de redactare pe care le vedem an de an la corectarea lucrărilor de BAC la informatică, cu exemplul concret și varianta corectă.
12 greșeli care te costă puncte la BAC la informatică
Nu vorbim despre greșeli de algoritmică. Vorbim despre lucruri mărunte, mecanice, pe care le fac și elevi care știu materia — și care fac diferența dintre 8,60 și 9,70.
1. Împărțirea întregilor tratată ca împărțire reală
Cea mai frecventă greșeală de la Subiectul I.
20/25*20/2 // NU este 8. Este 0.
Evaluarea se face de la stânga la dreapta: 20/25 pe întregi dă 0, apoi 0*20 dă 0, apoi 0/2 dă 0.
Regula: dacă ambii operanzi sunt int, rezultatul este int, trunchiat spre zero. Ca să obții împărțire reală, forțează conversia: (double)20/25.
2. Restul negativ
(-17) % 5 // este -2, nu 3
În C/C++, restul preia semnul deîmpărțitului. Dacă ai nevoie de un rest mereu pozitiv (util la probleme cu resturi modulo), scrie:
int r = ((a % b) + b) % b;
3. Confuzia „returnează” vs. „afișează”
Cerința de la Subiectul III.1 spune de obicei „subprogramul returnează”. Dacă tu scrii cout în loc de return, pierzi puncte semnificative din cele 10 — subprogramul nu respectă specificația.
// GREȘIT
int prodFact(int N, int M) {
...
cout << rez;
}
// CORECT
int prodFact(int N, int M) {
...
return rez;
}
Invers e la fel de rău: dacă cerința spune „afișează”, nu returna.
4. Scrierea unui program complet când se cere doar subprogramul
Dacă cerința spune „Scrieți definiția completă a subprogramului”, scrii doar subprogramul: antet, acolade, corp. Fără #include, fără main, fără citiri. Nu pierzi puncte pentru ele, dar pierzi 10 minute din care ai fi rezolvat III.3.a.
5. Ignorarea identificatorilor din enunț
Enunțul scrie cu bold numele subprogramului și ale parametrilor. Baremul cere explicit respectarea lor. Dacă cerința spune prodFact(N, M) și tu scrii produs(a, b), corectorul are temei să depuncteze.
6. Parametri transmiși prin valoare când trebuie prin referință
// GREȘIT — vectorul se modifică local, apelantul nu vede nimic
void sterge(int v[], int n) {
...
n--;
}
// CORECT
void sterge(int v[], int &n) {
...
n--;
}
Tablourile se transmit implicit prin adresă, dar dimensiunea este o variabilă simplă. Dacă subprogramul modifică numărul de elemente, n trebuie transmis prin referință.
7. Depășirea limitelor la ștergere și inserare în vector
// GREȘIT — citește v[n], element inexistent
for (int i = poz; i <= n - 1; i++)
v[i] = v[i + 1];
La i = n-1, accesezi v[n]. Corect:
for (int i = poz; i < n - 1; i++)
v[i] = v[i + 1];
n--;
La inserare, mergi invers, de la coadă spre poziția de inserare, altfel suprascrii datele.
8. Vector de frecvență nedeclarat global sau neinițializat
// GREȘIT — valori reziduale
int f[1001];
void numara() {
int f[1001]; // neinițializat, valori aleatoare
...
}
// CORECT
int f[1001] = {0}; // sau declarat global, inițializat implicit cu 0
Variabilele globale sunt inițializate automat cu 0. Cele locale, nu. La BAC, un vector de frecvență declarat local și neinițializat este o sursă garantată de rezultat greșit.
9. Neinițializarea minimului și maximului
// GREȘIT dacă vectorul are valori negative
int maxim = 0;
// CORECT
int maxim = v[0];
Sau, dacă enunțul garantează un interval, folosește o valoare din afara lui. Niciodată 0 „ca să fie”.
10. Comparația șirurilor de caractere cu ==
char a[100], b[100];
if (a == b) // GREȘIT — compară adrese
if (strcmp(a, b) == 0) // CORECT
Similar, a = b nu copiază șirul. Se folosește strcpy(a, b).
11. Soluție corectă, dar neeficientă, la Subiectul III.3
Cerința spune explicit „algoritm eficient din punctul de vedere al timpului de executare și al spațiului de memorie”. Dacă n ≤ 10^5 și tu scrii două for-uri imbricate, ai rezultatul corect dar pierzi punctele de eficiență.
Reflexul corect: la n de ordinul 10^5, soluția trebuie să fie o singură parcurgere sau, în cel mai rău caz, o sortare urmată de o parcurgere.
Și încă ceva: subpunctul a) cere descrierea în limbaj natural a algoritmului, cu justificarea eficienței. Sunt 2 puncte. Trei fraze. Foarte mulți elevi le lasă goale.
12. Cod scris ilizibil, fără indentare
Corectorul citește sute de lucrări scrise de mână. Un cod neindentat, cu acolade nealiniate și variabile denumite a, b, c, aa, x1, primește exact punctajul pe care corectorul poate să îl demonstreze — nu punctajul pe care l-ai fi meritat.
Trei reguli:
- indentează cu două spații per nivel, consecvent
- pune acoladele pe linii proprii
- lasă un rând liber între blocuri logice
Nu costă nimic și schimbă percepția corectorului asupra întregii lucrări.
Bonus: trei lucruri pe care NU trebuie să le faci
Nu valida datele de intrare. Enunțul spune explicit că datele se consideră corecte. Codul de validare nu se punctează.
Nu scrie comentarii lungi. Un comentariu scurt care explică o secvență neevidentă e util. Un bloc de 10 rânduri de comentarii consumă timp fără punctaj.
Nu lăsa nicio cerință goală. La Subiectul II.1.d, baremul acordă punctaj pentru structura repetitivă corectă chiar dacă algoritmul rezultat nu este echivalent cu cel dat. La III.3.a, două puncte se iau descriind orice algoritm rezonabil. Un item necompletat este zero garantat; un item completat parțial este aproape întotdeauna peste zero.
Întrebări frecvente
Se depunctează dacă amestec cin cu scanf?
Nu se depunctează explicit, dar poți obține rezultate greșite din cauza bufferelor diferite. Alege un stil și rămâi la el în tot programul.
Contează dacă folosesc #include <iostream> sau #include <bits/stdc++.h>?
La BAC, pe hârtie, nu se depunctează niciunul. Practic, bits/stdc++.h nu este standard și nu funcționează pe toate compilatoarele — dacă exersezi pe calculator, e mai sigur să incluzi explicit ce folosești.
Dacă greșesc și tai cu pixul, se depunctează? Nu. Tăierea clară a unei secvențe greșite nu se depunctează. Ce se depunctează este ambiguitatea: două variante lăsate ambele pe foaie, fără să fie clar care e răspunsul final.
Corectăm redactarea pe hârtie la fiecare ședință, exact pe grila de barem. Vezi și structura subiectelor și planul de pregătire pe etape. Programează o evaluare →