Gyakorlati alapok
A for ciklus
A számítógép gyakran dolgozik ismétlődő adatokkal, metódusokkal, ennek során valamilyen tevékenységet ismétel (idegen szóval iterál - iteration) valamennyi ideig vagy addig, amíg valami más meg nem szakítja. Mivel a programkód végrehajtása alapjában véve szekvenciális, pontosabban a main() főprogramban mindig felülről lefelé halad...
utasítás
↓
utasítás
↓
utasítás
↓
utasítás
...ezért bármilyen tevékenység-ismétlést kódismétléssel könnyű leprogramoznunk. Például írjuk ki a konzolra ötször, hogy Hello World!:
public class Main {
public static void main(String[] args) {
System.out.println("Hello World!");
System.out.println("Hello World!");
System.out.println("Hello World!");
System.out.println("Hello World!");
System.out.println("Hello World!");
}
}
Végeredmény:
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Ez nem túl elegáns megoldás és nincs is sok értelme. Az ismétlődés legegyszerűbb programozási szerkezete a for ciklus:
public class Main {
public static void main(String[] args) {
for(int i = 1; i <= 5; i++){
System.out.println("Hello World!");
}
}
}
Végeredmény:
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
A for ciklus fejléce kulcsfontosságú...
for (i = kezdőérték; i <= végérték; léptetés)
...mert benne deklaráljuk és inicializáljuk, hogy honnan indul a ciklus (int i = 1), meddig tart (i <= 5) és merrefelé (i++). Programozói konvenció, hogy a ciklusváltozót i betűvel jelöljük (egyesek az iterátor szóra, mások az index szóra vezetik vissza), több (egybeágyazott) for ciklus esetén pedig j, k, l betűkkel.
Továbbgondolva a fejléc információit, észrevehetjük, hogy a fejléc deklarációinak nincs közvetlen hatása a ciklus belső működésére, csupán annyi, hogy művelet hányszor legyen ismételve. Tehát a ciklus működéséhez alapértelmezésben nincs további feltétel. Ez a "feltételnélküliség" a meghatározó különbség az elöltesztelő és a hátultesztelő ciklussal szemben, ahol a ciklus működése egy vagy több feltételhez kötött.
A fentiekből következően egy növekvő léptetést alapjában véve szekvenciálisan így is le tudunk programozni, bár ez manapság már hajmeresztő megoldás, éppen ezért ettől mindenkit óva intek:
public class Main {
public static void main(String[] args) {
int i = 1;
System.out.print(i + " ");
i++;
System.out.print(i + " ");
i++;
System.out.print(i + " ");
i++;
System.out.print(i + " ");
i++;
System.out.print(i + " ");
}
}
Végeredmény:
1 2 3 4 5
Nézzük meg a megoldást a for ciklus bevetésével:
public class Main {
public static void main(String[] args) {
for(int i = 1; i <= 5; i++){
System.out.print(i + " ");
}
}
}
Végeredmény:
1 2 3 4 5
Természetesen a for ciklus nemcsak növekvő, hanem csökkenő léptetésre is beállítható:
public class
Main {
public static void main(String[] args) {
for(int i = 5; i >= 1; i--){
System.out.print(i + " ");
}
}
}
Végeredmény:
5 4 3 2 1
Most pedig a tudás birtokában akasszuk ki a fordítót egy végtelen ciklussal! (A végtelen ciklusról részletesen írok a következő fejezetben.) 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 egyszerűen nem 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