Anda di halaman 1dari 16

IDZ DO

PRZYKADOWY ROZDZIA
SPIS TRECI

KATALOG KSIEK
KATALOG ONLINE
ZAMW DRUKOWANY KATALOG

Turbo Pascal.

wiczenia praktyczne
Autor: Andrzej Kierzkowski
ISBN: 83-7197-219-9
Format: B5, stron: 144
Zawiera dyskietk
Przykady na ftp: 73 kB

TWJ KOSZYK
DODAJ DO KOSZYKA

CENNIK I INFORMACJE
ZAMW INFORMACJE
O NOWOCIACH
ZAMW CENNIK

CZYTELNIA
FRAGMENTY KSIEK ONLINE

Wydawnictwo Helion
ul. Chopina 6
44-100 Gliwice
tel. (32)230-98-63
e-mail: helion@helion.pl

Niniejsza pozycja przeznaczona jest dla uczniw, studentw i wszystkich tych, ktrzy
pragn zaznajomi si z tajnikami programowania. Z pewnoci przyda si rwnie
nauczycielom, stanowic dla nich cenn pomoc w przygotowywaniu si do zaj
z uczniami.
wiczenia zawarte w tej ksice zapoznaj z podstawami programowania, a take
co stanowi jej niewtpliw zalet - ucz algorytmicznego mylenia i sprawnej
analizy sposobw rozwizania problemu.

Wstp .................................................................................................................................... 5
ROZDZIA 1. wiczenia z mylenia algorytmicznego ......................................................................... 7
1.1. Na dobry pocztek jednak prosty program................................................................................... 7
1.2. Wrmy do metod ........................................................................................................................... 8
1.3. Co powiniene zapamita z tego cyklu wicze.......................................................................... 17
1.4. wiczenia do samodzielnego rozwizania .................................................................................... 18

ROZDZIA 2. Schematy blokowe ......................................................................................................... 21


2.1.Podstawowe informacje i proste wiczenia................................................................................... 21
2.2. Co powiniene zapamita z tego cyklu wicze.......................................................................... 26
2.3. wiczenia do samodzielnego rozwizania .................................................................................... 27

ROZDZIA 3. Podstawy Turbo Pascala............................................................................................... 29


3.1. Krtki kurs obsugi rodowiska zintegrowanego .......................................................................... 30
3.2. Struktura programu w Turbo Pascalu............................................................................................ 32
3.3. Instrukcje wyjcia (write i writeln)................................................................................................ 33
3.4. Stae i zmienne, najczciej stosowane typy ................................................................................. 39
3.5. Predefiniowane funkcje ................................................................................................................. 45
3.6. Instrukcje wejcia (read i readln)................................................................................................... 47
3.7. Instrukcja warunkowa.................................................................................................................... 49
3.8. Ptla for ........................................................................................................................................ 54
3.9. Inne rodzaje ptli .......................................................................................................................... 61
3.10. Funkcje i procedury ..................................................................................................................... 67
3.11. Co powiniene zapamita z tego cyklu wicze........................................................................ 77
3.12. wiczenia do samodzielnego rozwizania .................................................................................. 78

ROZDZIA 4. Zagadnienia trudniejsze ............................................................................................... 83


4.1. Tablice ........................................................................................................................................... 83
4.2. Definiowanie wasnych typw ...................................................................................................... 89
4.3. Moduy standardowe ..................................................................................................................... 97
4.4. Instrukcja wyboru (case) ............................................................................................................. 106
4.5. Zbiory .......................................................................................................................................... 109
4.6. Typ rekordowy ............................................................................................................................ 113
4.7. Obsuga plikw............................................................................................................................ 118
4.8. Wskaniki .................................................................................................................................... 126
4.9. Co powiniene zapamita z tego cyklu wicze........................................................................ 136
4.10. wiczenia do samodzielnego rozwizania ................................................................................ 137

Pewnie oczekujesz wstpu do Pascala, wyjanienia, czym jest, wiczenia programu, ktre
pozwoli wypisa co na ekranie, opisu budowy programw albo informacji o obsudze samego
programu. Tymczasem w najbliszym czasie nie bdziemy si zajmowa Pascalem. Zajmiemy
si czym, co jest trzonem programowania czyli algorytmami. Aby nie zaczyna jednak
cakiem na sucho, pierwsze wiczenie niech jednak bdzie dziaajcym programem. Nie bdziemy si na razie wgbia w jego budow. Sprbujmy go na razie wpisa, uruchomi i zobaczy
efekt jego dziaania.

wiczenie 1.1

Napisz i uruchom program, ktry przywita Ci Twoim imieniem.


Uruchom program Turbo Pascal, wpisujc polecenie turbo. Z menu File wybierz New (lub
wcinij kombinacj klawiszy Alt-F-N). W otwarte okienko edycyjne wpisz poniszy program:
program cw1_1;
{ Program wypisuje powitanie osoby, ktora
}
{ wlasciwie wpisze swoje imie w odpowiednie miejsce. }
{ dyskietka: 1_01.pas
}
const
imie = 'Andrzej'; { Tu wpisz wlasne imie }
begin
writeln ('Witaj, ' + imie + '!');
end.

Przepisz go dokadnie i bez bdw kada pomyka moe spowodowa kopoty z uruchomieniem. Nawet kropka na kocu jest istotna! Jedyn zmian, ktr moesz wprowadzi to
zmiana imienia Andrzej na wasne. Nie musisz te koniecznie wpisywa tekstw w nawiasach

