05. TANANYAG · FORRÁSKÓD
Feltételválasztás
05_Feltetelvalasztas_kommentelt.csAnimáció megnyitása →
namespace Feltetelvalasztas // A namespace (névtér) összefogja és elkülöníti az ide tartozó kódelemeket; ennek a névtérnek a neve Feltetelvalasztas.
{ // A nyitó kapcsos zárójel jelzi, hogy itt kezdődik a Feltetelvalasztas névtérhez tartozó kódblokk.
internal class Program // Az internal azt jelenti, hogy ez az osztály ezen az assemblyn belül érhető el; a class egy Program nevű osztályt definiál.
{ // Itt kezdődik a Program osztály törzse.
static void Main(string[] args) // A Main a program belépési pontja; static: példány nélkül futtatható, void: nem ad vissza értéket, string[] args: parancssori argumentumok tömbje.
{ // Itt kezdődik a Main metódus törzse.
// 1. PÉLDA – ELÁGAZÁS: ELDÖNTJÜK, HOGY A MEGADOTT HÁROM OLDALBÓL SZERKESZTHETŐ-E HÁROMSZÖG.
Console.Write("A háromszög a oldala: "); // Kiírjuk a bekérő szöveget; a Write nem kezd új sort, ezért a felhasználó ugyanebben a sorban írhatja be az értéket.
// string aOldalSzöveg = Console.ReadLine(); // A ReadLine() a beírt adatot szövegként, vagyis stringként olvassa be; ez a kétlépéses megoldás első lépése lenne.
// int a = Convert.ToInt32(aOldalSzöveg); // A Convert.ToInt32() a szöveget egész számmá alakítaná; ez a kétlépéses megoldás második lépése lenne.
// int aOldal = Convert.ToInt32(Console.ReadLine()); // A beolvasás és az int típusra alakítás egyetlen sorban is elvégezhető.
double aOldal = Convert.ToDouble(Console.ReadLine()); // A ReadLine() által visszaadott szöveget a Convert.ToDouble() double típusú számmá alakítja, majd eltároljuk az aOldal változóban.
Console.Write("A háromszög b oldala: "); // Bekérjük a háromszög második oldalának hosszát.
// int bOldal = int.Parse(Console.ReadLine()); // A Parse is szöveget alakít számmá; ez a változat egész számot, vagyis int értéket várna.
double bOldal = double.Parse(Console.ReadLine()); // A double.Parse() a beolvasott stringet double típusú számmá alakítja, majd az eredményt a bOldal változó tárolja.
Console.Write("A háromszög c oldala: "); // Bekérjük a háromszög harmadik oldalának hosszát.
// int cOldal = int.Parse(Console.ReadLine()); // Ugyanez int típussal: a szövegből egész számot készítenénk.
double cOldal = double.Parse(Console.ReadLine()); // A double.Parse() a harmadik beolvasott oldalt is double típusú számmá alakítja.
// LOGIKAI OPERÁTOROK – több feltételt kapcsolhatunk össze velük.
// && – ÉS: az összekapcsolt feltételeknek egyszerre kell igaznak lenniük.
// || – VAGY: elég, ha az összekapcsolt feltételek közül legalább az egyik igaz.
// ! – NEM: megfordítja egy logikai kifejezés értékét; true-ból false, false-ból true lesz.
if (aOldal + bOldal > cOldal && aOldal + cOldal > bOldal && bOldal + cOldal > aOldal) // Az if feltétele azt vizsgálja, hogy mindhárom háromszög-egyenlőtlenség teljesül-e; az && miatt mindhárom részfeltételnek igaznak kell lennie.
{ // Ez a kódblokk csak akkor fut le, ha az if feltétele true, vagyis a három oldalból szerkeszthető háromszög.
double kerület = aOldal + bOldal + cOldal; // Összeadjuk a három oldal hosszát, és az eredményt a kerület nevű double változóban tároljuk.
Console.WriteLine($"A háromszög kerülete: {kerület}"); // String interpolációval kiírjuk a kerület változó aktuális értékét.
double s = kerület / 2; // Kiszámítjuk a félkerületet; a Heron-képletben ezt szokás s betűvel jelölni.
double terület = Math.Sqrt(s * (s - aOldal) * (s - bOldal) * (s - cOldal)); // A Heron-képlettel kiszámítjuk a területet; a Math.Sqrt() a zárójelben lévő érték négyzetgyökét adja vissza.
// terület = Math.Round(terület, 2); // A Math.Round() két tizedesjegyre kerekítené a területet, és a kerekített értéket visszaírnánk ugyanabba a változóba.
// Console.WriteLine($"A háromszög területe: {Math.Round(terület, 2)}"); // A kerekítés közvetlenül a kiíráskor is elvégezhető, külön értékadás nélkül.
Console.WriteLine($"A háromszög területe: {terület:F2}"); // Az F2 formátum két tizedesjeggyel jeleníti meg az értéket; ez a kiírást formázza, magát a terület változóban tárolt számot nem módosítja.
} // Itt ér véget az if igaz ágának kódblokkja.
else // Az else ág akkor következik, ha az if feltétele hamis, vagyis legalább egy háromszög-egyenlőtlenség nem teljesül.
{ // Itt kezdődik az else kódblokkja.
Console.WriteLine("A megadott adatokból nem szerkeszthető háromszög."); // Tájékoztatjuk a felhasználót arról, hogy a megadott három oldal nem alkothat háromszöget.
} // Itt ér véget az else kódblokkja.
// 2. PÉLDA – if / else if / else ÉS Parse HASZNÁLATA.
// Ebben a példában egy egész számot kérünk be, majd három különböző eset közül választunk.
Console.Write("Adj meg egy egész számot: "); // Kiírjuk a bekérő üzenetet; a felhasználó ugyanebben a sorban adhatja meg a számot.
int szám = int.Parse(Console.ReadLine()); // A ReadLine() szöveget ad vissza, az int.Parse() pedig ezt a szöveget int típusú egész számmá alakítja.
if (szám > 0) // Az első feltétel azt vizsgálja, hogy a szám nagyobb-e nullánál; a kifejezés eredménye true vagy false lehet.
{ // Ez az ág akkor fut le, ha a szám pozitív.
Console.WriteLine("A megadott szám pozitív."); // Kiírjuk, hogy a felhasználó pozitív számot adott meg.
} // Itt ér véget az első if ág.
else if (szám < 0) // Ez a feltétel csak akkor kerül vizsgálatra, ha az előző if hamis volt; azt ellenőrzi, hogy a szám kisebb-e nullánál.
{ // Ez az ág akkor fut le, ha a szám negatív.
Console.WriteLine("A megadott szám negatív."); // Kiírjuk, hogy a felhasználó negatív számot adott meg.
} // Itt ér véget az else if ág.
else // Ide csak akkor jutunk, ha a szám nem nagyobb és nem is kisebb nullánál, tehát csak nulla lehet.
{ // Itt kezdődik a végső else ág.
Console.WriteLine("A megadott szám nulla."); // Kiírjuk, hogy a felhasználó nullát adott meg.
} // Itt ér véget az else ág.
} // Ez a záró kapcsos zárójel lezárja a Main metódus törzsét.
} // Ez a záró kapcsos zárójel lezárja a Program osztályt.
} // Ez az utolsó záró kapcsos zárójel lezárja a Feltetelvalasztas névteret.
/*
* FELTÉTELVÁLASZTÁS: if ÉS else
* -----------------------------
*
* A programoknak gyakran döntést kell hozniuk.
* Például:
*
* - szerkeszthető-e háromszög a megadott oldalakból;
* - pozitív, negatív vagy nulla-e egy szám;
* - elérte-e valaki a szükséges pontszámot;
* - helyes-e egy megadott jelszó.
*
* Erre használjuk többek között az if utasítást.
*
* Alapformája:
*
* if (feltétel)
* {
* // Ez a rész akkor fut le, ha a feltétel igaz.
* }
* else
* {
* // Ez a rész akkor fut le, ha a feltétel hamis.
* }
*
* Az if után zárójelben egy logikai kifejezés áll.
* Ennek eredménye mindig bool érték:
*
* true -> igaz
* false -> hamis
*
* Például:
*
* int életkor = 20;
*
* if (életkor >= 18)
* {
* Console.WriteLine("Nagykorú.");
* }
* else
* {
* Console.WriteLine("Kiskorú.");
* }
*/
/*
* ÖSSZEHASONLÍTÓ OPERÁTOROK
* -------------------------
*
* Feltételekben nagyon gyakran két értéket hasonlítunk össze.
*
* > nagyobb mint
* < kisebb mint
* >= nagyobb vagy egyenlő
* <= kisebb vagy egyenlő
* == egyenlő-e
* != nem egyenlő-e
*
* Például:
*
* szám > 0
*
* igaz, ha a szám pozitív.
*
* szám == 0
*
* igaz, ha a szám pontosan nulla.
*
* Fontos különbség:
*
* = -> értékadás
* == -> összehasonlítás
*
* Például:
*
* int szám = 5; // A szám változó értéke 5 lesz.
* szám == 5 // Ez egy kérdés: a szám értéke egyenlő 5-tel?
*/
/*
* LOGIKAI OPERÁTOROK: &&, ||, !
* ------------------------------
*
* Több feltételt logikai operátorokkal kapcsolhatunk össze.
*
* && -> ÉS
* || -> VAGY
* ! -> NEM
*
* && – ÉS
* --------
*
* Akkor lesz igaz, ha mindkét oldal igaz.
*
* életkor >= 18 && életkor < 65
*
* Ez akkor igaz, ha az életkor legalább 18 ÉS 65-nél kisebb.
*
* || – VAGY
* ---------
*
* Akkor lesz igaz, ha legalább az egyik oldal igaz.
*
* nap == "szombat" || nap == "vasárnap"
*
* Ez akkor igaz, ha a nap szombat VAGY vasárnap.
*
* ! – NEM
* -------
*
* Megfordít egy logikai értéket.
*
* bool esik = true;
* !esik
*
* A !esik ebben az esetben false.
*/
/*
* A HÁROMSZÖG FELTÉTELE
* ---------------------
*
* Három pozitív oldalhossz akkor alkothat háromszöget, ha bármely két oldal
* összege nagyobb a harmadik oldalnál.
*
* A programban ezért három feltételt vizsgálunk:
*
* aOldal + bOldal > cOldal
* aOldal + cOldal > bOldal
* bOldal + cOldal > aOldal
*
* Ezeket && operátorral kapcsoljuk össze:
*
* if (aOldal + bOldal > cOldal &&
* aOldal + cOldal > bOldal &&
* bOldal + cOldal > aOldal)
*
* Mivel && szerepel közöttük, az egész feltétel csak akkor true,
* ha mindhárom részfeltétel true.
*
* Ha ez teljesül, lefut az if blokk, és kiszámoljuk a kerületet és a területet.
* Ha nem teljesül, az else blokk fut le.
*/
/*
* TÖBB ESET: if – else if – else
* ------------------------------
*
* Nem mindig csak két lehetőség közül szeretnénk választani.
* Ilyenkor egy vagy több else if ágat is használhatunk.
*
* Általános forma:
*
* if (elsőFeltétel)
* {
* // Ha az első feltétel igaz.
* }
* else if (másodikFeltétel)
* {
* // Ha az első hamis, de a második igaz.
* }
* else
* {
* // Ha egyik korábbi feltétel sem volt igaz.
* }
*
* A vizsgálat felülről lefelé történik.
* Amint a program talál egy igaz feltételt, végrehajtja annak a blokkját,
* majd az egész if – else if – else szerkezet után folytatja a futást.
*
* A program második példája:
*
* if (szám > 0)
* {
* Console.WriteLine("A megadott szám pozitív.");
* }
* else if (szám < 0)
* {
* Console.WriteLine("A megadott szám negatív.");
* }
* else
* {
* Console.WriteLine("A megadott szám nulla.");
* }
*
* Itt három, egymást kizáró esetünk van:
*
* szám > 0 -> pozitív
* szám < 0 -> negatív
* egyébként -> nulla
*/
/*
* Console.ReadLine(), Parse ÉS Convert
* -------------------------------------
*
* A Console.ReadLine() a felhasználó által beírt adatot szövegként,
* vagyis string típusú értékként adja vissza.
*
* string beolvasott = Console.ReadLine();
*
* Ha számként szeretnénk vele dolgozni, a szöveget számmá kell alakítani.
* Ezt többféleképpen is megtehetjük.
*
* 1. Parse
* --------
*
* A számtípus saját Parse metódusát használjuk:
*
* int szám = int.Parse("1212");
* double érték = double.Parse("12,5");
*
* Bekéréssel együtt:
*
* int szám = int.Parse(Console.ReadLine());
*
* A végrehajtás sorrendje belülről kifelé:
*
* Console.ReadLine()
* ↓
* beolvas egy stringet
* ↓
* int.Parse(...)
* ↓
* a stringből int értéket készít
* ↓
* int szám = ...
* ↓
* az eredményt eltároljuk a szám változóban
*
* Más típusoknak is van Parse metódusuk, például:
*
* int.Parse("1212")
* double.Parse("12,5")
* bool.Parse("true")
* DateTime.Parse("2025.09.12")
*
* A tizedesjel és egyes dátumformátumok értelmezése a rendszer
* területi beállításaitól is függhet.
*
* Fontos: ha a szöveg nem alakítható a kért típusra, a Parse hibát jelez.
* Például az int.Parse("alma") nem tud egész számot készíteni az "alma" szövegből.
* Ennek biztonságosabb kezelésére létezik a TryParse is, ezzel később érdemes foglalkozni.
*
* 2. Convert
* ----------
*
* A Convert osztály különböző típusokra alakító metódusokat biztosít:
*
* Convert.ToInt32(...)
* Convert.ToDouble(...)
* Convert.ToBoolean(...)
*
* Például:
*
* double oldal = Convert.ToDouble(Console.ReadLine());
*
* A mostani programban szándékosan mindkét megoldás megjelenik:
* az a oldalnál Convert.ToDouble(), a b és c oldalnál double.Parse(),
* a második példában pedig int.Parse().
*/
/*
* IMPLICIT ÉS EXPLICIT TÍPUSKONVERZIÓ
* -----------------------------------
*
* Típuskonverziónak nevezzük, amikor egy értéket egy másik típusú
* értékként szeretnénk használni.
*
* IMPLICIT – rejtett, automatikus konverzió
* ------------------------------------------
*
* Bizonyos átalakításokat a C# automatikusan elvégez, ha azok biztonságosak.
*
* Például:
*
* int egész = 12;
* double valós = egész;
*
* Az int értéke automatikusan átalakítható double típusra.
*
* Stringgel végzett összefűzésnél is történhet automatikus szöveggé alakítás:
*
* int a = 1;
* string b = "2";
* Console.WriteLine(a + b);
*
* A kiírt eredmény:
*
* 12
*
* Itt nem matematikai összeadás történik, hanem szöveg-összefűzés.
*
* EXPLICIT – kifejezett konverzió
* ------------------------------
*
* Ilyenkor mi adjuk meg, hogyan szeretnénk átalakítani az értéket.
* A Parse és a Convert is ilyen, szándékosan kért átalakítást végez.
*
* int szám = int.Parse("42");
* double oldal = Convert.ToDouble("12,5");
*/
/*
* EGÉSZ ÉS VALÓS OSZTÁS – A KIFEJEZÉS TÍPUSA
* -------------------------------------------
*
* Osztásnál különösen fontos, hogy milyen típusú értékek szerepelnek
* a kifejezésben.
*
* Ha mindkét operandus egész típusú, egész osztás történik:
*
* 5 / 3 -> 1
* 2 / 3 -> 0
*
* A tört rész ilyenkor elvész.
*
* Például:
*
* int a = 7;
* int b = 3;
* int c = a / b;
*
* c értéke 2 lesz.
*
* Fontos: attól, hogy az eredményt double változóba tesszük, az osztás
* még nem lesz automatikusan valós osztás:
*
* double c = a / b;
*
* Az a / b előbb int / int műveletként kiszámolódik, vagyis 2 lesz,
* és csak ezután kerül a 2 érték double változóba, tehát c értéke 2.0.
*
* Ha azt szeretnénk, hogy valós osztás történjen, legalább az egyik
* operandus legyen valós típusú:
*
* double c = a / 4.0; -> 1.75
* 2 / 3.0 -> 0.666666...
*
* A 4.0 és a 3.0 alapértelmezés szerint double literálok, ezért ezekben
* a kifejezésekben már valós osztás történik.
*/
/*
* A HERON-KÉPLET ÉS A KIÍRÁS FORMÁZÁSA
* ------------------------------------
*
* Ha a háromszög szerkeszthető, először kiszámítjuk a kerületet:
*
* double kerület = aOldal + bOldal + cOldal;
*
* Ezután a félkerületet:
*
* double s = kerület / 2;
*
* Mivel a kerület double típusú, itt valós osztás történik.
*
* A Heron-képlet:
*
* T = √(s · (s-a) · (s-b) · (s-c))
*
* C#-ban:
*
* double terület = Math.Sqrt(
* s * (s - aOldal) * (s - bOldal) * (s - cOldal)
* );
*
* A Math.Sqrt() a négyzetgyököt számítja ki.
*
* A kiírásnál:
*
* Console.WriteLine($"A háromszög területe: {terület:F2}");
*
* az F2 azt jelenti, hogy az értéket két tizedesjeggyel jelenítjük meg.
* Ez csak a megjelenítést befolyásolja; a terület változóban tárolt eredeti
* double érték nem változik meg.
*
* A Math.Round(terület, 2) ezzel szemben egy két tizedesjegyre kerekített
* számértéket ad vissza.
*/
namespace Feltetelvalasztas
{
internal class Program
{
static void Main(string[] args)
{
Console.Write("A háromszög a oldala: ");
double aOldal = Convert.ToDouble(Console.ReadLine());
Console.Write("A háromszög b oldala: ");
double bOldal = double.Parse(Console.ReadLine());
Console.Write("A háromszög c oldala: ");
double cOldal = double.Parse(Console.ReadLine());
if (aOldal + bOldal > cOldal && aOldal + cOldal > bOldal && bOldal + cOldal > aOldal)
{
double kerület = aOldal + bOldal + cOldal;
Console.WriteLine($"A háromszög kerülete: {kerület}");
double s = kerület / 2;
double terület = Math.Sqrt(s * (s - aOldal) * (s - bOldal) * (s - cOldal));
Console.WriteLine($"A háromszög területe: {terület:F2}");
}
else
{
Console.WriteLine("A megadott adatokból nem szerkeszthető háromszög.");
}
Console.Write("Adj meg egy egész számot: ");
int szám = int.Parse(Console.ReadLine());
if (szám > 0)
{
Console.WriteLine("A megadott szám pozitív.");
}
else if (szám < 0)
{
Console.WriteLine("A megadott szám negatív.");
}
else
{
Console.WriteLine("A megadott szám nulla.");
}
}
}
}