Gyakorlati alapok
A végtelen ciklus
A for ciklus című fejezetben már elhangzott néhány gondolat a végtelen ciklussal kapcsolatban, ebben a fejezetben ezt magyarázzuk és pontosítjuk tovább.
A való életben számos olyan dolog létezik, amely ciklikusan ismétlődik, sőt: (elméletileg) soha nem áll meg. A legelső példa erre talán maga az Anyatermészet, amelynek ciklikus tevékenysége ugyan a Nap halálával szintén meg fog szűnni, de addig nagy valószínűséggel számíthatunk áldásos működésére.
Sok emberi tevékenység szintén ciklikus, összefoglaló néven mindezt talán nevezhetjük bio-, vagy más esetben életritmusnak (például ébrenlét - alvás).
Sok ember alkotta gép-gépalkatrész-szoftver végez ciklikus, azaz folyamatos, soha meg nem szakadó tevékenységet. Nevezzünk meg néhányat közülük:
-
műhold,
-
óra,
-
ventillátor,
-
jelzőlámpa,
-
áramellátás vezérlő szoftvere,
-
processzoridő kiosztásának Round Robin nevű algoritmusa,
-
stb.
Közös jellemzőjük, hogy állandó tevékenységük pontosan kikapcsolásukig vagy az első áramszünetig, vagy éppen meghibásodásukig tart.
Ha a gépet előre megírt, számítógépes program vezérli, akkor bizonyosak lehetünk abban, hogy folyamatos tevékenységét egy vagy több belső ciklus működteti. Ezek a belső ciklusok noha véges számú lépést tartalmaznak, hatásuk mégis (elméletileg) végtelen ideig tart, megtartva az algoritmus egyik legfontosabb törvényszerűségét, miszerint az mindig önmagában zárt és véges lépést tartalmaz.
A végtelen ciklus jelenléte tehát alapjában véve nem rossz dolog, nem utal programozási hibára csakis akkor, ha olyan feladat során keletkezik, amelynek végrehajtása nem igényel végtelen ciklusos algoritmust.
Egy programozást oktató módszertanon belül alap-, és középszinten nem nagyon szokott előfordulni végtelen ciklust tartalmazó algoritmusos feladat, tehát szinte bizonyosak lehetünk abban, hogy végtelen ciklus jelenléte programozási hiba. Illetve az az eset is rossz programozás eredménye, ha a végtelen ciklus ugyan megfelelően implementált, de nem adtunk meg benne legalább 1 határozott kilépési pontot. Mert programozás-technikailag nem engedhető meg, hogy a végtelen ciklust ne lehessen leállítani.
Most pedig a tudás birtokában akasszuk ki a fordítót egy végtelen ciklussal!
Itt egy kicsit trükköznünk kell, mert az Eclipse rendkívül magas szintű hibadetektálása azonnal hibát jelez, ha a ciklus végértékét rosszul adjuk meg, de természetesen átverhető. Például a végértéket (int a) mindig növeljük a ciklusban (a++).
A végtelen ciklus futása a konzolos rész piros négyszöggombjával állítható le:
public class Main {
public static void main(String[] args) {
int a = 100;
for(int i = 0; i < a; i++){
a++;
System.out.println(i);
}
}
}
Végeredmény:
végtelen ciklus
Valójában végtelen ciklus generálása ennél kisebb erőfeszítéssel is megoldható, ekkor hiányosan töltjük ki a for ciklus fejlécét (for(int i = 0; ; i++)), amelyben tehát nem adunk meg zárófeltételt...
public class Main {
public static void main(String[] args) {
for(int i = 0;
; i++){
System.out.println("Végtelen ciklus...");
}
}
}
Végeredmény:
végtelen ciklus
...vagy egyszerűen nem is töltjük ki a for ciklus fejlécét (for(; ;))...
public class Main {
public static void main(String[] args) {
for(; ;){
System.out.println("Végtelen ciklus...");
}
}
}
Végeredmény:
végtelen ciklus
Egy harmadik megoldás a Feltételvizsgálat egyszerűbben című fejezetben ismertetett algoritmus. A végtelen ciklus hajtómotorja itt az elöltesztelős while(true) feltétel, bár a while(false) feltételnek ebben az esetben egyszerűen nincs is értelme, hiszen a cikluson belül elérhetetlen kódot eredményezne (unreachable code). A cikluson belüli folyamatok egészen addig tartanak, amíg azokat a System.exit(0) függvény meg nem szakítja:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String[] menu = new String[] {"1 - Kiírás", "0 - Kilépés"};
while(true){
System.out.println("\nKérem válasszon
az alábbi lehetőségekből: ");
for(int i = 0; i < menu.length; i++)
{
System.out.println(menu[i]);
}
String valasztas = in.nextLine();
if("1".equals(valasztas)) {
System.out.println("Jó móka ez a Java-programozás!");
}
if("0".equals(valasztas)) {
System.out.println("\nViszlát!");
System.exit(0);
}
}
}
}
Végeredmény (például):
Kérem válasszon az alábbi lehetőségekből:
1 - Kiírás
0 - Kilépés
X
Kérem válasszon az alábbi lehetőségekből:
1 - Kiírás
0 - Kilépés
1
Jó móka ez a Java-programozás!
Kérem válasszon az alábbi lehetőségekből:
1 - Kiírás
0 - Kilépés
s
Kérem válasszon az alábbi lehetőségekből:
1 - Kiírás
0 - Kilépés
0
Viszlát!
Természetesen végtelen ciklus generálható do-while ciklusok segítségével is. Alább egy elöltesztelő, valamint egy hátultesztelő ciklust (Dönteni kell! (do - while)) akasztunk ki egy while(true) utasítással:
public class Main {
public static void main(String[] args) {
while(true){
System.out.println("Végtelen ciklus...");
}
}
}
Végeredmény:
végtelen ciklus
public class Main {
public static void main(String[] args) {
do{
System.out.println("Végtelen ciklus...");
}while(true);
}
}
Végeredmény:
végtelen ciklus