A InfoWiki wikiből
(→Több értékkel visszatérő függvények) |
Aktuális változat (2009. december 5., 08:48) (lapforrás) |
||
53. sor: | 53. sor: | ||
Console.WriteLine("paratlan, kisebb 20 => {0}",k[1]); | Console.WriteLine("paratlan, kisebb 20 => {0}",k[1]); | ||
</code> | </code> | ||
+ | |||
+ | == Több érték visszaadása listával == | ||
+ | |||
+ | Amennyiben nem tömbbel, hanem listával dolgozunk, a megoldás menete nagyon hasonló: | ||
+ | |||
+ | <code lang="csharp"> | ||
+ | static List<int> megszamol(int[] t) | ||
+ | { | ||
+ | List<int> r = new List<int>(); | ||
+ | int db1=0; | ||
+ | int db2=0; | ||
+ | foreach(int x in t) | ||
+ | { | ||
+ | if (x%2==0 && x>20) db1++; | ||
+ | if (x%2==1 && x<30) db2++; | ||
+ | } | ||
+ | r.Add(db1); | ||
+ | r.Add(db2); | ||
+ | return r; | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | Hívása: | ||
+ | |||
+ | <code lang="csharp"> | ||
+ | int[] l = new int[30]; | ||
+ | for(int i=0;i<l.Length;i++) | ||
+ | l[i]=rnd.Next(10,100); | ||
+ | |||
+ | List<int> k = megszamol(l); | ||
+ | Console.WriteLine("paros, nagyobb 20 => {0}",k[0]); | ||
+ | Console.WriteLine("paratlan, kisebb 20 => {0}",k[1]); | ||
+ | </code> | ||
+ | |||
+ | |||
<alairas>Hernyák Zoltán</alairas> | <alairas>Hernyák Zoltán</alairas> | ||
__NOTOC__ | __NOTOC__ |
Aktuális változat
Több értékkel visszatérő függvények
Amennyiben valamely függvényünk nem egy, hanem mindjárt kettő vagy több értéket is előállít, úgy első pillantásra reménytelen helyzetbe kerülünk. A függvények ugyanis vagy nulla darab (void), vagy egy darab (adott típusú) értékkel képesek csak visszatérni, több visszatérési értékkel nem!
Felmerült egyszer a megoldási lehetőségek boncolgatása közben, hogy egymás után több return-t is adjunk ki a függvényben, így oldjuk meg a több értékes visszatérést. A return-ból többet lehet írni egy függvény törzsébe, de ezek közül csak az egyik hajtódhat végre konkrét lefutáskor. Az első return hatására ugyanis a függvény futása azonnal befejeződik, és visszatérünk a hívás helyére.
A több értékkel visszatérés egyik (legprimitívebb) megközelítésében egy (a legfontosabb) értéket a függvény adja vissza, a többi értéket visszatérése előtt helyezze el globális statikus változókba, ahonnan a hívó kód ki tudja (utólag bármikor) olvasni.
Másik lehetséges megoldás, hogy kimenő (out) vagy átmenő (ref) paramétereken keresztül adunk vissza értékeket (ezekből tetszőlegesen sokat).
Több érték visszaadása vektorral
Lehetőség van azonban olyan függvény írására is, amely nem egyszerű, hanem összetett adattípusú visszatérési értékkel rendelkezik (pl. tömb, lista, rekord).
static int[] megszamol(int[] t) { int[] r = new int[2]; foreach(int x in t) { if (x%2==0 && x>20) r[0]++; if (x%2==1 && x<30) r[1]++; } return r; }
Ebben a példában egyszerre számoltuk meg a páros és 20-nál nagyobb elemek számát, illetve a páratlan és 30-nál kisebb elemek számát. A visszatérés során egy kételemű vektort (pontosabban annak memóriacímét) adjuk vissza. Hívása:
int[] l = new int[30]; for(int i=0;i<l.Length;i++) l[i]=rnd.Next(10,100); int[] k = megszamol(l); Console.WriteLine("paros, nagyobb 20 => {0}",k[0]); Console.WriteLine("paratlan, kisebb 20 => {0}",k[1]);
Több érték visszaadása listával
Amennyiben nem tömbbel, hanem listával dolgozunk, a megoldás menete nagyon hasonló:
static List<int> megszamol(int[] t) { List<int> r = new List<int>(); int db1=0; int db2=0; foreach(int x in t) { if (x%2==0 && x>20) db1++; if (x%2==1 && x<30) db2++; } r.Add(db1); r.Add(db2); return r; }
Hívása:
int[] l = new int[30]; for(int i=0;i<l.Length;i++) l[i]=rnd.Next(10,100); List<int> k = megszamol(l); Console.WriteLine("paros, nagyobb 20 => {0}",k[0]); Console.WriteLine("paratlan, kisebb 20 => {0}",k[1]);