Java programozási nyelv 2. rész – Vezérlő szerkezetek Nyugat-Magyarországi Egyetem Faipari Mérnöki Kar Informatikai Intézet Soós Sándor 2005. szeptember
Tartalomjegyzék Programozási módszertanok Strukturált programozás, struktogram Vezérlő szerkezetek JAVA-ban Az utasítás fogalma A blokk fogalma Egyszerű elágazás (if) Összetett elágazás (switch) Elöltesztelő ciklus (while) Hátultesztelő ciklus (do-while) For ciklus (for) For ciklus folyt. Címkék Break utasítás Continue utasítás Visszatérés egy metódusból (return)
Programozási módszertanok Egykoron: A programozás művészet volt Monolitikus programozás, egy ember ír egy programot A programnak nincs belső struktúrája Programozó zseni, nem tudja elmondani, hogyan csinálja! Szoftverkrízis Több programozóra van szükség Szükség van a programozók képzésére Egy program soha nincs készen, fel kell készülni a javításokra, továbbfejlesztésre, esetleg a programozó nélkül! Művészetből tudománnyá kellett alakítani a szakmát Ezért van szükség módszertanokra
Moduláris programozás Alapelv: Oszd meg és uralkodj! Top-down dekompozíció - Bottom-up kompozíció Előnyök: Tiszta szerkezet, tiszta kapcsolatok Egy-két helyen kell módosítani, ha valamilyen javításra, változtatásra van szükség Párhuzamos fejlesztést, tesztelést tesz lehetővé Egyszerre több ember dolgozhat egy feladaton Újrafelhasználhatóság, bizonyos modulok szabványosíthatók, újra felhasználhatók Hátrányok: Nem ad módszert arra, hogy tökéletesen jól működő modulokból hogyan lehet jó programot összeállítani.
Strukturált programozás DIJKSTRA: Hierarchikus programozás Top-down elven fokozatosan finomítjuk a programot. Nincsen bottom-up fázis. Minden szinten tudományosan bizonyítható a program helyessége. BOEHM ÉS JACOPINI: Minden algoritmus felépíthető a következő elemekből: szekvencia szelekció, elágazás iteráció, ciklus JACKSON-ELV: az adatszerkezetek is leírhatók a fenti három szerkezettel
Struktogram A strukturált programozás alapszerkezeteit egymásba ágyazott grafikus elemekkel ábrázoljuk. Amit le tudunk rajzolni, azt könnyedén átírhatjuk strukturált programmá, és viszont. Bármely strukturált programot le tudunk rajzolni struktogrammal. Alapfogalmak: http://www.ngkszki.hu/~fidoo/download/pmmf/ ProgTerv/STUKI.HTM
Struktogram alapelemek 1 Szekvencia Elágazás (if) utasítás 1 utasítás 2 Elágazás (switch)
Struktogram alapelemek 2 Előltesztelő ciklus (while) Kidolgozott példak: http://www.ngkszki.hu/~fidoo/download/pmmf/ ProgTerv/PELDAK.HTM Egy struktogram tervező program: http://www.myfriend.de/index.htm?/download.html
Példa struktogram
Vezérlőszerkezetek Java-ban A strukturált programozás megvalósítása JAVA-ban A C++ szintaktikájára épül kisebb eltérésekkel Ennek elemeit vesszük sorra a következő oldalakon Csak az eltéréseket emelem ki!
Az utasítás fogalma Utasítás: kifejezés utasítás deklaráció utasítás értékadás postfix, vagy prefix ++, ill. -- -szal képezett kifejezés metódushívás példányosítás (a new operátor használatával) deklaráció utasítás egy lokális változó létrehozása és opcionális inicializálása a lokális változó a deklarációtól az őt magában foglaló blokk végéig létezik A kétfajta utasítás tetszőleges sorrendben követheti egymást. Minden utasítást pontosvessző (;) zár le.
A blokk fogalma Blokk (utasítások szekvenciája): Utasítások { és } jelek közé írt sorozata Mindenhol, ahol utasítás írható, ott blokk is írható. Például: { int i; i = 123; int j = i*i; }
Egyszerű elágazás (if) if (logikai kifejezés) utasítás1 else utasítás2 Sajnos mindkét ágban állhat egyetlen utasítás is, ezért fennáll az if-then-else probléma: if (a == 1) { if (b == 2) { c = 1; } else { c = 2; } } if (a == 1) if (b == 2) c = 1; else c = 2;
Összetett elágazás (switch) switch (egész kifejezés) { case cimke1: utasítások; break; case cimke2: case cimke3: ... default: }
Elöltesztelő ciklus (while) while (logikai kifejezés) utasítás
Hátultesztelő ciklus (do-while) utasítás while (logikai kifejezés) Ha a logikai kifejezés hamis, egyszer akkor is lefut a ciklusmag!
For ciklus (for) for (kezdet; logikai kifejezés; továbblépés) utasítás Ez nagyjából ekvivalens a következővel: { kezdet; while (logikai kifejezés) { utasítás; továbblépés; }
For ciklus folyt. Miért csak nagyjából ekvivalens a kétféle ciklus? continue utasítás Miért fontos a külső zárójel a while ciklus körül?
Címkék Címke bármely utasítás elé tehetünk címkét, például: cimke: utasítás A most következő utasítások használhatók címkével és anélkül is. Ha megadunk címkét, akkor a címkével jelölt blokkra vonatkozik. Ha nem adunk meg címkét, akkor a legbelsőre.
Break utasítás Egy blokkból való kilépésre szolgál. Például: int i = 1; ciklus: while (i < 1000) { for (int j = 1; j <= i; j++) { if (KilepesTeszt(i, j)) break ciklus; … } Break utasítással nem lehet kilépni egy metódusból.
Continue utasítás A ciklusmag hátralévő részét átugorva, a ciklus feltételére kerül a vezérlés. For ciklus esetén a továbblépés is lefut! Például: while (! bemenet.eof()) { sor = bemenet.readln(); if (ures(sor)) continue; Feldolgoz( sor ); }
Visszatérés egy metódusból (return) Egy metódusból a return utasítással tudunk visszatérni. A return után írt kifejezés lesz a metódus visszatérési értéke. A Java fordító ellenőrzi, hogy a metódus minden lehetséges lefutása esetén végrehajtásra kerüljön egy return utasítás. Ha úgy találja, hogy ez nem teljesül, akkor fordítási hibát kapunk.
Nem létezik goto utasítás A Java nyelvben nincsen goto utasítás! Ennek ellenére a goto foglalt kulcsszó! Az eddig megismert szerkezetekkel - kiegészítve a később tárgyalandó finally-val - minden felmerülő programozási feladat megoldható.