Tipikus C++ Baklövések & Kivédésük

Ezek azok a hibák, amelyek a leggyakrabban pontvesztést okoznak a Neumann János Egyetem zárthelyi dolgozataiban. Így ismerd fel és küszöböld ki őket azonnal!

Futásidejű Hiba

1. Nullával való osztás (Division by zero / SIGFPE)

C++-ban ha egész számot nullával osztunk vagy nullával képzünk maradékot (%), a program azonnal összeomlik futási hibával (SIGFPE / Arithmetic Exception).

Megoldás: Az órai jegyzetünkben (osszetett_feltetel.cpp) látható módon az osztás elvégzése előtt mindig ellenőrizd az osztót egy if feltétellel!
// ❌ Hibás:
int a = 10, b = 0;
int maradek = a % b; // CRASH! Összeomlik a program!

// ✔ Helyes (osszetett_feltetel.cpp alapján):
if (b == 0) {
    cout << "Hiba: osztas nullaval!" << endl;
} else if (a % b == 0) {
    cout << "Oszthato!" << endl;
}
Logikai Hiba

2. Értékadás (=) az Összehasonlítás (==) helyett

A C++ szintaxis megengedi, hogy az if feltételében egyenlőség helyett értékadást írj. Ez szintaktikailag érvényes, de szörnyű logikai hibát okoz, mert az értékadás eredménye igaznak minősül, ha nem nulla!

Megoldás: Összehasonlításhoz mindig használj dupla egyenlőségjelet (==).
// ❌ Veszélyes hiba:
int jegy = 3;
if (jegy = 5) { // Értéket ad (jegy most 5 lesz) és IGAZ-ként fut le!
    cout << "Kivalo diak!" << endl; 
}

// ✔ Helyes:
if (jegy == 5) {
    cout << "Kivalo diak!" << endl;
}
Memóriahiba / UB

3. Túlindexelés tömböknél (Array Index Out of Bounds)

A C++ alapszintű tömbjei (pl. int tomb[10]) nem ellenőrzik a határokat futási időben. Ha a 10 elemű tömb 10. indexére írsz (csak 0-9 érvényes), memóriaszemetet kapsz vagy elszáll a program.

Megoldás: Ügyelj a ciklushatárokra: 0-tól indíts és szigorúan kisebb (< meret) legyen a feltétel, vagy használj std::vector konténert!
// ❌ Hibás:
int tomb[5];
for (int i = 0; i <= 5; i++) { // HIBA: i = 5 túllépi a tömböt!
    tomb[i] = i * 2;
}

// ✔ Helyes:
for (int i = 0; i < 5; i++) {
    tomb[i] = i * 2;
}
Szintaxis / Logika

4. switch-case 'break;' elfelejtése (Fallthrough)

Ha egy case ág végéről elhagyod a break; utasítást, a vezérlés továbbcsorog a következő case ágba is, még akkor is, ha annak a feltétele nem teljesülne.

Megoldás: Minden case ág végére tegyél break; utasítást a menü_sor.cpp és switch_case.cpp mintájára!
// ❌ Hibás:
switch (valasztas) {
    case 1:
        cout << "Elso opcio" << endl; // HIBA: nincs break!
    case 2:
        cout << "Masodik opcio" << endl; // Ez is le fog futni!
        break;
}

// ✔ Helyes:
switch (valasztas) {
    case 1:
        cout << "Elso opcio" << endl;
        break; // Megállítja a továbbcsorgást
    case 2:
        cout << "Masodik opcio" << endl;
        break;
}
Típushiba

5. Karakter és Szám típusok tévesztése cin / cout esetén

Amikor a felhasználótól betűt kérünk be, de int változóba olvassuk, vagy fordítva, a cin folyam hibás állapotba (failbit) kerül, és az összes további beolvasás meghiúsul.

Megoldás: Karakterekhez használj char típust, és ha szükséges, konvertáld ASCII számmá a tipuskonverzio.cpp mintájára (int(betu)).
// ❌ Hibás használat:
char c = '5';
int szam = int(c); // Vigyázat: ez NEM az 5 szám lesz, hanem az 53 (ASCII kód)!

// ✔ Helyes számérték kinyerés karakterből:
int valodi_szam = c - '0'; // 53 - 48 = 5
Számítási Hiba

6. Egészosztás miatti tizedesjegy-vesztés

Ha két int típusú számot osztasz el egymással (pl. 5 / 2), a C++ egészosztást végez, és az eredmény 2 lesz a 2.5 helyett.

Megoldás: Legalább az egyik operandust float vagy double típussá kell alakítani (pl. (float)a / b vagy a / 2.0).
// ❌ Hibás:
int a = 5, b = 2;
float atlag = a / b; // Az eredmény 2.0 lesz, nem 2.5!

// ✔ Helyes:
float atlag = (float)a / b; // 2.5