Professional Documents
Culture Documents
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
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
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
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-
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
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).
10
wiczenie 1.3
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
11
wiczenie 1.4
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.
11
12
wiczenie 1.6
=
=
=
=
=
=
=
=
=
=
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
13
wiczenie 1.7
wiczenie 1.8
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(4)
13
14
F(8)
F(50)
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
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
2 =
15
16
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
17
wiczenie 1.10
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,
17
18
wiczenie 1.11
wiczenie 1.12
wiczenie 1.13
wiczenie 1.14
wiczenie 1.15
18
19
wiczenie 1.16
wiczenie 1.17
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
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?
19
20
wiczenie 1.19
A (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