230 likes | 476 Views
5. tahvlipraktikum. Alamprogrammid. Meetodid. Ülesande korral eraldatakse välja alamülesanded. Ülesanne. Teisendada arv p -nd süsteemi. Alamülesanne Alamülesanne Alamülesanne Alam(alam)ülesanne …. Teisendada täisarv Teisendada murdarv (0,abc..). Alamülesandele vastab alamalgoritm .
E N D
5. tahvlipraktikum Alamprogrammid. Meetodid
Ülesande korral eraldatakse välja alamülesanded Ülesanne Teisendada arv p-nd süsteemi Alamülesanne Alamülesanne Alamülesanne Alam(alam)ülesanne … Teisendada täisarv Teisendada murdarv (0,abc..) Alamülesandele vastab alamalgoritm. Alamalgoritmile vastab alamprogramm. Alamülesannete väljaeraldamise, “nägemise” oskus on üks programmeerija olulistest kutseoskustest. Seda saab omandada ainult harjutades.
Alamprogramm Protseduur Eesmärgiks on mingi tegevus ära teha Funktsioon Eesmärgiks on leida mingi väärtus (vastus) Javas: meetod Meetod, mille tagastustüübiks on tühitüüp void Meetod, mille tagastustüübiks on mittetühi tüüp (int, double, …)
Meetod esitatakse meetodikirjeldusena. Koosneb päisest ja sisust (ehk kehast): Päis { Sisu } Päis Sisu Päis: [piiritlejad] tagastustüüp meetodiNimi( [formaalsete parameetrite loetelu] ) static void int double … valitav Formaalne parameeter: tüüp nimi Eraldatakse komadega Puudub AlgJavas int double … Ei: void Sisu: Lokaalmuutujate kirjeldused ja tegevused nende ning formaalsete parameetritega; naasmisdirektiivid (return)
Meetodikirjeldus on klassi elemendiks, st. paikneb alati mingis klassis, kuid mitte mõnes teises meetodikirjelduses. (Peale meetodi võib klassi elemendiks olla veel nt väljakirjeldus.) Kus kohal ja mis järjekorras meetodid klassis paiknevad ei oma mingit tähtsust. AlgJavas on kogu programm üks klass (nimega Main), meetodikirjeldused paiknevad selle lõpus, Neile eelnev osa on peameetodi (nimega main) sisuks: class Main public static void main(String[] args) println(”Tere”); int a = 100; . . . meetodikirjeldus meetodikirjeldus
Meetodi(kirjelduse) alguses on väga soovitatav kommenteerida, mis ülesande see meetod lahendab. Mis on antud ja milline on tulemus. Näiteks kujul Antud: Tulemus:
Meetod rakendatakse ehk kutsutakse välja ehk “käivitatakse”, “pannakse tööle” ainult mõnest teisest meetodist. (Nn rekursiivsel erijuhul ka sellest samast meetodist.) Selleks kirjutatakse meetodi rakendus ehk väljakutse kujul [KlassiNimi.]meetodiNimi( [argumentide loetelu] ) Puudub, kui väljakutsutava meetodi kirjeldus on samas klassis Argument: avaldis, erijuhul konstant või muutuja nimi. Eraldatakse komadega. argumentide arv = rakendatava meetodi formaalsete parameetrite arv Meetodi rakenduse täitmisel arvutatakse iga argumendi väärtus, omistatakse see vastavale formaalsele parameetrile ja seejärel antakse juhtimine meetodi sisule. Sisu töö lõpuga lõpeb rakenduse täitmine.
Ülesanne 1. Kus on meetodikirjeldus(ed), kus tema rakendused? class N1{ static void jooneke(){ // Antud: - // Tulemus: väljastatakse 10 miinust System.out.println(“-----------”); } public static void main(String[] args){ jooneke(); System.out.println(“Mida teha?”); jooneke(); } } jooneke(); println(“Mida teha?”); jooneke(); void jooneke() Antud: - Tulemus: väljastatakse 10 miinust println(“-----------”); Selle programmi töö tulemusena väljastatakse: ----------- Mida teha? -----------
Ülesanne 2. Mis toimub järgmise programmi töö tulemusena? int a = -3; int b = 3; rida(-33); rida(b); rida(b - a); rida(a + b); rida(10 * a * b); rida(-2); void rida(int k) Antud: arv k Tulemus: väljastatakse 10miinusmärki, kui k < 0, 10plussmärki, kui k > 0, 10võrdusmärki, kui k = 0 if(k < 0) println(“-----------“); else if(k > 0) println(“++++++++++“); else println(“==========“);
Eelmises kahes ülesandes olid meetodid tagastustüübiga void, st tegemist oli protseduuridega. Meetod-protseduuri väljakutse koos talle järgneva semikooloniga moodustab avaldisdirektiivi: [KlassiNimi.]meetodiNimi( [argumentide loetelu] ); Selle täimisel sooritatakse meetodis ettenähtud tegevused ja programmi täitmine jätkub kohast peale täidetud avaldisdirektiivi.
Meetodi kasutaja ei pea huvi tundma meetodi sisu vastu. • Samuti ei oma rakendamise seisukohalt tähtsust formaalsete • parameetrite nimed. Meetodit võib vaadelda (musta) kastina, • millest on olulised teada vaid • meetodi nimi • formaalsete parameetrite arv ja nende tüübid • tagastustüüp void jooneke void rida int Signatuur: jooneke() rida(int) Loomulikult peab kasutaja teadma, millist ülesannet antud meetod lahendab: mis eeldatakse antud olevat ja mis laadi on tulemus.
Kui meetodi tagastustüübiks ei ole void, vaid on konkreetne tüüp (int, double, …), siis on sisuliselt tegemist tegemist funktsiooniga. int numbreid int int numbreid(int a) Antud: arv a, 0 < a < 1000 Tulemus: tagastatakse kümnendnumbrite arv (1, 2 või 3) arvus a if(a < 10) return 1; else if(a < 100) return 2; else return 3; Sõltuvalt tagastustüübist nimetatakse ka meetod seda tüüpi olevaks. Seega ülalkirjeldatud meetod numbreid on täisarvutüüpi meetod.
Meetod-funktsiooni sisu täitmine peab lõppema naasmisdirektiiviga return av; Kus av on selle meetodi tagastustüüpi avaldis (erijuhul konstant või muutuja). Ka meetod-protseduuris võib sisu täimise lõpetada naasmisdirektiiviga, kuid siis ilma avaldiseta: return; Meetod-funktsiooni rakendus on avaldis [KlassiNimi.]meetodiNimi( [argumentide loetelu] ) mille väärtuseks saab (meetodi sisu täitmise lõppedes sooritatud) naasmisdirektiivis arvutatud avaldise väärtus.
Ülesanne 3. Leida kõik naasmisdirektiivid ja meetodite rakendused. * i = 1 .. 10 int a = juhuarv(1, 126); print(“Arvus “ + a + “ on “); println(numbreid(a) + “ numbrit.“); int juhuarv int int int juhuarv(int a, int b) Antud: arvud a ja b Tulemus: tagastatakse juhuarv poollõigult [a; b)(kui a > b, siis poollõigult [b; a))return (int)(a + Math.random()*(b - a)); int numbreid(int a) Antud: arv a, 0 < a < 1000 Tulemus: tagastatakse kümnendnumbrite arv (1, 2 või 3) arvus a if(a < 10) return 1; else if(a < 100) return 2; else return 3;
Järgnevates ülesannete korral, kus on nõutud kirjutada meetod, tuleb kirjutada ka seda meetodit rakendav testimisprogramm.
Ülesanne 4. Kirjutada meetod kahe arvu ruutude summa ruutjuure leidmiseks. Ülesanne 5. Kirjutada meetod taandamata ruutvõrrandi diskriminandi arvutamiseks. Ülesanne 6. Kirjutada meetod n-nda Fibonacci arvu leidmiseks. Fibonacci arvud on 0, 1, 1, 2, 3, 5, 8, …; iga järgmine saadakse kahe eelmise liitmise teel. Ülesanne 7. Kirjutada meetod (nimega invert), mis etteantud naturaalarvu korral tagastab arvu, milles numbrite järjestus on vastupidine. Ülesanne 8. Kirjutada meetod, mis etteantud naturaalarvu korral leiab vraeerimiste arvu (vt eelmine praktikum), mille järel arv muutub palindroomiks.
Ülesannet, mille korral tuleb leida üks kahest võimalikust vastusest (JAH või EI), nimetatakse kontrollimisülesandeks. Kontrollimisülesanne programmeeritakse loogilist tüüpi meetodina, st meetodina, mille tagastustüübiks on boolean. Sellise meetodi naasmisdirektiivides näidatakse loogiline avaldis, erijuhul loogiline konstant (true või false) või loogiline muutuja. boolean onPalindroom(int a) Antud: arv a, a > 0 Tulemus: tagastatakse true, kui a on palindroom false vastasel korral return a == invert(a); vt ka ül. 7 Ülesanne 9. Kirjutada meetod, mis kontrollib, kas antud arv on algarv.
Sõnetüüpi meetod (meetod tüüpi String) realiseerib ülesande, kus nõutavaks vastuseks on sõne (sümbolite järjend). Näiteks: String valikrida(int k) String valikrida int Antud: arv k Tulemus: tagastatakse sõne 10miinusmärki, kui k < 0, 10plussmärki, kui k > 0, 10võrdusmärki, kui k = 0 if(k < 0) return “-----------“; else if(k > 0) return “++++++++++“; else return “==========“; Ülesanne 10. Lõpetada järgmise suurema ülesande programmeerimine (vt järgmised slaidid):
Ülesanne:Teisendada antud 10nd arv mingisse teise positsioonilisse arvusüsteemi Vastav täpsustatud ülesanne Antud: positiivne arv a tüüpi double, uue süsteemi alus taisarv p, p > 1, p ≠ 10 ning täpsus (tulemuse murdosa kohtade arv) täisarv k, k > 0 Tulemus: sõne, mis on arvu a esituseks p-nd süsteemis; murdosas on k kohta; murdosa on ümardamata; täis- ja murdosa eraldajaks on koma • Alamülesandeid: • Teisendada täisarv 10 -> p • Teisendada murdosa 10 -> p, leides k kohta • Leida arvu täisosa • Leida arvu murdosa
Ülesande algoritm Antud: a,p ,k Tulemus: sõne s – arvu a kujutis p-nd süsteemis, k kohta peale koma s := tühi;t := a täisosa; m := a murdosa + t = 0 s := s + “0” - Teisendada tp-nd süsteemi; s := teisenduse tulemus s := s + “,” + m = 0 s := s + “0” - Lisada sõnele s arvu mk kohta peale koma p-nd süsteemis
Alamülesanne: leida murdosa kohad Täpsustatud ülesanne: Antud: m, p ja k (0 < m < 1, p > 1 , k > 0) Tulemus: sõne pikkusega k, mis kujutab arvu m numbrikohti p-nd süsteemis tulem := tühi; b := m k korda: c := b x p t := c täisosa; b := c murdosa tulem := tulem + tp-nd numbrina
Alamülesanne meetodina sõneks:??? Ülesanne meetodina: ??? Testimisprogramm: ???