Ludzie pragnÄ czasami siÄ rozstawaÄ, Ĺźeby mĂłc tÄskniÄ, czekaÄ i cieszyÄ siÄ z powrotem.
Zmienne
deklarowane w częci opisowej programu, po deklaracji użycia pakietów nazy-
wamy zmiennymi globalnymi, gdyż ich wartoci sš dostępne w każdym miej-
scu programu. Wyjštek stanowi sytuacja, gdy w definicji procedury lub funkcji
została zadeklarowana zmienna lokalna o tej samej nazwie co zmienna globalna,
Wówczas w treci procedury jest dostępna tylko zmienna lokalna.
Poniżej zamieszczamy ostatniš już modyfikację programu drukujšcego wizy-
tówki.
PROGRAM Wizytowka5;
USES CRT,PRINTER;
VAR Licznik,Numer,Ile:INTEGER;
{W tym miejscu należy umiecić definicje procedur:
Start z przykładu 4.2,
DrukujWizytowkel z programu Wizytowka3,
DrukujWizytowke2 z programu Wizytowka4,
JuzKoniec z przykładu 4.5.}
BEGIN
REPEAT
Start;
WRITE('Podaj numer wizytówki, która chcesz ');
WRITELNCwydrukować (1 lub 2).');
4.1. Podstawowe instrukcje
123
READLN(Numer);
WRITELNCPodaj liczbę potrzebnych Ci wizytówek.');
READLN(Ile);
IF Ile>0 THEN BEGIN
WRITELNCWlacz drukarkę i nacisnij ENTER.');
READLN
END;
IF Numer=1 THEN
FOR Licznik:=1 TO Ile DO DrukujWizytowkel
ELSE IF Numer=2 THEN
FOR Licznik:=Ile DOWNTO 1 DO DrukujWizytowke2;
UNTIL JuzKoniec
END. {Wizytowka5}
Uwaga: Tekst programu Wizytowka5 znajduje się na dyskietce w pliku WIZYT5.PAS
umieszczonym w kartotece R0ZDZ4.
Instrukcje powtarzania mogš spowodować powstanie w programie pętli nie-
skończonej, gdy wyrażenie logiczne opisujšce warunek zakończenia działania
instrukcji WHILE lub REPEAT stale przyjmuje wartoć umożliwiajšcš powtarzanie
instrukcji (cišgu instrukcji) lub gdy w instrukcji FOR zaburzeniu uległy zmiany
wartoci zmiennej sterujšcej. Taka sytuacja, jeli nie panujemy nad niš, jest trak-
towana jako błšd programisty. Program, którego działania nie można wiadomie
zakończyć, nie jest interesujšcy z praktycznego punktu widzenia. Ogromnie waż-
nš sprawš jest zatem uzyskanie pewnoci, że napisany przez nas program jest
pozbawiony tego rodzaju błędów.
Na zakończenie tego punktu wymieńmy podstawowe instrukcje omówione do-
tychczas w tym rozdziale, służšce do zapisywania algorytmów w postaci progra-
mów w języku Pascal:
- instrukcja procedury, czyli wywołanie procedury,
- instrukcja przypisania,
- instrukcje warunkowe,
- instrukcja złożona,
- instrukcje powtarzania,
- instrukcja pusta.
Używalimy również procedur standardowych służšcych do wyprowadzania
wyników i wprowadzania danych oraz procedur i funkcji przez nas zdefiniowa-
nych, które ułatwiły opisanie często wykonywanych czynnoci i uczyniły teksty
programów bardziej przejrzyste. Więcej informacji o procedurach i funkcjach
znajduje się w następnych punktach.
124
4. Elementy programowania w języku Pascal
4.2. Od problemu do programu
Poznalimy podstawowe instrukcje użyteczne przy formułowaniu algorytmów.
Spróbujmy teraz przeledzić na wybranym przykładzie drogę od postawienia pro-
blemu do napisania gotowego do wykonania programu. Naszym przykładowym
problemem będzie znajdowanie największego wspólnego dzielnika dwóch niezero
wych liczb naturalnych. Oznaczmy te liczby przez a i b, a ich największy wspólny
dzielnik przez NWD(a,&).
Pierwszy i najprostszy pomysł to postępowanie w myl reguły:
Sprawdzaj podzielnoć liczb a i b przez kolejne liczby naturalne poczšwszy
od 1 aż do uzyskania największej, jednoczenie dzielšcej je obie. Zakończ
sprawdzanie po osišgnięciu mniejszej z liczb a i b.
Ucilijmy podany opis tak, by umożliwiał napisanie programu. Zastanówmyj
się, jakie informacje musimy pamiętać w programie. Na pewno sš to liczby a i i
dla których szukamy największego wspólnego dzielnika, ponadto bieżšca w danej
chwili liczba (oznaczmy jš przez d), dla której sprawdzamy podzielnoć, i bieżš
największy wspólny dzielnik (oznaczmy go przez wsp). Sprawdzanie podzielno|
polega na badaniu reszty z dzielenia - jeli reszta jest zerem, to odpowied je
pozytywna. Zapiszmy teraz algorytm oparty na powyższych spostrzeżeniach.
Algorytm 4.3. Szukanie największego wspólnego dzielnika dwóch liczb.
Dane: niezerowe liczby naturalne a i b.
Wynik: NWD(a,6).
1. Czytaj liczby a i b.
2. Ustal wartoć zmiennych d i wsp na 1.
3. Dopóki wartoć d nie jest większa od wartoci a lub 6, powtarzaj czynno(j
opisane w krokach 4 i 5, następnie przejd do kroku 6.
4. Jeżeli reszty z dzielenia a oraz b przez d sš równe zero, to nadaj zmiennej
wsp wartoć zmiennej d.
5. Zwiększ wartoć zmiennej d o jeden.
6. Drukuj wartoć wsp.
Ponieważ program komputerowy jest jedynie formš zapisu algorytmu, ktÓ!
jest głównym ogniwem na drodze od problemu do programu, proponujemy zapis*
nie powyższego algorytmu w języku Pascal jako samodzielne ćwiczenie (zad. 4.1),
Dla nas bardziej interesujšcym zagadnieniem jest projektowanie, odkryw;
nie nowych algorytmów oraz ulepszanie już znanych. Kontynuujšc rozważani
nad algorytmem znajdowania największego wspólnego dzielnika dwóch liczb, za-'
uważmy, że w pewnych przypadkach algorytm 4.3 jest bardzo pracochłonny. Na
przykład dla liczb 12346 i 12348 zostanie wykonanych 2 12346 operacji obli-
czenia reszty z dzielenia. Pomimo dużej szybkoci działania komputera zajmie
4.2. Od problemu do programu
125
to dłuższš chwilę. W praktyce, zwłaszcza w przypadku programów wielokrot-
nie uruchamianych, jest ważne, aby umożliwiały one wykonanie obliczeń w jak
najkrótszym czasie. Przedstawimy inny o wiele szybszy algorytm znajdowania
największego wspólnego dzielnika dwóch liczb. Jest to współczesna wersja zna-
nego już w starożytnoci algorytmu, który został opisany przez Euklidesa w jego
fundamentalnym dziele Elementy.
Algorytm 4.4. Algorytm Euklidesa znajdowania największego wspólnego dziel-
nika dwóch liczb.
Dane: niezerowe liczby naturalne a i b.
Wynik: NWD(o,6).
1. Czytaj liczby a i b.
2. Dopóki a i b sš większe od zera, powtarzaj krok 3, a następnie przejd do
kroku 4.
3. Jeli a jest większe od b, to we za a resztę z dzielenia a przez b, w prze-
ciwnym razie we za b resztę z dzielenia b przez a.