16
MAREK G , AGOLEWSKI INSTYTUT BADA ´ N SYSTEMOWYCH PAN WYDZIA L MATEMATYKI I NAUK INFORMACYJNYCH POLITECHNIKI WARSZAWSKIEJ Algorytmy i podstawy programowania Materialy dydaktyczne dla student´ ow matematyki na Wydziale Matematyki i Nauk Informacyjnych Politechniki Warszawskiej Ostatnia aktualizacja: 1 pa´ zdziernika 2016 r. Copyright © 2010–2016 Marek G , agolewski This work is licensed under a Creative Commons Attribution 3.0 Unported License.

Algorytmy i podstawy programowania - Gagolewski · 2017. 2. 1. · Rekurencja, 6.Wska zniki. Dynamiczna alokacja pamieci. Tablice jednowymiarowe. Sortowanie.L an -, cuchy znakow 7.Macierze

  • Upload
    others

  • View
    2

  • Download
    0

Embed Size (px)

Citation preview

  • 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