PEŁNY KURS TURBO PASCALA - część VIII
pętle goto oraz FOR..TO..DO / FOR..DOWNTO..DO
W poprzednich pętlach tak naprawdę to nie wiadomo było ile razy się dana pętla wykona. Program mógł ciągnąć się w nieskończoność. Aby temu zapobiec, wymyślono pętle „FOR..TO..DO” oraz „FOR..DOWNTO..DO”. Oba pętle nie różnią się zbyt od siebie. Zacznijmy może od pętli „FOR..TO..DO”. Załóżmy, że chcemy zrobić program, który będzie 100 razy wypisywał imię użytkownika. Najpierw użytkownik wprowadza imię, a potem zaczyna się pętla, która polega na 100 - krotnym wypisaniu jego imienia schodząc o linie niżej. Stosując tu znaną ci już pętle, można zrobić to w ten sposób.
USES CRT;
VAR
imie:string;
ilosc:longint;
BEGIN
clrscr;
writeln('Jak masz na imię?');
read(imie);
ilosc:=0;
REPEAT
ilosc:=ilosc+1;
writeln(imie);
UNTIL ilosc=100;
readln;
END.
Jak widzimy, pętla jest prosta i nie trzeba jej dogłębnie omawiać. Program wypisze 100 razy imię użytkownika i się wyłączy. Zatem, w pętli tej z góry ustalona jest ilość wykonania instrukcji. Wiemy, że na 100% pętla wykona się 100 razy. Nic nie jest w stanie tego zmienić. Można, zatem, aby było prościej, zastosować pętle „FOR..TO..DO”. Najpierw obejrzyjcie program, a potem wyjaśnienia (program wykonuje to, co poprzedni).
USES CRT;
VAR
imie:string;
ilosc:longint;
BEGIN
clrscr;
writeln('Jak masz na imię?');
read(imie);
FOR ilosc:=1 TO 100 DO
BEGIN
writeln(imie);
END;
readln;
END.
Jak widzimy, zmienne pozostają te same, początek też ten sam. Pętla zaczyna się słówkiem „FOR”. Jest to jej początek. Po tym następuje przypisanie wartości jakiejś zmiennej. Zauważmy, że przypisujemy wartość dopiero tutaj, a nie przed pętlą. Następnie widzimy słówko „TO” i wpisujemy wartość zmiennej. Wpisaliśmy 100. Ilość ta informuje już nas, że pętla wykonywać będzie się 100 razy. Było to zatem polecenie, ile razy pętla ma się wykonać. Później następuje słówko „DO” i w oddzielnych blokach „BEGIN”, „END” wpisujemy polecenia pętli. Najważniejsze jest, że nie wpisujemy tam już czegoś takiego: „ilosc:=ilosc+1;”. Jest to zawarte po słowie „FOR”. Gdy pojedyncza instrukcja pętli się zakończy, wartość zmiennej „ilosc” przyjmuje wartość +1. Dzięki temu stworzyliśmy program, który mimo, że wygląda inaczej, działa tak jak poprzedni. Stymulując język polski, będzie to wyglądało tak: Od „imie” równa się 1 do 100, rób … Pamiętać trzeba o kilku ważnych rzeczach. Instrukcje pętli wpisujemy w oddzielne bloki - wielu o tym zapomina. Jak widzimy, pętla ta może się do czegoś przydać.
To w takim razie, po jakiego grzyba, wymyślono pętlę „FOR..DOWNTO..DO”??? Otóż, poprzednia pętla ZWIĘKSZAŁA wartość zmiennej o 1. Natomiast pętla „FOR..DOWNTO..DO” działa identycznie, z tym, że ZMNIEJSZA wartość zmiennej o 1. Programu już myślę, że nie trzeba robić - wszyscy wiedzą, o co chodzi. Zajmijmy się czymś bardziej skomplikowanym.
Na pewno pamiętacie zagnieżdżanie pętli z poprzedniej lekcji. Robiliśmy tam program „tabliczka mnożenia”. Spróbujmy zrobić program ten, ale za pomocą omawianej właśnie pętli. Spójrz, jak prościej wygląda on od poprzedniej wersji.
USES CRT;
VAR
a,b:longint;
BEGIN
clrscr;
FOR a:=1 TO 10 DO
BEGIN
FOR b:=1 TO 10 DO
BEGIN
writeln(a,'*',b,'=',a*b);
END;
END;
readln;
END.
Jak widzimy, do tabliczki mnożenia lepiej jest wykorzystywać pętlę „FOR..TO..DO”, aniżeli pętle „REPEAT”.
Ponieważ czas nagli, przechodzimy szybko do drugiej pętli omawianej w tej lekcji. Jest ona najprostsza do zrozumienia. Nie przypomina, bowiem żadnego zawiłego powtarzania, a przejście z jednego miejsca programu do drugiego. Załóżmy, że chcemy, aby program w którymś tam momencie wracał do początku programu lub gdzieś w jego środek. Dla przykładu posłużymy się programem, gdzie użytkownik będzie musiał wpisać hasło (coś już takiego było zdaje się). Jeżeli nie wpisze poprawnego hasła, program powtarza zapytanie. Jeżeli wpisze, program się wyłącza. Można ten program zrobić oczywiście za pomocą innych pętli już ci znanych, ale użyjemy tu nowego polecenia „GOTO” - nie mylić z „GOTOXY”. Polecenie to przenosi nas w dowolną część programu. Miejsce, gdzie przenieść ma nas to polecenie, musi być zaznaczone w kodzie programu. Poza tym, tak jak i zmienne - musi być wcześniej zdeklarowane. Miejsce takie nazywa fachowo się „kotwicą” i tak będziemy je nazywać. Deklarować kotwice najlepiej jest zaraz po zmiennych. Zmienne deklarowaliśmy poleceniem „VAR”, kotwice natomiast deklaruje się poleceniem „LABEL”. W praktyce wygląda to tak:
USES CRT;
VAR
zmienna1:longint;
zmienna2:string;
LABEL miejsce1;
BEGIN
(i tak dalej...)
Jak widzimy, zadeklarowałem dwie zmienne (ale mniejsza z nimi) oraz kotwice o nazwie „miejsce1”. Kotwice deklarujemy po słowie „LABEL” i nie wpisujemy żadnych typów (po prostu je wymieniamy po przecinku bez żadnych dwukropków). Na końcu pamiętać trzeba jednak o średniku. Teraz mamy już zadeklarowaną kotwice o nazwie „miejsce1”, więc bez problemu możemy ją użyć (a raczej wstawić). Gotowy już program z hasłem, wygląda następująco:
USES CRT;
VAR
haslo:longint;
LABEL miejsce1;
BEGIN
miejsce1:
clrscr;
write('Podaj poprawne hasło: ');
read(haslo);
IF haslo<>123456 THEN goto miejsce1;
writeln('Brawo! Odgadłeś hasło!');
readln;
END.
W powyższym przykładzie kotwica o nazwie „miejsce1” znajduje się na początku programu. Kotwice mogą znajdować się również w innych miejscach. Kotwice wstawia się do programu tylko jeden raz. Wstawiamy jej nazwę i dwukropek. Później komputer czyści ekran i pyta użytkownika o hasło. Hasło jest równe 123456. Jeżeli ktoś wprowadził błędne hasło, komputer wykonuje instrukcję warunkową. W niej ma rozkaz „GOTO miejsce1”, co oznacza „idź do miejsce1”. Komputer nie patrząc praktycznie na dalszą część kodu, przechodzi do kotwicy tak właśnie oznaczonej. I znowu: czyści ekran, pyta urzytkow… i tak dalej. Zatem, napis z brawami nie ukaże się dopóty użytkownik wprowadzi poprawne hasło (czyli 123456). Na tym właśnie polega polecenie „GOTO”.
No i to by było na tyle jeśli chodzi o tą lekcję. Moim zdaniem, jeżeli przeczytałeś już wszystkie wcześniejsze lekcje i tą - jesteś na dobrej drodze, aby zostać programistą. Oczywiście, twoja wiedza jest jeszcze bardzo uboga, dlatego zapraszam do lekcji następnej.
4