Rozdział 12 - Pętle

Załóżmy, iż chcesz wprowadzić pięć liczb i dodać je razem. Jednym ze sposobów (nie wpisuj tego, o ile nie czujesz obowiązku) jest wpisanie:

  10 LET SUMA=0
  20 INPUT A
  30 LET SUMA=SUMA+A
  40 INPUT A
  50 LET SUMA=SUMA+A
  60 INPUT A
  70 LET SUMA=SUMA+A
  80 INPUT A
  90 LET SUMA=SUMA+A
100 INPUT A
110 LET SUMA=SUMA+A
120 PRINT SUMA

Ten sposób jest złą praktyką programowania. Dla pięciu liczb jeszcze jest to do przyjęcia, lecz łatwo wyobrazić sobie, iż dla dziesięciu stałby się on uciążliwy, a dla 100 prawie niemożliwy. Lepszym rozwiązaniem jest zorganizowanie sobie zmiennej zliczającej do pięciu, a następnie zatrzymanie programu, jak poniżej (co już powinieneś wpisać):

10 LET SUMA=0
20 LET LICZNIK=1
30 INPUT A
40 REM LICZNIK = ILOSC WCZYTAN ZMIENNEJ A
50 LET SUMA=SUMA+A
60 LET LICZNIK=LICZNIK+1
70 IF LICZNIK<=5 THEN GOTO 30
80 PRINT SUMA

Zwróć uwagę jak łatwo można zmienić wiersz 70, aby program dodał dziesięć liczb czy nawet sto.

Taki rodzaj zliczania jest tak użyteczny, iż są dwa specjalne polecenia, aby go ułatwić: polecenie FOR i polecenie NEXT. Zawsze używa się ich razem. Wykorzystując je, właśnie wprowadzony przez ciebie program robi dokładnie to samo co:

10 LET SUMA=0
20 FOR L=1 TO 5
30 INPUT A
40 REM L = ILOSC WCZYTAN ZMIENNEJ A
50 LET SUMA=SUMA+A
60 NEXT L
80 PRINT SUMA

(aby otrzymać ten program z poprzedniego, musisz tylko wyedytować wiersze 20, 40, 60 i 70. TO otrzymasz z 4 z SHIFT).

Zwróć uwagę, iż zmieniliśmy nazwę zmiennej LICZNIK na L. Zmienna licznikowa - lub sterująca - pętli FOR-NEXT musi posiadać jednoliterową nazwę.

Wynikiem tego programu jest to, iż L przebiega kolejno przez wartości 1 (wartość startowa), 2, 3, 4 i 5 (wartość końcowa), a dla każdej z nich są wykonywane wiersze 30, 40 i 50. Następnie, gdy L osiągnęło wszystkie swoje pięć wartości, wykonany zostaje wiersz 80.

Dodatkowo zmienna sterująca wcale nie musi zmieniać swojej wartości za każdym razem co 1: możesz to zmienić na cokolwiek innego używając dodatku STEP do polecenia FOR. Najbardziej ogólną postacią polecenia FOR jest:

FOR zmienna sterująca = wartość początkowa TO wartość końcowa STEP krok

gdzie zmienna kontrolna posiada jednoliterową nazwę, a wartość początkowa, końcowa oraz krok są wyrażeniami liczbowymi. Zatem, jeśli w wierszu 20 programu wprowadzisz

20 FOR L=1 TO 5 STEP 3/2

to L przebiegnie przez wartości 1, 2.5 & 4. Zauważ, iż wcale nie musisz ograniczać się do liczb całkowitych oraz zmienna sterująca nie musi dokładnie osiągać wartości końcowej - pętla powtarza się dopóki jej zmienna sterująca jest mniejsza lub równa wartości końcowej (ale zajrzyj do ćwiczenia 4).

Musisz być ostrożny, gdy uruchamiasz razem dwie pętle FOR-NEXT - jedną wewnątrz drugiej. Wypróbuj ten program, który wyświetla kompletny zestaw kostek domina.

10 FOR M=0 TO 6
20 FOR N=0 TO M
30 PRINT M;":";N;" ";        
40 NEXT N
50 PRINT
60 NEXT M

pętla - N     
    |
pętla - N
pętla-M
    |
    |
    |
    |
pętla-M

