-
MAREK G ↪AGOLEWSKIINSTYTUT BADAŃ SYSTEMOWYCH PAN
WYDZIA L MATEMATYKI I NAUK INFORMACYJNYCH POLITECHNIKI
WARSZAWSKIEJ
Algorytmyi podstawy programowania
1. Etapy tworzenia oprogramowania. Algorytm
Materia ly dydaktyczne dla studentów matematykina Wydziale
Matematyki i Nauk Informacyjnych Politechniki Warszawskiej
Ostatnia aktualizacja: 1 października 2016 r.
Copyright © 2010–2016 Marek G ↪agolewskiThis work is licensed
under a Creative Commons Attribution 3.0 Unported License.
http://www.gagolewski.comhttp://creativecommons.org/licenses/by/3.0/
-
SPIS TREŚCI 0
Spis treści
1.1. Wprowadzenie . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . 11.2. Etapy tworzenia oprogramowania . . . .
. . . . . . . . . . . . . . . . . . . . 2
1.2.1. Sformu lowanie i analiza problemu . . . . . . . . . . . .
. . . . . . . . 21.2.2. Projektowanie . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . 61.2.3. Implementacja . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . 91.2.4. Testowanie .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
101.2.5. Eksploatacja . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . 101.2.6. Podsumowanie . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . 10
1.3. Ćwiczenia . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . 121.4. Wskazówki i odpowiedzi do
ćwiczeń . . . . . . . . . . . . . . . . . . . . . . 14
Ostatnia aktualizacja: 1 października 2016 r.
-
1.1. WPROWADZENIE 1
1.1. WprowadzenieScience is what we understand well enoughto
explain to a computer.Art is everything else we do.
D. E. Knuth
Przygod ↪e z algorytmami i programowaniem czas zacz ↪ać! W
trakcie naszych zaj ↪eć po-znasz wiele nowych, ciekawych
zagadnień. Celem, który chcemy pomóc Ci osi ↪agn ↪ać, jest
nietylko bliższe poznanie komputera (jak wiadomo, bliskość
sprzyja nawi ↪azywaniu przyjaźni,cz ↪esto na ca le życie), ale i
rozwijanie umiej ↪etności rozwi ↪azywania ważnych
problemów,także matematycznych.
Na pewno poważnie myślisz o karierze matematyka (być może w
tzw. sektorze ko-mercyjnym lub nawet naukowo-badawczym). Pami ↪etaj
o tym, że opanowanie umiej ↪etnościprogramowania komputerów nie
b ↪edzie wcale atutem w Twoim życiu zawodowym. B ↪edziewarunkiem
koniecznym powodzenia! Komputery bowiem towarzysz ↪a nam na
(prawie) każ-dym kroku, s ↪a nieod l ↪acznym elementem wspó
lczesnego świata.
Zapami↪etaj
Przedmiot AiPP l ↪aczy teori ↪e (algorytmy) z praktyk ↪a
(programowanie). Pami ↪etaj, żenie da si ↪e nabrać bieg lości w
żadnej dziedzinie życia bez intensywnych, systematycz-nych
ćwiczeń.
Nie szcz ↪edź wi ↪ec swego czasu na w lasne próby zmierzenia
si ↪e z przedstawionymiproblemami, eksperymentuj. Przecież to
praktyka mistrza czyni.
W tym semestrze poznasz najbardziej podstawowe zagadnienia
informatyki. Skrypt,którego celem jest systematyzacja Twej wiedzy,
podzielony jest na 8 cz ↪eści:
1. Etapy tworzenia oprogramowania. Algorytm2. Podstawy
organizacji i dzia lania komputerów. Reprezentacja liczb ca
lkowitych
i zmiennopozycyjnych3. Deklaracja zmiennych w j ↪ezyku C++.
Operatory arytmetyczne, logiczne i relacyjne.4. Instrukcja
warunkowa i p ↪etle5. Funkcje. Przekazywanie parametrów przez
wartość i przez referencj ↪e. Rekurencja6. Wskaźniki. Dynamiczna
alokacja pami ↪eci. Tablice jednowymiarowe. Sortowanie. Lań-
cuchy znaków7. Macierze8. Struktury w j ↪ezyku C++.
Abstrakcyjne typy danych
W niniejszej cz ↪eści zastanowimy si ↪e, w jaki sposób — w
wyidealizowanym przypadku— powstaj ↪a programy komputerowe. Co
ważne, niebawem i Tym b ↪edziesz post ↪epowa l(a)mniej wi ↪ecej w
przedstawiony niżej sposób rozwi ↪azuj ↪ac różne problemy z
użyciem kompu-tera.
Ostatnia aktualizacja: 1 października 2016 r.
-
1.2. ETAPY TWORZENIA OPROGRAMOWANIA 2
1.2. Etapy tworzenia oprogramowania
1.2.1. Sformu lowanie i analiza problemu
1.2.1.1. Sformu lowanie problemu
Punktem wyj́scia naszych rozważań niech b ↪edzie pewne
zagadnienie problemowe. Problemten może być bardzo ogólnej
natury, np. numerycznej, logicznej, spo lecznej czy
nawetegzystencjalnej. Oto kilka przyk ladów:
– obliczenie wartości pewnego wyrażenia arytmetycznego,–
znalezienie rozwi ↪azania uk ladu 10000 równań różniczkowych
celem znalezienia opty-
malnej trajektorii lotu pocisku, który uchroni ludzkość od
zag lady,– zaplanowanie najkrótszej trasy podróży od miasta X do
miasta Y,– postawienie diagnozy medycznej na podstawie listy
objawów chorobowych,– rozpoznanie twarzy przyjació l na zdj
↪eciu,– dokonanie predykcji wartości indeksu gie ldowego,–
zaliczenie (na pi ↪atk ↪e, rzecz jasna) przedmiotu AiPP,– rozwi
↪azanie dylematu filozoficznego, np. czym jest szcz ↪eście i jak
być szcz ↪eśliwym?
Znalezienie rozwi ↪azania danego problemu jest dla nas cz ↪esto
— z różnych wzgl ↪edów —bardzo istotne. Kluczowym pytaniem jest
tylko: jak to zrobić? Sytuacj ↪e t ↪e obrazuje rys.1.1. S lowem:
interesuje nas, w jaki sposób doj́sć do celu?
PROBLEM
ROZWI ↪AZANIE
???
Rys. 1.1. Punkt wyj́scia naszych rozważań
1.2.1.2. Analiza problemu
Po sformu lowaniu problemu, czyli stwierdzeniu, że odczuwamy
piln ↪a potrzeb ↪e uzyskaniaodpowiedzi na postawione sobie pytanie,
przechodzimy do etapu analizy . Tutaj dopre-cyzowujemy, o co nam
naprawd ↪e chodzi, co rozumiemy pod pewnymi poj ↪eciami,
jakichwyników si ↪e spodziewamy i do czego ewentualnie mog ↪a w
przysz lości si ↪e one nam przydać.
W przypadku pewnych zagadnień (np. matematycznych) zadanie
czasem wydaje si ↪ewzgl ↪ednie proste. Wszystkie poj ↪ecia maj ↪a
swoj ↪a definicj ↪e formaln ↪a, można udowodnić, żepewne kroki
prowadz ↪a do spodziewanych, jednoznacznych wyników itd.
Jednakże niektóre zagadnienia mog ↪a przyt laczać swoj ↪a z
lożoności ↪a. Na przyk lad ”za-
liczenie przedmiotu AiPP” wymaga m.in. określenia:
– jaki stan końcowy jest poż ↪adany (ocena bardzo dobra?),–
jakie czynności s ↪a kluczowe do osi ↪agni ↪ecia rozwi ↪azania
(udzia l w ćwiczeniach i labo-
ratoriach, s luchanie wyk ladu, zadawanie pytań, dyskusje na
konsultacjach),– jakie czynniki mog ↪a wp lywać na powodzenie na
poszczególnych etapach nauki (czy-
tanie ksi ↪ażek, wspólna nauka?), a jakie je wr ↪ecz
uniemożliwiać (codzienne imprezy?brak pr ↪adu w akademiku?
popsuty komputer?).
Ostatnia aktualizacja: 1 października 2016 r.
-
1.2. ETAPY TWORZENIA OPROGRAMOWANIA 3
Komputery. Istotn ↪a cech ↪a wielu zagadnień jest to, że nadaj
↪a si ↪e do rozwi ↪azania za po-moc ↪a komputera. Jak pokazuje
rozwój wspó lczesnej informatyki, tego typu problemów jestwcale
niema lo. W innych przypadkach cz ↪esto mamy do czynienia z sytuacj
↪a, w której kom-putery mog ↪a pomóc uzyskać rozwi ↪azanie cz
↪eściowe lub zgrubne przybliżenie rozwi ↪azania,które przecież
może być lepsze niż zupe lny brak rozwi ↪azania.
Cz ↪esto s lyszymy o niesamowitych ”osi ↪agni ↪eciach”
komputerów, np. wygraniu w szachy
z mistrzem świata, uczestnictwie w pe lnym podchwytliwych
pytań teleturnieju Jeopardy!(pierwowzór niegdyś emitowanego w
Polsce Va Banque), samodzielnym sterowaniu samo-chodem po zat
loczonych drogach (osi ↪agni ↪ecie ekipy Google), wirtualn ↪a obs
lug ↪a petentaw Zak ladzie Ubezpieczeń Spo lecznych itp.
Wyobraźni ↪e o ich pot ↪edze podsycaj ↪a opowia-dania
science-fiction, których autorzy przepowiadaj ↪a, że te maszyny
pewnego dnia b ↪ed ↪apotrafi ly zrobić prawie wszystko, o czym
tylko jesteśmy w stanie pomyśleć.
Niestety, z drugiej strony komputery podlegaj ↪a trzem bardzo
istotnym ograniczeniom.By latwiej można by lo je sobie uzmys
lowić, pos lużymy si ↪e analogi ↪a z dziedziny motoryzacji.
1 Komputer ma ograniczon ↪a moc oblicze-niow ↪a. Każda
instrukcja wykonuje si ↪eprzez pewien (niezerowy!) czas. Im
bar-dziej z lożone zadanie, tym jego rozwi ↪a-zywanie trwa d
lużej. Choć stan rzeczypoprawia si ↪e wraz z rozwojem
techno-logii, zawsze b ↪edziemy ograniczeni zasa-dami fizyki.
Samochody maj ↪a np. ograniczon ↪a pr ↪ed-kość, ograniczone
przyspieszenie (takżezasadami fizyki).
2 Komputer”rozumie”określony j ↪ezyk (j ↪e-
zyki), do którego syntaktyki (sk ladni)trzeba si ↪e
dostosować, którego konstruk-cj ↪e trzeba poznać, by móc si ↪e
z nim ”
do-gadać”. J ↪ezyki s ↪a zdefiniowane formalnieza pomoc ↪a
ścísle określonej gramatyki.Nie toleruje on najcz ↪eściej
żadnych od-st ↪epstw lub toleruje tylko nieliczne.
Aby zwi ↪ekszyć liczb ↪e obrotów silnika,należy wykonać jedn
↪a ścísle określon ↪aczynność — wcisn ↪ać mocniej peda l
gazu.Nic nie da uśmiechni ↪ecie si ↪e b ↪adź próbasympatycznej
konwersacji z desk ↪a roz-dzielcz ↪a na temat zalet jazdy z inn
↪apr ↪edkości ↪a.
3 Komputer ograniczony jest ponadtoprzez tzw. czynnik ludzki —
mówi si ↪e,że jest tak m ↪adry, jak jego programista.Potrafi
zrobić tylko to (i aż tyle), co samimu dok ladnie powiemy, co ma
zrobić,krok po kroku, instrukcja po instruk-cji. Nie domyśli si
↪e, co tak naprawd ↪enam chodzi po g lowie. Każdy wydawanyrozkaz
ma bowiem określon ↪a semantyk ↪e(znaczenie). Komputer jedynie
potrafigo pos lusznie wykonać.
Samochód zawiezie nas, gdzie chcemy,jeśli b ↪edziemy
odpowiednio pos lugiwaćsi ↪e kierownic ↪a i innymi przyrz ↪adami.
Nieb ↪edzie protestowa l, gdy skr ↪ecimy nie natym skrzyżowaniu,
co trzeba. Albo gdywjedziemy na drzewo. B ↪adź dwa.
Zapami↪etaj
Celem przewodnim naszych rozważań w tym semestrze jest wi ↪ec
takie poznanie na-tury i j ↪ezyka komputerów, by mog ly zrobić
dok ladnie to, co my chcemy. Oczywíscieskupimy si ↪e tutaj tylko
(i aż) na dość prostych problemach.
Ostatnia aktualizacja: 1 października 2016 r.
-
1.2. ETAPY TWORZENIA OPROGRAMOWANIA 4
Na pocz ↪atek, dla porz ↪adku, przedyskutujemy definicj ↪e
obiektu naszych zainteresowań.Otóż s lowo komputer pochodzi od
lacińskiego czasownika computare, który oznacza ob-liczać.
Jednak powiedzenie, że komputer zajmuje si ↪e tylko obliczaniem,
to stanowczo zaw ↪askie spojrzenie.
Informacja
Komputer to programowalne urz ↪adzenie elektroniczne s luż ↪ace
do przetwarzania in-formacji.
Aż cztery s lowa w tej definicji wymagaj ↪a wyjaśnienia.
Programowalność to omówionapowyżej zdolność do przyjmowania,
interpretowania i wykonywania wydawanych poleceńzgodnie z zasadami
syntaktyki i semantyki używanego j ↪ezyka.
Po drugie, pomimo licznych eksperymentów przeprowadzanych m.in.
przez biologówmolekularnych i fizyków kwantowych, wspó lczesne
komputery to w znakomitej wi ↪ekszościmaszyny elektroniczne.
Ich
”wn ↪etrzności” s ↪a w swej naturze wi ↪ec dość
nieskomplikowane
(ot, kilkaset milionów tranzystorów upakowanych na p lytce
drukowanej). O implikacjachtego faktu dowiemy si ↪e wi ↪ecej z
drugiego wyk ladu poświ ↪econego organizacji i dzia laniutych urz
↪adzeń.
Dalej, przez jednostk ↪e informacji rozumiemy dowolny ci ↪ag
liczb lub symboli (być możejednoelementowy). Oto kilka przyk
ladów:
– (6) (liczba naturalna),– (PRAWDA) (wartość logiczna),– (
”STUDENT MiNI”) (napis, czyli ci ↪ag znaków drukowanych),
– (3,14159) (liczba rzeczywista),– (4,-3,-6, 34) (ci ↪ag liczb
ca lkowitych),– (011100) (liczba w systemie binarnym),–
(”WARSZAWA”, 52◦13’56”N, 21◦00’30”E) (wspó lrz ↪edne GPS pewnego
miejsca na
mapie).
Ciekawostka
Wartym zanotowania faktem jest to, iż wiele obiektów
spotykanych na co dzień może miećswoje reprezentacje w postaci
ci ↪agów liczb lub symboli. Cz ↪esto te reprezentacje nie musz
↪aodzwierciedlać wszystkich cech opisywanego obiektu lecz tylko
te, które s ↪a potrzebne w danymzagadnieniu. Ci ↪ag (”
Maciek Pryk”,”Matematyka II rok”, 4,92, 21142) może być
wystarczaj ↪ac ↪a
informacj ↪a dla pani z dziekanatu, by przyznać pewnemu
studentowi stypendium za wynikiw nauce. W tym przypadku kolor oczu
Maciusia czy imi ↪e dziewczyny, do której wzdycha onw nocy, to zb
↪edne szczegó ly (chyba, że ta ostatnia jest córk ↪a Pani z
dziekanatu, ale. . . ).
I wreszcie, przetwarzanie informacji to wykonywanie różnych
dzia lań na liczbach(np. operacji arytmetycznych, porównań) lub
symbolach (np. zamiana elementów, l ↪aczenieci ↪agów). Rodzaje
wykonywanych operacji s ↪a ścísle określone, co nie znaczy, że
nie możnapróbować samodzielnie tworzyć nowych na podstawie
tych, które s ↪a już dost ↪epne.
Jako przyk ladowe operacje przetwarzaj ↪ace, odpowiednio, liczby
naturalne, wartościlogiczne i napisy, możemy przytoczyć:
2 + 2 → 4π < e → FA LSZ
”KATA”⊕ (”STREFA”/(E O)) → ”KATASTROFA”
Ostatnia aktualizacja: 1 października 2016 r.
-
1.2. ETAPY TWORZENIA OPROGRAMOWANIA 5
Nietrudno odgadn ↪ać ich znaczenie. Co ważne: w laśnie tak
dzia la komputer!
Zapami↪etaj
Ci ↪ag operacji, które potrafi wykonać komputer, nazywamy
programem komputero-wym.
Dokonajmy syntezy naszych dotychczasowych rozważań. Otóż
problem, który da si ↪erozwi ↪azać za pomoc ↪a komputera posiada
dwie istotne cechy (por. rys. 1.2):
1. daje si ↪e wyrazić w postaci pewnych danych (informacji)
wej́sciowych,2. istnieje dla niego program komputerowy, przetwarzaj
↪acy dane wej́sciowe w taki spo-
sób, że informacje wyj́sciowe mog ↪a zostać przyj ↪ete jako
reprezentacja poszukiwanegorozwi ↪azania.
PROBLEM
ROZWI ↪AZANIE
PROGRAM
Informacje wej́sciowe
Informacje wyj́sciowe
Rys. 1.2. Rozwi ↪azanie problemu za pomoc ↪a programu
komputerowego
Ostatnia aktualizacja: 1 października 2016 r.
-
1.2. ETAPY TWORZENIA OPROGRAMOWANIA 6
1.2.2. Projektowanie
Po etapie analizy problemu nast ↪epuje etap projektowania
algorytmów .
Zapami↪etaj
Algorytm to abstrakcyjny przepis (proces, metoda,”instrukcja obs
lugi”) pozwalaj ↪acy
na uzyskanie, za pomoc ↪a skończonej liczby dzia lań,
oczekiwanych danych wyj́sciowychna podstawie poprawnych danych
wej́sciowych.
Przyk ladowym algorytmem”z życia” jest przepis na pierniczki,1
przedstawiony w tab. 1.1.
Tab. 1.1. Przepis na pierniczki
Dane wej́sciowe: 2 szklanki m ↪aki; 2 lyżki miodu; 3/4 szklanki
cukru; 1,5 lyżeczkisody oczyszczonej; 1/2 torebki przyprawy
piernikowej; 1 lyżka mas la; 1 jajko (+ do-datkowo 1 jajko do
posmarowania); oko lo 1/3 szklanki lekko ciep lego mleka.
Algorytm:
1. M ↪ak ↪e przesiać na stolnic ↪e, wlać rozpuszczony gor ↪acy
miód i wymieszać (najle-piej nożem). Ci ↪agle siekaj ↪ac,
dodawać kolejno cukier, sod ↪e, przyprawy, a gdymasa lekko
przestygnie – mas lo i jedno jajko.
2. Dolewaj ↪ac stopniowo (po 1 lyżce) mleka zagniatać r ↪ek ↪a
ciasto aż b ↪edzie średniotwarde i g ↪este (nie musimy
wykorzystać ca lego mleka, bo masa może być zarzadka). Dok
ladnie wyrabiać r ↪ek ↪a, aż b ↪edzie g ladkie, przez oko lo 10
minut.
3. Na posypanej m ↪ak ↪a stolnicy rozwa lkować ciasto na placek
o grubości maksy-malnie 1 cm. Foremkami wykrajać z ciasta
pierniczki, smarować rozm ↪aconymjajkiem i uk ladać na blasze wy
lożonej papierem do pieczenia w odst ↪epach oko lo2–3 cm od siebie
(pierniczki troszk ↪e podrosn ↪a).
4. Piec w piekarniku nagrzanym do 180 stopni przez oko lo 15
minut. Przecho-wywać w szczelnie zamkni ↪etym pojemniku, do 4
tygodni lub jeszcze d lużej[oj tam! — przyp. MG]. Pierniczki im s
↪a starsze tym lepsze. Z czasem też staj ↪asi ↪e bardziej mi
↪ekkie.
5. Dekorować przed podaniem, najlepiej jak już b ↪ed ↪a mi
↪ekkie. Do dekoracjimożna użyć samego lukru lub lukru
wymieszanego z barwnikiem spożywczym.Zamiast barwnika spożywczego
można użyć soku z granatu lub z buraka. Pier-niczki można
dekorować roztopion ↪a czekolad ↪a i maczać w posypce cukrowejlub
w wiórkach kokosowych.
Dane wyj́sciowe: Pyszne pierniczki.
Widzimy, jak wygl ↪ada zapisany algorytm. Ważn ↪a umiej
↪etności ↪a, któr ↪a b ↪edziemy ćwi-czyć, jest odpowiednie jego
przeczytanie. Dobrze to opisa l D. E. Knuth (2002, s. 4):
Na wst ↪epie trzeba jasno powiedzieć, że algorytmy to nie
beletrystyka. Nie na-leży czytać ich ciurkiem. Z algorytmem jest
tak, że jak nie zobaczysz, to nieuwierzysz. Najlepsz ↪a metod ↪a
poznania algorytmu jest wypróbowanie go.
A zatem — do kuchni!
1Przepis ten pochodzi z serwisu Kwestia
Smaku:www.kwestiasmaku.com/desery/ciasteczka/pierniczki/przepis.html
Ostatnia aktualizacja: 1 października 2016 r.
http://www.kwestiasmaku.com/desery/ciasteczka/pierniczki/przepis.html
-
1.2. ETAPY TWORZENIA OPROGRAMOWANIA 7
Informacja
Oto najistotniejsze cechy algorytmu (por. Knuth, 2002, s.
4):
– skończoność — wykonanie algorytmu musi zatrzymać si ↪e po
skończonej liczbiekroków;
– dobre zdefiniowanie — każdy krok algorytmu musi być opisany
precyzyjne, ścíslei jednoznacznie, tj. być sformu lowanym na
takim poziomie ogólności, by każdy,kto b ↪edzie go czyta l, by l
w stanie zrozumieć, jak go wykonać;
– efektywność — w algorytmie nie ma operacji niepotrzebnie wyd
lużaj ↪acych czaswykonania;
– dane wej́sciowe s ↪a ścísle określone, pochodz ↪a z dobrze
określonych zbiorów;
– dane wyj́sciowe, czyli wartości powi ↪azane z danymi
wej́sciowymi, odpowiadaj ↪aspecyfikacji oczekiwanego poprawnego
rozwi ↪azania.
Wygl ↪ada na to, że nasz przepis na pierniczki posiada
wszystkie wyżej wymienionecechy. Wykonuj ↪ac powyższe czynności
ciasto to uda nam si ↪e kiedyś zjeść (skończoność).Wszystkie
czynności s ↪a zrozumia le nawet dla ma lo wprawionej gospodyni
(aczkolwiekw dobre zdefiniowanie może tutaj troch ↪e matematyk pow
↪atpiewać — co to znaczy oko lo1/3 szklanki ciep lego mleka?). Sam
proces przygotowania jest efektywny (nie każe ku-charce np.
umalować si ↪e w trakcie mieszania sk ladników b ↪adź pojechać
w mi ↪edzyczasie nazagraniczn ↪a wycieczk ↪e). Dane wej́sciowe i
wyj́sciowe s ↪a dobrze określone.
Zapami↪etaj
Jeden program rozwi ↪azuj ↪acy rozpatrywany problem może
zawierać realizacj ↪e wielualgorytmów , np. gdy z lożoność
zagadnienia wymaga podzielenia go na kilka podpro-blemów .
I tak zdolna kucharka wykonuj ↪aca program ”obiad” powinna
podzielić sw ↪a prac ↪e na
podprogramy”rosó l”,
”chili con carne z plackami tortilli” oraz
”pierniczki” i skupić si ↪e
najpierw na projektowaniu podzadań.Ważne jest, że algorytm
nie musi być wyrażony za pomoc ↪a j ↪ezyka zrozumia lego dla
komputera. Taki sposób opisu algorytmów nazywa si ↪e cz ↪esto
pseudokodem. Stanowi onetap pośredni mi ↪edzy analiz ↪a problemu a
implementacj ↪a, opisan ↪a w kolejnym paragrafie.Pseudokod ma po
prostu pomóc w bardziej formalnym podej́sciu do tworzenia
programu.
Dla przyk ladu, w przytoczonym wyżej przepisie, nie jest dok
ladnie wyt lumaczone —krok po kroku — co oznacza
”aż b ↪edzie średnio twarde i g ↪este”. Jednakże czynność t
↪e da
si ↪e pod pewnymi warunkami doprecyzować.
Jakby tego by lo ma lo, może istnieć wiele algorytmów s luż
↪acych do rozwi ↪azania tegosamego problemu! Przyjrzyjmy si ↪e nast
↪epuj ↪acemu przyk ladowi.
Ostatnia aktualizacja: 1 października 2016 r.
-
1.2. ETAPY TWORZENIA OPROGRAMOWANIA 8
1.2.2.1. Przyk lad: Problem m lodego Gaussa
Szeroko znana jest historia Karola Gaussa, z którym mia l
problemy jego nauczyciel ma-tematyki. Aby zaj ↪ać czymś m lodego
ch lopca, profesor kaza l mu wyznaczyć sum ↪e liczba, a + 1, . . .
, b, gdzie a, b ∈ N (jak g losi historia, by lo to a = 1 i b =
100). Zapewnenauczyciel pomyśla l sobie, że tamten użyje
algorytmu I i sp ↪edzi niema l ↪a ilość czasu narozwi ↪azywaniu
lamig lówki.
Algorytm I wyznaczania sumy kolejnych liczb naturalnych
// W e j ś c i e : a, b ∈ N (a < b)// W y j ś c i e : a+ a+
1 + ...+ b ∈ N
niech suma, i ∈ N;suma = 0;
dla (i = a,a+ 1,...,b)suma = suma + i;
zwróć suma jako wynik;
Jednakże sprytny Gauss zauważy l, że a+ a+ 1 + · · ·+ b =
a+b2 (b− a+ 1). Dzi ↪eki temuwyznaczy l wartość rozwi ↪azania
bardzo szybko korzystaj ↪ac z algorytmu II.
Algorytm II wyznaczania sumy kolejnych liczb naturalnych
// W e j ś c i e : a, b ∈ N (a < b)// W y j ś c i e : a+ a+
1 + ...+ b ∈ N
niech suma ∈ N;suma = a+b2 (b− a+ 1);zwróć suma jako wynik;
Zauważmy, że obydwa algorytmy rozwi ↪azuj ↪a poprawnie to samo
zagadnienie. Mimo toinna jest liczba operacji arytmetycznych (+,−,
∗, /) potrzebna do uzyskania oczekiwanegowyniku. Poniższa tabelka
zestawia t ↪e miar ↪e efektywności obydwu rozwi ↪azań dla
różnychdanych wej́sciowych. Zauważmy, że w przypadku pierwszego
algorytmu liczba wykonywa-nych operacji dodawania jest równa (b−
a+ 1) [instrukcja suma = suma + i] + (b− a)[dodawanie wyst ↪epuje
także w p ↪etli dla. . . ].
Tab. 1.2. Liczba operacji arytmetycznych potrzebna do
znalezienia rozwi ↪azania problemum lodego Gaussa.
a b Alg. I Alg. II
1 10 19 51 100 199 51 1000 1999 5
Ciekawostka
Badaniem efektywności algorytmów zajmuje si ↪e dziedzina zwana
analiz ↪a algorytmów . Czerpieona obficie z wyników teoretycznych
takich dzia lów matematyki jak matematyka dyskretnaczy rachunek
prawdopodobieństwa. Z jej elementami zapoznamy si ↪e podczas
innych wyk ladów.
Ostatnia aktualizacja: 1 października 2016 r.
-
1.2. ETAPY TWORZENIA OPROGRAMOWANIA 9
1.2.3. Implementacja
Na kolejnym etapie abstrakcyjne algorytmy, zapisane cz ↪esto w
postaci pseudokodu (np. zapomoc ↪a j ↪ezyka polskiego), należy
przepisać w formie, która jest zrozumia la nie tylko przeznas,
ale i przez komputer. Jest to tzw. implementacja algorytmów.
Intuicyjnie, tutaj wreszcie t lumaczymy komputerowi, co dok
ladnie chcemy, by zrobi l,tzn. go programujemy. Efektem naszej
pracy b ↪edzie kod źród lowy programu.
Ponadto, jeśli zachodzi taka potrzeba, na tym etapie należy
dokonać scalenia czy teżpowi ↪azania podzadań (”
rosó l”,”chili con carne” oraz
”pierniczki”) w jeden spójny projekt
(”obiad”).
Zapami↪etaj
Formalnie rzecz ujmuj ↪ac, zbiór zasad określaj ↪acych, jaki
ci ↪ag symboli tworzy kodźród lowy programu, nazywamy j ↪ezykiem
programowania.
Regu ly sk ladniowe j ↪ezyka (ang. syntactic rules) ścísle
określaj ↪a, które (i tylko które)wyrażenia s ↪a poprawne. Regu
ly znaczeniowe (ang. semantics) określaj ↪a precyzyjnie,
jakkomputer ma rozumieć dane wyrażenia. Dziedzin ↪a zajmuj ↪ac ↪a
si ↪e analiz ↪a j ↪ezyków progra-mowania jest lingwistyka
matematyczna.
W trakcie zaj ↪eć z AiPP b ↪edziemy poznawać j ↪ezyk C++,
zaprojektowany ok. 1983 r.przez B. Stroustrupa (aktualny standard:
ISO/IEC 14882:2003). Należy pami ↪etać, że C++jest tylko jednym
z wielu (naprawd ↪e wielu) sposobów, w jakie można wydawać
poleceniakomputerowi.
Ciekawostka
J ↪ezyk C++ powsta l jako rozwini ↪ecie j ↪ezyka C. Wśród
innych, podobnych do niego pod wzgl ↪e-dem sk ladni, j ↪ezyków
można wymienić takie popularne narz ↪edzia jak Java, C#, PHP
czyJavaScript.
J ↪ezyk C++ wyróżnia si ↪e zwi ↪ez lości ↪a sk ladni i
efektywności ↪a generowanego kodu wyniko-wego. Jest ponadto jednym
z najbardziej popularnych j ↪ezyków ogólnego zastosowania.
Kod źród lowy programu zapisujemy zwykle w postaci kilku
plików tekstowych(tzw. plików źród lowych, ang. source files).
Pliki te można edytować za pomoc ↪a dowolnegoedytora tekstowego,
np. Notatnik systemu Windows. Jednak do tego celu lepiej przydaj
↪asi ↪e środowiska programistyczne. Na przyk lad, my podczas
laboratoriów b ↪edziemy używaćMicrosoft Visual C++2.
Zapami↪etaj
Narz ↪edziem, które pozwala przetworzyć pliki źród lowe
(zrozumia le dla cz lowiekai komputera) na kod maszynowy programu
komputerowego (zrozumia ly tylko dlakomputera) nazywamy
kompilatorem (ang. compiler).
Zanotujmy, że środowisko Visual C++ posiada zintegrowany
(wbudowany) kompilatortego j ↪ezyka.
2Dost ↪epna jest bezp latna wersja tego środowiska, zob.
instrukcj ↪e instalacji opisan ↪a w samouczku nr 1.
Ostatnia aktualizacja: 1 października 2016 r.
-
1.2. ETAPY TWORZENIA OPROGRAMOWANIA 10
1.2.4. Testowanie
Gotowy program należy przetestować, to znaczy sprawdzić, czy
dok ladnie robi to, o co namchodzi lo. Jest to, niestety, cz ↪esto
najbardziej żmudny etap tworzenia oprogramowania. Jeślicoś nie
dzia la, jak powinno, należy wrócić do któregoś z poprzednich
etapów i naprawićb l ↪edy.
Warto zwrócić uwag ↪e, że przyczyn niepoprawnego dzia lania
należy zawsze szukaćw swojej omylności, a nie liczyć na to, że
jakís chochlik robi nam na z lość. Jak powie-dzielísmy,
komputer robi tylko to, co każemy. Zatem jeśli nakazalísmy
wykonać instrukcj ↪e,której skutków ubocznych nie jesteśmy do
końca pewni, nasza to odpowiedzialność, byskutki te
opanować.
1.2.5. Eksploatacja
Gdy program jest przetestowany, może s lużyć do rozwi
↪azywania wyj́sciowego problemu(wyj́sciowych problemów). Czasem
zdarza si ↪e, że na tym etapie dochodzimy do wniosku,iż czegoś
nam brakuje lub że nie jest to do końca, o co nam na pocz ↪atku
chodzi lo. Wtedyoczywíscie pozostaje powrót do wcześniejszych
etapów pracy.
Nauka programowania komputerów może nam pomóc rozwi ↪azać
wiele problemów. Pro-blemów, których rozwi ↪azanie w inny
sposób wcale nie by lyby dla nas dost ↪epne. A ponadtozobaczymy,
że jest wspania l ↪a rozrywk ↪a!
1.2.6. Podsumowanie
Omówilísmy nast ↪epuj ↪ace etapy tworzenia oprogramowania,
które s ↪a niezb ↪edne do rozwi ↪a-zania zagadnień za pomoc ↪a
komputera:
– sformu lowanie i analiza problemu,– projektowanie,–
implementacja,– testowanie,– eksploatacja.
Efekty pracy po każdym z etapów podsumowuje rys. 1.3.
Godne polecenia rozwini ↪ecie materia lu omawianego w tej cz
↪eści skryptu można znaleźćw ksi ↪ażce Harela (2001, s.
9–31).
Na zakończenie przytoczmy fragment ksi ↪ażki F.P. Brooksa
(Mityczny osobomiesi ↪ac.Eseje o inżynierii oprogramowania, wyd.
WNT).
Programowanie przynosi wiele radości; Pierwsza to zwyczajna
rozkosz tworze-nia czegoś. Jak dziecko lubi stawiać domki z
piasku, tak doros ly lubi budowaćcoś, zw laszcza wed lug w
lasnego projektu. [. . . ] Druga to przyjemność robieniaczegoś
przydatnego dla innych ludzi. W g l ↪ebi duszy chcemy, żeby inni
korzystaliz naszej pracy i uznawali j ↪a za użyteczn ↪a. [. . . ]
Trzecia przyjemność to fascyna-cja tworzenia z lożonych
przedmiotów, przypominaj ↪acych lamig lówki sk ladaj ↪acesi ↪e z
zaz ↪ebiaj ↪acych si ↪e, ruchomych cz ↪eści, i obserwowanie ich
dzia lania [. . . ].Czwarta przyjemność wyp lywa z ci ↪ag lego
uczenia si ↪e i wi ↪aże si ↪e z niepowtarzal-ności ↪a istoty
zadania. W taki czy inny sposób problem jest wci ↪aż nowy, a
ten,kto go rozwi ↪azuje, czegoś si ↪e uczy [. . . ]
Brooks twierdzi także, że to, co przynosi radość, czasem
musi powodować ból:
– należy dzia lać perfekcyjnie,
Ostatnia aktualizacja: 1 października 2016 r.
-
1.2. ETAPY TWORZENIA OPROGRAMOWANIA 11
– poprawianie i testowanie programu jest uci ↪ażliwe,
a także, w przypadku aplikacji komercyjnych:
– ktoś inny ustala cele, dostarcza wymagań; jesteśmy zależni
od innych osób,– należy mieć świadomość, że program, nad
którym pracowa lo si ↪e tak d lugo, w chwili
ukończenia najcz ↪eściej okazuje si ↪e już przestarza ly.
PROBLEM
IDEE
ALGORYTMY
KOD ŹRÓD LOWY
POPRAWNY PROGRAM
ROZWI ↪AZANIE
Analiza
Projektowanie
Implementacja
Testowanie
Eksploatacja
Rys. 1.3. Efekty pracy po każdym z etapów tworzenia
oprogramowania
Ostatnia aktualizacja: 1 października 2016 r.
-
1.3. ĆWICZENIA 12
1.3. ĆwiczeniaZadanie 1.1. Rozważ poniższ ↪a implementacj ↪e
(w j ↪ezyku C++) algorytmu Euklidesa znaj-dywania najwi ↪ekszego
wspólnego dzielnika (NWD) dwóch liczb naturalnych 0 ¬ a <
b.
1 // W e j ś c i e : 0 ¬ a < b2 // W y j ś c i e : NWD(a, b
)3 int NWD(int a, int b) // t j . NWD : N× N→ N4 {5 assert (a >=
0 && a < b); // w a r u n k i poprawn . d a n y c h w e
j .6 int c; // n i e c h c ∈ N − z m i e n n a p o m o c n i c z a7
while (a != 0) // t z n . d o p ó k i (a 6= 0 )8 {9 c = b % a; //
c s t a j e s i ↪e r e s z t ↪a z d z i e l e n i a b p r z e z
a
10 b = a;11 a = c;12 }13 return b; // z w r ó ć w a r t o ś
ć b j a k o w y n i k ;14 }
Prześledź dzia lanie algorytmu Euklidesa, prezentuj ↪ac w
postaci tabelki, jakie wartościprzyjmuj ↪a zmienne a, b, c w
każdym kroku. Rozpatrz: a) NWD(42, 56), b) NWD(192,348), c)
NWD(199, 544), d) NWD(2166, 6099).
Zadanie 1.2. Pokaż, w jaki sposób za pomoc ↪a ci ↪agu operacji
przypisania można przesta-wić wartości dwóch zmiennych (a, b)
tak, by otrzymać (b, a).Zadanie 1.3. Napisz kod, który przestawi
wartości (a, b, c) na (c, a, b).Zadanie 1.4. Napisz kod, który
przestawi wartości (a, b, c, d) na (c, d, b, a).Zadanie 1.5.
Dokonaj permutacji ci ↪agu (a, b, c) tak, by otrzymać ci ↪ag
(a
′, b′, c′) taki, żea′ ¬ b′ ¬ c′.Zadanie 1.6. Pokaż, w jaki
sposób za pomoc ↪a ci ↪agu przypisań i podstawowych opera-cji
arytmetycznych można maj ↪ac na wej́sciu ci ↪ag zmiennych (a, b,
c) otrzymać a) (b, c +10, a/b), b) (a+ b, c2, a+ b+ c), c) (a−
b,−a, c−a+ b). Postaraj si ↪e zminimalizować liczb ↪eużytych
instrukcji i zmiennych pomocnicznych.
Zadanie 1.7. [MD] Prześledź dzia lanie poniższej funkcji w j
↪ezyku C++ wywo lanej jakoa) f(2, 4) i b) f(3,−1).
1 double f( double x, double y) // t j . f : R× R→ R2 {3 double
c; // n i e c h c ∈ R − z m i e n n a p o m o c n i c z a4 c = x +
y + 1;5 if (y > 1) // j e ś l i y > 16 c = c / y;7 return c;
// z w r ó ć w a r t o ś ć c j a k o w y n i k8 }
Zadanie 1.8. [MD] Wzoruj ↪ac si ↪e na kodzie z zadania 1.7 oraz
wykorzystuj ↪ac funkcj ↪e ftam zdefiniowan ↪a, napisz kod funkcji g
: R× R→ R, która jest określona wzorem:
g(a, b) ={f(a+ b, a− b) dla a > b,b− a dla b a.
Zadanie 1.9. Dany jest ci ↪ag n liczb rzeczywistych x = (x[0], .
. . , x[n−1]) (umawiamy si ↪e,że elementy ci ↪agów numerujemy od
0). Dla ci ↪agów (1,−1, 2, 0,−2) oraz (34, 2,−3, 4, 3.5)
Ostatnia aktualizacja: 1 października 2016 r.
-
1.3. ĆWICZENIA 13
prześledź dzia lanie nast ↪epuj ↪acego algorytmu s luż ↪acego
do wyznaczania średniej arytme-tycznej, która jest określona
wzorem:
1n
∑n−1i=0 x[i] = 1n (x[0] + x[1] + · · ·+ x[n− 1]) .
1 // W e j ś c i e : n > 0 o r a z x[0], x[1], . . . , x[n−
1] ∈ R2 // W y j ś c i e : ś r e d n i a a r y t m e t y c z n a
z (x[0], x[1], . . . , x[n− 1])3 niech s ∈ R;4 s = 0;5 dla (i=0 ,1
,... ,n−1)6 s = s + x[i];7 zwróc s/n jako wynik;
Zadanie 1.10. Dany jest ci ↪ag n dodatnich liczb rzeczywistych x
= (x[0], . . . , x[n − 1])(różnych od 0). Napisz algorytm, który
wyznaczy ich średni ↪a harmoniczn ↪a:
n∑n−1i=0
1x[i]
= n1/x[0] + 1/x[1] + · · ·+ 1/x[n− 1] .
Wyznacz za pomoc ↪a tego algorytmu wartość średniej
harmonicznej dla ci ↪agów (1, 4, 2, 3, 1)oraz (10, 2, 3,
4).Zadanie 1.11. Napisz kod, który dla danych dodatnich liczb
rzeczywistych a, b, c spraw-dzi, czy może istnieć trójk ↪at
prostok ↪atny o bokach podanych d lugości.
Zadanie 1.12. Napisz kod, który dla danych dodatnich liczb
rzeczywistych a, b, c spraw-dzi, czy może istnieć trójk ↪at
(dowolny) o bokach podanych d lugości.
Zadanie 1.13. Napisz kod, który dla danych liczb rzeczywistych
a, b, c wyznaczy rozwi ↪a-zanie równania ax2 + bx+ c = 0 (wzgl
↪edem x).? Zadanie 1.14. [PS]
”Szklana pu lapka”. Masz do dyspozycji pojemniki na wod ↪e o
ob-
j ↪etości x i y litrów oraz dowoln ↪a ilość wody w basenie.
Czy przy ich pomocy (pojemnikiwype lnione do pe lna) można wybrać
z litrów wody? Napisz pseudokod algorytmu, któryto sprawdza i
dokonaj obliczeń dla a) x = 13, y = 31, z = 1111, b) x = 12, y =
21, z = 111.
Ostatnia aktualizacja: 1 października 2016 r.
-
1.4. WSKAZÓWKI I ODPOWIEDZI DO ĆWICZEŃ 14
1.4. Wskazówki i odpowiedzi do ćwiczeń
Odpowiedź do zadania 1.1.NWD(42,56) = 14.
5: a=42, b=56, c=07: a=42, b=56, c=148: a=42, b=42, c=149: a=14,
b=42, c=145: a=14, b=42, c=147: a=14, b=42, c=08: a=14, b=14, c=09:
a=0, b=14, c=05: a=0, b=14, c=0Wynik: 14
NWD(192,348) = 12.
5: a=192, b=348, c=07: a=192, b=348, c=1568: a=192, b=192,
c=1569: a=156, b=192, c=1565: a=156, b=192, c=1567: a=156, b=192,
c=368: a=156, b=156, c=369: a=36, b=156, c=365: a=36, b=156, c=367:
a=36, b=156, c=128: a=36, b=36, c=129: a=12, b=36, c=125: a=12,
b=36, c=127: a=12, b=36, c=08: a=12, b=12, c=09: a=0, b=12, c=05:
a=0, b=12, c=0Wynik: 12
NWD(199, 544) = 1.NWD(2166, 6099) = 57. �
Odpowiedź do zadania 1.9.Wynik dla (1,−1, 2, 0,−2): 0.Wynik dla
(34, 2,−3, 4, 3.5): 8,1. �
Odpowiedź do zadania 1.10.Wynik dla (1, 4, 2, 3, 1): 6037
.Wynik dla (10, 2, 3, 4): 24071 . �
Odpowiedź do zadania ??. SKO(5, 3,−1, 7,−2) = 59,2.Podany
algorytm wymaga n2 + 5n operacji arytmetycznych. Nie jest on
efektywny,
gdyż można go latwo usprawnić tak, by potrzebnych by lo 5n+ 1
dzia lań (+,−, ∗, /). �
Ostatnia aktualizacja: 1 października 2016 r.
WprowadzenieEtapy tworzenia oprogramowaniaSformułowanie i
analiza
problemuProjektowanieImplementacjaTestowanieEksploatacjaPodsumowanie
CwiczeniaWskazówki i odpowiedzi do cwiczen