Vsebina Od problema do načrta programa 1. del Osnovne strategije iskanja rešitev problema Načini opisovanja rešitev problema Osnovni gradniki rešitve problema Primeri Napišite postopek za kuhanje kave Rešitev problema je opisana kot zaporedje napotkov Napotki si sledijo en za drugim vrstni red je pomemben zaporedje/sekvenca Posamezne korake lahko opišemo podrobneje razgradnja/dekompozicija Razgradnja poteka tako dolgo, dokler ne dobimo enostavnih napotkov V programski kodi se napotki imenujejo stavki ali ukazi. Zaporedje stavkov združujemo v bloke, podprograme in programske module. Napišite postopek za prehod preko ceste pri semaforju Pri nekoliko kompleksnejših problemih nam enostavno zaporedje navodil ne zadostuje Glede na nek pogoj se moramo odločiti katero izmed alternativnih variant bomo izvedli izbira/alternativa V programski kodi izbiro ponazorimo z odločitvenimi stavki Če bo lepo vreme, bom šel na čago, sicer se bom učil OPDP. Če je vrednost imenovalca ulomka enaka 0, javi napako. 1
Izdelajte postopek s katerim boste komplet 52 igralnih kart razdelili na rdeče in črne Zelo pogosto moramo neko sekvenco napotkov večkrat ponoviti število ponovitev je lahko podano naprej ali pa je odvisno od nekega pogoja ponavljanje/iteracija V programski kodi ponavljanje izvajajo ponavljalni stavki/zanke Napišite postopek za izračun končne ocene pri predmetu OPDP, če poznate število točk testov, domačih nalog in vaj Najpogosteje problemi, ki jih rešujemo z računalniki vsebujejo neke matematične izračune V programskem jeziku takšne račune imenujemo izrazi Izrazi so lahko običajno samo enostavne matematične operacije/operatorji: plus, minus, krat, deljeno, ostanek pri deljenju in elementarne matematične funkcije (npr. sinus, logaritem, ). Ploščina kvadrata je: a 2. Razdalja med točkami v ravnini je: (x 2 x 1 ) 2 + (y 2 y 1 ) 2 Tudi pri odločitvah in pogojih za ponavljanje se pojavljajo izrazi povedo, če je nekaj res ali ni logični izrazi Logične izraze lahko kombiniramo z operacijami kot so in, ali in ne/ni Če bo lepo vreme, in če bom imel denar ali pa si ga bom lahko sposodil, in če se ne rabim učiti OPDP, bom šel na čago. V izrazih se lahko pojavljajo nespremenljive (konstantne) vrednosti konstante Druge vrednosti se med izvajanjem postopka spreminjajo spremenljivke Začetne vrednosti spremenljivk določimo z izrazi (prireditveni ) ali pa jih preberemo od zunaj 2
Vrednosti konstant in spremenljivk imajo lahko vrednosti različnih tipov števila, barve, datumi, podatkovni tip Podatkovni tip določa kakšne vrednosti lahko zavzame nek podatek in katere operacije lahko izvajamo nad njimi (kakšne izraze lahko tvorimo z njimi) Pri reševanju problemov z računalnikom se skoraj vedno pojavi potreba po vnosu nekaterih podatkov vhodni parametri programa Ti podatki se potem obdelajo po postopku, ki smo ga določili Na koncu nam mora program izpisati rezultat obdelave izhodni parametri Osnovne strategije iskanja rešitev Iskanje in uporaba obstoječih rešitev Postopna razgradnja problema (top down pristop), pristop deli in vladaj Kombinacija ij različnih ih tehnik Iskanje in uporaba obstoječih rešitev Zelo malo problemov je takšnih, ki bi jih morali razviti čisto od začetka Uporabimo lahko obstoječe ideje in rešitve, ki so jih razvili drugi razvijalci Uporabimo lahko (delne) rešitve lastnih projektov ponovna uporaba (pouporaba) Paziti moramo na avtorske pravice in plagiatorstvo (npr. odprtokodne rešitve) Primeri ponovne uporabe Ponovna uporaba delov programov Programske knjižnice Npr. podatki in manipulacija podatkov o študentih so del večine aplikacij za študentsko evidenco vpisi, izpiti, diplome, spletni ltiračun č študenta, t e vpis, Ponovna uporaba uporabniških vmesnikov Npr. ponovna uporaba uporabniških vmesnikov pri RAD orodjih Ponovna uporaba domačih nalog in programov sošolcev ni dovoljena Obstoječa aplikacija kot osnova za reševanje problemov Obstoječa aplikacija nam lahko služi kot orodje za izdelavo bolj popolnih aplikacij Z analizo obstoječe programske kode lahko pridemo do potrebnih postopkov za rešitev problema reverzni inženiring 3
Postopna razgradnja problema Deli in vladaj Rešitev problema najprej opišemo na najvišjem nivoju (abstraktni oz. kontekstni nivo) Posamezne dele rešitve nato podrobneje razgradimo Postopek ponavljamo tako dolgo, da dobimo lahko obvladljive podprobleme, ki jih je možno pretvoriti v programsko kodo Postopna razgradnja je le ena izmed verzij bolj osnovne strategije reševanja kompleksnejših problemov deli in vladaj: Problem razdelimo na manjše, med seboj neodvisne podprobleme Posamično rešimo vsakega od podproblemov Na koncu delne rešitve podproblemov združimo v končno rešitev problema Problem mora biti razgradljiv Različne metodologije/pristopi k reševanju problemov Strukturni pristop (strukturno programiranje) Objektni pristop (objektno programiranje) Funkcijski pristop Aspektni pristop Načini opisovanja rešitev problema Psevdokod Naravno besedilo za opis postopka z določenimi sintaksnimi omejitvami Diagram poteka Grafična predstavitev dt postopka Nassi Shneiderman diagrami Entitetno relacijski model (podatkovna baza) Razredni diagrami Osnovni elementi algoritmov Programski sklopi Podprogrami funkcije in procedure Programski moduli (datoteke) Spremenljivke, podatkovni dtk itipi, i konstante t in izrazi 4
Osnovni elementi algoritmov Spremenljivke Stavki Elementarni stavki Prireditveni Branje podatkov Izpis podatkov Sestavljeni stavki Zaporedje (sekvenca) Odločitev (izbira, selekcija) Ponavljanje (iteracija) Sočasno izvajanje Spremenljivke so elementi algoritma (programa), ki hranijo neko informacijo potrebno za rešitev naloge Nabor vrednosti, ki jo lahko neka spremenljivka hrani, je določen z njenim podatkovnim tipom Za poimenovanja spremenljivk ima vsak programski jezik določena slovnična pravila 3 2 5 Spremenljivke 3.0 5,98 3,1 A 9 $ Spremenljivko si lahko ponazorimo kot kontejnerje, kjer lahko hrani samo določeno vrsto stvari (papir, steklo, plastika, ) Pri računalniku so različne stvari cela števila, števila z decimalno vejico, črke, v računalniku je naenkrat lahko v kontejnerju samo ena vrednost Poimenovanja spremenljivk Običajno je prvi znak imena spremenljivke črka, ki mu sledi več črk ali števk določeni programski jeziki dopuščajo še kakšne druge znake (npr. podčrtaj) A, I, X, Abrakadabra, Stevec, StElementov, MAX_SIZE, Spremenljivka_z_zelo_dolgim_imenom 6tinivo, va vrednost, Pazi!, #@@%# Nekateri programski jeziki ločijo različne velikosti črk v imenih spremenljivk (C!), drugi ne Spremenljivke V večini programskih jezikov je potrebno spremenljivko, ki jo uporabljamo, predhodno deklarirati oz. specificirati Deklaracija zagotovi (rezervira) prostor za vrednost spremenljivke v pomnilniku računalnika in določi njen podatkovni tip Specifikacija poveže ime spremenljivke v enem programskem modulu in deklaracijo (iste) spremenljivke v drugem modulu ne rezervira nobenega pomnilniškega prostora Spremenljivke Določeni programski jeziki (npr. Basic) dopuščajo uporabo spremenljivk brez deklaracije spremenljivke lahko vsebujeo vrednost (skoraj) poljubnega podatkovnega tipa V algoritmih in načrtih programa deklaracijo spremenljivk običajno izpustimo 5
Podatkovni tipi Podatkovni tipi Določajo nabor vrednosti, ki jih lahko hrani neka spremenljivka ali konstanta oz. nabor vrednosti, ki jih lahko določa (vrača) nek izraz Podatkovni tipi so lahko: enostavni informacijo predstavlja ena vrednost sestavljeni informacija je zgrajena iz več vrednosti (polja, strukture, razredi, ) Vsak podatkovni tip ima definiran nabor operacij (operatorjev in funkcij), ki jih lahko izvajamo nad njegovo zalogo vrednosti in jih uporabljamo v izrazih V programskih jezikih so te operacije strogo določene č V psevdokodu oz. v diagramu poteka sta običajno nabor možnosti in sintaksa bolj ohlapna Operatorji imajo določeno prioriteto (kateri operator se bo izvedel prej) in asociativnost (ali se izvaja iz leve proti desni ali z desne proti levi) Enostavni podatkovni tipi Celoštevilčni podatkovni tip Določajo nabor vrednosti iz množice celih števil v določenem obsegu Običajno ločimo med nepredznačenimi (unsigned) in predznačenimi (signed) celoštevilčnimi podatkovnimi tipi prvi zajemajo samo nenegativne vrednosti, drugi pa dopuščajo tako pozitivne kot negativne vrednosti Enostavni podatkovni tipi Realni podatkovni tip Določajo nabor vrednosti iz množice realnih števil v določenem obsegu in z določeno natančnostjo Logični podatkovni tip Vsebuje nabor vrednosti dveh elementov (True in False) Najpogosteje se uporablja v odločitvenih pogojih stavkov za izbiro in ponavljanje Znakovni podatkovni tip, časovni podatkovni tip, Celoštevilčni podatkovni tip Celoštevilčni podatkovni tip Obseg vrednosti: Primeri za nepredznačena števila 0 255, 0 65535, 0 4294967295 Primeri za predznačena števila 128 +127, 32768 +32767, 2147483648 +2147483647 Operatorji: Operator Opis () Oklepaji spremenijo prednost operatorjev Sprememba predznaka *, / (div), % (mod), ** AND, OR, XOR, NOT Množenje, celoštevilčno deljenje, ostanek pri deljenju, potenca Aritmetični: in, navadni ali, izključen ali, aritmetična negacija +, Seštevanje, odštevanje Funkcije: Funkcija abs(x) sqr(x) round(x) Opis Absolutna vrednost (abs( 3)=>3) Kvadrat števila (enako kot x*x) Zaokrožena vrednost (operand je realna vrednost) (round(0.5)=>1) 6
Realni podatkovni tip Realni podatkovni tip Obseg in napačnost: IEEE realna števila z enojno natančnostjo 1,18*10 38 3,40*10 +38 7 mest natančnosti IEEE realna števila z dvojno natančnostjo 2,23*10 308 1,79*10 +308 15 mest natančnosti Operatorji: Operator Opis () Oklepaji spremenijo prednost operatorjev Sprememba predznaka ** Potenca *, / Množenje in deljenje +, Seštevanje, odštevanje Funkcije: Funkcija abs(x) sqr(x) sqrt(x) sin(x), cos(x), tan(x) log(x), exp(x), log10(x) Opis Absolutna vrednost Kvadrat števila (enako kot x*x) Kvadratni koren števila (sqrt(9)=>3) Krožne funkcije Naravni logaritem, esponent z osnovo e, desetiški logaritem Logični podatkovni tip Logični podatkovni tip Operatorji: Operator Opis () Oklepaji spremenijo prednost operatorjev NOT Logična negacija AND Logični in OR, XOR Logični ali, logični ekskluzivni ali A B NOT A A AND B A OR B A XOR B F F T F F F F T T F T T T F F F T T T T F T T F T True/Res F False/Ni res Relacijski (primerjalni) operatorji delujejo nad drugimi podatkovnimi tipi in vračajo logično vrednost Relacijski operator Opis <, <=, >, >= Je manjši, je manjši ali enak, je večji, je večji ali enak = (==), <> (!=) Je enak, je različen Konstante Simbolične konstante Konstante so elementi algoritma oz. programa, ki nosijo neko informacijo, ki se med izvajanjem ne spreminja Tako kot spremenljivke in izrazi, ima tudi konstanta določen svoj podatkovni tip Številčne konstante 5, 3.6, 12E 3, 0.025 Logične konstante True, False Znakovne konstante A V večini programskih jezikov lahko določenim konstantam priredimo simbolično ime, ki ga potem uporabljamo v kodi Simbolična konstanta se obnaša podobno kot spremenljivka, le da ji naknadno ne moremo spremeni vrednosti Simbolične konstante povečajo preglednost programske kode in enostavnejše spreminjanje #define PI 3.14159 7
Izrazi Izrazi Izraz je kombinacija spremenljivk, konstant, operatorjev in klicev funkcij, ki vrača neko vrednost Glede na tip podatka, ki mu pripada p rezultat izraza, delimo izraze na: matematične (celoštevilčne oz. realne) logične znakovne Izraze različnih tipov običajno ne moremo mešati med seboj oz. jih je potrebno najprej pretvoriti na skupen podatkovni tip (typecasting) Pretvorbo lahko izvede programer (eksplicitno) ali za to poskrbi prevajalnik (implicitno) 3*5.0 pred izračunom se levi operand pretvori iz celega v realno število Številčni izrazi: Zgledi izrazov 3/5.0 3/5 5+8*(2 sqr(5)) 3*sin(0.5) Logični izrazi: Elementarni stavki Prireditveni : izračuna določen izraz in vrednost priredi podani spremenljivki Izraz na desni strani se mora po tipu ujemati s tipomspremenljivkena na levistrani 3>5.0 3>5 8<9 AND (12<3 OR 5<>6) Psevdokod: set spremenljivka = izraz Diagram poteka: ali spremenljivka = izraz spremenljivka = izraz Elementarni stavki Branje podatkov: prebere enega ali več podatkov iz vhodne enote in jih priredi podani spremenljivkam Psevdokod: Diagram poteka: read spremenljivka read spremenljivka Elementarni stavki Izpis podatkov: izpiše enega ali več izrazov na izhodno napravo Psevdokod: d print izraz Diagram poteka: print izraz 8
Zaporedje (sekvenca) Ponazarja zaporedje izvajanja stavkov (elementarnih ali sestavljenih) Stavki se izvedejo en za drugim v podanem zaporedju Psevdokod: Diagram poteka: Zaporedje (sekvenca) Zaporedje elementarnih stavkov enakega tipa običajno navedemo v skupnem bloku: a = 12 b = a*3 begin end ali print a print b Odločitev (selekcija) Glede na nek pogoj se izvede ena izmed dveh (ali več) alternativnih poti skozi postopek Možnih je več različic odločitvenega stavka: Stavek kif brez alternative Stavek if z eno alternativo Sestavljeni if z več alternativami Odločitev (selekcija) Odločitveni z eno alternativo Če je izpolnjen nek pogoj, se izvede določena pot skozi program, sicer se izvajanje tega dela kode preskoči Psevdokod: Diagram poteka: if logični izraz then logični izraz Odločitev (selekcija) Odločitveni z dvema alternativama Psevdokod: Diagram poteka: if logični izraz then logični izraz Odločitev (selekcija) Odločitveni z več alternativami Psevdokod: if logični izraz then if logični izraz then if logični izraz then ali if logični izraz then if logični izraz then if logični izraz then 9
Odločitev (selekcija) Odločitveni z več alternativami Diagram poteka: log. izraz log. izraz log. izraz Komentarji Komentarji so bistveni del vsakega algoritma in programa, ker nudijo razlago rešitve problema Komentarje v programski kodi prevajalnik ignorira Ločimo med: Vrstičnimi komentarji segajo do konca vrstice Blok komentarji zajemajo lahko del vrstice ali več vrstic Primer 1 Komentarji v psevdokodu: // vrstični komentar /* */ blokovni komentar Komentarji v diagramu poteka read x,y Preberemo koordinato točke Naloga: Izdelajte postopek, ki bo izpisal vsoto dveh vnesenih števil. Analizainrazgradnja in problema: 1. Branje dveh števil 2. Izračun vsote 3. Izpis vsote Primer 1 Načrt rešitve s psevdokodom: // 1. Branje dveh števil read stevilo1,stevilo2 stevilo2 // 2. Izračun vsote set vsota=stevilo1+stevilo2 // 3. Izpis vsote print vsota Primer 1 Načrt rešitve z diagramom poteka: read stevilo1 read stevilo2 vsota = stevilo1+ stevilo2 print vsota 10
Posplošitev primera 1 Naloga: Izdelajte postopek, ki bo izpisal XXXX vnesenih števil. Analizainrazgradnjain problema: 1. Branje vhodnih parametrov 2. Izračun izhodnih vrednosti 3. Izpis izhodnih vrednosti Posplošitev primera 1 Načrt rešitve s psevdokodom: // 1. Branje vhodnih parametrov read // 2. Izračun izhodnih vrednosti set // 3. Izpis izhodnih vrednsoti print Posplošitev primera 1 Primer 2 Načrt rešitve diagramom poteka: read Naloga: Izdelajte postopek, ki bo izpisal manjšega in večjega izmed dveh vnesenih števil. Analizainrazgradnja in problema: print 1. Branje dveh števil 2. Ugotavljanje katero število je večje in katero manjše 3. Izpis manjšega in večjega števila Primer 2 Podrobnejša razgradnja problema: 1. Branje dveh števil 2a. Ugotavljanje katero število je manjše 2b. Ugotavljanje katero število je večje 3. Izpis manjšega in večjega števila Rešitev A // 1. Branje dveh števil read stevilo1,stevilo2 // 2a. Ugotavljanje katero število je manjše if stevilo1<stevilo2 then set manjše = stevilo1 set manjše = stevilo2 // 2b. Ugotavljanje katero število je večje if stevilo1<stevilo2 then set večje = stevilo2 set večje = stevilo1 // 3. Izpis manjšega in večjega števila print manjše, večje 11
Rešitev B // 1. Branje dveh števil read stevilo1,stevilo2 /* 2. Ugotavljanje katero število je manjše in katero večje */ if stevilo1<stevilo2 then set manjše = stevilo1 set večje = stevilo2 set manjše = stevilo2 set večje = stevilo1 // 3. Izpis manjšega in večjega števila print manjše, večje Rešitev B manjše = stevilo1 večje = stevilo2 read stevilo1 read stevilo2 stevilo1< stevilo2 manjše = stevilo2 večje = stevilo1 print manjše print večje Primer 3 Primer 3 Naloga: Izdelajte postopek, ki bo določil in izpisal razdaljo med dvema točkama v ravnini. Analizainrazgradnjain problema: 1. Branje koordinat dveh točk 2. Izračun razdalje 3. Izpis razdalje Podrobnejša analiza Kako se izračuna razdalja med dvema točkama v ravnini Pogledamo v matematični priročnik Pogooglamo g Vprašamo profesorja matematike d = (x 2 x 1 ) 2 + (y 2 y 1 ) 2 Primer 3 Načrt rešitve s psevdokodom: // 1. Branje koordinat dveh točk read x1,y1,x2,y2 x2 y2 // 2. Izračun razdalje set d=sqrt(sqr(x2 x1)+sqr(y2 y1)) // 3. Izpis razdalje print d Primer 4 Naloga: Izdelajte postopek, ki bo izpisal kvocient dveh vnesenih števil. V primeru, da je drugo število enako 0, naj izpiše obvestilo o napaki. Analiza in razgradnja problema: 1. Branje dveh števil 2. Ugotavljanje ali je drugo število enako 0 3. Če je, izpis sporočila o napaki 4. Če ni, izračun kvocienta in izpis rezultata 12
Posplošitev primera 4 Naloga: Izdelajte postopek, ki bo XXXX. V primeru, da je YYYY, naj izpiše obvestilo o napaki. Analizainrazgradnjain problema: 1. Branje vhodnih podatkov 2. Ugotavljanje ali so vhodni podatki pravilni 3. Če niso, izpis sporočila o napaki 4. Če so, izračun naloge in izpis rezultata Primer 4 Posplošena rešitev s psevdokodom: // 1. Branje vhodnih podatkov read /* vhodni podatki */ // 2. Ugotavljanje j pravilnosti if not /* podatki pravilni */ then print Napaka // 3. Izračun rezultata /* set rezultat = */ // 4. Izpis rezultata print /* rezultat */ Posplošena rešitev z diagramom poteka read Primer 4 Konkretna rešitev s psevdokodom: print podatki pravilni print Napaka // 1. Branje vhodnih podatkov read a,b // 2. Ugotavljanje j pravilnosti if not (b<>0) then print Napaka // 3. Izračun rezultata set rezultat = a/b // 4. Izpis rezultata print rezultat Konkretna rešitev z diagramom poteka read a,b Primer 5 b<>0 Naloga: Izdelajte postopek, ki bo izpisal večjega izmed dveh vnesenih števil. Analiza in razgradnja problema: kvocient = a/b print Napaka print kvocient 1. Branje dveh števil 2. Ugotavljanje katero število je večje 3. Izpis večjega števila 13
Primer 5 Rešitev s psevdokodo // 1. Branje dveh števil // 2. Ugotavljanje katero število je večje // 3. Izpis večjegaštevila Primer 5 Rešitev s psevdokodo // 1. Branje dveh števil read a,b // 2. Ugotavljanje katero število jevečje // 3. Izpis večjega števila Primer 5 Rešitev s psevdokodo // 1. Branje dveh števil read a,b // 2. Ugotavljanje katero število jevečje if a>b then set vecje = a set vecje = b // 3. Izpis večjega števila Primer 5 Rešitev s psevdokodo // 1. Branje dveh števil read a,b // 2. Ugotavljanje katero število jevečje if a>b then set vecje = a set vecje = b // 3. Izpis večjega števila print vecji Primer 6 Naloga iz lanskega testa: Napišite postopek za izračun končne ocene pri predmetu OPDP, če poznate število točk testov, domačih nalog in vaj. Analiza problema: Prebrali bomo točke testov, vaj in domačih nalog. Nato bomo izračunali skupno število točk. Na koncu bomo izračunali in izpisali končno oceno. // preberemo podatke o točkah read točke_testov, točke_vaj, točke_domačih_nalog // izračunamo skupno število točk set skupne_točke = ROUND( 0.4*točke_testov + 0.4*točke_vaj + 0.2*točke_domačih_nalog) // izračunamo in izpišemo oceno if skupne_točke>=90 then print 10 if skupne_točke>=80 then print 9 if skupne_točke>=70 then print 8 if skupne_točke>=60 then print 7 if skupne_točke>=50 then print 6 print 5 14