Widać wyraźnie, iż pętla N jest w całości wewnątrz pętli M - są one poprawnie zagnieżdżone. Musimy natomiast unikać pętli FOR-NEXT, które zachodzą na siebie tak, iż jedna nie jest całkowicie wewnątrz drugiej, jak w tym przykładzie:

ŹLE 10 FOR M=0 TO 6
20 FOR N=0 TO M
30 PRINT M;":";N;" ";     
40 NEXT M
50 PRINT
60 NEXT N
pętla - M     
    |
    |
pętla - M

 


pętla - N
    |
    |
    |
pętla - N

Pętle FOR-NEXT muszą albo być w całości jedna w drugiej, albo zupełnie osobno.

Następną rzeczą do unikania jest wskakiwanie do wnętrza pętli FOR-NEXT z poza niej. Zmienna sterująca zostaje poprawnie zainicjowana tylko po wykonaniu jej polecenia FOR, a jeśli opuścisz je, to po napotkaniu polecenia NEXT komputer będzie zdezorientowany. Jeśli masz szczęście, otrzymasz wtedy komunikat 1 lub 2 (oznaczający, iż polecenie NEXT nie zawiera rozpoznawalnej zmiennej sterującej).

 

Podsumowanie 

Polecenia: FOR, NEXT, TO, STEP

 

Ćwiczenia

  1. Przepisz program z rozdziału 11, który wyświetla zestaw znaków, lecz teraz zastosuj w nim pętlę FOR-NEXT (odpowiedź w rozdziale 13).

 

 

  1. Zmienna sterująca nie posiada tylko nazwy i wartości, jak normalna zmienna, lecz również wartość końcową, krok oraz numer wiersza, do którego powraca pętla po każdym obiegu (wiersz za poleceniem FOR, gdzie została ustawiona). Po pierwsze przekonaj się, iż gdy polecenie FOR jest wykonywane, cała ta informacja jest dostępna (używając wartości początkowej jako pierwszej wartości przyjmowanej w pętli), a po drugie, że (używając jako przykłady nasz drugi i trzeci program) informacja ta jest wystarczająca, aby zamienić jeden wiersz:

NEXT C

na dwa wiersze:

LET C=C+1
IF
C<=5 THEN GOTO 30

(Właściwie troszkę tu oszukaliśmy: w rzeczywistości powinno być GOTO 21 zamiast GOTO 30. W naszym programie będzie to miało ten sam efekt.)

 

 

  1. Uruchom ten program, a następnie wpisz

PRINT C

Dlaczego w odpowiedzi dostajemy 6 a nie 5?

[Odpowiedź: polecenie NEXT w wierszu 60 jest wykonywane 5 razy i za każdym razem do C jest dodawane 1.] Co się stanie, jeśli w wierszu 20 wstawisz STEP 2?

 

 

  1. Zmień trzeci program tak, aby zamiast automatycznego dodawania pięciu liczb prosił on o podanie ilości liczb do dodania. Gdy uruchomisz ten program, to co się stanie przy wprowadzeniu 0 oznaczającego, iż nie chcesz dodawać żadnych liczb? Dlaczego mógłbyś podejrzewać, iż sprawi to komputerowi problem; chociaż jest oczywiste, czego chcesz? (komputer musi poszukać polecenia NEXT C, które zwykle nie jest konieczne). W rzeczywistości ZX81 sam się o to zatroszczy.

 

 

  1. Wypróbuj ten program wyświetlający liczby od 1 do 10 w odwrotnej kolejności:

10 FOR N=10 TO 1 STEP -1
20 PRINT N
30 NEXT N

Zmień go w program nie wykorzystujący pętli FOR-NEXT w taki sam sposób, jak zmiana programu 3 w program 2 (zobacz do ćwiczenia 2). Dlaczego ujemny krok wprowadza drobną różnicę?

 

 


   I Liceum Ogólnokształcące   
im. Kazimierza Brodzińskiego
w Tarnowie

©2018 mgr Jerzy Wałaszek

Dokument ten rozpowszechniany jest zgodnie z zasadami licencji
GNU Free Documentation License.

Pytania proszę przesyłać na adres email: i-lo@eduinf.waw.pl

W artykułach serwisu są używane cookies. Jeśli nie chcesz ich otrzymywać,
zablokuj je w swojej przeglądarce.
Informacje dodatkowe