Elágazások és Logikai Változók: Amikor a Program Döntéseket Hoz 🚦
Gondolj a programodra, mint egy okos robotra. Néha ez a robot is csak úgy megy előre, csinálja a dolgát lépésről lépésre. De mi van, ha egy elágazáshoz ér az úton? Például: „Ha esik az eső, vegyek esernyőt, különben ne?” 🌧️☂️ Erre valók az elágazások!
Elágazások: Az if-else Kódútkereszteződés 🛣️
Az elágazás (if-else) a programozás legalapvetőbb módja, hogy utasításokat feltételhez kössünk. Segítségével megadhatjuk, hogy egy bizonyos kódrészlet csak akkor fusson le, ha egy általunk meghatározott feltétel igaz. Ha nem igaz, akkor vagy nem történik semmi, vagy egy másik kódrészlet fut le (ez az opcionális else rész).
A /*feltétel*/ helyére egy logikai kifejezést (például a > -1, c <= d, e == f, g != h) vagy egy logikai változót (amit általában logikai kifejezések eredményének tárolására használunk) írhatsz.
if ( /*feltétel*/ ) {
// Az ide írt utasítások hajtódnak végre,
ha a feltétel igaz (true) ✅
} else {
// Az ide írt utasítások hajtódnak végre,
ha a feltétel hamis (false) ❌
}
Fontos trükk! 🎩 Ha a /*feltétel*/ helyére nem egyértelműen logikai kifejezést írsz (pl. a+b, getline(fajl, valtozonev), vagy akár std::cout << „Hello”), a C++ megpróbálja logikai értékké konvertálni azt:
- Ha a kifejezés értéke 0-val egyenértékű (pl. 0, 0.0, üres karakter (‘\0’), NULL, nullptr), akkor false-zá (hamissá) konvertálódik. Ekkor az else ág fut le.
- Ha a kifejezés értéke nem 0-val egyenértékű (pl. 1, -5, ‘A’, „szoveg”, egy fájl sikeres beolvasása), akkor true-vá (igazzá) konvertálódik. Ekkor az if blokk utasításai futnak le.
Ez elsőre furcsa lehet, de például a getline(fajl, valtozonev) függvény akkor ad vissza false értéket, ha elérte a fájl végét, így ezt közvetlenül használhatod if feltételként! Nagyon menő, igaz? 😎
Egy fontos dolog: Egy if elágazásban lévő utasításblokk csak egyszer fog lefutni. Ha többször szeretnél valamit végrehajtani, akkor ahhoz már ciklusok kellenek (pl. for, while, do-while), de erről majd a következő fejezetben mesélek! 🔄
Logikai Változók és Értékek: A true és false Királysága 👑
A logikai kifejezések eredménye mindig vagy true (igaz) vagy false (hamis) lehet. Gondolj rájuk úgy, mint két speciális „kulcsszóra”, amik a C++-ban úgy viselkednek, mint a számok vagy szövegek. A true és false literálok típusa bool (logikai).
Ezeket az igaz/hamis értékeket eltárolhatjuk bool típusú változókban is. Ez nagyon hasznos, ha egy feltételt többször is szeretnénk használni, vagy ha egy összetett feltétel eredményét szeretnénk tárolni:
int szam;
std::cout << "Kerem adjon meg egy szamot: " << std::endl;
std::cin > szam;
// A 'negativ_e' változó értéke true lesz,
ha a 'szam' negatív
bool negativ_e = (szam < 0);
if (negativ_e) {
// Ugyanaz, mint if (negativ_e == true)
std::cout << "A megadott szam negativ." << std::endl;
} else {
std::cout << "A megadott szam nem negativ
(azaz nulla vagy pozitiv)." << std::endl;
}
Tipp: Amikor egy bool változót ellenőrzöl az if feltételében, elegendő csak a változó nevét megadni (if (negativ_e)). A negativ_e == true alak szintaktikailag helyes, de feleslegesen hosszú és nem szokás használni. 😉
A ! Operátor: A Tagadás Mestere 🙅♀️
A ! operátorral egy logikai változó vagy kifejezés ellentétes értékét kaphatjuk meg. Ez a „nem” operátor!
bool bekapcsolva = true;
bool kikapcsolva = !bekapcsolva;
// kikapcsolva értéke false lesz
bool van_penz = false;
bool nincs_penz = !van_penz;
// nincs_penz értéke true lesz
Egyéb típusok konvertálása bool-lá és fordítva 🔄
- Ha egy bool változónak nem logikai, hanem más típusú értéket adsz, a C++ megpróbálja konvertálni:
- 0-val egyenértékű értékek (0, 0.0, ‘\0’, NULL, nullptr) false-zá válnak.
- Nem 0-val egyenértékű értékek (-1, 5, ‘A’, „szoveg”, üres string „”) true-vá válnak.
bool b;
b = 0; // b értéke false lesz
b = '\0'; // b értéke false lesz
b = 100; // b értéke true lesz
b = "valami";
// b értéke true lesz
(egy nem üres string pointere nem 0)
Ha egy bool értéket számmá konvertálsz:
- false to 0
- true to 1
int a = false; // a értéke 0 lesz
int b = true; // b értéke 1 lesz
Példa: Egy Szám Paritása (Páros vagy Páratlan) 짝홀
Nézzünk egy igazi példát, ahol az if-else és a logikai kifejezések is szerepet kapnak! Megírjuk azt a programot, ami eldönti, hogy egy felhasználó által megadott szám páros vagy páratlan.
Egy egész szám páros, ha kettővel elosztva 0 a maradék, és páratlan, ha a maradék 1 (vagy -1). A maradékot a % (modulo) operátorral tudjuk megállapítani. Például: 7 % 3 eredménye 1, mert 7=2times3+1.
Fontos! A % operátor csak egész szám típusú (pl. int) értékekkel működik! Lebegőpontos számokkal (float, double) nem használható, mert akkor hibaüzenetet kapsz a fordítótól!
Két érték egyenlőségét a == operátorral vizsgáljuk (nem összetévesztendő az = értékadó operátorral!). Ez a logikai kifejezés akkor lesz true, ha a két oldalán lévő érték megegyezik.
#include <iostream>
int main() {
int szam;
// Ebben tároljuk a felhasználótól bekért egész számot
std::cout << "Kerem adjon meg egy egesz szamot: "
<< std::endl;
std::cin >> szam;
// Bekérjük az értéket.
Ha tizedes számot ad meg, az int automatikusan
levágja a tizedes részt!
std::cout << "A megadott szam (" << szam << ") ";
// Itt a feltétel:
ha a számot 2-vel osztva a maradék 0, akkor páros
if (szam % 2 == 0) {
std::cout << "paros." << std::endl;
} else {
std::cout << "paratlan." << std::endl;
}
return 0;
}
Több Elágazás: Az if-else if-else Létra 🪜
Egy elágazásnak nem csak két ága lehet! Használhatsz egymásba ágyazott if-else elágazásokat, vagy a sokkal elegánsabb if-else if-else szerkezetet, ha több feltételt szeretnél ellenőrizni egymás után.
// Példa struktúra:
if (feltetel1) {
// Utasítások, ha feltetel1 igaz
} else if (feltetel2) {
// Utasítások,
ha feltetel1 hamis, de feltetel2 igaz
} else if (feltetel3) {
// Utasítások,
ha feltetel1 es feltetel2 hamis,
de feltetel3 igaz
} else {
// Utasítások, ha egyik feltétel sem igaz
}
Példa: Karakterek Elemzése (Kis- és Nagybetűsítés) 🔡
Nézzük meg egy másik példán, hogyan tudunk több feltételt is vizsgálni! Írjunk egy programot, ami beolvas egy karaktert, és ha az egy kisbetű, nagybetűsíti, ha egy nagybetű, kisbetűsíti, egyébként pedig kiírja, amit kapott.
ASCII Kódok Segítsége: Az ASCII táblában a karakterek számokkal vannak ábrázolva. Érdekes, hogy:
- Ha egy kisbetű ASCII kódjából levonsz 32-t, megkapod a neki megfelelő nagybetű ASCII kódját.
- Ha egy nagybetű ASCII kódjához hozzáadsz 32-t, megkapod a neki megfelelő kisbetű ASCII kódját.
Például: ‘a’ (ASCII: 97) −32to ‘A’ (ASCII: 65). ‘A’ (ASCII: 65) +32to ‘a’ (ASCII: 97).
Kódolás trükk: Ha egy számítást (karakter – 32) eredményét karakterként akarod kiíratni, a static_cast<char>(…) használatával „átkényszerítheted” a típust char-ra. Enélkül a program az ASCII kódot (számot) írná ki.
#include <iostream>
int main() {
char karakter;
std::cout << "Kerem adjon meg egy tetszoleges karaktert: "
<< std::endl;
std::cin >> karakter;
std::cout << "A megadott ertek eredetileg: "
<< karakter << std::endl;
std::cout << "A feldolgozott ertek: ";
// Ellenőrizzük, hogy nagybetű-e
(ASCII 65-90 között)
if (karakter >= 'A' && karakter <= 'Z') {
// 'A' és 'Z'
helyett használhatnánk a 65 és 90 számokat is!
std::cout << static_cast<char>(karakter + 32) << std::endl;
// Átalakítjuk kisbetűvé
}
// Ha nem nagybetű, ellenőrizzük,
hogy kisbetű-e (ASCII 97-122 között)
else if (karakter >= 'a' && karakter <= 'z') {
// 'a' és 'z' helyett 97 és 122
std::cout << static_cast<char>(karakter - 32) << std::endl;
// Átalakítjuk nagybetűvé
}
// Ha nem betű, akkor kiírjuk eredeti formájában
else {
std::cout << karakter << std::endl;
}
return 0;
}
Megjegyzés a feltételhez (&&): A && az úgynevezett logikai ÉS operátor. Azt jelenti, hogy az egész feltétel akkor lesz true, ha mindkét része igaz. Tehát: karakter >= ‘A’ ÉS karakter <= ‘Z’. Van még a || (logikai VAGY) és a ! (logikai NEM) operátor is, amikkel komplexebb feltételeket építhetsz!
Ezzel a tudással már képes vagy arra, hogy a programjaid döntéseket hozzanak, és különböző útvonalakon haladjanak a feltételektől függően! Ez egy hatalmas lépés a programozás világában! 🗺️
C++ Tudástár
- Bevezetés – Alapfogalmak
- Változók és konstansok a C++ nyelvben
- input, Output, Véletlenszám generálás
- Vezérlési szerkezetek a C++ nyelvben
- C++ haladó
- Tömbök: Az Adatok Kamrája
- Függvények
- Mutatók és referenciák
- Stringek és String Műveletek
- Struktúrák (struct): Egyedi Adattípusok Készítése
- Objektum orientált programozás
- Fájlkezelés
Kapcsolódó bejegyzések
- A State of AI Jelentés 5 Meglepő Tanulsága – Mit Üzen a Mesterséges Intelligencia Jövője?
- A Fájl, Ami Visszanéz – Kanári Tokenek
- Négy meglepő igazság a modern hekkertámadásokról
- Mi hajtja a számítástechnika forradalmait? – 3. rész
- A Számítástechnika Elképesztő Utazása 2.
- 💥 Az SQL Injection – Amikor a weboldalad saját magát árulja el
- A jövő munkahelyei:
- IoT eszközök: A kényelmes élet kulcsa vagy a privát szféra végét jelentik?
-
A titkosítás evolúciója: Hogyan vált a kulcsküldés problémája a digitális kor alappillérévé?
- Az internet titkos világa – Amit nem látsz a Google-ban