C:\Andrzej\PDF\TurboPascal - wiczenia praktyczne\01.doc

Turbo Pascal wiczenia praktyczne


klamrowych. Tak w Turbo Pascalu oznaczane s komentarze, nie majce wpywu na dziaanie programu, ale majce kolosalne znaczenie w przypadku, kiedy program trzeba bdzie
poprawi albo wyjani komu jego struktur. Mimo tego, e komentarzy wpisywa nie musisz, zrb to, aby od pocztku nabra dobrych przyzwyczaje. I nie daj si zwie myli, e
zrobisz to pniej. Ja wielokrotnie obiecywaem sobie, e poniewa jest mao czasu, bd
pisa sam tekst programu, a kiedy, w wolnej chwili, opisz go komentarzami. Jak si nietrudno domyli, zaowocowao to tysicami wierszy nieopisanego tekstu w Turbo Pascalu,
ktry nigdy ju nikomu si do niczego nie przyda. Zrozumienie, w jaki sposb program
dziaa moe zaj wicej czasu ni napisanie go od nowa. Wpisujc, nie zwracaj uwagi na
to, e niektre sowa s pogrubione. Zostay tak oznaczone jedynie dla poprawienia czytelnoci
tekstu. Jeeli korzystasz z Turbo Pascala w wersji 7.0, zostan one zreszt automatycznie
wyrnione podczas wpisywania.
Nadszed moment uruchomienia. Wcinij klawisze Ctrl-F9 (jest to odpowiednik wybrania
z menu Run polecenia Run, albo wcinicia kombinacji klawiszy Alt-R-R). Jeeli przy wpisywaniu programu popenie bdy, informacja o tym pojawi si w grnym wierszu okna.
Nie prbuj na razie wgbia si w jej tre, tylko jeszcze raz dokadnie przejrzyj program
i popraw bd. Jeeli program wpisae poprawnie, nie zobaczysz nic. A gdzie powitanie?
Powitanie jest, tyle e ukryte. Turbo Pascal wyniki dziaania programw ukazuje na specjalnym,
do tego celu przeznaczonym ekranie (ang. user screen) ktry, na razie jest niewidoczny. Aby
przeczy si do tego ekranu, naley wcisn klawisze Ctrl-F5. Powrt nastpuje po wciniciu dowolnego klawisza.
Oto, co powiniene zobaczy na ekranie:
Turbo Pascal Version 7.0
Witaj, Andrzej!

Copyright (c) 1983,92 Borland International

