fel
le

Több értékű függvények

Gyakoriak azok az esetek, amikor a függvényünk nem egy, hanem több értéket is előállít. Ez tovább bontható két alapesetre:

  • több értékünk van, de mindegyik ugyanazon típusú,
  • a visszatérési értékek típusa esetenként eltérő.

A probléma, hogy egy függvény egy időben csak egy visszatérési értékkel térhet vissza, most 3 különböző módon is kezelhető:

  • a függvény adjon vissza egy vektort,
  • a függvény adjon vissza egy listát,
  • a függvény adjon vissza egy rekordot.

Az első két megoldás csak akkor használható, ha a visszatérési értékek mindegyike azonos típusú (mivel ezt mind a vektor, mind a lista megköveteli). A harmadik megoldás (rekord) akkor is alkalmazható, ha azonosak a típusok, akor is, ha különbözőek.

Jegyezzük meg, hogy ezen esetekben van egy közös pont: a visszatéréshez szükséges vektort, listát, rekordot a függvény maga hozza létre, tölti fel értékekkel, és a return segítségével visszaadja a hívás helyére. Mivel ezek mind referencia típusok, így a return-nek memóriacímet kell visszaadnia, amit a hívás helyén fogadni és tárolni kell egy egyező típusú változóba. Ezen tárolt érték alapján lehet később elérni a függvény által elkészített és tárolt értékeket.

Vektorral visszatérő függvények

Legyen az az eset, amikor egy vektorban keressük a legkisebb és legnagyobb elem értékét. A keresés során minden elemet elő kell venni, meg kell vizsgálni. Készíthetünk olyan függvény változatot, amely mind a minimális elem, mind a maximális elem értékét meghatározza.

static int[] minMax(int[] t)
{
  int[] ret = new int[2];
  ret[0] = t[0];
  ret[1] = t[1];
  for(int i=1;i<10;i++)
  {
     if (t[i]<ret[0]) ret[0] = t[i];
     if (t[i]>ret[1]) ret[1] = t[i];
  }
  return ret;
}
 

Ebben a példában a ret[0] tárolja a minimális, a ret[1] a maximális elem értékét. A függvény elején már tudjuk, hogy pontosan 2 elemmel kell visszatérnünk majd, így a 2 elemű visszatérési vektort (ret) el is készítjük.

int[] r = minMax(miVektorunk);
Console.WriteLine("A legkisebb elem értéke {0}", ret[0]);
Console.WriteLine("A legnagyobb elem értéke {0}", ret[1]);
 

Fedezzük fel a problémát: azt a feldolgozás helyén tudni kell (valahonnan), hogy a 0. sorszámú elemben van a legkisebb, az 1. sorszámú elemben a legnagyobb érték. Ezt könnyű téveszteni, és csak a dokumentáció segíthet (vagy a függvény kódjának értelmezése).

Vektor feltöltése

Amikor olyan függvényt írunk, amelynek egy vektort kell feltölteni (pl. véletlen értékekkel), akkor választhatunk hogy paraméterként adjuk át a vektort, vagy a függvény állítja azt elő.

static void Feltoltes_1(int[] t, int min, int max)
{
  Random rnd = new Random();
  for(int i=0;i<t.Length;i++)
  {
    int x = rnd.Next(min,max+1);
    t[i] = x;
  }
}
// ..
// használat
// ..
int[] tx = new int[20];
Feltoltes_1( tx, 10, 90);
 

Ez esetben a vektor hossza nem paraméter, hiszen a vektort magát is megkapja a függvény, a hosszát le tudja kérni, csak elemekkel kell feltölteni ([min,max] intervallumból). Amikor a vektort neki kell előállítani, paraméterként érdemes átadni a létrehozandó vektor hosszát.

static int[] Feltoltes_2(int hossz, int min, int max)
{
  Random rnd = new Random();
  int[] ret = new int[hossz];
  for(int i=0;i<hossz;i++)
  {
    int x = rnd.Next(min,max+1);
    ret[i] = x;
  }
  return ret;
}
// ..
// használat
// ..
int[] tx = Feltoltes_2( 20, 10, 90);
 

Listával visszatérő függvény

Nincs jelentős különbség a két elképzelésben. Listával visszatérő függvényt hasonlóan kell elkészíteni, mint a vektorral visszatérő függvényt.

Legyen a feladat: egy vektorban lévő számokból válogassuk ki a páros, 5-nél nagyobb számokat (nem tudni hány lesz belőle):

static List<int> kivalogat(int[] t)
{
  List<int> r = new List<int>();
  foreach(int x in t)
  {
    if (x>5 && x%2==0) r.Add(x);
  }
  return r;
}
// ..
// használat
// ..
List<int> szamok = kivalogat( t );
 

Rekorddal visszatérő függvény

Ha egy függvény rekord-al kíván visszatérni, akkor korábban a rekordot deklarálni kell (létre kell hozni a rekord típust). Maradjunk a min-max értéket meghatározó függvény problémájánál:

//.................................................
// --
// rekord deklaráció
// --
class minMaxRec
{
  public int min;
  public int min;
}
//.................................................
// --
// a rekord példánnyal visszatérő fv
// --
static minMaxRec minMax(int[] t)
{
  minMaxRec r = new minMaxRec();
  r.min = t[0];
  r.max = t[1];
  for(int i=1;i<10;i++)
  {
     if (t[i]<r.min) r.min = t[i];
     if (t[i]>r.max) r.max = t[i];
  }
  return r;
}
//.................................................
// --
// használat
// --
minMaxRec f = minMax( miVektorunk );
Console.WriteLine("A legkisebb elem értéke {0}", f.min );
Console.WriteLine("A legnagyobb elem értéke {0}", f.max );
 
Hernyák Zoltán
2013-01-24 17:51:40