10. nädala õpijuhis
Eesmärk
editNädala eesmärgiks on:
- Tutvuda alamprogrammide koostamise põhimõtetega ja põhimõistetega: lokaalsed ja globaalsed muutujad; argumendid ja parameetrid; andmete edastamine jne.
- Tutvuda Pythoni vahenditega alamprogrammide koostamiseks
- Praktiseerida alamprogrammide koostamist - algoritmi jaotamist sobivateks osadeks, nende eraldi alamprogrammidena vormistamist ja programmis kasutamist.
- Praktiseerida moodulite koostamist.
Lugemiseks ja proovimiseks
edit- Loe materjal Alamprogrammidest üldiselt, et saada mõistetest ettekujutus.
- Keelereeglitest, kuidas alamprogramme (täpsemalt funktsioone) Pythonis koostada, on materjalis Funktsioonid Pythonis.
- Vaata alamprogrammide kasutamise näiteid, mis Pythoni materjalis toodud ja proovi need läbi
- Edasi lahenda allpool olevaid ülesandeid
Ülesanded
editÜlesanne 1 Newtoni meetod
editTeeme ise funktsiooni, millega ruutjuurt leida. Ruutjuure leidmiseks sobib Newtoni meetod, mis on piisavalt lihtne, et teda realiseerida. Meetodi kirjeldus on järgmine:
Meetod töötab sellisel viisil, et ühte valemit kasutades hakatakse järjest välja arvutama võimalikke ruutjuure väärtuseid, kasutades iga järgmise väärtuse leidmisel eelmise arvutuse tulemust. Sellisel viisil läheb erinevus eelmise ja järgmise rehkenduse tulemuse vahel üha väiksemaks ning samal ajal läheneb vastus ühe enam õigele tulemusele. Arvutamine lõpetatakse siis, kui kahe järjestikuse rehkenduse tulemused on (peaaegu) võrdsed - nt erinevad alles 9..10 komakohas. sel juhul võib olla kindel on ruutjuur on täpne kuni 9..10 komakohani.
Konkreetsemalt: kõigepealt võetakse ruutjuure esimeseks väärtuseks (Vana_RJ
) täiesti suvaline arv (nt 1 või juuritav arv ise vms). Edasi arvutatakse uus väärtus järgmist valemist kasutades:
Uus_RJ = ((Arv/Vana_RJ)+Vana_RJ)/2
Järgnevalt kontrollitakse, kas eelmise ja järgmise rehkenduse tulemused (Vana_RJ
ja Uus_RJ
) on võrdsed.
Kui nad ei ole võrdsed, siis tuleb tsüklit ja arvutust korrata, kasutades sealjuures arvutamiseks uut väärtust.
Kuidas kontrollida võrdumist?
Kuna kahe ujukomaarvu võrdlemist == märgiga ei peeta mõistlikuks tegevuseks (enamasti ei olnud ujukomaarvud täpsed), sobib erinevuse kontrollimiseks järgmine idee:
EPSILON=10E-09 #Sellega määrame täpsuse - 9 komakohta}
Kontrollimiseks sobib:
abs(vana_RJ-uus_RJ)>EPSILON #Kui erinevus on liiga suur.
Kontrollitakse kahe arvu vahe absoluutväärtust. Kui see on suurem määratud täpsusest, tuleb edasi arvutada.
Näide arvutamisest: Leiame ruutjuure arvule 4. Algväärtustame juure alguses 1-ga. Järjestikused rehkendused oleksid järgmised:
(4/1 + 1)/2 -> 2.5 abs(1-2.5) - vahe liiga suur (4/2.5 + 2.5)/2 -> 2.05 abs(2.5-2.0006) - vahe liiga suur (4/2.05 + 2.05)/2 -> 2.0006 abs(1-2.5) - vahe liiga suur
Nagu sellest näitest näha muutub vastus üha täpsemaks, ehkki soovitud täpsuse jaoks tuleks veel paarringi edasi arvutada.
Edasi võrdleme, kas meie funktsioon on kuidagi kehvem kui ametlik sqrt() - kas tuleb sama väärtus? Võrdele, kas sqrt() ja Sinu funktsioon() annavad sama tulemusega täpsusega 9 kohta peale koma - võrduses kasuta samasugust ujukomaarvude võrdumise kontrolli kui kasutab meetod ise.
Mõtle alamprogramme koostades järgmistele küsimustele!!
edit- Millega peaks piirduma AP töö?
- Mida vajab AP algandmetena? See/need on sisendparameetrid.
- Kas sisendparameetritele kehtivad mingid piirangud?
- Mida ja mil viisil annab AP vastuseks? Kas üks vastus funktsioonist? Mitme vastuse korral tuleb funktsioonist tagastada list. Ja kui ei olegi otsest vastust, siis ei ole vaja seda return-lausega tagastada
- Kas on muutujaid, mida peaks kasutama _ainult_ AP? Millised? Nendest saavad AP lokaalsed muutujad.
- Newtoni ülesandes on ka üks konstant arvutustäpsuse jaoks. Kuhu tema kirjeldus tuleks lisada ja miks?
- Kokkuvõttes - tekkiv AP peab olema selline, et kui ta ühest failist teise kopeerida, siis on ta töövõimeline peaprogrammis muudatusi tegemata.
Lisa alamprogrammi ette kommentaarina:
edit# AP: mida ta teeb (lühidalt) # Sisend: parameetrite kirjeldus # Väljund: vastuse kirjeldus # Eeltingimused: # millega AP väljakutsumisel arvestada - eritingimused sisendparameetritele # Järeltingimused: # olukord peale AP tööd - olulist muudatused väärtustes - puudutab ennekõike väljundparameetreid
Ülesanne 2 Väikesed teisendused
editTäienda teisenduste moodulit (teisenda.py) teisendustega kraadide/radiaanide ja celsiuste/fahrenheit-ide vahel.
C = (F - 32) * (5 / 9)
Saad oma teisendusfunktsioone kontrollida järgmise veebilehe abil: http://www.translatorscafe.com/cafe/units-converter/
Koosta programm, mis kõik funktsioonid ära testiks.
Ülesanne 3 Mooduli loomine
editKoosta moodul, mis koosneb alamprogrammidest, mis täisarvulistest jada elementidest keskmist, suurimat väärtust, väikseimat väärtust ning kõige enam esinevat väärtust (st moodi) leiavad.
NB! Sisefunktsioone min()
ja max()
me ei kasuta ;)