Vezérlőpult
D2. Paraméterek és visszatérési érték · Metódusok

D blokk · Metódusok · 2. tananyag

Paraméterek és visszatérési érték

A D1-es metódusaink mindig ugyanazt csinálták. Az igazi erő ott kezdődik, amikor a metódusnak bemenete és kimenete van: adatot kap, dolgozik vele, eredményt ad vissza. A fejezet végére a B8-as Siker(string szoveg) fejléc utolsó ismeretlenje is a helyére kerül — és a makacs beolvasásból egyszer megírt, bárhonnan hívható eszköz lesz.

2 tanóraparaméter · argumentumreturn

Tanulási célok

1A metódus bemenete: paraméterek

Udvozol("Anna");
Udvozol("Bence");

void Udvozol(string nev)
{
    Console.WriteLine($"Szia, {nev}! Örülök, hogy itt vagy.");
}

Több paraméter vesszővel:

Vonal('=', 20);
Vonal('-', 30);

void Vonal(char jel, int hossz)
{
    for (int i = 0; i < hossz; i++)
    {
        Console.Write(jel);
    }
    Console.WriteLine();
}

Az argumentumok sorrendje és típusa kötött: az első a jel, a második a hossz. Ha felcseréled, a fordító szól (CS1503) — a típusrendszer (B1) itt is véd.

2A metódus kimenete: a return

Eddig a metódusaink csak csináltak valamit. A visszatérési értékű metódus eredményt ad, amellyel a hívó tovább dolgozhat:

int osszeg = Osszead(3, 4);
Console.WriteLine(osszeg);              // 7
Console.WriteLine(Osszead(10, 20));     // 30 — a hívás kifejezés!

int Osszead(int a, int b)
{
    return a + b;
}
ARGUMENTUMOK 3 4 a b A TÖRZS DOLGOZIK int Osszead(int a, int b) return a + b; return EREDMÉNY 7 int osszeg = …

A return korai kilépésre is jó — a C3-as őrfeltétel-gondolat metódusban:

string Minosites(int pontszam)
{
    if (pontszam < 0 || pontszam > 100)
    {
        return "érvénytelen pontszám";   // itt azonnal vége
    }
    if (pontszam >= 85)
    {
        return "jeles";
    }
    return "még gyakorolj";              // minden más eset
}
⚠️ MINDEN ÚTVONALON KELL RETURN

Ha van olyan kódútvonal, amelyen a metódus return nélkül érne véget, CS0161 fordítási hibát kapsz. Ezért áll a lánc végén egy „feltétel nélküli” return — az a „minden más” eset.

Bool-t visszaadó metódus — a C1-es feltételekkel kéz a kézben:

if (Paros(szam))
{
    Console.WriteLine("Páros!");
}

bool Paros(int ertek)
{
    return ertek % 2 == 0;      // a hasonlítás eredménye bool — pont jó
}

3Érték szerinti átadás: a metódus másolatot kap

int szam = 10;
Duplazo(szam);
Console.WriteLine(szam);        // 10 — NEM változott!

void Duplazo(int ertek)
{
    ertek *= 2;                 // csak a helyi másolat duplázódott
}

A paraméter a hívott metódus saját változója, amely az argumentum másolatát kapja (B1: az értéktípusok másolódnak). A metódus a hívó változóját nem éri el — és ez így van jól: a metódus nem tud „belenyúlni” a hívó adataiba.

Ha az eredmény kell, a helyes út a return:

int szam = 10;
szam = Duplaz(szam);            // a hívó DÖNT: felülírja a sajátját
Console.WriteLine(szam);        // 20

int Duplaz(int ertek)
{
    return ertek * 2;
}
ℹ️ ÉS AZ OUT?

A B6-os TryParse out kulcsszava pont ez alól a szabály alól ad kivételt: azzal a metódus mégis a hívó változójába ír. A D3-ban járjuk körül, hogyan és mikor.

Milyen fejléc illik hozzá?

Döntsd el a feladatról: kell-e bemenet, és kell-e visszaadott eredmény?

1 / 8Pontszám: 0
…

4Receptből eszköz: a Konzol.SzamotKer

A C5-ös makacs beolvasást eddig minden programba újra be kellett gépelni. Metódusként egyszer írjuk meg — a Konzol.cs-be, hogy minden projektünkben kéznél legyen:

public static int SzamotKer(string kerdes)
{
    int ertek;
    Console.Write(kerdes);
    while (!int.TryParse(Console.ReadLine(), out ertek))
    {
        Hiba("Egész számot kérek — próbáld újra!");
        Console.Write(kerdes);
    }
    return ertek;
}

Használata bármelyik programban:

int eletkor = Konzol.SzamotKer("Hány éves vagy? ");
int tipp = Konzol.SzamotKer("Tipped (1–100): ");

Két sor — és mindkét bekérés hibatűrő. Figyeld meg a fejlécen az egész fejezetet: string bemenet (a kérdés), int kimenet (a beolvasott szám), a törzsben pedig a C5-ös recept. (A Konzol.cs-en belül a Hiba(…) hívható Konzol. előtag nélkül — saját osztályán belül vagyunk.)

