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 class Akarmi { static void Main() Adatbekeres(); //……………………………………………………………………. static void Main() Adatbekeres(); Console.WriteLine(”X={0}”,x); } static void Adatbekeres() Console.WriteLine(”X=”); int x = int.Parse( Console.ReadLine()); Az alprogram aktiválása! Az alprogram deklarációja. Az alprogram definíciója (utasítástörzs) 2
Alprogramok Alprogramok Van neki neve Utasítástörzse (utasításblokk) Nevével és két zárójellel lehet őket aktivizálni a bennük lévő utasítássorozatot Az utasítások végrehajtása után a program fut tovább az eredeti környezetben… 3
Alprogramok Alprogramok (eljárások) 4
Alprogramok class Akarmi { static void Main() Adatbekeres(); //……………………………………………………………………. static void Main() Adatbekeres(); Console.WriteLine(”X={0}”,x); } static void Adatbekeres() Console.WriteLine(”X=”); int x = int.Parse( Console.ReadLine()); 5
kívül vagyunk ‘x’ hatáskörén Alprogramok class Akarmi { //……………………………………………………………………. static void Main() Adatbekeres(); Console.WriteLine(”X={0}”, x ); } static void Adatbekeres() Console.WriteLine(”X=”); int x = int.Parse( Console.ReadLine()); ‘x’ itt deklarálatlan, kívül vagyunk ‘x’ hatáskörén 6
kívül vagyunk ‘x’ hatáskörén Alprogramok class Akarmi { //……………………………………………………………………. static void Main() int x; Adatbekeres(); Console.WriteLine(”X={0}”, x ); } static void Adatbekeres() Console.WriteLine(”X=”); x = int.Parse( Console.ReadLine()); ‘x’ itt deklarálatlan, kívül vagyunk ‘x’ hatáskörén 7
Ez két különböző ‘x’ változó! Alprogramok class Akarmi { //……………………………………………………………………. static void Main() int x; Adatbekeres(); Console.WriteLine(”X={0}”, x ); } static void Adatbekeres() Console.WriteLine(”X=”); int x = int.Parse( Console.ReadLine()); Ez két különböző ‘x’ változó! 8
A STATIC változók közösek az alprogramokban! class Akarmi { static int x; static void Main() Adatbekeres(); Console.WriteLine(”X={0}”, x ); } //……………………………………………………………………. static void Adatbekeres() Console.WriteLine(”X=”); x = int.Parse( Console.ReadLine()); A STATIC változók közösek az alprogramokban! 9
Alprogramok static int x; class Akarmi { static void Main() Adatbekeres(); Console.WriteLine(”X={0}”, x ); } static int x; static void Adatbekeres() Console.WriteLine(”X=”); x = int.Parse( Console.ReadLine()); A STATIC változók a teljes CLASS-on belül közösek, függetlenül a deklaráció helyétől! Ellentétben az alprogramok belsejében lévő változódeklarációval, ahol is a deklaráció helyétől LEFELÉ tart a hatáskör. 10
Alprogramok static int x; class Akarmi { static void Main() Adatbekeres(); Console.WriteLine(”X={0}”, x ); } static int x; static void Adatbekeres() Console.WriteLine(”X=”); x = int.Parse( Console.ReadLine()); A STATIC változók a teljes CLASS-on belül közösek, függetlenül a deklaráció helyétől! Ellentétben az alprogramok belsejében lévő változódeklarációval, ahol is a deklaráció helyétől LEFELÉ tart a hatáskör. 11
Alprogramok static int x; class Akarmi { static void Adatbekeres() Console.WriteLine(”X=”); x = int.Parse( Console.ReadLine()); } static void Main() Adatbekeres(); Console.WriteLine(”X={0}”, x ); Az osztályon belül a STATIC elemek (változók, eljárások) deklarálási sorrendje lényegtelen! 12
De csak ha PUBLIC jelöléssel is el van látva! Alprogramok class Masik { static void Main() Akarmi.Adatbekeres(); Console.WriteLine(”X={0}”, Akarmi.x ); } class Akarmi public static int x; public static void Adatbekeres() Console.WriteLine(”X=”); x = int.Parse( Console.ReadLine()); Másik osztályban lévő STATIC alprogram minősített névvel aktivizálható! De csak ha PUBLIC jelöléssel is el van látva! PUBLIC: a deklaráció hatáskörének kiterjesztése az osztályon kívülre is! 13
Alprogramok namespace EgyikNevTer { class Akarmi { public static void Adatbekeres() { … } } namespace MasikNevTer class Masik static void Main() EgyikNevTer.Akarmi.Adatbekeres(); Console.WriteLine(”X={0}”, x ); Másik osztályban lévő STATIC alprogram névtér + osztály + alprogram minősített névvel aktivizálható! 14
Alprogramok class Akarmi { static int Adatbekeres() Console.WriteLine(”X=”); int x = int.Parse( Console.ReadLine()); return x; } static void Main() int x = Adatbekeres(); Console.WriteLine(”X={0}”, x ); Az alprogram a végén egy számértéket fog előállítani, és visszaadni! return + egy int típusú kifejezés! Az alprogram aktiválása, és a visszatérési érték tárolása változóban. 15
Alprogramok Azt az alprogramot, aki értéket állít elő – függvénynek nevezzük A függvényeknél meg kell adni, milyen típusú értéket állítanak elő A nem függvény típusú alprogramokat eljárásoknak nevezzük Az eljárásoknál a visszatérési típust ‘void’ kulcsszóval kell jelölni A void szó a típusnélküliséget jelöli 16
Alprogramok A függvényekben a return használata kötelező! Az eljárárásokban is használható a return, de a return mögé ilyenkor semmit sem szabad már írni! static void Main() { int x = Console.ReadLine(); if (x==0) return; … } 17
Alprogramok minden függvény legalább 1 db return-t static bool Adatbekeres() { Console.WriteLine(”Logikai érték=”); string s = Console.ReadLine(); if (s.ToUpper()==”IGEN”) return true; return false; } return hatására a függvény azonnal befejezi a futását, és visszaadja a megadott értéket! minden függvény legalább 1 db return-t kell tartalmazzon A return egyfajta ugró utasításként viselkedik, azonnal kiugrik a függvény törzséből! 18
Alprogramok static bool Adatbekeres() { Console.WriteLine(”Logikai érték=”); string s = Console.ReadLine(); if (s.ToUpper()==”IGEN”) return true; if (s.ToUpper()==”NEM”) return false; } A C# fordító szerint nem garantált hogy minden esetben (minden ágon) lesz return ebben az alprogramban. ”Not all code paths returns a value” 19
A ‘tomb’ egy közös változó a függvények között. Alprogramok static bool Van_e_zero() { foreach(int x in tomb) if (x==0) return true; return false; } A ‘tomb’ egy közös változó a függvények között. static int Oszeg() { int sum = 0; foreach(int x in tomb) sum += x; return sum; } 20
Alprogramok Paraméterek Az alprogramok valamely al-feladat megoldására vannak kialakítva Az alfeladat megoldásához szükséges adatokat … Az alprogram maga kéri be Közös static változók tartalmazzák Paraméterekben kapja meg 21
Alprogramok Paraméterek … Az alprogram maga kéri be Általában nagyon gyenge, nagyon rossz megoldás! Így az alprogram kommunikál is a felhasználóval valamilyen interface-n És számolási műveleteket is végez… 22
Alprogramok Three-tier (three-layer) applications Data Storage Data files XML SQL servers Data Storage Application Logic User Interface WAP Windows Console WEB Alprogramok 23
Alprogramok Az alprogram maga kéri be a működéséhez szükséges adatokat Data Storage Application Logic User Interface Az az alprogram amelyik egy időben több rétegbe is tartozik – NEM JÓ! Mivel amennyiben cserélődik a user interface, úgy bele kell javítani az alprogramba is! 24
Alprogramok Az alprogram a közös változókban találja meg az adatokat Egy kicsivel jobb megoldás De a közös változó neve több eljárásban is bele van égetve Módosítás esetén sok helyen kell átírni A közös változók élettartama STATIC, vagyis a program elejétől a végéig életben vannak Szorítsuk a minimumra a közös változók használatát 25
Alprogramok Az alprogram paraméterekben kapja meg az adatokat A lehető legjobb megoldás (egyelőre) static bool Van_e_zero( int[] tomb, int ertek ) { foreach(int x in tomb) if (x==ertek) return true; return false; } Formális paraméterlista Formálisan változódeklaráció-lista (típus + név párosok) 26
Alprogramok Formális paraméterlista: static bool Van_e_zero( int[] tomb, int ertek ) { … } A paraméter-változók hatásköre csak az alprogramra terjed ki! Csak az alprogram futási idejében léteznek Kezdőértéküket a hívás helyén kell megadni 27
Alprogramok Paraméter-átadás: static void Main() { int[] elemek = new int[20]; bool b = Van_e( elemek, 0 ); } static bool Van_e ( int[] tomb, int ertek ) { for(int i=0;i<tomb.Length;i++) if (tomb[i]==ertek) return true; return false; } 28
Alprogramok Aktuális paraméterlista – értékeket tartalmaz bool b = Van_e( elemek, 0 ); tomb = elemek ertek = 0 static bool Van_e ( int[] tomb, int ertek ) A hívás során a formális paraméterlistában deklarált változók automatikusan felveszik az aktuális paraméterlistában megadott értéket az értékadás szabályainak megfelelően. 29
Alprogramok Aktuális és formális paraméterlista A háttérbeni értékadó utasítás miatt: Az aktuális paraméterlista pontosan annyi elemet kell tartalmazzon, mint a formális paraméterlista (ugyanis nincs alapértelmezett kezdőérték a paraméterváltozókra) 30
Alprogramok Aktuális és formális paraméterlista A háttérbeni értékadó utasítás miatt: Az aktuális paraméterlistában megadott érték az értékadó utasításoknál is megbeszélt típus-kompatibilitási szabályok szerinti típusúnak kell lennie (vagyis vagy megegyezik az érték típusa a fogadó változó típusával, vagy implicit típuskonverzió kell legyen a két típus között) bool b = Akarmi( 0 ); static bool Akarmi ( double ertek ) 31