Hernyák Zoltán Magasszintű Programozási Nyelvek I. Alprogramok Hernyák Zoltán Web: http://dragon.ektf.hu/aroan, E-Mail: aroan@aries.ektf.hu Magasszintű Programozási Nyelvek I. Eszterházy Károly Főiskola Számítástudományi tsz http://aries.ektf.hu 1
Alprogramok Paraméterek típusai: Bemenő paraméter: az értéket az alprogram felhasználja Átmenő paraméter: az érték helyén egy egyező típusú változót kell megadni, az alprogram felhasználja a benne lévő értéket, és meg is változtatja Kimenő paraméter: az érték helyén egy egyező típusú változót kell megadni, az alprogram nem használja fel a benne levő értéket, de megváltoztatja 2
Alprogramok Bemenő paraméter: static int Osszege( int[] tomb ) { int sum=0; foreach(int x in tomb) sum+=x; return sum; } static void Main() { int[] a = new int[300]; … feltöltés elemekkel … int x = Osszege(a); int[] b = new int[15]; int z = Osszege(b); } 3
Alprogramok Átmenő paraméter: static void Rendezes( int[] tomb ) { for(int i=0;i<tomb.Length-1;i++) for(int j=i+1;j<tomb.Length;j++) if( tomb[i]>tomb[j]) int z=tomb[i]; tomb[i] = tomb[j]; tomb[j]=z; } static void Main() { int[] a = new int[300]; … feltöltés elemekkel … Rendezes (a); } 4
Alprogramok Kimenő paraméter: static void Feltoltes( int[] tomb ) { Random rnd = new Random(); for(int i=0;i<tomb.Length;i++) tomb[i] = rnd.Next(10,100); } static void Main() { int[] a = new int[300]; Feltoltes (a); } 5
Alprogramok Paraméterek típusai: Bemenő paraméter: az értéket az alprogram felhasználja Alapértelmezett paraméterátadás, nem kell semmilyen extra jelölést használni A hívás helyén egyszerű adattípus esetén akár kifejezést is lehet írni 6
Alprogramok Bemenő paraméter: static int Osszead( int a, int b ) { return a+b; } static void Main() { int x = 13; int f = Osszead( 3, x ); int g = Osszead( f-1, f*2 ); int h = Osszead( Szoroz(2,8)+1 ,f*2 ); } 7
Alprogramok Kimenő paraméter: static void ElsoUtolso( int[] t, int elso, int utolso ) { elso=-1; utolso=-1; for(int i=0;i<t.Length;i++) if (t[i]==0 && elso==-1) elso=i; if (t[i]==0) utolso=i; } static void Main() { int[] h = new int[30]; int a,b; ElsoUtolso(h, a, b); Console.WriteLine(”{0},{1}”,a,b); } 8
Alprogramok Kimenő paraméter: static void ElsoUtolso( int[] t, int elso, int utolso ) { } int a=0,b=0; ElsoUtolso(h, a, b); a b elso utolso elso = a; utolso = b; elindul az alprogram nincs ilyen a = elso ; b = utolso; 9
Az ‘out’ kulcsszót mindkét helyen alkalmazni kell! Alprogramok Kimenő paraméter: static void ElsoUtolso( int[] t, out int elso, out int utolso ) { } int a,b; ElsoUtolso(h, out a, out b); elso utolso Az ‘out’ kulcsszót mindkét helyen alkalmazni kell! a b 10
Alprogramok Kimenő paraméter: static void ElsoUtolso( int[] t, out int elso, out int utolso ) { … } A formális paraméterlistában az ‘out’ azt jelenti, hogy ezen változót nem akárhol kell a memóriában létrehozni, hanem pontosan azon a helyen, ahol az aktuális paraméterlistában megadott változó is van A két változó egy helyen szerepel a memóriában! 11
Alprogramok Kimenő paraméter: int a,b; ElsoUtolso(h, out a, out b); Az aktuális paraméterlistában az ‘out’ azt jelenti, hogy ezen változóknak nem szükséges megelőzően értéket adni, mivel a bennük lévő értékeket az alprogram nem kívánja felhasználni majd Ezen változók értékét az al-program kötelezően meg kell változtassa! 12
Az ‘out’ paramétereknek kötelező értéket adni! Alprogramok Kimenő paraméter: static void ElsoUtolso( int[] t, out int elso, out int utolso ) { for(int i=0;i<t.Length;i++) if (t[i]==0 && elso==-1) elso=i; if (t[i]==0) utolso=i; } The out parameter ‘elso’ must be assigned to before control leaves the current method. Az ‘out’ paramétereknek kötelező értéket adni! A C# fordító nem biztos benne, hogy ez bekövetkezik ebben az esetben (pl ha a t tömb 0 elemszámú, vagy nincs nulla a tömbön belül)! 13
Alprogramok Referencia típusú paraméter: 1 1 eletkor | nev | ferfi static void Oregedes( Hallgato akarki ) { akarki.eletkor++; } Hallgato h = new Hallgato(); h.Eletkor = 20; Oregedes(h); Console.WriteLine(h.eletkor); akarki = h; 1 1 eletkor | nev | ferfi h akarki 1 14
Alprogramok Referencia típusú paraméter: static void Oregedes( Hallgato akarki ) { akarki.eletkor++; } Oregedes(h); A referencia-típusú paraméter-változókra is ugyanaz a szabály, de… A híváskor a kezdőérték beállításakor a memóriacímet veszik át Így rajtuk keresztül elérhető a másodlagos memóriaterület, és meg is változtatható 15
Alprogramok Referencia típusú paraméter: static void Feltoltes( int[] t ) { for(int i=0;i<t.Length;i++) t[i] = i+1; } int[] a = new int[20]; Feltoltes(a); 16
Alprogramok Referencia típusú paraméter: static void Feltoltes( int[] t ) { t = new int[20]; for(int i=0;i<t.Length;i++) t[i] = i+1; } int[] a=null; Feltoltes(a); int[] b=new int[30]; Feltoltes(b); 17
Alprogramok Referencia típusú paraméter: static void Feltoltes( out int[] t ) { t = new int[20]; for(int i=0;i<t.Length;i++) t[i] = i+1; } int[] a; Feltoltes( out a ); int[] b=new int[30]; Feltoltes( out b ); 18
Alprogramok Átmenő paraméter: static void Csere( ref int a, ref int b ) { int z = a; a = b; b = z; } int x=2, y=3; Csere( ref x, ref y ); A referencia-típusú paraméterátadás gyakorlatilag megegyezik a kimenő paraméterek kezelésével De a fordítóprogram megköveteli, hogy hívás előtt már legyen értéke az adott változónak, akit átadunk az eljárásnak! 19
Alprogramok Átmenő paraméter: static void Csere( ref int a, ref int b ) { if (a!=b) int z = a; a = b; b = z; } int x=2, y=3; Csere( ref x, ref y ); Az átmenő paramétereket az eljárás nem kötelezően kell megváltoztatnia! (ellentétben a kimenő paraméterekkel) 20