⚠️ Greșeli frecvente

Greșeli frecvente la BAC Informatică

Cele mai comune capcane care reduc nota — cu exemple greșit vs. corect și explicații clare

← Înapoi la platformă

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!

🔴 Greșeli de logică și operatori
1
Confuzia între = (atribuire) și == (comparație)
❌ Greșit
if (x = 5)        // atribuie 5 lui x!
    cout << "DA";  // mereu adevărat dacă x≠0
✅ Corect
if (x == 5)       // verifică dacă x este 5
    cout << "DA";
De reținut: = atribuie o valoare. == compară două valori. Eroarea cu = în if este depistată de compilator cu warning (-Wall), dar nu e eroare de compilare.
2
Lipsa break în instrucțiunea switch
❌ Greșit
switch(x) {
  case 1: cout << "unu";
  case 2: cout << "doi";
  case 3: cout << "trei";
}
// x=1 → afișează "unudoitrei"!
✅ Corect
switch(x) {
  case 1: cout << "unu"; break;
  case 2: cout << "doi"; break;
  case 3: cout << "trei"; break;
}
De reținut: Fără break, execuția «cade» în cazul următor (fall-through). Adaugă break după fiecare ramură, cu excepția cazurilor intenționat grupate.
3
Depășire de tip int — trebuie long long
❌ Greșit
int n = 100000;
int suma = n * (n + 1) / 2;
// n*(n+1) = 10^10 → overflow int!
// int max ≈ 2.1 × 10^9
✅ Corect
long long n = 100000;
long long suma = n * (n + 1) / 2;
// long long max ≈ 9.2 × 10^18 ✅
Regulă: Dacă produsul sau suma poate depăși ~2×10⁹, folosiți long long. La BAC cu n ≤ 10⁶, produsele n² sau n×n sunt adesea prea mari pentru int.
4
Acces în afara limitelor vectorului (buffer overflow)
❌ Greșit
int v[10];    // indici 0..9
v[10] = 5;   // undefined behavior!

for (int i = 1; i <= n; i++)
    v[i] = ...  // dacă n ≥ 10 → crash
✅ Corect
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 ✅
Regulă: Dacă indexezi de la 1, dimensiunea vectorului trebuie să fie cel puțin n+1. Verifică întotdeauna că bucla se oprește la i <= n, nu la i < n sau i <= n+1.
🟠 Greșeli de citire și afișare
5
cin >> s vs getline — citire șiruri cu spații
❌ Greșit
string s;
cin >> s;
// Input: "Ana are mere"
// s = "Ana" — se oprește la spațiu!
✅ Corect
string s;
getline(cin, s);
// Input: "Ana are mere"
// s = "Ana are mere" ✅
Atenție: Dacă ai citit un număr cu cin >> n înainte de getline, adaugă cin.ignore(); între ele pentru a consuma newline-ul rămas în buffer.
6
Vector mare declarat local în main — stack overflow
❌ Greșit
int main() {
    int v[1000000];  // ~4 MB pe stivă
    // Stiva are ~1-8 MB → crash!
}
✅ Corect
int v[1000001];  // global — segment date
// Inițializat automat cu 0
int main() {
    // folosim v fără probleme
}
Regulă de aur la BAC: Orice vector cu n ≥ 10.000 se declară global. Variabilele globale sunt stocate în segmentul de date (BSS/data), nu pe stivă.
🟡 Greșeli de algoritm
7
Recursivitate infinită — lipsa cazului de bază
❌ Greșit
int factorial(int n) {
    return n * factorial(n - 1);
    // niciodată nu se oprește!
}
✅ Corect
int factorial(int n) {
    if (n == 0) return 1; // caz de bază!
    return n * factorial(n - 1);
}
Regulă: Orice funcție recursivă trebuie să aibă un caz de bază care oprește recursivitatea. Verifică că parametrul se apropie mereu de cazul de bază.
8
Compararea numerelor reale cu == (float/double)
❌ Greșit
double x = 0.1 + 0.2;
if (x == 0.3)       // FALS!
    cout << "egal"; // nu se afișează
// 0.1+0.2 = 0.30000000000000004
✅ Corect
double EPS = 1e-9;
if (abs(x - 0.3) < EPS)
    cout << "egal";  // funcționează ✅
Regulă: Numerele reale nu se compară cu == din cauza erorilor de reprezentare în virgulă mobilă. Folosiți o marjă de toleranță epsilon (de obicei 10⁻⁹).
9
Inițializarea greșită a minimului/maximului
❌ Greșit
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]
}
✅ Corect
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];
}
Alternativă: Poți iniția cu 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?

📝 Exerciții & Filtrare 🏠 Înapoi la capitole 📄 Cheat Sheet