Gyakorlati alapok
Dönteni kell! (do - while)
A for ciklus használatához valójában nincs szükség semmilyen további eldöntendő dologra, eseményre. Ha a ciklust működtető fejléc adatait (és persze a ciklus kódjait) jól adtuk meg...
for (i = kezdőérték; i <= végérték; léptetés)
...akkor az biztosan és korrekt módon le fog futni. Például írjuk ki a konzolra ötször a "Hello World!" üdvözletet:
public class
Main {
public static void main(String[] args) {
for(int i = 1; i <= 5; i++){
System.out.println("Hello World!");
}
}
}
Végertedmény:
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Ezzel ellentétben a do while ciklusok kizárólag akkor indulnak be vagy addig tartanak, amíg a beállított feltételek teljesülnek.
A do while kifejezést leginkább "Csináld, amely alatt (feltételváltozás)..." mondattal lehetne lefordítani.
Kétféle do while ciklusból válogathatunk:
-
elöltesztelő - a ciklus csakis akkor fut le, ha a ciklus elején beállított feltételek megfelelőek,
-
hátultesztelő - a ciklus egyszer mindenféleképpen lefut és utána addig, amíg a hátul beállított feltételek megfelelőek.
A háromféle ciklus különböző működését (for, elöltesztelő és hátultesztelő) a faktoriális-számításon keresztül mutatjuk meg.
Kis matematikai előzmény: faktoriális-számítások főleg a kombinatorikában fordulnak elő, amely olyan kérdésekkel foglalkozik: például 12 db biliárdlyukba hányféleképpen tehetünk 7 db golyót úgy, hogy 1 lyukba nem teszünk 1-nél többet?
Jelölése a "!" jel, például 5! = 120, ahol 5! = 1 x 2 x 3 x 4 x 5.
Először nézzük meg a számítást for ciklussal:
public class Main {
public static void main(String[] args) {
int eredmeny = 1;
for(int i = 1; i <= 5; i++){
eredmeny *= i;
}
System.out.println(eredmeny);
}
}
Végeredmény:
120
Az alábbi elöltesztelő ciklus (ekkor csak while szót + feltételt + blokk-zárójeleket /{}/ használunk) csakis azért fut le, mert a beállított futási feltétel megfelelő (i <= 5). Ha i kezdeti értéke nem 1 lenne, hanem mondjuk nagyobb 5-nél (i > 5), akkor soha nem lépnénk be a ciklusba. Illetve i értékét a cikluson belül növelnünk is kell (i++).
public class Main {
public static void main(String[] args) {
int eredmeny = 1;
int i = 1;
while (i <= 5){
eredmeny *= i;
i++;
}
System.out.println(eredmeny);
}
}
Végeredmény:
120
A hátultesztelésnél a ciklus egyszer mindenképpen lefut, mert a futási feltétel hátul van tesztelve. Ekkor már használjuk a do szót is. Az i értékét a cikluson belül szintén növelnünk kell (i++):
public class Main {
public static void main(String[] args) {
int eredmeny = 1;
int i = 1;
do{
eredmeny *= i;
i++;
}while (i <= 5);
System.out.println(eredmeny);
}
}
Végeredmény:
120
A fenti 3 példából jól látható, hogy egyetlen feladat elvégzése általában többféleképpen is lehetséges, adott tehát a kérdés, hogy melyiket válasszuk?
Az optimális eljárás mindig "feladatspecifikus", azaz mindig az adott feladat jellege határozza meg. A fenti példákban az elöltesztelő volt a legkevésbé hatékony, hiszen egyszerűen nem volt értelme a ciklus elöltesztelésének (bár így is működött, de programozás-technikailag hiba lenne erre a feladatra ezt választani).
A for ciklus és a hátultesztelő nagyjából azonos hatékonyságú, de én személy szerint úgy ítélem meg, hogy mivel ebben a matematikai feladatban valójában nincs külső feltétel, ezért a legtisztább eljárás a for ciklus használata.
Általánosságban kijelenthetjük, hogy fontos, külső feltételek várása-teljesülése esetén elöl-, vagy hátultesztelő ciklust, szimpla iteráció esetében pedig for ciklust érdemes használnunk.