Cele mai comune capcane care reduc nota — cu exemple greșit vs. corect și explicații clare
Această pagină reunește greșelile care apar cel mai frecvent în lucrările de BAC la informatică. Fiecare greșeală are un exemplu de cod incorect și varianta corectă. Studiază-le înainte de examen!
if (x = 5) // atribuie 5 lui x! cout << "DA"; // mereu adevărat dacă x≠0
if (x == 5) // verifică dacă x este 5 cout << "DA";
= atribuie o valoare. == compară două valori. Eroarea cu = în if este depistată de compilator cu warning (-Wall), dar nu e eroare de compilare.
switch(x) { case 1: cout << "unu"; case 2: cout << "doi"; case 3: cout << "trei"; } // x=1 → afișează "unudoitrei"!
switch(x) { case 1: cout << "unu"; break; case 2: cout << "doi"; break; case 3: cout << "trei"; break; }
break, execuția «cade» în cazul următor (fall-through). Adaugă break după fiecare ramură, cu excepția cazurilor intenționat grupate.
int n = 100000; int suma = n * (n + 1) / 2; // n*(n+1) = 10^10 → overflow int! // int max ≈ 2.1 × 10^9
long long n = 100000; long long suma = n * (n + 1) / 2; // long long max ≈ 9.2 × 10^18 ✅
long long. La BAC cu n ≤ 10⁶, produsele n² sau n×n sunt adesea prea mari pentru int.
int v[10]; // indici 0..9 v[10] = 5; // undefined behavior! for (int i = 1; i <= n; i++) v[i] = ... // dacă n ≥ 10 → crash
int v[100001]; // n ≤ 100000, indexat 1..n for (int i = 1; i <= n; i++) cin >> v[i]; // i merge de la 1 la n ✅
i <= n, nu la i < n sau i <= n+1.
string s; cin >> s; // Input: "Ana are mere" // s = "Ana" — se oprește la spațiu!
string s; getline(cin, s); // Input: "Ana are mere" // s = "Ana are mere" ✅
cin >> n înainte de getline, adaugă cin.ignore(); între ele pentru a consuma newline-ul rămas în buffer.
int main() { int v[1000000]; // ~4 MB pe stivă // Stiva are ~1-8 MB → crash! }
int v[1000001]; // global — segment date // Inițializat automat cu 0 int main() { // folosim v fără probleme }
int factorial(int n) { return n * factorial(n - 1); // niciodată nu se oprește! }
int factorial(int n) { if (n == 0) return 1; // caz de bază! return n * factorial(n - 1); }
double x = 0.1 + 0.2; if (x == 0.3) // FALS! cout << "egal"; // nu se afișează // 0.1+0.2 = 0.30000000000000004
double EPS = 1e-9; if (abs(x - 0.3) < EPS) cout << "egal"; // funcționează ✅
== din cauza erorilor de reprezentare în virgulă mobilă. Folosiți o marjă de toleranță epsilon (de obicei 10⁻⁹).
int minim = 0; // greșit dacă v[i] > 0 int maxim = 0; // greșit dacă v[i] < 0 for (int i=1; i<=n; i++) { if (v[i]<minim) minim=v[i]; // n-ar găsi minim din [3,5,7] }
int minim = v[1]; // inițializare cu primul element int maxim = v[1]; for (int i=2; i<=n; i++) { // pornim de la 2 if(v[i]<minim) minim=v[i]; if(v[i]>maxim) maxim=v[i]; }
INT_MAX și INT_MIN (din <climits>), sau mai simplu — cu primul element din vector și buclă de la 2.
Vrei să exersezi cu exerciții interactive?