2. Harjoitukset: Ehdottoman merkilliset poikkeukset¶
Tässä harjoituksessa päästään tekemään ohjelmia, jotka ovat muutakin kuin suoraviivaisia laskuautomaatteja. Suorituskerrat voivat olla erilaisia, koska nyt käyttäjälle annetaan mahdollisuus olla suurammassa vuorovaikutuksessa ohjelman kanssa. Viime kerran harjoituksiin nähden näissä tehtävissä on huomattavasti enemmän haastetta, sillä kaikissa joutuu miettimään miten toimitaan erilaisissa tilanteissa. Viikon viimeiset tehtävät antavat myös eväitä lopputyön tekemiseen ja antavat hieman esimakua siitä, millaisia haasteita lopputyön kanssa tulee olemaan.
Osaamistavoitteet¶
Näiden harjoitusten jälkeen pystyt tekemään ohjelmia, joiden suoritus haarautuu käyttäjän toiveiden mukaan. Lisäksi osaat kommunikoida käyttäjälle tämän virheellisistä
syötteistä
ja ohjelmasi osaavat antaa miellyttävän näköisiä tulosteita. Keskeisenä tekijänä ovat materiaalin kolme konseptia: merkkijonot
, poikkeusten
käsittely ja ehtorakenteet
. Myös sanakirjoja
käytetään. Kukin tehtävä omalta osaltaan opettaa myös ohjelmien suunnittelua - eipä siltä oikein voi välttyäkään. Esimerkki¶
Tehtävänanto¶
Toteuta ohjelma, joka kysyy käyttäjältä kaksi kokonaislukua ja kertoo, onko toinen niistä toisen tekijä. Virheellisistä syötteistä huomautetaan erikseen. Alla on esimerkkejä ohjelman toiminnasta:
Anna ensimmäinen luku: 5 Anna toinen luku: 10 5 on 10:n tekijä.
Anna ensimmäinen luku: 9 Anna toinen luku: -3 -3 on 9:n tekijä.
Anna ensimmäinen luku: 7 Anna toinen luku: 4 Kumpikaan luvuista ei ole toisen tekijä.
Anna ensimmäinen luku: 2 Anna toinen luku: -2 2 on -2:n tekijä.
Anna ensimmäinen luku: 0 Anna toinen luku: 3 3 on 0:n tekijä.
Anna ensimmäinen luku: 0 Anna toinen luku: 0 0 on 0:n tekijä.
Anna ensimmäinen luku: aasi Ei näytä luvulta
Anna ensimmäinen luku: 0 Anna toinen luku: aasi Ei näytä luvulta
Ratkaisu¶
Lähdetään liikkeelle helpoimmasta, eli lukujen kysymisestä. Tämä menee jo viime kerralla opitulla tavalla, joten ei siitä sen enempää:
luku_1 = int(input("Anna ensimmäinen luku: "))
luku_2 = int(input("Anna toinen luku: "))
Tekijyyttä voi testata jakojäännöksellä. Jos jakojäännös on nolla, jakaja on jaettavan tekijä.
Mietitään sitten miten ohjelma voisi haarautua. Tulostusvaihtoehtoja on kaksi: joko toinen luvuista on toisen tekijä, tai kumpikaan ei ole. Tämä voisi viitata kahteen
haaraan
, alla olevaan tyyliin. Käytetään luonnosteluvaiheessa pass-komentoa korvaamaan ehtolauseen
sisälle tuleva koodi. if luku_1 % luku_2 == 0 or luku_2 % luku_1 == 0:
pass
else:
pass
Tästä seuraa kuitenkin ongelma: mistä tiedetään kumpi oli kumman tekijä? Suunnittelemamme ehtolause ei tätä kerro. Pitäisi siis lisätä toinen tarkistus tämän ehtolauseen sisälle, jossa selvitetään kumpi oli kumpi. Tämä onnistuisi katsomalla kumpi luvuista on pienempi, koska suurempi luku ei voi olla pienemmän tekijä. Tämä on kuitenkin tarpeettoman hankalaa. On helpompaa purkaa tämä yksi haara kahdeksi:
if luku_1 % luku_2 == 0:
pass
elif luku_2 % luku_1 == 0:
pass
else:
pass
Nyt 1. haarassa tiedetään, että juuri luku_2 on luku_1:n tekijä, ja vastaavasti 2. haarassa tiedetään, että asia oli toisin päin. Lisätään tehtävänannon mukaiset tulostukset näihin haaroihin. Se kannattaa tehdä kopioimalla teksti tehtävänannon esimerkeistä, ja korvaamalla sitten lukuarvot
aaltosulkupaikanpitimillä
. Huomaa argumenttien
muuttuva järjestys 1. ja 2. haaran välillä. if luku_1 % luku_2 == 0:
print(f"{luku_2} on {luku_1}:n tekijä.")
elif luku_2 % luku_1 == 0:
print(f"{luku_1} on {luku_2}:n tekijä.")
else:
print("Kumpikaan luvuista ei ole toisen tekijä.")
Yhdistetään tämä syötteen kysymiseen ja kokeillaan:
Anna ensimmäinen luku: 4 Anna toinen luku: 0 --------------------------------------------------------------------------- ZeroDivisionError Traceback (most recent call last) /joku/kansio/tekija.py in() 1 luku_1 = int(input("Anna ensimmäinen luku: ")) 2 luku_2 = int(input("Anna toinen luku: ")) ----> 3 if luku_1 % luku_2 == 0: 4 print(f"{luku_2} on {luku_1}:n tekijä.") 5 elif luku_2 % luku_1 == 0: ZeroDivisionError: integer division or modulo by zero
...
Se nolla. Tekijyydestä tiedetään, että kaikki luvut ovat nollan tekijöitä ja nolla on itsensä tekijä. Eli jos jompi kumpi luvuista on nolla, toinen on sen tekijä. Aiemmasta viisastuneena ei yritetä laittaa tätä yhden
haaran
alle, vaan lisätään kaksi uutta haaraa. Nyt on tärkeää miettiä myös mihin kohtaan uudet haarat sijoitetaan. Mikäli käyttäjä syöttää
nollan, koodin suoritus ei saa päästä niihin ehtolauseisiin
joissa suoritetaan jakamista. Niinpä nämä uudet ehdot tulee sijoittaa alkuun. Muistetaan siis, että ehtorakenteesta
suoritetaan ainoastaan ensimmäinen haara, jonka ehto
toteutuu - muita haaroja ei edes tutkita. Koko ohjelma tähän asti:luku_1 = int(input("Anna ensimmäinen luku: "))
luku_2 = int(input("Anna toinen luku: "))
if luku_1 == 0:
print(f"{luku_2} on {luku_1}:n tekijä.")
elif luku_2 == 0:
print(f"{luku_1} on {luku_2}:n tekijä.")
elif luku_1 % luku_2 == 0:
print(f"{luku_2} on {luku_1}:n tekijä.")
elif luku_2 % luku_1 == 0:
print(f"{luku_1} on {luku_2}:n tekijä.")
else:
print("Kumpikaan luvuista ei ole toisen tekijä.")
Kokeillaan uudestaan:
Anna ensimmäinen luku: 4 Anna toinen luku: 0 4 on 0:n tekijä.
Vielä puuttuu virheellisten
syötteiden
käsittely. Tämä onnistuu try-except-rakenteella, jossa otetaan kiinni materiaalissa pariin kertaan pyöritelty ValueError-poikkeus
:try:
luku_1 = int(input("Anna ensimmäinen luku: "))
luku_2 = int(input("Anna toinen luku: "))
except ValueError:
print("Ei näytä luvulta")
Tämä on muuten hyvä, mutta jos se lyödään ohjelman alkuun sellaisenaan saadaan vähemmän toivottuja tuloksia.
Anna ensimmäinen luku: aasi Ei näytä luvulta --------------------------------------------------------------------------- NameError Traceback (most recent call last) /joku/kansio/tekija.py in() 4 except ValueError: 5 print("Ei näytä luvulta") ----> 6 if luku_1 == 0: 7 print(f"{luku_2} on {luku_1}:n tekijä.") 8 elif luku_2 == 0: NameError: name 'luku_1' is not defined
Virheilmoitus kyllä tulostuu, mutta rivin 6 ehtolauseesta saadaankin NameError! On tämä työmaa... Ongelman ydin on siinä, että rivin 2 suoritus loppuu heti kun int-funktiota kutsutaan, joten luku_1 muuttujaa ei koskaan luoda. Tässä tilanteessa olisikin toivottavaa, että ohjelman suoritus ei jatku, jos jompikumpi luvuista on virheellinen - eihän siinä ole edes mitään järkeä jatkaa. Ongelman voi ratkaista lyömällä try-except-rakenteeseen else-osan, ja työntämällä loput koodit sinne:
try:
luku_1 = int(input("Anna ensimmäinen luku: "))
luku_2 = int(input("Anna toinen luku: "))
except ValueError:
print("Ei näytä luvulta")
else:
if luku_1 == 0:
print(f"{luku_2} on {luku_1}:n tekijä.")
elif luku_2 == 0:
print(f"{luku_1} on {luku_2}:n tekijä.")
elif luku_1 % luku_2 == 0:
print(f"{luku_2} on {luku_1}:n tekijä.")
elif luku_2 % luku_1 == 0:
print(f"{luku_1} on {luku_2}:n tekijä.")
else:
print("Kumpikaan luvuista ei ole toisen tekijä.")
Tämän rakennelman ymmärtäminen on keskeistä tämän kerran harjoitustehtävien suorittamiselle. Käytä siis hetki sen opiskeluun. Nyt ohjelma toimii oikein:
Anna ensimmäinen luku: aasi Ei näytä luvulta
Ohjelmien lopettaminen¶
Tässä harjoituksessa on tehtäviä, joissa pyydetään päättämään ohjelman suoritus esim. virhetilanteessa. Tämä tarkoittaa aina sitä, että virheestä ilmoittaminen jää ohjelman viimeiseksi suoritettavaksi riviksi siinä haarassa missä se on. Ohjelman rakenne tulee siis suunnitella siten, että kukin virheilmoitus on jonkun rakenteen sisällä siten, ettei sen jälkeen ole enää mitään suoritettavaa. Internetin ihmemaa löytää helposti quit- ja exit-funktiot, joilla ohjelman suorituksen voi lopettaa. Näitä ei kuitenkaan voi kurssilla käyttää. Syitä on kaksi.
Ensimmäinen syy liittyy oppimiseen: tässä harjoituksessa on tarkoitus oppia ohjaamaan ohjelman suorituksen kulkua ohjausrakenteilla - ei käyttämällä oikopolkuja. Oikopolkuja voi käyttää sitten, kun ohjelman suorituksen hallinnan perusteet ovat hallussa. Toinen syy on tekninen: nämä funktiot sammuttavat koko Python-prosessin. Tarkistukset toimivat siten, että tarkistinohjelma lataa palautetun koodin suoritettavaksi osaksi itseään (importilla). Näin ollen em. funktiot sammuttavat siis palauttamasi ohjelman lisäksi myös tarkistimen, ja saat tästä ilmoituksen "Tarkistin kaatui kesken tarkistuksen".
Yhteiset tehtävät¶
Kaikki nämä tehtävät kuuluvat osaksi kurssisuoritusta.
Lämmittelytehtävä¶
{'slug': 'oa-poliittiset-neliöt', 'content': [('heading', "Poliittiset neliöt¶
\n", 0, 1), ('paragraph', 'Ajoittain ruudulla tapahtuvassa geometriassa pitää tietää millä puolella jotain akselia tai objektia jokin toinen objekti sijaitsee. Jos esimerkiksi halutaan loihtia ruudulle otus joka liikkuu ruudun lähintä reunaa kohti, pitää ensin selvittää kummassa suunnassa tämä reuna on. Tässä tehtävässä toteutamme yksinkertaisen ehtolauseen, jonka avulla piirretään poliittisesti orientoituneita neliöitä, joiden väri riippuu sijainnista: vasemmalla punaista, oikealla sinistä.
\n', 2, 1), ('paragraph', 'Opittavat asiat: Ohjelman suorituksen ohjaaminen
\n', 4, 1), ('paragraph', 'ehtorakenteen
avulla. Koordinaatiston puoliskojen tunnistaminen koodissa.Tavoite: Ohjelma, joka piirtää neliöitä, joiden väri riippuu x-koordinaatista
\n', 6, 1), ('separator', '\n', 8, 1), ('paragraph', '
Alustus:
\n', 10, 1), ('paragraph', 'Edellisen harjoituksen tapaan tehtävässä on annettu koodipohja. Kaikki kirjoitettava koodi pitäisi jälleen tulla funktion sisälle.
\n', 12, 1), ('file', ' \n', 14, 1), ('separator', '\n', 16, 1), ('paragraph', '
Toteutettava funktio:
\n', 18, 1), ('list', 'piirra_nelio
- Parametrit:
- neliön sivun pituus (kokonaisluku)
- alkupisteen x-koordinaatti (kokonaisluku)
- alkupisteen y-koordinaatti (kokonaisluku) ', 20, 4), ('cleanup', '
Funktio piirtää yhden neliön, jonka täyttöväri riippuu siitä onko aloituspisteen x-koordinaatti positiivinen vai negatiivinen. Negatiiviselle x-koordinaatin
\n', 25, 1), ('separator', 'arvolle
käytetään väriä "red"
ja positiiviselle väriä "blue"
.\n', 27, 1), ('paragraph', '
Pääohjelma:
\n', 29, 1), ('paragraph', 'Koodipohjan
\n', 31, 1), ('image', "pääohjelmassa
olevat rivit piirtävät esimerkkikuvan neliöt, jos funktio on toteutettu oikein. Huom: kääntymissuunta vaikuttaa neliöiden asetteluun, joten tulos ei välttämättä ole täysin sama (kuvan neliöt piirretty kääntymällä oikealle). 
\n', 35, 1), ('paragraph', '
Käytettävät Turtle-komennot:
\n', 37, 1), ('paragraph', 'Käytössä ovat jo tutut komennot. Kaikkia näistä ei tarvita.
\n', 39, 1), ('code', 'forward(x) # liikkuu x pikseliä ruudulla eteenpäin. x on kokonaisluku, esim. forward(42)\nleft(a) # kääntyy vasemmalle a astetta. a on kokonaisluku, esim. left(40)\nright(a) # kääntyy oikealle a astetta. a on kokonaisluku, esim. right(40)\ncolor(c) # asettaa värin. c on väriarvo, tässä tehtävässä voit käyttää perusväriarvoja kuten "red", "yellow", "blue", esim. color("red")\nbegin_fill() # aloittaa täytön; kaikki tämän komennon jälkeiset viivat lasketaan täyttöalueen rajoiksi\nend_fill() # tämä komento lopettaa täytön; tämän ja edellisen välissä piirretty suljettu alue täytetään color-komennon määrittämällä värillä\nreset() # jos teet virheen, tällä komennolla voit pyyhkiä piirroksen pois ja palauttaa nuolen aloituspaikkaan\ndone() # jättää piirtoikkunan auki koodin suoritus pääsee tähän kohtaan; ilman tätä komentoa ikkuna sulkeutuu kun koodi on suoritettu\nup() # nostaa kynän jolloin kynää voi liikuttaa piirtämättä mitään\ndown() # laskee kynän alas jotta piirtäminen voi jatkua\nsetx(x) # asettaa kynän x-koordinaatin annettuun arvoon\nsety(y) # asettaa kynän y-koordinaatin annettuun arvoon\ncircle(r) # piirtää ympyrän, jonka säde on r; tämä tapahtuu siten, että kynä liikkuu 360 asteen ympyrän nykyisestä sijainnistaan kaartamalla koko ajan vasemmalle\n
\n \n \n \n \n
\n\n\n', 'revision': 25876, 'max_points': 3, 'urls': {'stats_url': '/stats/single-exercise/oa-poliittiset-neli%C3%B6t/', 'feedback_url': '/feedback/statistics/oa-fitech-2023-2024/oa-poliittiset-neli%C3%B6t/', 'download_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-poliittiset-neli%C3%B6t/download_answers/', 'summary_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-poliittiset-neli%C3%B6t/answer_summary/', 'batch_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-poliittiset-neli%C3%B6t/batch_grade/', 'reset_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-poliittiset-neli%C3%B6t/reset_completion/', 'edit_url': '/exercise-admin/file-upload/395/change/', 'submit_url': '/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-poliittiset-neli%C3%B6t/25876/check/', 'edit_content_url': '/staff/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-poliittiset-neli%C3%B6t/editform/edit/', 'delete_content_url': '/staff/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-poliittiset-neli%C3%B6t/editform/delete/', 'add_content_url': '/staff/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-poliittiset-neli%C3%B6t/add/'}}
Päätehtävät¶
{'slug': 'oa-poliisista-päivää', 'content': [('heading', "Poliisista päivää¶
\n", 0, 1), ('paragraph', 'Poliisin IT-osaaminen on kovaa vauhtia rapisemassa, joten he ovat tehneet sinulle tarjouksen, josta et voi kieltäytyä: tehtävänäsi on ohjelmoida ohjelma, jolla pystyy selvittämään ohi ajaneen auton nopeuden syöttämällä matkan, jonka auto on kulkenut tietyn ajan kuluessa. Käyt tuumasta toimeen koodaamaan innosta puhkuen verratonta nopeuslaskuriasi.
\n', 2, 1), ('paragraph', 'Opittavat asiat: Tulosten ja muiden numeroiden sijoittaminen
\n', 4, 1), ('paragraph', 'merkkijonoihin
käyttämällä hyödyksi paikanpitimiä
. Pitkän merkkijonon katkominen.Tavoite: Ohjelma, joka kysyy auton kulkeman matkan sekä tähän kuluneen ajan, ja antaa nopeuden siististi tulostettuna.
\n', 6, 1), ('separator', '\n', 8, 1), ('paragraph', '
Toteutettava pääohjelma:
\n', 10, 1), ('paragraph', 'Ohjelmassa siis kysytään kaksi liukuluku
\n', 12, 1), ('paragraph', 'syötettä
. Poliisien sovellusosaaminen on pahasti rapistunut kännykän räpeltämisen myötä, joten virheellisistä syötteistä on syytä huomauttaa. Jos poliisi sattuu syöttämään ihan oikeita numeroarvoja, tulostetaan sekä annetut arvot että laskettu nopeus kilometreinä tunnissa. Kuten esimerkistä ilmenee, kaikki numerot tulostetaan kahden desimaalin tarkkuudella - tämän aikansaanti vaatii f-merkkijonojen käyttöä! Pelkällä round-funktiolla ei siis tässä tehtävässä pääse oikeastaan edes lähtöviivalle. Jos saat tyylivaroituksen pitkästä rivistä, merkkijonon voi jakaa usealla riville laittamalla osaset alekkain. Luonnollisesti mahdollinen f pitää laittaa kunkin osasen eteen tarvittaessa:
\n', 14, 1), ('code', 'print(\n "Tässä on merkkijono jossa on paljon paljon paljon tekstiä, "\n "ja jos sinne laitetaan vielä paikanpitimiä pidentämään..."\n)\n
Poikkeusten käsittelyyn virheellisillä syötteillä voit kurkata aika suoraa apua tämän harjoituksen esimerkistä.
\n', 23, 1), ('separator', '\n', 25, 1), ('paragraph', '
Esimerkit toiminnasta:
\n', 27, 1), ('code', "Anna auton kulkema matka (m): 50.0\nAnna matkaan kulunut aika (s): 3.0\n50.00 metriä 3.00 sekunnissa kulkeneen auton nopeus on 60.00 km/h.\n
Anna auton kulkema matka (m): 50.0m\nVähemmän donitseja, enemmän puhtaita numeroita.\n
Anna auton kulkema matka (m): 50.0\nAnna matkaan kulunut aika (s): minuutti\nVähemmän donitseja, enemmän puhtaita numeroita.\n
\n \n \n \n \n
\n\n\n', 'revision': 32440, 'max_points': 3, 'urls': {'stats_url': '/stats/single-exercise/oa-poliisista-p%C3%A4iv%C3%A4%C3%A4/', 'feedback_url': '/feedback/statistics/oa-fitech-2023-2024/oa-poliisista-p%C3%A4iv%C3%A4%C3%A4/', 'download_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-poliisista-p%C3%A4iv%C3%A4%C3%A4/download_answers/', 'summary_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-poliisista-p%C3%A4iv%C3%A4%C3%A4/answer_summary/', 'batch_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-poliisista-p%C3%A4iv%C3%A4%C3%A4/batch_grade/', 'reset_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-poliisista-p%C3%A4iv%C3%A4%C3%A4/reset_completion/', 'edit_url': '/exercise-admin/file-upload/89/change/', 'submit_url': '/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-poliisista-p%C3%A4iv%C3%A4%C3%A4/32440/check/', 'edit_content_url': '/staff/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-poliisista-p%C3%A4iv%C3%A4%C3%A4/editform/edit/', 'delete_content_url': '/staff/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-poliisista-p%C3%A4iv%C3%A4%C3%A4/editform/delete/', 'add_content_url': '/staff/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-poliisista-p%C3%A4iv%C3%A4%C3%A4/add/'}}
{'slug': 'oa-heksoja-mittatilauksena', 'content': [('heading', "Heksoja mittatilauksena¶
\n", 0, 1), ('paragraph', 'Tietokoneen muistin sisältöä esitetään usein heksadesimaaliluvuilla, eli 16-kantaisilla luvuilla (kirjaimet a-f kuvaavat numeroja 10-15). Tyypillisesti tällöin halutaan myös sisällyttää lukuun riittävä määrä etunollia, jotta siitä voidaan lukea kuinka monibittinen luku on kyseessä, jolloin yksi heksa vastaa neljää bittiä. Tämä käy vallan hyvin, koska tietokoneen muistipaikkojen koot ovat aina kakkosen potensseja ja pienimmillään kahdeksan, joka esitettäisiin siis kahdella heksalla. Tässä tehtävässä muutetaan kokonaisluku Pythonilla heksadesimaaliksi, jossa on oikea määrä etunollia.
\n', 2, 1), ('paragraph', 'Opittavat asiat: Merkkijono
\n', 4, 1), ('paragraph', 'metodien
etsiminen ja käyttö siten, että käytetään useampaa kuin yhtä metodia yhdelle merkkijonolle. Tavoite: Ohjelma, joka muuntaa kokonaisluvun määrätyn pituiseksi heksadesimaaliluvuksi etunollilla varustettuna.
\n', 6, 1), ('separator', '\n', 8, 1), ('paragraph', '
Alustus:
\n', 10, 1), ('paragraph', 'Pythonissa voi muuntaa luvun heksadesimaalia esittäväksi
\n', 12, 1), ('code', 'merkkijonoksi
hex-funktiolla
:In [1]: hex(452)\nOut[1]: '0x1c4'\n
Jossa "0x" on heksaluvuille usein käytetty etuliite, josta ilmenee luvun luonne erityisesti niissä tapauksissa, että sinne ei ole eksynyt yhtään numeroa arvolla a-f.
\n', 19, 1), ('separator', '\n', 21, 1), ('paragraph', '
Toteutettava funktio:
\n', 23, 1), ('list', 'muotoile_heksaluvuksi
- Parametrit:
- muutettava kokonaisluku
- esitettävien bittien lukumäärä
- Palauttaa:
- merkkijonon joka esittää halutunlaista heksalukua ', 25, 5), ('cleanup', '
Funktion tulee muuntaa annettu kokonaisluku heksadesimaaliluvuksi ja sen jälkeen muotoilla se siten, että siinä on oikea määrä heksanumeroita. Koska yksi heksanumero vastaa neljää bittiä, halutun merkkijonon pituus saadaan jakolaskulla. Muotoiluun ei haluta mukaan "0x" etuliitettä, ja sen olemassaolo haittaa etunollien lisäämistä, joten sekin pitäisi ottaa pois.
\n', 31, 1), ('paragraph', 'Tarvitaan siis kaksi asiaa: etuliitteen poisto, ja etunollien lisääminen sen jälkeen. Molempiin operaatioihin löytyy sopiva merkkijonometodi - itse asiassa useampikin. Myös suoritusjärjestystä on syytä miettiä. Luvun ollessa liian suuri bittimäärälle palautetaan kaikki merkit vaikka niitä onkin liikaa. Eli bittien määrää käytetään ainoastaan miniminä. Muista palauttaa lopputulos!.
\n', 33, 1), ('paragraph', 'Merkkijonometodeja ja suoritusjärjestystä kannattaa testata
\n', 35, 1), ('paragraph', 'tulkissa
jolloin on paljon helpompi nähdä mitä kukin merkkijonometodi palauttaa. Tulkissa voit viitata edelliseen tulokseen _
-merkillä - jos vaikka yllä annetun esimerkin jälkeisellä rivillä käyttää tätä merkkiä, se sisältäisi arvon "0x1c4". Jakolaskuun kannattaa käyttää kokonaislukujakolaskua, eli //-
\n', 37, 1), ('separator', 'operaattoria
. \n', 39, 1), ('paragraph', '
Pääohjelma:
\n', 41, 1), ('paragraph', 'Tee pääohjelma joka kysyy käyttäjältä kokonaisluvun sekä esitettävien bittien lukumäärän. Jos jompikumpi syötteistä ei ole kokonaisluku, annetaan virheilmoitus ja ei jatketa suoritusta - eli samalla tavalla kuin esimerkissä ja edellisessä tehtävässä, paitsi nyt muunnos tehdään kokonaisluvuksi liukuluuvun sijaan. Numerot saatuaan pääohjelma
\n', 43, 1), ('separator', 'kutsuu
juuri tehtyä funktiota ja tulostaa sen paluuarvon
. Alta näet esimerkkejä siitä miten ohjelman tulisi toimia sekä kyselyihin käytettävät merkkijonot. \n', 45, 1), ('paragraph', '
Esimerkit toiminnasta:
\n', 47, 1), ('code', "Anna kokonaisluku: 5\nAnna heksaluvun pituus (bittien lukumäärä): 16\n0005\n
Anna kokonaisluku: 349798384653\nAnna heksaluvun pituus (bittien lukumäärä): 64\n00000051719bc40d\n
Anna kokonaisluku: 255\nAnna heksaluvun pituus (bittien lukumäärä): 8\nff\n
Anna kokonaisluku: aasi\nKokonaisluku kiitos\n
Anna kokonaisluku: 252\nAnna heksaluvun pituus (bittien lukumäärä): 2.5\nKokonaisluku kiitos\n
ja vielä loppuun malli siitä mitä käy jos luku on liian iso bittimäärälle (eli ei mitään erikoista):
\n', 78, 1), ('code', "Anna kokonaisluku: 4892\nAnna heksaluvun pituus (bittien lukumäärä): 4\n131c\n
\n \n \n \n \n
\n\n\n', 'revision': 24697, 'max_points': 3, 'urls': {'stats_url': '/stats/single-exercise/oa-heksoja-mittatilauksena/', 'feedback_url': '/feedback/statistics/oa-fitech-2023-2024/oa-heksoja-mittatilauksena/', 'download_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-heksoja-mittatilauksena/download_answers/', 'summary_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-heksoja-mittatilauksena/answer_summary/', 'batch_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-heksoja-mittatilauksena/batch_grade/', 'reset_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-heksoja-mittatilauksena/reset_completion/', 'edit_url': '/exercise-admin/file-upload/519/change/', 'submit_url': '/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-heksoja-mittatilauksena/24697/check/', 'edit_content_url': '/staff/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-heksoja-mittatilauksena/editform/edit/', 'delete_content_url': '/staff/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-heksoja-mittatilauksena/editform/delete/', 'add_content_url': '/staff/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-heksoja-mittatilauksena/add/'}}
{'slug': 'oa-nelilaskin', 'content': [('heading', "Nelilaskin¶
\n", 0, 1), ('paragraph', 'Tässä tehtävässä koodaamme perinteisen nelilaskimen. Ei mikään maailman jännittävin värkki, mutta sen tekemisessä oppii useita hyödyllisiä asioita niin syötteiden käsittelystä kuin ohjelman rakenteesta.
\n', 2, 1), ('paragraph', 'Opittavat asiat: Sisäkkäisten
\n', 4, 1), ('paragraph', 'ohjausrakenteiden
käyttö siten, että ohjelman kaikki suorituspolut pysyvät ehjinä. Käyttäjän syötteiden tarkastaminen poikkeusten
käsittelyn avulla. Tavoite: Koodata nelilaskin, jolle annetaan operaatio ja operandit.
\n', 6, 1), ('separator', '\n', 8, 1), ('paragraph', '
Toteutettava pääohjelma:
\n', 10, 1), ('paragraph', 'Käyttäjä valitsee
\n', 12, 1), ('paragraph', 'operaattorin
syöttämällä
haluaako tehdä yhteen-, vähennys-, kerto- vai jakolaskun. Jos käyttäjä yrittää syöttää jotain muuta, todetaan, että "Operaatiota ei ole olemassa"
. Tämän jälkeen ohjelma kysyy käyttäjältä kaksi lukua ja antaa tuloksen esimerkkien mukaisesti. Mikäli käyttäjä syöttää virheellisen luvun, ohjelman suoritus loppuu ja näytölle tulostuu "Ei tämä ole mikään luku"
. Vastaavasti, jos käyttäjä yrittää jakaa nollalla, todetaan "Tällä ohjelmalla ei pääse äärettömyyteen"
. Koodissa tulee laskea liukuluvuilla
. Tässä tehtävässä on erityisen tärkeää pitää mielessä mitä harjoituksen alussa kerrottiin ohjelman lopettamisesta. Älä siis käytä quit- tai exit-funktioita!
\n', 14, 1), ('separator', '\n', 16, 1), ('paragraph', '
Esimerkit toiminnasta:
\n', 18, 1), ('code', "Valitse operaatio (+, -, *, /): +\nAnna luku 1: 12.8\nAnna luku 2: enpäs\nEi tämä ole mikään luku\n
Valitse operaatio (+, -, *, /): +\nAnna luku 1: aasisvengaa\nEi tämä ole mikään luku\n
Valitse operaatio (+, -, *, /): ^\nOperaatiota ei ole olemassa\n
Valitse operaatio (+, -, *, /): *\nAnna luku 1: 12\nAnna luku 2: 5\nTulos: 60\n
Valitse operaatio (+, -, *, /): /\nAnna luku 1: 52.65\nAnna luku 2: 0\nTällä ohjelmalla ei pääse äärettömyyteen\n
\n \n \n \n \n
\n\n\n', 'revision': 30434, 'max_points': 3, 'urls': {'stats_url': '/stats/single-exercise/oa-nelilaskin/', 'feedback_url': '/feedback/statistics/oa-fitech-2023-2024/oa-nelilaskin/', 'download_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-nelilaskin/download_answers/', 'summary_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-nelilaskin/answer_summary/', 'batch_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-nelilaskin/batch_grade/', 'reset_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-nelilaskin/reset_completion/', 'edit_url': '/exercise-admin/file-upload/88/change/', 'submit_url': '/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-nelilaskin/30434/check/', 'edit_content_url': '/staff/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-nelilaskin/editform/edit/', 'delete_content_url': '/staff/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-nelilaskin/editform/delete/', 'add_content_url': '/staff/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-nelilaskin/add/'}}
{'slug': 'oa-äänestyskone', 'content': [('heading', "Äänestyskone¶
\n", 0, 1), ('paragraph', 'Oikean maailman äänestyskoneisiin liittyy monenlaisia turvallisuustekijöitä. Onneksi näin peruskurssilla voidaan tehdä vain ohjelma, joka laskee annettuja ääniä ja näyttää tulokset. Tällä ohjelmalla ei taatusti voida suorittaa minkäänlaista vaalivilppiä.
\n', 2, 1), ('paragraph', 'Opittavat asiat:
\n', 4, 1), ('paragraph', 'Sanakirjan
sisällön lukeminen ja päivittäminen. Funktioiden
käyttö muuntuvien
arvojen kanssa.Tavoite: Ohjelma johon käyttäjä(t) syöttävät ääniä, ja joka ilmoittaa tulokset
\n', 6, 1), ('paragraph', 'Ennen kuin aloitat:
\n', 8, 1), ('paragraph', 'Luo ohjelmaasi testausta varten kaksi eri äänestystä kuvaavaa sanakirjaa. Kummassakin on vaihtoehdot "jaa", "ei", "eos" (en osaa sanoa), sekä lisäksi oma avain virheellisiä ääniä varten. Toisessa äänestyksessä on valmiiksi tuloksia.
\n', 10, 1), ('code', 'verouudistus = {\n "jaa": 0,\n "ei": 0,\n "eos": 0,\n "virhe": 0\n}\nnalle_puh_presidentiksi = {\n "jaa": 12,\n "ei": 0,\n "eos": 5,\n "virhe": 4\n}\n
1. toteutettava funktio:
\n', 28, 1), ('list', 'aanesta
- Parametrit:
- sanakirja, jossa on aiemmat äänet, ja johon uusi ääni talletetaan ', 30, 2), ('cleanup', '
Funktio esittää äänestyksen vaihtoehdot sekä pyytää käyttäjää syöttämään yhden niistä. Syöte kannattaa muuttaa pieniksi kirjaimiksi. Tämän jälkeen funktio lisää käyttäjän valitseman vaihtoehdon äänten lukumäärään yhden. Tämä tulee tehdä siis siten, että vanha arvo haetaan sanakirjasta annetulla
\n', 33, 1), ('paragraph', 'avaimella
, ja tallennetaan
myös sinne takaisin. Mikäli käyttäjän valitsema avain ei ole sanakirjassa, lisätään ykkönen "virhe"-avaimen arvoon. Huomaa, että funktion ei kuulu palauttaa
mitään, koska se muokkaa muuntuvaa arvoa. 2. toteutettava funktion:
\n', 35, 1), ('list', 'nayta_tulokset
- Parametrit:
- sanakirja, jossa on äänestystulokset ', 37, 2), ('cleanup', '
Funktio
\n', 40, 1), ('code', "tulostaa
äänestyksen tulokset siten, että kunkin vaihtoehdon saamat äänet esitetään #-merkeistä muodostuvilla palkeilla, kukin omalla rivillään. Esim:Jaa : #####\nEi : ######\nEos : #\nVirhe: ###\n
Kaksoispisteiden ja palkkien tasaaminen ei ole pakollista tehtävän läpäisyn kannalta.
\n', 49, 1), ('paragraph', 'Toteutettava
\n', 51, 1), ('paragraph', 'pääohjelma
: Pääohjelmassa on tarkoitus kutsua tehtyjä funktioita kummallekin sanakirjalle. Kummankin sanakirjan kohdalla voit tehdä seuraavat asiat:
\n', 53, 1), ('list', '- tulosta käyttäjälle tieto siitä mistä äänestetään
- kutsu aanesta-funktiota
- kutsu nayta_tulokset-funktiota ', 55, 3), ('cleanup', '
Koodissa tulee olla siis vain kaksi funktiota, mutta niitä kutsutaan eri
\n', 59, 1), ('paragraph', 'argumenteilla
. Pääohjelman tarkistus olettaa, että olet käyttänyt annettuja sanakirjoja sellaisenaan, ja verouudistus äänestetään ensin.Esimerkit toiminnasta:
\n', 61, 1), ('paragraph', 'Alla on kutsuttu aanesta-funktiota kertaalleen per äänestys.
\n', 63, 1), ('code', "Suoritetaanko verouudistus?\nAnna äänesi, vaihtoehdot ovat:\njaa, ei, eos\n> ööö\n\nJaa : \nEi : \nEos : \nVirhe: #\n\nNalle Puh presidentiksi?\nAnna äänesi, vaihtoehdot ovat:\njaa, ei, eos\n> jaa\n\nJaa : #############\nEi : \nEos : #####\nVirhe: ####\n
\n \n \n \n \n
\n\n\n', 'revision': 25615, 'max_points': 3, 'urls': {'stats_url': '/stats/single-exercise/oa-%C3%A4%C3%A4nestyskone/', 'feedback_url': '/feedback/statistics/oa-fitech-2023-2024/oa-%C3%A4%C3%A4nestyskone/', 'download_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-%C3%A4%C3%A4nestyskone/download_answers/', 'summary_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-%C3%A4%C3%A4nestyskone/answer_summary/', 'batch_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-%C3%A4%C3%A4nestyskone/batch_grade/', 'reset_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-%C3%A4%C3%A4nestyskone/reset_completion/', 'edit_url': '/exercise-admin/file-upload/643/change/', 'submit_url': '/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-%C3%A4%C3%A4nestyskone/25615/check/', 'edit_content_url': '/staff/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-%C3%A4%C3%A4nestyskone/editform/edit/', 'delete_content_url': '/staff/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-%C3%A4%C3%A4nestyskone/editform/delete/', 'add_content_url': '/staff/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-%C3%A4%C3%A4nestyskone/add/'}}
Lopputyötehtävät¶
Seuraavista tehtävästi tulee tehdä yksi. Valinta kannattaa tehdä sen perusteella minkä lopputyöaiheen olet valinnut. Nämä tehtävät eivät ole pakollisia minimikurssisuoritukseen.
{'slug': 'oa-miinatehtävä-äärirajoilla', 'content': [('heading', "Miinatehtävä: Äärirajoilla¶
\n", 0, 1), ('paragraph', 'Tämän tehtävän on tarkoitus antaa valmiuksia Miinantallaaja-lopputyötä varten. Tehtävässä opit joitain perustotuuksia siitä, miten 2-ulotteinen ruudukko toimii ohjelmakoodissa. Lisäksi opit muutamia ohjelmointiperiaatteita, kuten sanakirjojen käyttöä kun halutaan tulostaa jotain tiettyä arvoa vastaava viesti. Viestien hakeminen sanakirjoista on myös hyvin yleistä mm. tämän kurssin tarkistimissa.
\n', 2, 1), ('paragraph', 'Opittavat asiat: Lukujen suuruksien tarkastelu
\n', 4, 1), ('paragraph', 'ehtorakenteilla
. Tehtävässä opitaan, että N-pituisen sarjan viimeinen arvo ei ole N, jos ensimmäinen on 0. Ongelman hahmottelu paperille. Lisäksi opitaan miten ohjelman sisällä kannattaa käyttää data-arvoja, ja pyöritellä pitkiä merkkijonoja
vasta tulostaessa. Tavoite: Ohjelma, joka kysyy käyttäjältä kentän mitat sekä ruudun, ja kertoo miten ruutu sijoittuu kentällä.
\n', 6, 1), ('separator', '\n', 8, 1), ('paragraph', '
Alustus:
\n', 10, 1), ('paragraph', 'Lisätään ohjelmaan
\n', 12, 1), ('code', 'sanakirja
, josta lyötyy eri sijainteja vastaavat tulostettavat viestit. Sanakirjan tulee olla koodissasi juuri tällä nimellä:TULOSTUKSET = {\n "ulkona": "Antamasi ruutu on kentän ulkopuolella.",\n "nurkassa": "Antamasi ruutu on kentän nurkassa.",\n "laidalla": "Antamasi ruutu on kentän laidalla.",\n "keskellä": "Antamasi ruutu on keskikentällä."\n}\n
\n', 23, 1), ('paragraph', '
1. toteutettava funktio:
\n', 25, 1), ('list', 'sijainti_kentalla
- Parametrit:
- ruudun x-koordinaatti (kokonaisluku)
- ruudun y-koordinaatti (kokonaisluku)
- kentän leveys (kokonaisluku)
- kentän korkeus (kokonaisluku)
- Palauttaa:
- sijaintia kuvaavan avainsanan (merkkijono) ', 27, 7), ('cleanup', '
Tämä funktio palauttaa yhden em. sanakirjan avaimista riippuen siitä missä kohtaa x- ja y-koordinaateilla määritetty ruutu on kentällä, jonka leveys ja korkeus on annettu funktiolle. Funktion tulisi siis tutkia onko ruutu ulkona, nurkassa vai laidassa - jos ei ole mistään näistä, se on keskikentällä. Funktio siis palauttaa yhden sanakirjan
\n', 35, 1), ('paragraph', 'avaimista
, esim jos koordinaatit olivat ulkopuolella tulisi palautusrivin olla: return "ulkona"
. Huom! Tehtävässä koordinaattien origo on ruudussa (0, 0). Katso tarkasti alla olevista esimerkeistä, kuinka tämä vaikuttaa tulostuksiin. Kannattaa myös pitää mielessä, että koordinaatit osoittavat kokonaisia ruutuja! Piirtele siis ruudukko paperille ja kirjoittele reunoihin numerot niin voit helposti katsoa milloin ollaan missäkin päin kenttää.
\n', 37, 1), ('separator', '\n', 39, 1), ('paragraph', '
2. toteutettava funktio:
\n', 41, 1), ('list', 'tulosta_sijainti
- Parametrit:
- sijaintia kuvaava avainsana (merkkijono) ', 43, 2), ('cleanup', '
Funktio tulostaa valitun ruudun sijainnin, eli onko se ulkona, nurkassa, laidalla vai keskellä. Viesti tulee hakea tehtävänannossa määritetystä sanakirjasta käyttäen funktion
\n', 46, 1), ('paragraph', 'parametria
avaimena
. Tähän pitäisi tulla aika lailla siis yksi rivi koodia ainakin jos muistaa, että sanakirjan avaimena voi käyttää muuttujaa
. Kannattaa ottaa ohjeet tosissaan, sillä tarkistin muuttelee sanakirjaan tallennettuja viestejä...Tämä funktio ei saa kutsua edellistä funktiota!
\n', 48, 1), ('separator', '\n', 50, 1), ('paragraph', '
Pääohjelma:
\n', 52, 1), ('paragraph', 'Kirjoita ohjelma, joka kysyy käyttäjältä kentän leveyden ja pituuden ja näiden jälkeen koordinaatit vaaka- ja pystysuunnissa (eli x- ja y-koordinaatit). Liian pienien leveyden ja pituuden antamisen jälkeen annetaan alla olevien esimerkkien mukainen virheilmoitus ja lopetetaan ohjelman suoritus (kuten laskintehtävässä). Koordinaattien
\n', 54, 1), ('paragraph', 'syöttämisen
jälkeen ohjelman täytyy ilmoittaa, osuiko annettu koordinaatti kentän nurkkaan, reunalle, keskikentällä vai ulkopuolelle. Tämä onnistunee parhaiten juuri tehdyillä funktioilla: ensimmäinen palauttaa sijaintia vastaavan avainsanan ja toinen tulostaa sitä vastaavan viestin.Kaikki
\n', 56, 1), ('separator', 'merkkijonot
kyselyihin ja tulostuksiin löydät suoritusesimerkeistä.\n', 58, 1), ('paragraph', '
Esimerkit toiminnasta:
\n', 60, 1), ('code', "Anna kentän leveys: 0\nAnna kentän korkeus: 0\n\nNoin pienelle kentälle ei mahdu ainuttakaan ruutua!\n
Anna kentän leveys: -6\nAnna kentän korkeus: 999\n\nNoin pienelle kentälle ei mahdu ainuttakaan ruutua!\n
Anna kentän leveys: 1\nAnna kentän korkeus: 1\nAnna x-koordinaatti: 0\nAnna y-koordinaatti: 0\n\nAntamasi ruutu on kentän nurkassa.\n
Anna kentän leveys: 5\nAnna kentän korkeus: 8\nAnna x-koordinaatti: 4\nAnna y-koordinaatti: 3\n\nAntamasi ruutu on kentän laidalla.\n
Anna kentän leveys: 13\nAnna kentän korkeus: 7\nAnna x-koordinaatti: 2\nAnna y-koordinaatti: 2\n\nAntamasi ruutu on keskikentällä.\n
Anna kentän leveys: 4\nAnna kentän korkeus: 4\nAnna x-koordinaatti: 4\nAnna y-koordinaatti: 4\n\nAntamasi ruutu on kentän ulkopuolella.\n
\n \n \n \n \n
\n\n\n', 'revision': 25149, 'max_points': 4, 'urls': {'stats_url': '/stats/single-exercise/oa-miinateht%C3%A4v%C3%A4-%C3%A4%C3%A4rirajoilla/', 'feedback_url': '/feedback/statistics/oa-fitech-2023-2024/oa-miinateht%C3%A4v%C3%A4-%C3%A4%C3%A4rirajoilla/', 'download_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-miinateht%C3%A4v%C3%A4-%C3%A4%C3%A4rirajoilla/download_answers/', 'summary_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-miinateht%C3%A4v%C3%A4-%C3%A4%C3%A4rirajoilla/answer_summary/', 'batch_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-miinateht%C3%A4v%C3%A4-%C3%A4%C3%A4rirajoilla/batch_grade/', 'reset_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-miinateht%C3%A4v%C3%A4-%C3%A4%C3%A4rirajoilla/reset_completion/', 'edit_url': '/exercise-admin/file-upload/92/change/', 'submit_url': '/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-miinateht%C3%A4v%C3%A4-%C3%A4%C3%A4rirajoilla/25149/check/', 'edit_content_url': '/staff/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-miinateht%C3%A4v%C3%A4-%C3%A4%C3%A4rirajoilla/editform/edit/', 'delete_content_url': '/staff/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-miinateht%C3%A4v%C3%A4-%C3%A4%C3%A4rirajoilla/editform/delete/', 'add_content_url': '/staff/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-miinateht%C3%A4v%C3%A4-%C3%A4%C3%A4rirajoilla/add/'}}
{'slug': 'oa-spektritehtävä-kulmikasta-koodia', 'content': [('heading', "Spektritehtävä: Kulmikasta koodia¶
\n", 0, 1), ('paragraph', 'Tämän ongelman ratkaisusta on hyötyä Spektriä pukkaa lopputyössä. Kirjoitetaan ohjelma, joka laskee ja tulostaa kahden pisteen välisen suoran yhtälön, huomioiden kaikki rajatapaukset.
\n', 2, 1), ('paragraph', 'Opittavat asiat: Lukujen suuruksien tarkastelu
\n', 4, 1), ('paragraph', 'ehtorakenteilla
. Ohjelman ohjaaminen siten, että laskujen lopputuloksista tehdään oikeat toteamukset. Suoran yhtälön laskeminen.Tavoite: Ohjelma, joka laskee suoran yhtälön ja tulostaa sen.
\n', 6, 1), ('separator', '\n', 8, 1), ('paragraph', '
Toteutettava funktio:
\n', 10, 1), ('list', 'laske_parametrit
- Parametrit:
- ensimmäisen pisteen x-koordinaatti (liukuluku)
- ensimmäisen pisteen y-koordinaatti (liukuluku)
- toisen pisteen x-koordinaatti (liukuluku)
- toisen pisteen y-koordinaatti (liukuluku)
- Palauttaa:
- suoran kulmakerroin (liukuluku)
- suoran vakiotermi (liukuluku) ', 12, 8), ('cleanup', '
Käytä kulmakertoimelle ja vakiotermille seuraavia kaavoja:
\n', 21, 1), ('tex', 'k = \\dfrac{y_2-y_1}{x_2-x_1}\n
\n', 23, 3), ('paragraph', 'ja
\n', 27, 1), ('tex', 'b = \\dfrac{x_2 \\cdot y_1 - x_1 \\cdot y_2}{x_2 - x_1}\n
\n', 29, 3), ('separator', '\n', 33, 1), ('paragraph', '
Toteutettava
\n', 35, 1), ('paragraph', 'pääohjelma
:Haluamme, että ohjelmamme
\nmikä on suoran yhtälö mikäli se vain suinkin voidaan laskea. Lisäksi haluamme ohjelman kykenevän erottamaan toisistaan tilanteet joissa käyttäjä syöttää saman pisteen kahdesti, ja joissa suora on pystysuora. Päätämme, ettemme tarkista käyttäjän syötteitä erikseen, mutta ohjelman pitää osata kuitenkin käsitellä myös
\n', 37, 2), ('paragraph', 'ottaa vastaan käyttäjältä
kahden pisteen x- ja y-koordinaatit ja kertoo\nmikä on suoran yhtälö mikäli se vain suinkin voidaan laskea. Lisäksi haluamme ohjelman kykenevän erottamaan toisistaan tilanteet joissa käyttäjä syöttää saman pisteen kahdesti, ja joissa suora on pystysuora. Päätämme, ettemme tarkista käyttäjän syötteitä erikseen, mutta ohjelman pitää osata kuitenkin käsitellä myös
liukulukuja
ja pyöristää kaikki tulosteensa täsmälleen kolmen desimaalin tarkkuuteen. Ohjelman tekemisessä kannattaa käyttää sisäkkäisiä try- ja if-rakenteita. Helpoin tapa tietää voiko yhtälön laskea on tietenkin kutsua juuri tehtyä funktiota try:n sisällä. Joku
\n', 40, 1), ('paragraph', 'poikkeus
sieltä saadaan, jos yhtälöä ei voi laskea. Kannattaa myös huomata, että vakiotermin ollessa negatiivinen ohjelmasi tulee tulostaa yhtälöön miinusmerkki - eli ihan suoraan ei vakiotermiä voi heittää samaan muotoilumerkkijonoon! Sitä ei myöskään pitäisi laittaa mukaan jos se on nolla (kulmakerroin tulostetaan kuitenkin aina).Kyselyissä ja tulostuksissa käytettävät
\n', 42, 1), ('separator', 'merkkijonot
löydät alta.\n', 44, 1), ('paragraph', '
Esimerkit toiminnasta:
\n', 46, 1), ('code', "Anna ensimmäisen pisteen x-koordinaatti: 0\nAnna ensimmäisen pisteen y-koordinaatti: 0\nAnna toisen pisteen x-koordinaatti: 0\nAnna toisen pisteen y-koordinaatti: 0\nNämähän ovat yksi ja sama piste!\n}}}\n{{{\nAnna ensimmäisen pisteen x-koordinaatti: -1\nAnna ensimmäisen pisteen y-koordinaatti: 100\nAnna toisen pisteen x-koordinaatti: -1\nAnna toisen pisteen y-koordinaatti: -100\nSuora on pystysuora, yhtälöä ei voida laskea.\n}}}\n{{{\nAnna ensimmäisen pisteen x-koordinaatti: 2\nAnna ensimmäisen pisteen y-koordinaatti: 3.1\nAnna toisen pisteen x-koordinaatti: 6.7\nAnna toisen pisteen y-koordinaatti: 8.51\nSuoran yhtälö: y = 1.151x + 0.798\n}}}\n{{{\nAnna ensimmäisen pisteen x-koordinaatti: -8\nAnna ensimmäisen pisteen y-koordinaatti: 4.5\nAnna toisen pisteen x-koordinaatti: -5\nAnna toisen pisteen y-koordinaatti: 4.5\nSuoran yhtälö: y = 0.000x + 4.500\n}}}\n{{{\nAnna ensimmäisen pisteen x-koordinaatti: 3.141457\nAnna ensimmäisen pisteen y-koordinaatti: -6.12433\nAnna toisen pisteen x-koordinaatti: 0\nAnna toisen pisteen y-koordinaatti: 50\nSuoran yhtälö: y = -17.866x + 50.000\n}}}\n{{{\nAnna ensimmäisen pisteen x-koordinaatti: 5.76 \nAnna ensimmäisen pisteen y-koordinaatti: 4.6\nAnna toisen pisteen x-koordinaatti: 2\nAnna toisen pisteen y-koordinaatti: -5\nSuoran yhtälö: y = 2.553x - 10.106\n}}}\n{{{\nAnna ensimmäisen pisteen x-koordinaatti: 2\nAnna ensimmäisen pisteen y-koordinaatti: 2\nAnna toisen pisteen x-koordinaatti: 4\nAnna toisen pisteen y-koordinaatti: 4\nSuoran yhtälö: y = 1.000x\n
\n \n \n \n \n
\n\n\n', 'revision': 33005, 'max_points': 4, 'urls': {'stats_url': '/stats/single-exercise/oa-spektriteht%C3%A4v%C3%A4-kulmikasta-koodia/', 'feedback_url': '/feedback/statistics/oa-fitech-2023-2024/oa-spektriteht%C3%A4v%C3%A4-kulmikasta-koodia/', 'download_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-spektriteht%C3%A4v%C3%A4-kulmikasta-koodia/download_answers/', 'summary_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-spektriteht%C3%A4v%C3%A4-kulmikasta-koodia/answer_summary/', 'batch_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-spektriteht%C3%A4v%C3%A4-kulmikasta-koodia/batch_grade/', 'reset_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-spektriteht%C3%A4v%C3%A4-kulmikasta-koodia/reset_completion/', 'edit_url': '/exercise-admin/file-upload/90/change/', 'submit_url': '/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-spektriteht%C3%A4v%C3%A4-kulmikasta-koodia/33005/check/', 'edit_content_url': '/staff/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-spektriteht%C3%A4v%C3%A4-kulmikasta-koodia/editform/edit/', 'delete_content_url': '/staff/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-spektriteht%C3%A4v%C3%A4-kulmikasta-koodia/editform/delete/', 'add_content_url': '/staff/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-spektriteht%C3%A4v%C3%A4-kulmikasta-koodia/add/'}}
{'slug': 'oa-piiritehtävä-mittauspuuhia', 'content': [('heading', "Piiritehtävä: Mittauspuuhia¶
\n", 0, 1), ('paragraph', 'Tämä harjoitus saattaa osoittautua hyödylliseksi erityisesti Piiri pieni pyörii -lopputyötä ajatellen. Tehtävänäsi on koodata ohjelma, joka kysyy käyttäjältä komponentin tyypin sekä komponentin arvon ja laskee näiden pohjalta komponentin impedanssin sekä esittää sen osoitinmuodossa.
\n', 2, 1), ('paragraph', 'Opittavat asiat: Käyttäjän valintojen tunnistaminen
\n', 4, 1), ('paragraph', 'syötteistä
ja niihin reagointi ehtorakenteessa
. Lisäksi tutustutaan hieman komponenttien impedanssien laskukaavoihin ja osoitinmuotoon.Tavoite: Ohjelma, joka kysyy komponentin tyypin ja arvon, ja kertoo sen impedanssin osoitinmuodossa.
\n', 6, 1), ('separator', '\n', 8, 1), ('paragraph', '
Toteutettava funktio:
\n', 10, 1), ('list', 'laske_osoitinmuoto
- Parametrit:
- komponentin tyyppi (merkkijono huom. pieni kirjain)
- komponentin arvo (liukuluku)
- jännitelähteen taajuus (liukuluku) - valinnainen,oletusarvo0
- Palauttaa:
- osoittimen pituus (liukuluku)
- osoittimen kulma radiaaneina (liukuluku) ', 12, 7), ('cleanup', '
Funktio laskee siis komponentin impedanssin arvon alla olevilla kaavoilla riippuen komponentin tyypistä, joka on joko r, l tai c. Kompleksiluvun voi syöttää Pythoniin ihan vain muodossa
\n', 20, 1), ('code', "1j
ja Python käsittelee kompleksilukuja ihan mielissään. Vastus:\nZ = R\nKela:\nZ = 2pi * f * L * 1j\nKondensaattori:\nZ = 1 / (2pi * f * C * 1j)\n
Impedanssin laskun jälkeen se pitäisi palauttaa osoitinmuodossa. Tähän tarkoitukseen löytyy cmath-
\n', 31, 1), ('separator', 'moduulista
funktio nimeltä polar
. \n', 33, 1), ('paragraph', '
Toteutettava
\n', 35, 1), ('paragraph', 'pääohjelma
:Pääohjelma kysyy käyttäjältä yhden komponentin tyypin (R = vastus, L = kela, C = kondensaattori) ja sen arvon (vastukselle resistanssi, kelalle induktanssi ja kondensaattorille kapasitanssi). Kelan ja kondensaattorin tapauksessa kysytään myös erikseen komponentin taajuus. Siitä että jekkuileva käyttäjä saattaa
\n', 37, 1), ('paragraph', 'syöttää
jotain muuta kuin numeroita ei tarvi välittää, mutta komponentin tyypistä tulee tarkistaa onko se sallittujen joukossa. Ohjelman pitäisi myös toimia riippumatta siitä syöttääkö käyttäjä kirjaintunnukset pieninä tai isoina.Ohjelma tulostaa komponentin impedanssin osoitinmuodossa siten, että osoittimen pituus jätetään pyöristämättä, mutta kulma tulostetaan asteina ja kolmen desimaaliin tarkkuuteen pyöristettynä.
\n', 39, 1), ('paragraph', 'Kysymys
\n', 41, 1), ('separator', 'merkkijonot
ja muut tulosteet löydät esimerkeistä. \n', 43, 1), ('paragraph', '
Esimerkit toiminnasta:
\n', 45, 1), ('code', "Anna komponentin tyyppi (R, L, C): xD\nSallittuja komponentteja ovat R, L ja C!\n
Anna komponentin tyyppi (R, L, C): r\nAnna komponentin arvo: 10.5\nKomponentin impedanssi osoitinmuodossa: 10.5 < 0.000°\n
Anna komponentin tyyppi (R, L, C): L\nAnna komponentin arvo: 0.855\nAnna komponentin taajuus: 10 \nKomponentin impedanssi osoitinmuodossa: 53.72123437638546 < 90.000°\n
Anna komponentin tyyppi (R, L, C): c\nAnna komponentin arvo: 0.000003\nAnna komponentin taajuus: 250.751\nKomponentin impedanssi osoitinmuodossa: 211.57103141083562 < -90.000°\n
\n \n \n \n \n
\n\n\n', 'revision': 36338, 'max_points': 4, 'urls': {'stats_url': '/stats/single-exercise/oa-piiriteht%C3%A4v%C3%A4-mittauspuuhia/', 'feedback_url': '/feedback/statistics/oa-fitech-2023-2024/oa-piiriteht%C3%A4v%C3%A4-mittauspuuhia/', 'download_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-piiriteht%C3%A4v%C3%A4-mittauspuuhia/download_answers/', 'summary_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-piiriteht%C3%A4v%C3%A4-mittauspuuhia/answer_summary/', 'batch_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-piiriteht%C3%A4v%C3%A4-mittauspuuhia/batch_grade/', 'reset_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-piiriteht%C3%A4v%C3%A4-mittauspuuhia/reset_completion/', 'edit_url': '/exercise-admin/file-upload/91/change/', 'submit_url': '/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-piiriteht%C3%A4v%C3%A4-mittauspuuhia/36338/check/', 'edit_content_url': '/staff/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-piiriteht%C3%A4v%C3%A4-mittauspuuhia/editform/edit/', 'delete_content_url': '/staff/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-piiriteht%C3%A4v%C3%A4-mittauspuuhia/editform/delete/', 'add_content_url': '/staff/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-piiriteht%C3%A4v%C3%A4-mittauspuuhia/add/'}}
{'slug': 'oa-liikkeen-hallintaa', 'content': [('heading', "Sorsatehtävä: Liikkeen hallintaa¶
\n", 0, 1), ('paragraph', 'Edellisellä harjoituskerralla tehtiin funktio, joka muuntaa napakoordinaatit (x, y)-koordinaattipariksi ja todettiin, että tätä käytetään usein ruudulla liikkuvien objektien kanssa. Tällä kertaa menemme hieman lähemmäs käytäntöä. Harjoituksessa opetellaan päivittämään (x, y)-tasolla liikkuvan pistemäisen objektin sijainti perustuen sen suuntaan ja nopeuteen. Objektin, jolla on useita ominaisuuksia, pystyy näppärästi kuvaamaan sanakirjalla. Ihan peliksi asti tästä harjoitustehtävästä ei vielä ole, mutta ainakin kyseessä on hyvin usein toistuva mekanismi.
\n', 2, 1), ('paragraph', 'Opittavat asiat:
\n', 4, 1), ('paragraph', 'Sanakirjan
sisällön lukeminen ja päivittäminen. Funktioiden
käyttö muuntuvien
arvojen kanssa.Tavoite: Joukko funktioita, jotka pyytävät käyttäjältä liikkeen suunnan ja nopeuden, sekä päivittävät objektin sijainnin näitä käyttäen.
\n', 6, 1), ('separator', '\n', 8, 1), ('paragraph', '
Alustus:
\n', 10, 1), ('paragraph', 'Nouda edelliseltä harjoituskerralta Sininen funktio -tehtävän ratkaisu ja kopioi siitä
\n', 12, 1), ('code', 'muunna_xy_koordinaateiksi
-funktio. Älä muuta tätä funktiota! Voit tehdä myös valmiiksi pääohjelmaan
sanakirjoja, jossa on toteutettavien funktioiden vaatimat avain
-arvo
-parit, esim. hahmo_1 = {\n "x": 0,\n "y": 0,\n "suunta": 0,\n "nopeus": 0\n}\n\nhahmo_2 = {\n "x": 50,\n "y": 50,\n "suunta": 0,\n "nopeus": 0\n}\n
\n', 30, 1), ('paragraph', '
1. toteutettava funktio:
\n', 32, 1), ('list', 'kysy_liike
- Parametrit:
- sanakirja, josta löytyy yllä kuvatut avain-arvo-parit ', 34, 2), ('cleanup', '
Funktio tulostaa hahmon sijainnin ja
\n', 37, 1), ('separator', 'pyytää
sen jälkeen käyttäjältä liikkeen suunnan asteina sekä nopeuden. Tulosteen ja pyynnön käyttämät merkkijonot
löydät tehtävänannon lopun esimerkistä. Molemmat syötteet otetaan liukulukuina ja sijoitetaan sanakirjan vastaavien avainten arvoiksi. Huomaa, että funktio ei palauta
mitään, koska se päivittää muuntuvaa
objektia. Muista viitata sanakirjaan funktion parametrin nimellä! \n', 39, 1), ('paragraph', '
2. toteutettava fuktio:
\n', 41, 1), ('list', 'paivita_sijainti
- Parametrit:
- sanakirja, josta löytyy yllä kuvatut avain-arvo-parit ', 43, 2), ('cleanup', '
Tämä funktio laskee hahmon uuden sijainnin perustuen sanakirjasta löytyvään suuntaan ja nopeuteen. Nämä kaksi arvoa muodostavat itse asiassa napakoordinaattiosoittimen. Olisikohan joku funktio, jolla saisi tästä laskettua paljonko (x, y)-koordinaatit muuttuvat...? Saattaa myös olla, että tällainen funktio ottaa kulman vastaan radiaaneina, kun taas sanakirjassa kulma on asteina. Kuulemma math-moodulissa voisi olla jotain apua tähän..
\n', 46, 1), ('paragraph', 'Huomaa, että testauksessa hahmon aloituspiste ei suinkaa ole aina (0, 0). Funktion tulee siis toimia myös silloin kun hahmon alkusijainti on jossain muussa pisteessä. Huomaa myös, että em. apufunktio palauttaa koordinaattien muutokset - nämä arvot tulee siis summata sanakirjassa oleviin sijaintikoordinaatteihin (eli sijoittaa alkuperäisten päälle uudet arvot). Tämäkin funktio muokkaa muuntuvia objekteja, joten mitään ei tule palauttaa.
\n', 48, 1), ('separator', '\n', 50, 1), ('paragraph', '
Pääohjelma:
\n', 52, 1), ('paragraph', 'Tee pääohjelma joka kysyy siirron kahdelta pelaajalta, joilla kummallakin on kentällä oma hahmo. Se ilmoittaa kumman pelaajan vuoro on, ja kutsuu sitten molempia funktiota käsittelemään tämän pelaajan hahmosanakirjaa, ja lopuksi tulostaa hahmon uuden sijainnin, esimerkkien mukaisesti. Sama toistetaan toiselle pelaajalle. Näin toimimalla varmistetaan, että molemmat funktiot käsittelevät argumenttina annettua sanakirjaa, eivät suoraan pääohjelmassa olevia.
\n', 54, 1), ('separator', '\n', 56, 1), ('paragraph', '
Esimerkit toiminnasta:
\n', 58, 1), ('code', "Pelaajan 1 vuoro\nHahmo on sijainnissa (0, 0)\nAnna liikkumissuunta asteina: 180\nAnna liikenopeus: 10\nUusi sijainti: (-10, 0)\nPelaajan 2 vuoro\nHahmo on sijainnissa (50, 50)\nAnna liikkumissuunta asteina: 45\nAnna liikenopeus: 5\nUusi sijainti: (54, 54)\n
Pelaajan 1 vuoro\nHahmo on sijainnissa (0, 0)\nAnna liikkumissuunta asteina: 30\nAnna liikenopeus: -4\nUusi sijainti: (-3, -2)\nPelaajan 2 vuoro\nHahmo on sijainnissa (50, 50)\nAnna liikkumissuunta asteina: 210\nAnna liikenopeus: 4\nUusi sijainti: (47, 48)\n
\n \n \n \n \n
\n\n\n', 'revision': 34106, 'max_points': 4, 'urls': {'stats_url': '/stats/single-exercise/oa-liikkeen-hallintaa/', 'feedback_url': '/feedback/statistics/oa-fitech-2023-2024/oa-liikkeen-hallintaa/', 'download_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-liikkeen-hallintaa/download_answers/', 'summary_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-liikkeen-hallintaa/answer_summary/', 'batch_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-liikkeen-hallintaa/batch_grade/', 'reset_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-liikkeen-hallintaa/reset_completion/', 'edit_url': '/exercise-admin/file-upload/513/change/', 'submit_url': '/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-liikkeen-hallintaa/34106/check/', 'edit_content_url': '/staff/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-liikkeen-hallintaa/editform/edit/', 'delete_content_url': '/staff/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-liikkeen-hallintaa/editform/delete/', 'add_content_url': '/staff/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-liikkeen-hallintaa/add/'}}
Anna palautetta
Kommentteja harjoituksista?