4. nädal 1. Kuidas vahetada kahes muutujas olevad väärtused omavahel ära? 2. Rasvaprotsendivahemike ülesandele mõned täiendused ja üldistused, mis puudutavad vahemike kontrollimist, tüüpilisi vigu ja if-lause võimalusi. Tsükkel ------- Näited, mis algavad sõnaga "while". Tsüklit kasutatakse tegevuste kordamiseks. Enne järgmist kordust otsustatakse, kas tsüklis olevaid lauseid tuleb veel täita või mitte. Tsükli kavandamisel tuleb alati läbi mõtelda, milline on: - tsükli keha - milliseid lauseid on vaja korrata (ja milliseid mitte!) - kordamise tingimus - millal tsükli sisu korratakse ja kuidas tingimus kirja panna? - korduste arv - mitu korda korratakse - millest korduste arv sõltub? NB! On täiesti OK, kui ühe tsükli sees on teine tsükkel. Algoritmid: loendamine ja summeerimine -------------------------------------- Muutuja väärtuse suurendamine (increment) K = K + 1 K senisele väärtusele liidetakse 1 ja tulemus "pannakse tagasi" samasse muutujasse. Muutuja väärtust suurendatakse ühe võrra. Pythonis võib ka kirjutada K += 1. Esimene variant on universaalne. Tüüpalgoritmidena tutvume loendamise ja summeerimisega. Loendamise idee on järgmine: täisarvuline muutuja (loendur, counter, ...) võetakse loenduriks. Enne loendamist loendur nullitakse (loendur = 0). Iga kord, kui juhtub see, mida loendada vaja (nt leitakse sobiv arv), suurendatakse loendurit 1 võrra (loendur = loendur + 1 või loendur += 1). Kui kõik on läbivaadatud, ön muutujas loendur loendamise tulemus. Summeerimine toimub sarnaselt loendamisega. Võetakse muutuja ja algväärtustatakse 0-ga (summa = 0). Kogu tegevus toimub tsüklis. Igas korduses liidetakse summasse uus arv (summa = summa + arv või summa += arv) ja saadud uus väärtus pannakse tagasi samasse muutujasse. Summa suureneb arvu võrra. Ülesanne 1 Loendamine Andmeteks on üliõpilaste kontrolltöö punktid ja töö maksimaalsed punktid (kõigil ühesugune). Hindamisel kehtivad protsentides väljendatud piirid: A: 91%-100%, B: 81%-90%, C: 71%-80% jne. Pane igale tööle hinne. Loendada, mitu õpilast said töö eest hindeks B. Punktid sisestab kasutaja ja peale iga sisestust küsib programm, kas on veel hindamata töid. Lahendust saab laiendada nii, et loendatakse iga hinde esinemine, lõpuks tehakse kokkuvõte. Ülesanne 2 Arvu arvamise mäng Üks mängija mõtleb arvu etteantud piirides ja teine katsub seda ära arvata. Meie ülesandes - arvuti mõtleb arvu ja inimene hakkab arvama. Arvuti vastab igale arvamisele ja täpsustab, kas pakutud arv on liiga suur või liiga väike. Kuidas arvuti arvu mõtleb? Selleks on juhuslike arvude generaator. Näiteks sobib funktsioon randint(a, b). Funktsioon tagastab juhusliku täisarvu vahemikust [a .. b] Kasutamise näide: arv = randint(1,10) Sel juhul saab arv täisarvulise väärtuse vahemikust [1..10] Funktsioon randint() paikneb moodulis random, mis tuleb importida ning funktsiooni käivitamisel kirjutada nime ette random. Üldiselt juhuslike arvude "tootmiseks" tuleb generaator kõigepealt algväärtustada, milleks on funktsioon seed(). See peab tagama, et programmi uuel käivitamisel tekiks teistsugune juhuslike arvude jada. Pythonis kaasneb random mooduli importimisega automaatselt seed()-i ühekordne käivitamine. Võtame ka teadmiseks, et arvude jada ei saa juhuslikum kui seed()-i iga "arvu tegemise" eel korrata. Pigem vastupidi. Järelikult ei ole ka import-lauset õige programmi keskele paigutada. Millal mäng lõpetada? a) arv arvatakse ära b) kui liiga palju arvatakse (näiteks üle 6 korra), siis programm teatab, et nii rumal ikka olla ei saa, et niiiii kaua seda ühte õnnetut arvu arvata. Kui arvuvahemik on 1 .. 100, siis mitme pakkumisega peaks arv kindlasti arvatud saama? Kui see tehtud, tuleb terve mäng veel korduma panna - Kas soovid veel mängida? NB! See tähendab uue tsükli lisamist mängutsükli ümber. Ära püüa mängutsüklit kõike tegema panna. Juhuslike suuruste funktsioonimaailm on üpris kirev ja selle kohta saab lugeda Pythoni dokumentatsiooni lehel: https://docs.python.org/3/library/random.html Ülesanne 3. Õnnelik seitse Kui suur on lootus võita mõnes õnnemängus? Selleks võib välja arvutada tõenäosuseid, aga võib ka mängu käiku simuleerida. Mängija veeretab kahte täringut. Kui täringutel olevate silmade summa on 7, võidab mängija näiteks 4 eurot. Kui ei ole, siis kaotab näiteks 1 eurot. Need summad võiksid olla kergesti muudetavad. Mängu alguses on vaja teada, kui palju raha mängu pannakse. Seejärel hakatakse veeretama ja vastavalt rahahulka suurendama või vähendama. Mäng lõppeb siis, kui raha on otsas. Veeretada aitab juhuslike arvude generaator. Lisaks on vaja programmi lõpus teatada, kui palju kordi jõuti täringuid veeretada ja kui suur oli vahepeal kõige suurem summa. ------------------------------------- Teema vahetus: Andmed arvuti mälus. Näide arvude murdosa teisendamisest. Vikipeediast: http://et.wikipedia.org/wiki/Kahends%C3%BCsteem näeb, kuidas toimub murdosade teisendamine kahendsüsteemi. Sealt kopi-paste: Kümmnendarvu murdosa teisendamine kahendarvuks Murdosa korrutatakse kahega. Kui tekkis täisosa, see lahutatakse ja saadakse bitt väärtusega 1, kui täisosa ei tekkinud saadakse bitt väärtusega 0. Näiteks murru 0,4 teisendus. 0,4 * 2 = 0,8 täisosa ei tekkinud, tulemusse bitt 0 0,8 * 2 = 1,6 lahutame täisosa, tulemusse bitt 1 0,6 * 2 = 1,2 lahutame täisosa, tulemusse bitt 1 0,2 * 2 = 0,4 täisosa ei tekkinud, tulemusse bitt 0 0,4 * 2 = 0,8 täisosa ei tekkinud, tulemusse bitt 0 0,8 * 2 = 1,6 lahutame täisosa, tulemusse bitt 1 0,6 * 2 = 1,2 lahutame täisosa, tulemusse bitt 1 0,2 * 2 = 0,4 täisosa ei tekkinud, tulemusse bitt 0 jne 0,4= 0,01100110.. Ka kahendsüsteemis saab reaalarve esitada nagu kümnendsüsteemis, kusjuures pärast koma on järgukaaludeks kahe negatiivsed astmed: 2^-1, 2^-2, 2^-3 jne. Kümnendsüsteemi arv 0,5 on kahendsüsteemis seega 0,1. -------------------------------------------------------------- Proovi teha kodus ka järgmisi ülesandeid. Aga et neid on päris mitu, siis võib läheneda ka valikuliselt. Ülesnne 4 Ruutjuur Leiame arvust ruutjuure, kasutades selleks Newtoni meetodit (mitte sqrt()-funktsiooni). Meetodi kirjeldus: ------------------ Alguses tehakse "oletus" arvu (Arv) ruutjuure kohta (Vana_RJ, see võib olla täiesti suvaline). Lähtudes esimesest arvust, leitakse uus väärtus kasutades valemit: Uus_RJ = (Arv/Vana_RJ + Vana_RJ)/2 Võrreldakse Vana_RJ ja Uus_RJ. Kui nad on (peaaegu) võrdsed, on ruutjuur leitud. Kui aga mitte, siis viimati leitud ruutjuur (Uus_RJ) saab Vana_RJ-ks ja tegevust korratakse. Võrdumise kontrollimiseks määratakse täpsus, mitu komakohta arvudel vähemalt kattuma peaksid. Näiteks 8 kohta peale koma: EPSILON=10E-09 #Määratakse täpsus Tsükli kordamise tingimus on abs(vana_RJ-uus_RJ) > EPSILON See tähendab korratakse seni, kui eelmine ja viimane leitud arv erinevad rohkem kui täpsus. Tsükkel lõpetab töö, kui vastus on piisavalt täpne (ehk Uus_RJ-i ja Vana_RJ-i vahe on väiksem kui määratud täpsus). Ülesanne 5 Spordipäev Koolis oli spordipäev ja lapsed viskasid palli. Iga õpilase kohta on teada tema parim vise. Eraldi teame Pauli tulemust. Leida, mitmenda koha Paul saavutas. (Nt: Paul sai palliviskes 4 koha.) Ülesande täiendus on see, kus tuuakse eraldi välja kohtade jagamine. (Nt: Paul jagas 2 kuni 4 kohta.) Ülesanne 6 Hea pank (ehk "unistada ju võib") Avad pangas kogumishoiuse ja paned hoiusele mingi arvu eurot. Igal palgapäeval (üks kord kuu alguses) lisad hoiusele teatud arvu eurosid (igas kuus võrdselt). Pank lisab intressiga teenitud eurod kuu lõpus. Teada on intressimäär aastas. Sellest saame protsendi 1 kuu kohta, jagades ta 12-ga (intress/12). (Tegelikkuses on see veidi keerulisem.) Kaks alamülesannet: a) Sisestad lisaks summa, mille tahad hoiusele koguda. Programm peab simuleerima hoiuse muutumist ja teatama, mitu aastat ja mitu kuud kulub eesmärgi saavutamiseks. b) Simuleeri konto seisu muutumist. Trüki välja konto seis iga hoiustamisaasta lõpus 10 aasta jooksul. Tulemus esita tulpadesse paigutatud tabelina. Kummagi variandi jaoks koosta eraldi programm.