5Gyakori hibák

TünetMi történt?Mit tegyél?
CS0161: not all code paths return a valuevan olyan kódútvonal, ahol nincs returna lánc végére feltétel nélküli return (2. szakasz)
CS0029 a return sorábana visszaadott érték típusa nem egyezik a fejléccelint metódus int-et adjon — vagy igazítsd a fejlécet
CS1503: cannot convert from…az argumentumok sorrendje vagy típusa nem stimmelnézd a fejlécet: első paraméter — első argumentum
CS7036: There is no argument given…kevesebb argumentumot adtál, mint ahány paraméter vanannyi argumentum, ahány paraméter (kivételek: D3)
CS0162: Unreachable code detecteda return utáni sor sosem futhat lea return azonnal kilép — ami utána áll az ágban, törölhető
int x = Koszones(); nem fordulvoid metódust használtál értékkénta void nem ad vissza semmit — értékhez visszatérési típus kell
a hívó változója „nem változik meg”érték szerinti átadás: a metódus másolatot kapottadd vissza return-nel, és írd felül a hívónál (3. szakasz)

6Gyakorlat — a Konzol megtanul kérdezni

  1. Nyisd meg a C5-ös SzamKitalalo projektet (benne a Konzol.cs).
  2. Írd be a Konzol.cs-be a 4. szakasz SzamotKer metódusát, és teszteld egy egyszerű bekéréssel.
  3. Írd át a számkitalálót: minden bekérés a Konzol.SzamotKer(…) hívással történjen. Számold meg, hány sorral rövidült a program!
  4. Írj a programba egy bool Talalt(int tipp, int titkos) metódust is, amely eldönti a találatot — és használd a ciklus feltételében.
  5. Tesztelj minden útvonalat, majd commit: Konzol.SzamotKer + parameteres metodusok.
✅ ELLENŐRZŐ PONT

A számkitaláló ugyanúgy működik, mint eddig, de a Program.cs érezhetően rövidebb; a SzamotKer betűre és rossz számra is újrakérdez.

7Feladatok

Gyakorló feladatok

⭐ alap · ⭐⭐ haladó · ⭐⭐⭐ kihívás

D2.1⭐

Névre szóló üdvözlés: írj Udvozol(string nev) metódust, és hívd meg három különböző névvel.

D2.2⭐

Rugalmas vonalhúzó: írd át a D1.2-es Vonal() metódust úgy, hogy paraméterként kapja a hosszt ÉS a karaktert — húzz vele háromféle vonalat.

D2.3⭐⭐

A nagyobbik, metódusban: írj int Nagyobb(int a, int b) metódust (C1.3 emléke!), és használd két bekért számra. Mit adjon, ha egyenlők? Döntsd el, és kommentben indokold.

D2.4⭐⭐

Átlag-metódus: írj double Atlag(int a, int b) metódust. Vigyázz: a B3-as egészosztás-csapda metóduson belül is csapda! Ellenőrizd az 5 és 6 átlagával.

D2.5⭐⭐⭐

Konzol.IgenNem: írj a Konzol.cs-be public static bool IgenNem(string kerdes) metódust: kiírja a kérdést, és egyetlen billentyűt fogad el — i-re igazat, n-re hamisat ad vissza, minden másra újra kérdez (C5 do-while!). Használd egy rövid programban: „Kérsz még egy kört?”

8Önellenőrző kvíz

Ellenőrizd magad!

Minden kérdésnél egy válasz helyes. A végén pontszámot kapsz.

9Fogalomtár

FogalomJelentés
paramétera fejlécben deklarált „bemeneti változó”: (string nev) — a hívástól kapja értékét
argumentuma híváskor ténylegesen átadott érték: Udvozol("Anna")
visszatérési típusa fejléc első tagja: mit ad vissza a metódus (int, bool, … — vagy void: semmit)
returnmegadja az eredményt ÉS azonnal kilép a metódusból
kifejezés-hívása visszatérési értékű hívásnak értéke van: változóba, kiírásba, feltételbe tehető
érték szerinti átadása paraméter az argumentum másolatát kapja — a hívó változója nem módosul
kódútvonal-lefedésminden lehetséges úton kell return — különben CS0161

10Összegzés

  1. A paraméter a metódus bemenete (a fejlécben), az argumentum a híváskor átadott érték — sorrend és típus kötött.
  2. A return eredményt ad és azonnal kilép; a visszatérési értékű hívás kifejezés, amellyel tovább számolhatsz.
  3. Minden kódútvonalon kell return — a lánc végi feltétel nélküli return a bevett lezárás.
  4. Az átadás érték szerinti: a metódus másolatot kap, a hívó változóját nem módosítja — ha az eredmény kell, return + felülírás.
  5. A Konzol.SzamotKer(…) megszületett: a makacs beolvasás mostantól egyetlen hívás. Így válik a recept eszközzé.
  6. Ami hátravan a fejlécből: mi van, ha ugyanaz a név többféle bemenettel kellene — és mire jó az out meg a ref? Ez a következő fejezet.