Na koniec trzeba wyj z Turbo Pascala. Wcinij kombinacj Alt-X (co odpowiada wybraniu
z menu File polecenia Quit (wersja 5.5) bd Exit (wersje 6 i 7). Na pytanie, czy zapisa zmiany,
odpowiedz negatywnie.

No wanie. Przekonae si, e komputer do spki z Pascalem potrafi zrozumie to, co masz
im do powiedzenia, wic pora... zaj si teori. Tak powiniene robi zawsze, kiedy przyjdzie
Ci rozwiza jaki problem za pomoc komputera. Warto si z kartk papieru i zastanowi
si nad jego istot. Kada minuta powicona na analiz problemu, moe zaowocowa
oszczdnoci godzin podczas pisania kodu... Najwaniejsze jest dobrze problem zrozumie
i wymyli algorytm jego rozwizania. No wanie. Co to sowo tak waciwie oznacza?
Najprociej rzecz ujmujc, algorytm to po prostu metoda rozwizania problemu, albo piszc
inaczej przepis na jego rozwizanie. Oczywicie nie jest to tylko pojcie informatyczne
rwnie dobrze stosuje si je w wielu dziedzinach ycia codziennego (jak choby w gotowaniu).
Rwnie dobrze jak myle o przepisie na ugotowanie makaronu mona rozwaa algorytm
jego gotowania. Rozwaajc algorytm rozwizania problemu informatycznego, naley mie
na uwadze:
M dane, ktre mog by pomocne do jego rozwizania wraz ze sposobem ich prze-

chowania, czyli struktur danych,


M wynik, ktry chcemy uzyska.

C:\Andrzej\PDF\TurboPascal - wiczenia praktyczne\01.doc

Rozdzia 1. M wiczenia z mylenia algorytmicznego

Gdzie w tle rozwaamy te czas, ktry mamy na uzyskanie wyniku z danych. Oczywicie,
tak na prawd mylimy o dwch czasach: jak szybko dany program trzeba napisa i jak
szybko musi dziaa. atwo jest szybko napisa program, ktry dziaa wolno, jeszcze atwiej
wolno taki, ktry dziaa jak w. Prawdziw sztuk jest szybko napisa co, co pracuje
sprawnie. Warto jednak mie na uwadze, e zwykle program (bd te jego cz) jest pisany raz, a wykorzystywany wiele razy, wic o ile nie grozi to zawaleniem terminw warto
powici czas na udoskonalenie algorytmu.
Rozwaajc wic dane, ktre masz do dyspozycji oraz majc na uwadze czas, musisz okreli, w jaki sposb taki wynik uzyska. Inaczej mwic musisz okreli dziaania, ktrych
podjcie jest konieczne do uzyskania wyniku oraz ich waciw kolejno.
wiczenie 1.2

Zapisz sposb, czyli algorytm gotowania makaronu.


Wrmy do przykadu z makaronem. By moe istniej inne sposoby jego ugotowania, ale
moja metoda (algorytm) jest nastpujca. Przyjmuj, e mam makaron spagetti jakoci pozwalajcej uzyska zadowalajcy mnie wynik, sl, wod, garnek, cedzak, minutnik i kuchni.
Makaron proponuj ugotowa tak:
1. Wsypa makaron do garnka.
2. Nala do garnka wod tak, aby makaron zosta przykryty.
3. Posoli do smaku (w kuchni takie pojcie jest atwiej akceptowalne ni w informatyce

tu trzeba by dokadnie zdefiniowa, co oznacza do smaku, a by moe zaprojektowa jaki system doradzajcy, czy ilo soli jest wystarczajca; poniewa chcemy
jednak stworzy algorytm prosty i dokadny, przyjmijmy moj norm yki kuchennej soli na 5 litrw wody.
4. Gotowa wod z makaronem na kuchni. Po zagotowaniu czeka okoo 8 minut.
5. Zagotowany makaron odcedzi cedzakiem.
6. Rwnie uywajc cedzaka pola makaron dokadnie zimn wod, aby si nie skleja.
7. Przesypa makaron na talerz.

No i jedzenie gotowe. Mona jeszcze pomyle nad przyprawieniem makaronu jakim sosem, ale to ju inny algorytm. Nie mwi przy tym, e przedstawiona metoda jest najlepsza
czy jedyna. To po prostu mj algorytm gotowania makaronu, ktry mi smakuje.
Warto zwrci uwag, e oprcz samych skadnikw oraz czynnoci do wykonania niezwykle
wana jest kolejno wykonania tych czynnoci. Makaron posolony ju na talerzu (po punkcie 7
algorytmu) smakowaby duo gorzej (cho musz szczerze przyzna, e ju mi si zdarzya
taka wpadka). Polewanie zimn wod makaronu przed woeniem go do garnka (a wic
przed punktem 1) na pewno nie zapobiegnie jego sklejeniu. Ju nie mwi o takiej katastrofie,
jak by byo przeniesienie punktu 1 za 4.
Jakie to mao informatyczne. Czy to w ogle ma zwizek z tworzeniem programw? Moim
zdaniem TAK. W nastpnym wiczeniu rozwaymy mniej kulinarny, a bardziej matematyczny
problem (matematyka czsto przeplata si z informatyk i wiele problemw rozwizywanych
za pomoc komputerw to problemy matematyczne).

C:\Andrzej\PDF\TurboPascal - wiczenia praktyczne\01.doc

10

Turbo Pascal wiczenia praktyczne

wiczenie 1.3

Znajd najwikszy wsplny podzielnik (NWD) liczb naturalnych A i B.


Zadanie ma wiele rozwiza. Pierwsze nasuwajce si nazwiemy je siowym, jest rwnie
skuteczne, co czasochonne i niezgrabne. Pomys jest nastpujcy. Poczwszy od mniejszej
liczby, a skoczywszy na znalezionym rozwizaniu sprawdzamy, czy liczba dzieli A i B bez
reszty. Jeeli tak to mamy wynik, jak nie pomniejszamy liczb o 1 i sprawdzamy dalej.
Innymi sowy sprawdzamy podzielno liczb A i B (zamy, e B jest mniejsze) przez B,
potem przez B-1, B-2 i tak do skutku... Algorytm na pewno da pozytywny wynik (w najgorszym
przypadku zatrzyma si na liczbie 1, ktra na pewno jest podzielnikiem A i B). W najgorszym przypadku bdzie musia wykona 2B dziele i B odejmowa. To zadanie na pewno
da si i naley rozwiza lepiej.
Drugi algorytm nosi nazw Euklidesa. Polega na powtarzaniu cyklu nastpujcych operacji:
podziau wikszej z liczb przez mniejsz (z reszt) i do dalszej dziaalnoci wybrania dzielnika i znalezionej reszty. Operacja jest powtarzana tak dugo, a reszt bdzie 0. Szukanym
najwikszym wsplnym podzielnikiem jest dzielnik ostatniej operacji dzielenia. Oto przykad (szukamy najwikszego podzielnika liczb 12 i 32):
32 / 12 = 2 reszty 8
12 / 8 = 1 reszty 4
8 / 4
= 2 reszty 0

Szukanym najwikszym wsplnym podzielnikiem 12 i 32 jest 4. Jak wida zamiast sprawdzania 9 liczb (12, 11, 10, 9, 8, 7, 6, 5, 4), z wykonaniem dwch dziele dla kadej z nich,
jak miaoby to miejsce w przypadku rozwizania siowego, wystarczyy nam tylko trzy
dzielenia.
Bardzo podoba mi si trzeci algorytm, bdcy modyfikacj algorytmu Euklidesa, ale nie
wymagajcy ani jednego dzielenia. Tak, to jest naprawd moliwe. Jeeli liczby s rne,
szukamy ich rnicy (od wikszej odejmujc mniejsz). Odrzucamy wiksz z liczb i czynimy
to samo dla mniejszej z nich i wyniku odejmowania. Na kocu, kiedy liczby bd sobie
rwne bd jednoczenie wynikiem naszych poszukiwa. Nasz przykad z liczbami 32 i 12
bdzie si przedstawia nastpujco:
32 12 = 20
20 12 = 8
12 8 = 4
8 4 = 4
4 = 4

Znowu znaleziono poprawny wynik, czyli 4. Operacji jest co prawda wicej, ale warto
zwrci uwag, e s to jedynie operacje odejmowania, a nie dzielenia. Koszt operacji dodawania i odejmowania jest za znacznie mniejszy, ni dzielenia i mnoenia (piszc koszt
mam tu na myli czas pracy procesora, niezbdny do wykonania dziaania). Zastanwmy si
jeszcze, na czym polega rnica pomidzy ostatnimi dwoma algorytmami. Po prostu szukanie reszty z dzielenia liczb A i B poprzez dzielenie zastpiono wieloma odejmowaniami.

10

C:\Andrzej\PDF\TurboPascal - wiczenia praktyczne\01.doc

Rozdzia 1. M wiczenia z mylenia algorytmicznego

11

wiczenie 1.4

Znajd najmniejsz wspln wielokrotno (NWW) liczb naturalnych A i B.


Czasem najlepsze s rozwizania najprostsze. Od razu moemy si domyli, e siowe
rozwizania (na przykad sprawdzanie podzielnoci przez A i B liczb od A*B w d a do
wikszej z nich i przyjcie jako wynik najmniejszej, ktrej obie s podzielnikami) cho istniej,
nie s tym, czego szukamy. A wystarczy przypomnie sobie fakt z matematyki z zakresu
szkoy podstawowej:
NWW (A, B) = A*B/NWD (A,B)
i ju wiadomo, jak problem rozwiza, wykorzystujc algorytm, ktry ju znamy. Usilne (i czsto
uwieczone sukcesem) prby rozwizania problemu poprzez sprowadzenie go do takiego,
ktry ju zosta rozwizany, to jedna z cech programistw. Jak zobaczysz w nastpnych wiczeniach, czsto stosujc rne techniki, programici s nawet w stanie sprowadzi rozwizanie
zadania do ... rozwizania tego samego zadania dla innych (atwiejszych) danych, w nadziei,
e dane w kocu stan si tak proste, e bdzie mona poda wynik z gowy. I to dziaa!
Podstaw tak sprawnego znalezienia rozwizania tego wiczenia okazaa si znajomo
elementarnej matematyki. Jak ju pisaem, matematyka do silnie splata si z programowaniem i dlatego dla wasnego dobra przed przystpieniem do klepania w klawiatur warto
przypomnie sobie kilka podstawowych zalenoci i wzorw. Jako dowd tego zapraszam
do rozwizania kolejnego wiczenia.
wiczenie 1.5

Znajd wynik dziaania AB.


Wyglda na to, e twrcy Turbo Pascala o czym zapomnieli albo uznali za niepotrzebne, liczc na znajomo matematyki wrd programistw (z drugiej strony wbudowanych jest
wiele mniej przydatnych funkcji). W kadym razie cho trudno w to uwierzy nie ma
bezporednio moliwoci podniesienia jednej liczby do potgi drugiej. Jest to zapewne jedna
z pierwszych wasnych funkcji, ktre napiszesz. Tylko jakim sposobem? Jako uatwienie
podpowiem, e trzeba skorzysta z wasnoci logarytmu i funkcji ex.
Naley przeprowadzi nastpujce rozumowanie:
B

AB = eln(A ) = eB*ln(A)
poniewa x = eln(x) oraz ln(xy)= y * ln(x). Obie funkcje (ex i ln(x)) s w Pascalu dostpne,
wic problem w ten sposb moemy uzna za rozwizany. Nie byo to trudne dla osb, ktre
potrafi si posugiwa suwakiem logarytmicznym, ale mnie przyprawio kiedy o bl gowy
i konieczno przypomnienia sobie logarytmw. Warto pamita, e rozwizanie to bdzie
skuteczne jedynie dla dodatnich wartoci podstawy potgi i nie znajdziemy w ten sposb
istniejcego wyniku dziaania (-4)4.

C:\Andrzej\PDF\TurboPascal - wiczenia praktyczne\01.doc

11

12

Turbo Pascal wiczenia praktyczne

wiczenie 1.6

Znajd silni danej liczby (N!).


Jak z lekcji matematyki wiadomo, silnia liczby jest iloczynem wszystkich liczb naturalnych
mniejszych od niej lub jej rwnych. Czyli:
N! = 1 * 2 * ... * (N-1) * N
Ju bezporednio z tej definicji wynika jedno (cakiem poprawne) rozwizanie tego problemu. Naley po prostu uzyska wynik mnoenia przez siebie wszystkich liczb naturalnych
mniejszych lub rwnych danej. Ten algorytm nosi nazw iteracyjnego i zostanie dokadnie
pokazany w wiczeniu 3.39.
Zastanw si jednak nad jeszcze drugim algorytmem. Silnia posiada te drug definicj
(oczywicie rwnowan poprzedniej):
1 jeeli N = 0;
N! =
N * (N-1)! jeeli N>1.
Co dziwnego jest w tej definicji. Odwouje si do... samej siebie. Na przykad przy liczeniu
5! kae policzy 4! i pomnoy przez 5. Jako pewnik daje nam tylko fakt, e 0! = 1. Jak si
okazuje zupenie to wystarczy. Sprbuj na kartce, zgodnie z t definicj policzy 5!. Powiniene otrzyma taki cig oblicze:
5! = 5 * 4!
5!
5!
5!
5!
5!
5!
5!
5!
5!
5!

=
=
=
=
=
=
=
=
=
=

5 *
5 *
5 *
5 *
5 *
5 *
5 *
5 *
5 *
120

(4
(4
(4
(4
(4
(4
(4
(4
24

*
*
*
*
*
*
*
*

3!)
(3 *
(3 *
(3 *
(3 *
(3 *
(3 *
6)

2!))
(2 *
(2 *
(2 *
(2 *
2))

1!)))
(1 * 0!))))
(1 * 1))))
1)))

Jak wida otrzymalimy poprawny wynik. Mam nadziej, e przeledzenie tego przykadu
pozwoli na zrozumienie takiego sposobu definiowania funkcji i przeprowadzania oblicze.
Metoda ta jest bardzo czsto wykorzystywana w programowaniu i nosi nazw rekurencji.
W skrcie mwic, polega ona na definiowaniu funkcji za pomoc niej samej, ale z mniejszymi
(bd w inny sposb atwiejszymi) argumentami. A w przypadku programowania na wykorzystaniu funkcji lub procedury przez ni sam.

12

C:\Andrzej\PDF\TurboPascal - wiczenia praktyczne\01.doc

Rozdzia 1. M wiczenia z mylenia algorytmicznego

13

wiczenie 1.7

Sprbuj zdefiniowa mnoenie dwch liczb naturalnych A i B w sposb rekurencyjny.


To tylko wiczenie do niczego si w przyszoci nie przyda (wszak komputery potrafi
mnoy), ale mam nadziej bliej zapozna z rekurencj.
A jeeli B = 1;
A*B =
A + [A * (B-1)] jeeli B>1.
oczywicie mona te:
B jeeli A = 1;
A*B =
[(A-1) * B] + B jeeli A>1.
Wiele podejmowanych dziaa (zarwno matematycznych, jak i w yciu codziennym) podlega zasadzie rekurencji. Kilka wicze dodatkowych pod koniec rozdziau pozwoli jeszcze
lepiej si z ni zapozna.

wiczenie 1.8

Przemyl sensowno rozwizania rekurencyjnego problemu N-tego wyrazu cigu Fibonacciego.


To wiczenie to ilustracja swoistej puapki rekurencji, w ktr atwo moe wpa nieuwany programista. Wiele osb po poznaniu tej techniki stosuje j, kiedy si tylko da. A
ju na pewno zawsze, gdy problem jest zdefiniowany w sposb rekurencyjny. atwo mona
sta si ofiar tej poytecznej techniki.
Rozwamy cig Fibonacciego, ktrego wyrazy opisane s definicj rekurencyjn:
0 jeeli N = 0
F(N) =

1 jeeli N = 1
F(N-1) + F(N-2) jeeli N>1.

Wydaje si, e sama definicja ju nasz problem rozwizuje. Wystarczy wykorzysta rekurencj.
Sprbujmy wic na kartce, zgodnie z definicj, policzy kilka pierwszych wyrazw cigu:
F(0)

F(1)

F(2)

F(1) + F(0) = 1 + 0 = 1

F(3)

F(2) + F(1) = F(1) + F(0) + F(1) = 1 + 0 + 1 = 2

F(4)

F(3) + F(2) = F(2) + F(1) + F(2) =


F(1) + F(0) + F(1) + F(1) + F(0) =
1 + 0 + 1 + 1 + 0 = 3

C:\Andrzej\PDF\TurboPascal - wiczenia praktyczne\01.doc

13

14

Turbo Pascal wiczenia praktyczne


F(5)

F(4) + F(3) = F(3) + F(2) =


F(2) + F(1) + F(2) + F(2) + F(1) =
F(1) + F(0) + F(1) + F(1) + F(0) + F(1) + F(0) +
F(1) = 1 + 0 + 1 + 1 + 0 + 1 + 0 + 1 = 5

F(8)

F(7) + F(6) = F(6) + F(5) + F(5) + F(4) =


F(5) + F(4) + F(4) + F(3) + F(4) + F(3) + F(3) +
F(2) = ... co to liczenie nie idzie w dobrym kierunku ...

F(50)

Czy s jacy odwani?

Co jest nie tak algorytm liczcy F(8) kae nam w pewnym momencie liczy a trzy razy
F(4) i trzy razy F(3). Oczywicie nie bdzie tego liczy tylko raz i przyjmowa wyniku dla
wszystkich oblicze, poniewa wystpuj one w rnych wywoaniach rekurencyjnych
i wzajemnie o swoich wynikach nic nie wiedz. Podobnie nie da si skorzysta z wyliczonych
ju poprzednich wartoci, poniewa nigdzie nie s przechowywane. To jest bardzo zy sposb
rozwizania tego problemu. Mimo tego, e funkcja posiada dobr rekurencyjn definicj, jej
zaprogramowanie za pomoc rekurencji nie jest dobre.
A jak zaprogramowa obliczanie wartoci takiej funkcji za pomoc komputera? Bardzo atwo
iteracyjnie. Wystarczy liczy jej kolejne wartoci dla liczb od 2 a do szukanej i pamita
zawsze tylko ostatnie dwa wyniki. Ich suma stanie si za kadym razem now wartoci i do
kolejnego przebiegu przyjmiemy wanie j i wiksz z poprzednich dwch. Czas pracy
rozwizania iteracyjnego jest wprost proporcjonalny do wartoci N. A od czego zaley ten
czas w przypadku rozwizania rekurencyjnego? Niestety od 2N. Pamitasz legend o twrcy
szachw? Jeeli nie, koniecznie j odszukaj. Jest ona pikn ilustracj wzrostu wartoci
funkcji potgowej:

14

2N

16

10

1024

11

2048

12

4096

20

1048576

30

1073741824

40

1099511627776

60

1152921504606846976

100

267650600228229401496703205376

1000

ok. 1*10301

C:\Andrzej\PDF\TurboPascal - wiczenia praktyczne\01.doc

Rozdzia 1. M wiczenia z mylenia algorytmicznego

15

Jak wida, wraz ze wzrostem wielkoci danej, czas rozwizywania zadania bdzie rs w sposb
niesamowity. W wiczeniu 3.63 bdziesz mia moliwo sprawdzenia czasu dziaania algorytmu
o zoonoci wykadniczej (tak informatycy nazywaj funkcj, ktra okrela czas oblicze
w zalenoci od rozmiaru danych) dla rnych danych.
Algorytmw o zoonoci wykadniczej stosowa nie naley. Istnieje co prawda caa grupa
problemw, dla ktrych nie znaleziono lepszej ni wykadnicza metody rozwizania
(i prawdopodobnie nigdy nie zostanie ona znaleziona), ale przy ich rozwizywaniu stosuje
si inne, przyblione ale dziaajce szybciej algorytmy. W przeciwnym razie, nawet dla problemu z bardzo ma dan na rozwizanie ,trzeba by byo czeka wieki.
Duo lepsze s algorytmy o zoonoci wielomianowej (takie, gdzie czas pracy zaley od
potgi rozmiaru problemu (na przykad od kwadratu problemu). Bardzo dobre w klasie
wielomianowych s te o zoonoci liniowej (i taki udao si nam wymyli!). Istnieje jednak jeszcze jedna klasa, ktr informatycy lubi najbardziej, i ktr poznasz w nastpnym
wiczeniu.
A jako ostatni informacj z tego wiczenia zapamitaj, e kady algorytm rekurencyjny da
si przeksztaci do postaci iteracyjnej. Czasami tak atwo, jak silni czy cig Fibonacciego,
czasem trudniej lub bardzo trudno (swego czasu zamieniaem na posta iteracyjn algorytm,
ktry w postaci rekurencyjnej mia kilka wierszy, za posta iteracyjna miaa ich wielokrotnie
wicej). Prawie zawsze stracimy na czytelnoci. Zwykle zyskamy na czasie pracy i obcieniu
komputera. Jeeli wic przeksztacenie do postaci iteracyjnej jest proste i oczywiste, naley
to zrobi ale nie za wszelk cen.

wiczenie 1.9

Znajd metod obliczania wyraenia 2N, gdzie N jest liczb naturaln.


Nasun Ci si pierwszy pomys: skorzystanie z naszego znakomitego algorytmu z wiczenia
1.5. Wszak 2N = eN*ln(2), wic z szybkim wyliczeniem nie bdzie problemu. Pomys nawet mi
si podoba (wiadczy o tym, e oswoie si ju z myl, by rozwizywa problemy przez
ich sprowadzenie do ju rozwizanych). Ale kopot polega na tym, e nasza metoda opiera
si na funkcjach, ktre dziaaj na liczbach rzeczywistych (ex i ln(x)). Poniewa komputer
reprezentuje liczby rzeczywiste z pewnym przyblieniem, nie dostaniemy niestety dokadnego
wyniku liczby naturalnej. Dla odpowiednio duego N wynik zacznie by obarczony bdem.
A my tymczasem potrzebujemy wyniku, bdcego liczb naturaln. Pomylmy wic nad innym rozwizaniem.
A gdyby tak po prostu N razy przemnoy przez siebie liczb 2 (a jeeli N=0, za wynik
przyj 1)? Pomys jest dobry. Jego zoono jest liniowa (przed chwil napisalimy, e dla
liczby N naley N razy pomnoy liniowo rozwizania wida bardzo dobrze). Rozwizanie
jest poprawne.
Ale da si to zrobi lepiej rekurencyjnie. Sprbujmy zdefiniowa 2N w nastpujcy sposb:
1 jeeli N=0
N

2 =

(2N/2) jeeli N jest parzyste


2

2*(2N/2/) jeeli N jest nieparzyste


(jako N/2 rozumiemy cakowit cz dzielenia N przez 2). Jako drobne wiczenie matematyczne proponuj sprawdzi (a moe nawet udowodni?), e jest to prawda. Jeeli kto

C:\Andrzej\PDF\TurboPascal - wiczenia praktyczne\01.doc

15

16

Turbo Pascal wiczenia praktyczne


chce si zmierzy z dowodem, proponuj przypomnie sobie dowody indukcyjne. Rekurencja
w informatyce i indukcja w matematyce to rodzone siostry.
Powstaje pytanie (metod rekurencyjn ju mamy): czy to daje nam jak oszczdno?
Przyjrzyjmy si jeszcze raz temu wzorowi. Za kadym razem warto argumentu maleje nie
o jeden czy dwa (jak byo w przypadku silni czy cigu Fibonacciego), ale ... o poow. Czyli
jak szukamy potgi 32, za drugim razem bdziemy ju szuka 16, za trzecim 8, potem 4, 2, 1
i zerowej. To nie jest nijak liniowe. To jest o wiele lepsze! Jak nazwa zoono tego algorytmu? Przyjo si mwi, e jest to zoono logarytmiczna. Oznacza to, e czas rozwizania problemu jest zaleny od logarytmu (w tym przypadku o podstawie 2) wielkoci danych.
To jest to, co informatycy lubi najbardziej.
Tabelka, ktr pokazalimy powyej byaby niepena bez danych o zoonoci logarytmicznej.
Powtrzmy j zatem jeszcze raz:
N

log 2(N)

2N

1,00

1,58

2,00

16

10

3,32

1024

11

3,46

2048

12

3,58

4096

20

4,32

1048576

30

4,91

1073741824

40

5,32

1099511627776

60

5,91

1152921504606846976

100

6,64

267650600228229401496703205376

1000

9,97

ok. 1*10301

Czy widzisz rnic? Dla danej o wartoci 1000 algorytm logarytmiczny musi wykona tylko 10 mnoe, a liniowy a tysic. Gdybymy wymylili algorytm wykadniczy, liczby
mnoe nie daoby si atwo nazwa, a ju na pewno nie daoby si tej operacji przeprowadzi
na komputerze.
Ten typ algorytmw, ktre sprowadzaj problem nie tylko do mniejszych tego samego typu, ale
do mniejszych przynajmniej dwukrotnie nazwano (moim zdaniem susznie) dziel i zwyciaj. Zawsze, jak uda Ci si problem podzieli w podobny sposb na mniejsze, masz szans
na uzyskanie dobrego, logarytmicznego algorytmu.

16

C:\Andrzej\PDF\TurboPascal - wiczenia praktyczne\01.doc

Rozdzia 1. M wiczenia z mylenia algorytmicznego

17

wiczenie 1.10

Sprawd, czy liczba N jest liczb pierwsz.


Dla przypomnienia: liczba pierwsza to taka, ktra ma tylko dwa rne, naturalne podzielniki: 1
i sam siebie.
Zadanie wbrew pozorom nie jest tylko sztuk dla sztuki. Funkcja sprawdzajca, czy zadana
liczba jest pierwsza, czy nie (i znajdujca jej podzielniki) w szybki sposb (a wic o maej
zoonoci) miaaby ogromne znaczenie w kryptografii i to takiej silnej, najwyszej jakoci, a konkretnie w amaniu szyfrw. Warto wic powici mu chwilk.
Pierwszy pomys: dla kadej liczby od 2 do N-1 sprawdzi, czy nie dzieli N. Jeeli ktra z nich
dzieli N nie jest pierwsze. W przeciwnym razie jest. Pierwszy pomys nie jest zy. Funkcja
na pewno dziaa i ma zoono liniow. Troszk si j da poprawi, ale czy bardzo?
Poczymy nastpujc obserwacj. Jeeli liczba N nie bya podzielna przez 2, to na pewno
nie jest podzielna przez adn liczb parzyst. Mona wic miao wyeliminowa sprawdzanie
dla wszystkich liczb parzystych wikszych od 2. Czyli sprawdza dla 2, 3, 5, 7, itd. Redukujemy w ten sposb problem o poow, uzyskujc zoono, no wanie jak? Tak, dalej
liniow. Algorytm bez wtpienia jest szybszy, ale cigle w tej samej klasie.
Pomylmy dalej. Dla kadego duego (wikszego od N ) podzielnika N musi istnie podzielnik may (mniejszy od N ) bdcy ilorazem N i tego duego. Nie warto wic
sprawdza liczb wikszych od N jeeli przedtem nie znalelimy podzielnika, dalej te
go nie bdzie. Czyli nie sprawdzamy liczb do N-1, tylko do N . Czy co nam to dao?
Oczywicie algorytm dziaa jeszcze szybciej. A jak z jego zoonoci? Co prawda nie jest
liniowa, ale dalej pozostaa wykadnicza (tylko z lepszym, ni liniowa wykadnikiem). Proste pytanie: z jakim wykadnikiem zoono wielomianowa jest liniowa, a z jak ta, ktr
uzyskalimy? Jeeli podae odpowiednio wartoci 1 i , to udzielie poprawnej odpowiedzi.

M Co to jest algorytm?
M Co to jest zoono algorytmu?
M Co to jest iteracja?
M Co to jest rekurencja?
M Dlaczego rekurencja nie zawsze jest dobra?
M Na czym polega metoda dziel i zwyciaj?
M Jak wygldaj dobre algorytmy dla kilku prostych problemw: gotowania makaronu,

szukania najwikszego wsplnego dzielnika, najmniejszej wsplnej wielokrotnoci,


silni, wyrazu cigu Fibonacciego, potgi liczby, sprawdzania czy liczba jest pierwsza.

C:\Andrzej\PDF\TurboPascal - wiczenia praktyczne\01.doc

17

18

Turbo Pascal wiczenia praktyczne

wiczenie 1.11

Napisz algorytm gotowania ulubionej potrawy.


Moesz posuy si ksik kucharsk. Zwr szczegln uwag na skadniki (czyli dane
algorytmu) oraz na kolejno dziaa.

wiczenie 1.12

Podaj algorytm udzielania pierwszej pomocy osobie poszkodowanej w wypadku samochodowym.

wiczenie 1.13

Napisz algorytm liczenia pierwiastkw rwnania kwadratowego.


Funkcja (dla przypomnienia) ma posta f(x)=ax2+bx+c. Przypomnij sobie szkolny sposb
liczenia pierwiastkw on w zasadzie jest ju bardzo dobrym algorytmem.

wiczenie 1.14

Przeanalizuj problem obliczania wartoci wielomianu.


Wielomian ma nastpujc posta: w(x) = anxn + an-1xn-1 + ... + a1x + a0. Porwnaj metod najbardziej oczywist (mnoenie i dodawanie po kolei) z algorytmem opartym na schemacie
Hornera, ktry mwi, e wielomian mona przeksztaci do postaci: w(x) = (...(anx + an-1)x
+ ... + a1)x + a0. Aby to nieco rozjani: wielomian trzeciego stopnia: w3(x) = a3x3 + a2x2 +
a1x + a0 mona przeksztaci do postaci: w(x) = ((a3x + a2)x+ a1)x + a0 sprawd, e to to
samo. Porwnaj liczb dziaa (mnoe i dodawa) w obu przypadkach. Czy zoono
w ktrym z nich jest lepsza? Jeeli nie, to czy mimo wszystko warto stosowa ktry z nich?
Moe jeste w stanie zauway take jakie inne jego zalety?

wiczenie 1.15

Przeanalizuj gr w zgadywanie liczby.


Pamitasz gr: zgadnij liczb z zakresu 1-1000? Zgadujcy podaje odpowied, a Ty mwisz
zgade, za duo albo za mao. Gdyby zgadujcy strzela, dugo trwaoby trafienie.
Mona jednak wymyli bardzo sprawny algorytm zgadnicia liczby. Sprbuj go sformuowa. Ile maksymalnie razy trzeba zgadywa, eby mie pewno uzyskania prawidowego
wyniku? Jak zoono ma algorytm? Czy przypomina Ci ktr z metod z poprzednich
wicze? Zapamitaj nazw tej metody: przeszukiwanie binarne.

18

C:\Andrzej\PDF\TurboPascal - wiczenia praktyczne\01.doc

Rozdzia 1. M wiczenia z mylenia algorytmicznego

19

wiczenie 1.16

Sprawd, czy punkt X ley wewntrz, czy na zewntrz trjkta ABC.


Narysuj oba przypadki na kartce i rozwa pola trjktw, ktre powstay poprzez poczenie
wierzchokw trjkta z punktem i kombinacje ich sum. Podaj algorytm sprawdzania.

wiczenie 1.17

Napisz algorytm rozwizania problemu wie z Hanoi.

Wiee z Hanoi to klasyka zada informatycznych. Do dyspozycji masz trzy stosy, na ktrych ukadasz kka. Na pocztku kka tworz piramid na jednym z nich. Naley ca
przenie na drugi stos, zgodnie z zasadami: kadorazowo mona przenie tylko jedno kko ze szczytu dowolnego stosu. Nie mona ka kek wikszych na mniejsze. Przyjrzyj si
ilustracji.
Podaj algorytm rozwizania tego problemu. Zastanw si nad rozwizaniem rekurencyjnym.
Jak zoono moe mie wymylony algorytm? Czy mylisz, e da si znale rozwizanie
o lepszej zoonoci?

wiczenie 1.18

Rozwa algorytmy przeszukiwania cigu liczb w celu znalezienia maksimum.


Masz do dyspozycji nieuporzdkowany skoczony cig liczb i zadanie, aby znale w nim
najwiksz liczb. Przemyl dwie metody:
1. Przesuwasz si po kolejnych wyrazach cigu, sprawdzasz, czy biecy nie jest wikszy

od dotychczas znalezionego najwikszego (ktry pamitasz), jeeli tak, to przyjmujesz, e to on jest najwikszy. Po dojciu do koca cigu bdziesz zna odpowied.
2. Dziaasz rekurencyjnie. Jeeli cig jest jednoelementowy uznajesz, e ten element jest

najwikszy. W przeciwnym razie dzielisz cig na 2 czci i sprawdzasz, co jest wiksze najwikszy element lewego podcigu czy najwikszy element prawego podcigu.
Drugi algorytm jest typu dziel i zwyciaj i na pierwszy rzut oka wydaje si lepszy ni
pierwszy (liniowy). Sprawd, czy to prawda. Zrb to na kilku przykadach. Ktry algorytm
jest lepszy? Dlaczego wynik jest taki zaskakujcy?

C:\Andrzej\PDF\TurboPascal - wiczenia praktyczne\01.doc

19

20

Turbo Pascal wiczenia praktyczne

wiczenie 1.19

Przyjrzyj si funkcji Ackermanna.


n+1 jeeli m=0
A (m-1, n) jeeli m>0, n=0

A (m, n) =

A (m-1, A (m, n-1)) jeeli m, n>0


Ta niewinnie wygldajca funkcja zdefiniowana rekurencyjnie to prawdziwy koszmar. Sprbuj
policzy A(2, 3), bez pamitania w czasie wyliczania wartoci ju policzonych. A A(3, 3)? Czy
odwayby si policzy A (4, 3)? Czy algorytm rekurencyjny zdaje tu egzamin?
Sprbuj podej do zadania w inny sposb. Zapisuj wyliczane wyniki w tabelce (na przykad
w pionie dla wartoci m, w poziomie dla n. Poniej masz pocztek takiej tabelki:
m.\n

10

10

11

Sprbuj policzy kilka kolejnych wartoci. Zastanw si, w jaki sposb mona prbowa zabra si do rozwizania tego problemu iteracyjnie.

20

C:\Andrzej\PDF\TurboPascal - wiczenia praktyczne\01.doc