3. Pętle iteracyjne o danej liczbie powtórzeń: instrukcja for
Instrukcja for ma następującą postać. for (init; wyr; upd) ins gdzie:
Instrukcja for tworzy pętlę, która działa w następujący sposób:
Porównując instrukcję for z instrukcją while można wskazać, że taki sam efekt jak za pomocą instrukcji: init; while (wyr) { ins; upd; } Dobry styl programowania nakazuje używać instrukcji for wyłącznie w tym
celu.
Najprostsze zastosowanie ma instrukcja for przy organizacji pętli iteracyjnych ze znanym zakresem iteracji. W tym przypadku częśc init inicjuje licznik, wyrażenie wyr kontroluje granice licznika, część upd zmienia bieżącą wartość licznika.
Krótkie przykłady Zasięg zmiennych deklarowanych w części inicjacyjnej instrukcji for zaczyna się od miejsca deklaracji i kończy wraz z końcem instrukcji for
Obrazuje to poniższy rysunek: ![]()
Na przykład: Terminem redeklaracja określamy ponowną deklarację zmiennej lokalnej
w jej zasięgu, tzn. w bloku. Przypomnijmy: każda zmienne lokalna może być
deklarowana tylko raz w bloku i nie jest dopuszczalne przesłanianie nazw
zmiennych lokalnych w blokach wewnętrznych. Nazwy zmiennych, opisujących
pola klasy mogą być w blokach metod przesłaniane.
Oczywiście, wcale nie musimy deklarować zmiennych w części inicjacyjnej instrukcji for, ale - pamiętajmy, że zgodnie z ogólną zasadą - każda zmienna musi być przed użyciem zadeklarowana: int a =0, n = 10, i; for (i=0; i < n; i ++) a+=i; // Ok for (i=n; i < n*2; i++) a+=i; // Ok
Ale nie wolno pisać tak: Przed lekturą dalszego tekstu, proszę samodzielnie wykonać to zadanie, definiując odpowiednią metodę w klasie Liczba, którą mieliśmy opracować w poprzednim podpunkcie.
Możliwe rozwiązanie - metoda pow w klasie Liczba, która może być użyta na rzecz dowolnej liczby całkowitej: public class Liczba { int a; public Liczba(int liczba) { // konstruktor a = liczba; } //... public double pow(int n) { if (n < 0) { // warunek konieczny: n >=0 System.out.println("Niedopuszczalna wartość wykładnika"); return -0.1; } double wynik = 1; for (int i = 1; i <= n; i++) wynik *= a; return wynik; }
Zauważmy, że w pętli for zastosowaliśmy zmiany licznika od 1 do n (włącznie).
Ten sam efekt moglibyśmy osiągnąć pisząc: for (i=0; i<n; i++). Instrukcje w następujących pętlach for zostaną wykonane n - razy
for (int i = 1; i <= n; i++) .... for (int i = 0; i < n; i++) .... i pod względem liczby "obrotów" pętli obie instrukcje for są równoważne
Drugi praktyczny przykład zastosowania instrukcji for polega na rozwiązaniu następującego zadania. Przed lekturą dalszego tekstu proszę spróbować samodzielnie rozwiązać to zadanie.
Możliwe rozwiązanie: public double getBalanceAfter(int n) { double wspOds = (interest/100)/12; for (int i = 1; i <= n; i++) balance += wspOds*balance + monthIncome - monthExpend; return balance; }
Ogólnie, instrukcja for jest bardzo elastyczna. Spełniając reguły składniowe możemy pisać dosyć dziwne programy. import javax.swing.*; public class Napisy { final int LIMIT = 10; public static void main(String[] args) { new Napisy(); } public Napisy() { String ozdoba = null, txt = null; int n = 0; for (ozdoba = ask("Co wokół?"); n <= LIMIT && ozdoba != null && (txt = ask("Napis?")) != null; n++, System.out.println(n + ": " + ozdoba + txt + ozdoba) ); System.exit(1); } private String ask(String txt) { return JOptionPane.showInputDialog(txt); } }
Proszę skompilowac i wykonać ten program - tak by widzieć efekty jego działania. Ogólnie jednak: używajmy instrukcji for wyłącznie do konstruowania pętli
ze znaną liczbą lub zakresem iteracji, czyli w postaci:
for ( i = ?; i <?; i = i ą ?) ... wszystkie inne przypadki programując za pomoca instrukcji while lub do..while
Na koniec warto zwrócić uwagę na to, że pętle iteracyjne mogą być dowolnie zagnieżdżane. public class Nested { public static void main(String[] args) { String out = null; char c = 'a'; while (c <= 'd') { for (int i=1; i<=2; i++) { out = "Dla " + c + " " + i + " mamy j ="; for (int j = i; j <= i + 3; j++) out += " " + j; System.out.println(out); } c++; } } }
i uzyskać wydruk: Dla a 1 mamy j = 1 2 3 4
Dla a 2 mamy j = 2 3 4 5 Dla b 1 mamy j = 1 2 3 4 Dla b 2 mamy j = 2 3 4 5 Dla c 1 mamy j = 1 2 3 4 Dla c 2 mamy j = 2 3 4 5 Dla d 1 mamy j = 1 2 3 4 Dla d 2 mamy j = 2 3 4 5
Proszę przeanalizować wyniki i odpowiedzieć na pytanie: dlaczego sekwencje
|