Praktikum nr 10 Kuidas saite hakkama kolmanda pikuse ülesandega? Funktsioonide näited: funktsioon1.py ja funktsioon2.py Ülesanne 1 Ringi pindala Koosta funktsioon, mis arvutab raadiuse järgi ringi pindala. Funktsiooni argumendiks on raadius ja funktsioon tagastab ringi pindala. Koosta teine funktsioon, mille ülesandeks on kauguse leidmine kahe punkti vahel - argumentideks on kahe punkti x ja y koordinaadid ning funktsioon tagastab punktide-vahelise kauguse. Lisa programm, mis küsib ringi keskpunkti ja ühe ringjoonel oleva punkti koordinaadid ning arvutab välja ringi pindala. Vastuse leidmiseks kutsutakse välja funktsioonid kauguse leidmiseks ja pindala leidmiseks. Ülesanne 2 Ruutjuur Koosta ise funktsioon ruutjuure leidmiseks. Selleks kasutame Newtoni meetodit (mitte Pythoni enda sisefunktsiooni sqrt()). Meetodi tutvustus oli 4. nädalal. Vastav lahendus on lahenduste kaustas. Peaprogrammis kirjuta tsükkel, mis teeb arvud 1..20 ja trükib ekraanile tabeli kolme tulbaga: arv, Sinu ruutjuur, sqrt ruutjuur. Tabeli moodi väljundi saamiseks vaata näidet valjund_7.py (2. nädal) ja lahenduse näidet n5_ruudu_tabel.py Funktsioone koostades mõtle ja otsusta: 1. Millega piirdub funktsiooni töö? Üks konkreetne ülesanne! 2. Mida vajab funktsioon algandmetena? See/need on funktsiooni argumendid. 2a. Kas argumentidele kehtivad mingid piirangud? 3. Mis on funktsiooni töö tulemus? Kas üks vastus? Mitme vastuse korral tuleb funktsioonist tagastada list. Kui ei ole konkreetset vastust, ei ole vaja seda return-lausega tagastada 4. Kas on muutujaid, mida kasutab ainult funktsioon? Need on funktsiooni lokaalsed muutujad. NB! Funktsioon ei tohi kasutada otse peaprogrammi muutujaid! 5. Ülesandes on konstant arvutustäpsuse jaoks. Kus tema kirjeldus peab olema ja miks? 6. Arvesta, et funktsioon peab olema selline, et kui ta ühest failist teise kopeerida, siis on ta töövõimeline peaprogrammis muudatusi tegemata. Katseta: kasuta oma ruutvõrrandi lahendamise programmis (olemas ka lahenduste kaustas) oma juure-funktsiooni. Lisa alamprogrammi ette kommentaarina: # Funktsioon: mida ta teeb, lühidalt # Sisend: argumentide kirjeldus # Väljund: vastuse kirjeldus # Eeltingimused: kas tuleb funktsiooni väljakutsumisel millegagi arvestada - eritingimused argumentidele # Järeltingimused: olukord peale funktsiooni tööd - kas kusagil (muutujate väärtustes) on midagi olulist muutunud Kopeeri funktsioon ringi pindala leidmise faili ja kutsu seal sqrt() asemel välja. Veendu, et funktsioon töötab ka seal. Ülesanne 3 Tähtede loendamine Tundide tabelis on lingid kolmele tekstile: eesti-, inglise- ja saksakeelsele. Leia iga keele kohta erinevate tähtede esinemissagedused. Piirdume ladina tähtedega, mis on kõigis nimetatud keeltes olemas.' Arvesta, et A ja a on üks ja sama täht. Loendamiseks proovi kasutada sõnastikku (dictionary). Viit on tunnitööde tablis, viidatud peatükis on tähtede loendamiseks igati sobiv näide. Vastus väljasta kahel erineval viisil: iga tähe kohta tema korduste arv ja esinemise protsent kõigist tähtedest. Absoluutarvud ei ole kõige paremini võrreldavad. Et sama tööd on vaja teha kõigi failidega, tuleb siinkohal kasutada funktsioone (mitte hakata koodi kopeerima). Soovitus töö jaotamiseks kahte funktsiooni: Esimene funktsioon saab argumendiks faili nime ja tagastab sõnastiku loendatud tähtedega. Funktsioon kutsutakse välja kolm korda erinevate failide jaoks. Teine funktsioon saab argumendiks sagedustega sõnastiku ja tagastab teise sõnastiku, kus on võtmed samuti tähed, kuid seotud väärtused on suhtarvud (protsendid). See lahendus ei ole kõige elegantsem. Funktsiooni kutsutakse välja kolm korda - iga keele jaoks. Peaprogramm trükib lõpuks ekraanile võrdlustabeli kolme suhtarvudega sõnastiku alusel. Funktsioonid ja moodulid Moodul on füüsiline struktuur funktsioonde koos hoidmiseks. Moodul on fail, kuhu on kogutud mitmed funktsiooinid ja tavaliselt on nad mingil sisulisel alusel organiseeritud. Mooduleid saab ka ise teha. Vt näidet teisenda.py 11. nädala all. Ülesanne 4 Teisendamine ja moodulid Täienda teisenduste moodulit (vt veebis 11. nädala näidete all teisenda.py) teisendustega kraadide/radiaanide ja celsiuste/fahrenheit-ide vahel. C = (F - 32) * (5 / 9) Lisa veel üks sarnane teisendusfunktsioonide paar omal vabal valikul. Seega kokku 6 funktsiooni. Funktsioon peab olema selline, et teda universaalselt erinevates olukordades kasutada saaks. St ta ei kasuta teisi muutujaid, kui ainult argumente ja lokaalseid muutujaid ning ta ei trüki midagi välja.