3. Harjoitukset: Silmukka kiristyy¶
Näissä harjoituksissa tehdään entistä enemmän ns. oikeampia ohjelmia. Uutuutena erityisesti se, että niin ohjelman käsittelemä tieto kuin koodin toistokerrat eivät ole enää rajattuja ennalta määrättyhin kiinteisiin arvoihin. Toisto antaa paljon mahdollisuuksia, mutta vaatii tietysti myös uudenlaisten ajattelumallien omaksumista. Tämän kerran lopputyöaihetehtävät ovat selkeästi paketin haastavimpia, mutta samalla niistä pitäisi myös saada aika konkreettista hyötyä.
Osaamistavoitteet¶
Silmukoiden ja listojen soveltaminen ongelmanratkaisussa. Yhä laajempien ongelmakokonaisuuksien ratkonta kun päästään pois viime viikon rajoitteista. Keskeisiä käsitteitä ovat tällä viikolla listat ja silmukat. Jälkimmäisistä löytyy käyttöä niin while- kuin for-silmukoillekin ja toivon mukaan nämä harjoitukset havainnollista kummankin käyttötarkoituksia. Listojen kohdalla erityisen keskeistä on oppia muodostamaan oikeanlaisia tietorakenteita.
Esimerkki¶
Tehtävänanto¶
Kakkosmateriaalin lopussa väläytettiin ideaa ohjelmasta, joka muuntaa mittaustuloksia imperiaalisista hemulin-kaavunhelman-leveys-tulipalon-sammutuksen-jälkeen tyylisistä mittausyksiköistä järjellisiin SI-järjestelmän yksiköihin. Mittaustuloksia ei vain silloin osattu käsitellä massoina, kun listoja ei tunnettu. No, nyt tunnetaan! Eli tehdään ohjelma johon voi syöttää useita mittaustuloksia yksiköineen, ja ohjelma muuntaa ne kaikki vastaaviksi SI-järjestelmän yksiköiksi. Koska ohjelma on suunniteltu valmiin mittausdata käsittelyyn, valikoissa selaaminen tulee minimoida - niinpä kaikki yksiköt pitäisi muuntaa automaattisesti riippumatta siitä mitä suuretta ne ovat. Lämpötila tosin unohdetaan, koska se ei mene samaan kerroin-kohdeyksikkö kaavaan kuin muut yksiköt.
Tiedostoja ei osata vielä käsitellä, joten ohjelmasta tulee jossain määrin väliaikaisratkaisu. Tosin
komentorivin
syöteohjauksella voidaan halutessa ottaa mittaukset tiedostosta, ja itse asiassa myös tallentaa tulostukset tiedostoon...Kakkosmateriaalin lopussa meillä oli siis jotain tämän näköistä, joka toimi pituudelle:
PITUUSKERTOIMET = {
"in": 0.0254,
"\"": 0.0254,
"ft": 0.3048,
"'": 0.3048,
"yd": 0.9144,
"mi": 1609.344
}
def muunna_metreiksi(mittaus):
arvo = mittaus["arvo"]
yksikko = mittaus["yksikko"]
try:
metrit = arvo * PITUUSKERTOIMET[yksikko]
except KeyError:
mittaus["virheellinen"] = True
else:
mittaus["yksikko"] = "m"
mittaus["arvo"] = metrit
mittaus = {"yksikko": "aasi", "arvo": 4.64}
print("{mittaus['arvo']:.3f} {mittaus["yksikko"]}")
print("on")
muunna_metreiksi(mittaus)
if not mittaus.get("virheellinen", False):
print("{mittaus['arvo']:.3f} {mittaus["yksikko"]}")
else:
print("Virheellinen yksikkö")
Ratkaisu¶
Ensimmäinen vastattava kysymys on se, miten pystytään päättelemään samalla kertaa lähdeyksiköstä sekä kerroin että kohdeyksikkö. Tämä onnistuisi tietenkin valtavalla
ehtorakenteella
, mutta ei sellaista koodia halua kukaan ylläpitää. Alkuperäisessä esimerkissä saatiin kertoimet sanakirjasta
. Mikään ei estä laittamasta tietorakenteita
sanakirjan arvoiksi, joten pelkän kertoimen sijaan voidaan laittaa monikko
, joka sisältää sekä kertoimen että kohdeyksikön. Lisätään myös sanakirjaan kaikkien suureiden yksiköt:YKSIKOT = {
"in": (2.54, "cm"),
"\"": (2.54, "cm"),
"ft": (30.48, "cm"),
"'": (30.48, "cm"),
"yd": (0.9144, "m"),
"mi": (1.609344, "km"),
"oz": (28.349523125, "g"),
"lb": (0.45359237, "kg"),
"cp": (2.365882365, "dl"),
"pt": (4.73176473, "dl"),
"qt": (0.946352946, "l"),
"gal": (3.785411784, "l")
}
Tällaisesta rakenteesta saadaan kerroin loitsimalla
YKSIKOT[yksikko][0]
ja vastaavasti kohdeyksikkö YKSIKOT[yksikko][1]
- eli haetaan ensin avainta
vastaava monikko ja vielä sen sisältä indeksiosoituksella
haluttu arvo. Tätä tietoa käyttämällä voidaan muuttaa esimerkin funktiosta allaolevan mukainen muunna_si_yksikoksi
-funktio.def muunna_si_yksikoksi(mittaus):
arvo = mittaus["arvo"]
yksikko = mittaus["yksikko"]
try:
# monikon 1. alkio on kerroin
si_arvo = arvo * YKSIKOT[yksikko][0]
except KeyError:
mittaus["virheellinen"] = True
else:
# monikon 2. alkio on kohdeyksikkö
mittaus["yksikko"] = YKSIKOT[yksikko][1]
mittaus["arvo"] = si_arvo
Funktio edelleen muokkaa olemassaolevaa sanakirjaa, joten sen ei tarvi palauttaa mitään. Seuraavaksi pitäisi saada mittauksia jostain. Koska haluamme tehdä ohjelman, joka jossain vaiheessa tulee käsittelemään ihan oikeita datatiedostoja, tehdään funktio, joka luo listan mittauksista kysymällä ne käyttäjältä. Periaatteessahan muunnoksen voisi myös tehdä heti
syötteen
jälkeen, mutta käsin syöttäminen ei ole ohjelman lopullinen tavoite, joten muunnosfunktion kutsumista ei myöskään kannata sijoittaa kyselyfunktioon. Kyselyfunktio on vain datan lähde. Kysytään syöte splittaamalla samalla tavalla kuin kolmosmateriaalissa tehtiin. def lue_mittaukset():
print("Syötä mitatut arvot ja yksiköt välilyönnillä erotettuna. Tyhjä syöte lopettaa.")
mittaukset = []
while True:
syote = input("Anna mittaus: ").strip()
if not syote:
return mittaukset
try:
arvo, yksikko = syote.split(" ")
arvo = float(arvo)
except ValueError:
print("Anna syötteet pyydetyssä muodossa.")
else:
mittaukset.append({
"yksikko": yksikko,
"arvo": arvo
})
Tässä toteutetaan jotain mitä materiaalissa jätettiin tekemättä: miten käsitellään ohjelman lopetus, jos syöte puretaan splitillä. Tällöin tulee yleensä toimia kahdessa vaiheessa - ensin otetaan koko syöte talteen muuttujaan, josta tarkastellaan oliko se tyhjä, ja vasta sen jälkeen yritetään muuttaa se käyttökelpoiseen muotoon. Sattumoisin myös molemmat try:n sisällä olevat rivit tuottavat ValueError-
poikkeuksen
, joten yksi except riittää. Oikeanlaiset mittaukset lisätään alussa määriteltyyn tyhjään listaan
sanakirjoina, jotka ovat samaa muotoa kuin alkuperäisessä esimerkissä. Funktiot voidaan yhdistää pääohjelmafunktiossa:def paaohjelma()
mittaukset = lue_mittaukset()
for mittaus in mittaukset:
muunna_si_yksikoksi(mittaus)
Mielenkiintoista tässä on ehkä se, että itse listaa ei koskaan muokata, ainoastaan siellä olevia sanakirjoja. Koska lista sisältää ainoastaan viittauksia sanakirjoihin, listan sisältö "muokkautuu" prosessin seurauksena ilman, että siihen itseensä kosketaan lainkaan. Tässä käy siis erittäin hyvin ilmi miten
muuntuvuus
toimii. Jollain tapaa pitäisi ehkä vielä saada tulokset näkyviin. Koska kyseessä on edelleen suurempiin suunnitelmiin tarkoitettu ohjelmarunko, tehdään tulostus omassa funktiossaan. def tulosta_mittaukset(mittaukset):
for mittaus in mittaukset:
if mittaus.get("virheellinen"):
print("virheellinen mittaus: {arvo:.3f} {yksikko}".format(**mittaus))
else:
print("{arvo:.3f} {yksikko}".format(**mittaus))
Koska funktiossa ei itsessään ole mitään kovin ihmeellistä, tässä on näytetty temppu, jonka ansiosta vanha
format-metodi
on usein parempi tapa sanakirjojen tulosteluun: sanakirjan voi "purkaa" format-metodin avainsana-argumenteiksi
, eli sanakirjan avainten nimiä vai käyttää paikanpitimissä
suoraan. Käytännössä siis tuo **mittaus
voitaisiin korvata tällä: arvo=mittaus["arvo"], yksikko=mittaus["yksikko"]
. Luonnollisesti tätä käytettäessä pitää varmistaa, että sanakirjassa todella on kaikki avaimet, joita paikanpitimiin on laitettu. Loppusilauksena lisätään tulostusfunktion kutsuminen pääohjelmanfunktioon, ja kutsutaan itse pääohjelmaa tutun näköisellä rakenteella:
try:
paaohjelma()
except KeyboardInterrupt:
print("Mittausten käsittely keskeytetty.")
Koko ohjelma:
Bonustemppuna näytetään vielä miten ohjelmalle voi syöttää nipun mittauksia ainakin Linuxin komentorivillä näppärästi. Olkoon tiedostossa muutamia mittauksia. Huom! lopun tyhjä rivi on tärkeä.
Tämän voisi syöttää ohjelmalle näin:
/joku/kansio$ python3 mittausmuunnin.py < mittaukset.txt Syötä mitatut arvot ja yksiköt välilyönnillä erotettuna. Tyhjä syöte lopettaa. Anna mittaus: Anna mittaus: Anna mittaus: Anna mittaus: Anna mittaus: Anna mittaus: 58.420 cm 351.534 g 86.905 km 2.240 m 20.101 l
Ainoa kauneusvirhe on jokaista riviä kohti tulostuva pyyntö. Onneksi seuraavassa materiaalissa opetellaan lukemaan tiedostoja oikeasti Pythonilla.
Yhteiset tehtävät¶
Kaikki nämä tehtävät kuuluvat osaksi kurssisuoritusta.
Lämmittelytehtävä¶
{'slug': 'oa-spiraali-hulluuteen', 'content': [('heading', "Spiraali hulluuteen¶
\n", 0, 1), ('paragraph', 'Toistorakenteiden avulla ohjelmoija voi päästää taiteelliset lahjansa (tai niiden puutteen) vapaaksi. Toistorakenteilla ja yksinkertaisella aritmetiikalla voi piirrellä säännöllisesti muuntuvia kuvioita. Tässä esimerkissä piirrellään miellyttävän säännöllisiä spiraaleja.
\n', 2, 1), ('paragraph', 'Opittavat asiat: Tehtävässä opetellaan ennaltamäärätyn toistomäärän tekeminen
\n', 4, 1), ('paragraph', 'silmukalla
. Lisäksi palautellaan mieliin miten funktiolle määritetään valinnaisia argumentteja
.Tavoite: Toteuttaa ohjelma, joka piirtää säännöllisiä spiraaleja, joiden väriä, sädettä, säteen kasvua sekä viivan leveyttä voidaan säätää.
\n', 6, 1), ('separator', '\n', 8, 1), ('paragraph', '
Toteutettava funktio:
\n', 10, 1), ('list', 'piirra_spiraali
- Parametrit:
- spiraalin väri (väriarvo - merkkijono tai kolmen alkion monikko)
- piirrettävien kaarien (neljäsosaympyrä) lukumäärä (kokonaisluku)
- spiraalin alkusäde (kokonaisluku)
- säteen kasvu (liukuluku)
- viivan paksuus (kokonaisluku) - oletusarvo1 ', 12, 6), ('cleanup', '
Funktion alussa asetetaan väri ja kynän paksuus. Loput piirtokomennoista tehdään silmukassa, jossa on kaarien lukumäärän verran toistoja. Toteutuksessa kannattaa käyttää
\n', 19, 1), ('separator', 'for-silmukkaa
ja range-funktiota. Jokaisella kierroksella piirretään 90 asteen kaari, jonka jälkeen kasvatetaan sädettä kasvuparametrin verran. Huomaa, että silmukkamuuttujaa
ei välttämättä käytetä mihinkään.\n', 21, 1), ('paragraph', '
Pääohjelma:
\n', 23, 1), ('paragraph', 'Pääohjelmaan tulee laittaa alla olevat koodirivit:
\n', 25, 1), ('code', 'piirra_spiraali("black", 20, 10, 3)\npiirra_spiraali("red", 10, 20, 4, 3)\npiirra_spiraali("blue", 10, -20, -4, 3)\ndone()\n
Näiden pitäisi piirtää esimerkin mukainen taideteos.
\n', 34, 1), ('separator', '\n', 36, 1), ('paragraph', '
Käytettävät Turtle-komennot:
\n', 38, 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 (ks. selitys alapuolella)\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\nseth(a) # asettaa kynän suunnaksi kulman a\npensize(w) # asettaa kynän leveydeksi w\n
Lisäksi circle-komennosta otetaan käyttöön sen ensimmäinen valinnainen argumentti:
\n', 58, 1), ('code', 'circle(r, a) # piirtää kaaren, jonka säde on r ja sisäkulma a\n
\n', 64, 1), ('paragraph', '
Esimerkit toiminnasta:
\n', 66, 1), ('image', "
\n \n \n \n \n
\n\n\n', 'revision': 33100, 'max_points': 3, 'urls': {'stats_url': '/stats/single-exercise/oa-spiraali-hulluuteen/', 'feedback_url': '/feedback/statistics/oa-fitech-2023-2024/oa-spiraali-hulluuteen/', 'download_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-spiraali-hulluuteen/download_answers/', 'summary_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-spiraali-hulluuteen/answer_summary/', 'batch_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-spiraali-hulluuteen/batch_grade/', 'reset_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-spiraali-hulluuteen/reset_completion/', 'edit_url': '/exercise-admin/file-upload/396/change/', 'submit_url': '/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-spiraali-hulluuteen/33100/check/', 'edit_content_url': '/staff/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-spiraali-hulluuteen/editform/edit/', 'delete_content_url': '/staff/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-spiraali-hulluuteen/editform/delete/', 'add_content_url': '/staff/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-spiraali-hulluuteen/add/'}}
Päätehtävät¶
{'slug': 'oa-anomisen-automagiaa', 'content': [('heading', "Anomisen automagiaa¶
\n", 0, 1), ('paragraph', 'On työlästä luoda jokaiselle käyttäjältä pyydettävälle syötteelle erikseen kyselysilmukka, joka tarkistaa, onko käyttäjä antanut oikeantyyppisen syötteen. Automatisoidaan siis syötteen pyytäminen käyttäjältä siten, että voimme käyttää aina samaa funktiota, kun haluamme kysyä kokonaislukua käyttäjältä ja varmistaa, että käyttäjän vastaus todella on kokonaisluku. Tässä tehtävässä tehtävä funktio on todella kätevä pohja, jota käytetään myös seuraavissa tehtävissä, ja kannattaapa tuota käyttää lopputyössäkin.
\n', 2, 1), ('paragraph', 'Oppittavat asiat:
\n', 4, 1), ('paragraph', 'Silmukan
tekeminen siten, että sitä toistetaan kunnes käyttäjän antama syöte
on oikeanlainen. Uudelleenkäytettävän funktion kirjoittaminen. Tavoite: Toteuttaa funktio, joka kysyy käyttäjältä kokonaislukua kunnes saa sellaisen. Funktio on toteutettu siten, että sen esittämä pyyntö ja mahdollinen virheviesti annetaan funktiokutsun
\n', 6, 1), ('separator', 'argumentteina
.\n', 8, 1), ('paragraph', '
Toteuttava funktio:
\n', 10, 1), ('list', 'pyyda_syote
- Dokumenttimerkkijono: ', 12, 1), ('cleanup', '
"""\nKysyy käyttäjältä kokonaislukua käyttäen kysymyksenä parametrina annettua\nmerkkijonoa. Virheellisen syötteen kohdalla käyttäjälle näytetään toisena\nparametrina annettu virheilmoitus. Käyttäjän antama kelvollinen syöte\npalautetaan kokonaislukuna.\n"""\n
- Parametrit:
- käyttäjälle esitettävä pyyntö (merkkijono)
- virheviesti jos käyttäjä ei syötä kokonaislukua (merkkijono)
- Palauttaa:
- Käyttäjän syöttämän kokonaisluvun (kokonaisluku) ', 21, 5), ('cleanup', '
Funktion tulee siis esittää parametrina annettua pyyntöä käyttäjälle kunnes tämä syöttää kelvollisen kokonaisluvun. Aina kun käyttäjä antaa virheellisen syötteen, tulostetaan toisena parametrina annettu virheviesti ja esitetään pyyntö uudestaan. Kun käyttäjän syöte on kelvollinen kokonaisluku, se palautetaan kokonaislukuna. Funktion toteutuksessa saattaa olla hyödyksi kerrata miten aika samanlainen funktio tehtiin materiaalissa.
\n', 27, 1), ('separator', '\n', 29, 1), ('paragraph', '
Pääohjelma:
\n', 31, 1), ('paragraph', 'Pääohjelmassa haluamme kutsua funktiota kaksi kertaa, jotta näemme miten hienosti se hoitaa lukujen kyselyt erilaisilla pyynnöillä ja virheilmoituksilla. Pääohjelmaa ei tarvitse miettiä itse, voit kopioida sen suoraan tästä:
\n', 33, 1), ('code', 'luku = pyyda_syote(\n "Anna kokonaisluku: ",\n "Et antanut kokonaislukua"\n)\nprint(f"Annoit kokonaisluvun {luku}! Nohevaa toimintaa!")\nhemulit = pyyda_syote(\n "Montako hemulia mahtuu muumitaloon? ",\n "Tämä ei ollut kelvollinen hemulien lukumäärä!"\n)\nprint(f"Muumitaloon mahtuu {hemulit} hemulia")\n
\n', 48, 1), ('paragraph', '
Esimerkit toiminnasta:
\n', 50, 1), ('paragraph', 'Kun yllä annettu pääohjelma suoritetaan, funktion toimiessa oikein pitäisi tapahtua jotain tämän näköistä:
\n', 52, 1), ('code', "Anna kokonaisluku: aasi\nEt antanut kokonaislukua!\nAnna kokonaisluku: kuusysi tirsk\nEt antanut kokonaislukua!\nAnna kokonaisluku: 5\nAnnoit kokonaisluvun 5! Nohevaa toimintaa!\nMontako hemulia mahtuu muumitaloon? 7.5\nTämä ei ollut kelvollinen hemulien lukumäärä!\nMontako hemulia mahtuu muumitaloon? 1\nMuumitaloon mahtuu 1 hemulia\n
\n \n \n \n \n
\n\n\n', 'revision': 26099, 'max_points': 3, 'urls': {'stats_url': '/stats/single-exercise/oa-anomisen-automagiaa/', 'feedback_url': '/feedback/statistics/oa-fitech-2023-2024/oa-anomisen-automagiaa/', 'download_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-anomisen-automagiaa/download_answers/', 'summary_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-anomisen-automagiaa/answer_summary/', 'batch_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-anomisen-automagiaa/batch_grade/', 'reset_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-anomisen-automagiaa/reset_completion/', 'edit_url': '/exercise-admin/file-upload/245/change/', 'submit_url': '/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-anomisen-automagiaa/26099/check/', 'edit_content_url': '/staff/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-anomisen-automagiaa/editform/edit/', 'delete_content_url': '/staff/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-anomisen-automagiaa/editform/delete/', 'add_content_url': '/staff/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-anomisen-automagiaa/add/'}}
{'slug': 'oa-alku-aina-hankalaa', 'content': [('heading', "Alku aina hankalaa¶
\n", 0, 1), ('paragraph', 'Tässä tehtävässä tarkistellaan alkulukuja. Alkulukuja tärkeämpää tehtävässä tosin on oppia käyttämään funktioita työkaluina sekä uudelleenkäyttämään olemassaolevaa koodia. Molemmat tehtävän koodiin tulevat funktiot ovatkin sellaisia, että ne voisi helposti irrottaa tästä tehtävästä johonkin muuhun käyttöön ilman, että niitä tarvitsee millään tavalla muokata. Tämä onnistuu, koska hyvin suunnitellut työkalufunktiot eivät tee mitään ylimääräistä - ne tekevät vain sen mitä lupaavat, ja palauttavat tuloksen jota voidaan tarpeen mukaan jatkokäsitellä.
\n', 2, 1), ('paragraph', 'Opittavat asiat:
\n', 4, 1), ('paragraph', 'Silmukkamuuttujan
ja range-funktion käyttö sekä silmukan
lopettaminen returnilla. Olemassaolevan funktion
uudelleenkäyttö ja muokkaaminen. Tavoite: Ohjelma, joka kysyy käyttäjältä kokonaisluvun ja kertoo onko se alkuluku.
\n', 6, 1), ('separator', '\n', 8, 1), ('paragraph', '
Alustus:
\n', 10, 1), ('paragraph', 'Tehtävässä tarvitaan edellisen tehtävän
\n', 12, 1), ('separator', 'pyyda_syote
-funktiota, joten kopioi se koodiisi. Funktioon tulee lisätä pieni muutos. \n', 14, 1), ('paragraph', '
Muokattava funktio:
\n', 16, 1), ('list', 'pyyda_syote
- Dokumenttimerkkijono: ', 18, 1), ('cleanup', '
"""\nKysyy käyttäjältä kokonaislukua käyttäen kysymyksenä parametrina annettua\nmerkkijonoa. Virheellisen syötteen kohdalla käyttäjälle näytetään toisena\nparametrina annettu virheilmoitus. Käyttäjän antama kelvollinen syöte\npalautetaan kokonaislukuna. Hyväksyy vain luvut jotka ovat suurempia kuin 1.\n"""\n
- Parametrit:
- käyttäjälle esitettävä pyyntö (merkkijono)
- virheviesti jos käyttäjä ei syötä kokonaislukua (merkkijono)
- Palauttaa:
- käyttäjän syöttämän kokonaisluvun (kokonaisluku) ', 27, 5), ('cleanup', '
Funktion tulee aiemmin toteutetun toiminnan lisäksi tarkistaa onko annettu luku suurempi kuin 1. Jos luku on pienempi tai yhtä suuri kuin 1, se hylätään samalla virheilmoituksella kuin muutkin virheelliset syötteet.
\n', 33, 1), ('separator', '\n', 35, 1), ('paragraph', '
Toteutettava funktio:
\n', 37, 1), ('list', 'tarkista_alkuluku
- Dokumenttimerkkijono: ', 39, 1), ('cleanup', '
"""\nTarkistaa onko parametrina annettu luku alkuluku. Palauttaa False jos luku ei\nole alkuluku; jos luku on alkuluku palautetaan True\n"""\n
- Parametrit:
- tarkistettava luku (kokonaisluku)
- Palauttaa:
- tiedon siitä onko luku alkuluku (totuusarvo) ', 46, 4), ('cleanup', '
Funktiossa tulee jollain sopivalla menetelmällä selvittää onko sille annettu luku alkuluku. Tutkimuksia voi tehdä Googlessa tai Wikipediassa. Huomaa, että alkulukujen tunnistamisessa jakojäännös (%) on hyödyllinen kapistus! Hyödyksi on myös tieto, että range-funktio voi ottaa myös useampia
\n', 51, 1), ('paragraph', 'argumentteja
kuin yhden. Tutki ja testaa tulkissa
!Kuten yltä käy ilmi, tämä funktio palauttaa tiedon siitä onko luku alkuluku - sen tehtävä siis ei ole tulostaa tätä tietoa!
\n', 53, 1), ('separator', '\n', 55, 1), ('paragraph', '
Pääohjelma:
\n', 57, 1), ('paragraph', 'Pääohjelmassa
käyttäjältä kysytään tutkittava luku käyttämällä hyödyksi muokattua syötefunktiota. Lisäksi käytetään juuri tehtyä alkuluvun tarkistusfunktiota, ja lopuksi sen paluuarvosta
riippuen tulostetaan käyttäjälle tiedoksi oliko kyseessä alkuluku. \n', 61, 1), ('paragraph', '
Esimerkit toiminnasta:
\n', 63, 1), ('code', "Anna kokonaisluku, joka on suurempi kuin 1: 1\nPieleen meni :'(.\nAnna kokonaisluku, joka on suurempi kuin 1: nelonen\nPieleen meni :'(.\nAnna kokonaisluku, joka on suurempi kuin 1: 9\nKyseessä ei ole alkuluku.\n
Anna kokonaisluku, joka on suurempi kuin 1: 7\nKyseessä on alkuluku.\n
\n \n \n \n \n
\n\n\n', 'revision': 25973, 'max_points': 3, 'urls': {'stats_url': '/stats/single-exercise/oa-alku-aina-hankalaa/', 'feedback_url': '/feedback/statistics/oa-fitech-2023-2024/oa-alku-aina-hankalaa/', 'download_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-alku-aina-hankalaa/download_answers/', 'summary_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-alku-aina-hankalaa/answer_summary/', 'batch_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-alku-aina-hankalaa/batch_grade/', 'reset_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-alku-aina-hankalaa/reset_completion/', 'edit_url': '/exercise-admin/file-upload/246/change/', 'submit_url': '/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-alku-aina-hankalaa/25973/check/', 'edit_content_url': '/staff/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-alku-aina-hankalaa/editform/edit/', 'delete_content_url': '/staff/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-alku-aina-hankalaa/editform/delete/', 'add_content_url': '/staff/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-alku-aina-hankalaa/add/'}}
Lopputyötehtävät 1¶
Näistä pitäisi tehdä yksi, se omaa lopputyötä edistävä. Nämä tehtävät eivät ole pakollisia minimikurssisuoritukseen.
{'slug': 'oa-elämää-pellolla', 'content': [('heading', "Miinatehtävä: Elämää pellolla¶
\n", 0, 1), ('paragraph', 'Ruudukoita on yleensä tapana esittää kaksiulotteisena listana, eli listana joka sisältää listoja, jotka vastaavat ruudukon rivejä ja niiden alkiot yksittäisten ruutujen sisältöä. Tässä tehtävässä perehdytään hieman tällaisten listojen saloihin ja erityisesti niiden läpikäyntiin for-silmukoilla. Jätetään miinat hetkeksi haravoimatta ja suunnataan maaseudulle tutkimaan mitä eläimiä läheiseltä pellolta löytyy... Joka tapauksessa tehtävän periaatteet tulevat tarpeeseen Miinantallaaja-lopputyössä.
\n', 2, 1), ('paragraph', 'Osaamistavoitteet: Kaksiulotteisten
\n', 4, 1), ('paragraph', 'listojen
läpikäynti sisäkkäisillä for-silmukoilla
.Tavoite: Ohjelma, joka tutkii kentän kaikki ruudut ja kertoo mitä eläimiä sieltä löytyy.
\n', 6, 1), ('separator', '\n', 8, 1), ('paragraph', '
Alustus:
\n', 10, 1), ('paragraph', 'Käytetään jälleen sanakirjaa. Tällä kertaa siihen, että kenttään eläimet on merkitty yksittäisillä kirjaimilla, mutta tulostaessa olisi mukava hakea kokonainen sana näkyviin. Käytä siis koodissasi tätä sanakirjaa:
\n', 12, 1), ('code', 'ELAIMET = {\n "a": "aasi",\n "k": "koira",\n "@": "kissa",\n "h": "hemuli",\n "l": "lammas"\n}\n
\n', 24, 1), ('paragraph', '
1. toteutettava funktio:
\n', 26, 1), ('list', 'tutki_ruutu
- Dokumenttimerkkijono: ', 28, 1), ('cleanup', '
"""\nFunktio tutkii ruudun - jos siellä on eläin, se tulostaa eläimen sijainnin sekä nimen.\n"""\n
- Parametrit:
- ruudussa oleva merkki (merkkijono)
- rivin numero
- sarakkeen numero ', 36, 4), ('cleanup', '
Tiedot eläimestä tulostetaan, jos se löytyy sanakirjasta. Muuten ei tulosteta mitään. Tulostus on muotoa "Ruudusta (5, 6) löytyy aasi", jossa siis 5 on x-koordinaatti ja 6 y-koordinaatti. Ihan kuin tämä olisi nähty aiemminkin... Huomaa, että rivi vastaa y-koordinaattia ja sarake x-koordinaattia..
\n', 41, 1), ('paragraph', 'Tarkistin saattaa muuttaa tehtävänannossa annettua sanakirjaa, mikä tulee huomioida toteutuksessa.
\n', 43, 1), ('separator', '\n', 45, 1), ('paragraph', '
2. toteutettava funktio:
\n', 47, 1), ('list', 'tutki_kentta
- Dokumenttimerkkijono: ', 49, 1), ('cleanup', '
"""\nFunktio tutkii kentän sisällön käymällä sen kokonaan läpi kutsuen tutki_ruutu-funktiota\njokaiselle kentän sisällä olevalle alkiolle.\n"""\n
- Parametrit:
- kenttää kuvaava 2-ulotteinen lista ', 58, 2), ('cleanup', '
Funktion tulee käydä läpi kaikki kentällä olevat ruudut. Läpikäynti luonnistuu parhaiten for-silmukoilla. Koska tutki_ruutu-funktiolle pitäisi saada myös koordinaatit, tarvitaan läpikäyntiin itse rivien ja ruutujen lisäksi niiden
\n', 61, 1), ('separator', 'indeksit
. Tässä on syytä pitää mielessä, että rivi eli y-koordinaatti vastaa 2-ulotteisen listan ulompaa indeksiä.\n', 63, 1), ('paragraph', '
Pääohjelma:
\n', 65, 1), ('paragraph', 'Testtavan kentän voit ottaa tästä,
\n', 67, 1), ('code', 'funktiokutsun
osannet tässä vaiheessa kirjoittaa.pelto = [\n [" ", "a", " ", " ", "l"],\n [" ", "k", "@", "k", " "],\n ["h", " ", "a", "k", " "]\n]\n
\n', 77, 1), ('paragraph', '
Esimerkit toiminnasta:
\n', 79, 1), ('paragraph', 'Annetulla kentällä pitäisi tulostua:
\n', 81, 1), ('code', "Ruudusta (1, 0) löytyy aasi\nRuudusta (4, 0) löytyy lammas\nRuudusta (1, 1) löytyy koira\nRuudusta (2, 1) löytyy kissa\nRuudusta (3, 1) löytyy koira\nRuudusta (0, 2) löytyy hemuli\nRuudusta (2, 2) löytyy aasi\nRuudusta (3, 2) löytyy koira\n
Huomaa, että jos olet saanut koordinaatit väärinpäin molemmissa funktioissa, ohjelmakokonaisuus antaa oikein tulostuksen, mutta funktiot yksittäisinä toimiva väärin.
\n', 94, 1)], 'question': '', 'form': '\n\n\n\n \n \n \n \n \n
\n\n\n', 'revision': 25977, 'max_points': 4, 'urls': {'stats_url': '/stats/single-exercise/oa-el%C3%A4m%C3%A4%C3%A4-pellolla/', 'feedback_url': '/feedback/statistics/oa-fitech-2023-2024/oa-el%C3%A4m%C3%A4%C3%A4-pellolla/', 'download_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-el%C3%A4m%C3%A4%C3%A4-pellolla/download_answers/', 'summary_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-el%C3%A4m%C3%A4%C3%A4-pellolla/answer_summary/', 'batch_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-el%C3%A4m%C3%A4%C3%A4-pellolla/batch_grade/', 'reset_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-el%C3%A4m%C3%A4%C3%A4-pellolla/reset_completion/', 'edit_url': '/exercise-admin/file-upload/524/change/', 'submit_url': '/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-el%C3%A4m%C3%A4%C3%A4-pellolla/25977/check/', 'edit_content_url': '/staff/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-el%C3%A4m%C3%A4%C3%A4-pellolla/editform/edit/', 'delete_content_url': '/staff/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-el%C3%A4m%C3%A4%C3%A4-pellolla/editform/delete/', 'add_content_url': '/staff/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-el%C3%A4m%C3%A4%C3%A4-pellolla/add/'}}
{'slug': 'oa-suoraa-puhetta', 'content': [('heading', "Spektritehtävä: Suoraa puhetta¶
\n", 0, 1), ('paragraph', 'Tässä tehtävässä tutustutaan uusien listojen tuottamiseen olemassaoleviin listoihin nojaten. Tyypillisesti tätä tekniikkaa tarvitaan mm. silloin, kun kaikkiin alkuperäisen listan arvoihin tulee soveltaa jotain kaavaa. Spektriä pukkaa-lopputyötä tuijottavat voivat hyödyntää tässä tehtävässä oppimiansa taitoja työtä tehdessään.
\n', 2, 1), ('paragraph', 'Opittavat asiat: Uuden
\n', 4, 1), ('paragraph', 'listan
tuottaminen toisen listan alkioiden
pohjalta. Tavoite: Ohjelma, joka laskee kahden pisteen välisen suoran arvoja annetuissa pisteissä.
\n', 6, 1), ('separator', '\n', 8, 1), ('paragraph', '
Alustus:
\n', 10, 1), ('paragraph', 'Edellisen harjoituskerran spektritehtävässä tehtiin
\n', 12, 1), ('separator', 'laske_parametrit
-funktio, jota sattumoisin tarvitaan taas. Hae se siis mukaan. \n', 14, 1), ('paragraph', '
1. toteutettava funktio:
\n', 16, 1), ('list', 'kysy_kaksi_lukua
- Dokumenttimerkkijono: ', 18, 1), ('cleanup', '
"""\nPyytää käyttäjältä kaksi liukulukua välilyönnillä erotettuna. Syötettä kysytään\nkunnes käyttäjä antaa kaksi kelvollista liukulukua. Syötetyt luvut palautetaan\nliukulukuina.\n"""\n
- Parametrit:
- kysymysmerkkijono (merkkijono)
- Palauttaa:
- pisteen x-koordinaatti (liukuluku)
- pisteen y-koodrinaatti (liukuluku) ', 26, 5), ('cleanup', '
Kysyy
käyttäjältä kaksi liukulukua käyttäen parametrina annettua kysymysmerkkijonoa. Kyselyä toistetaan kunnes käyttäjä syöttää kaksi liukulukua välilyönnillä erotettuna. Virheen tapahtuessa ohjeistetaan syöttämään oikeanlainen syöte toteamalla "Anna kaksi lukua välilyönnillä erotettuna"
. Kun kelvollinen syöte saadaan, luvut palautetaan liukulukuina.\n', 34, 1), ('paragraph', '
2. toteutettava funktio:
\n', 36, 1), ('list', 'laske_pisteet_suoralla
- Dokumenttimerkkijono: ', 38, 1), ('cleanup', '
"""\nTuottaa joukon arvoja, jotka ovat annetulla kulmakertoimella ja vakiotermillä\nmääritetyn suoran arvoja annetuissa x-akselin pisteissä.\n"""\n
- Parametrit:
- kulmakerroin (liukuluku)
- vakiotermi (liukuluku)
- x-akselin pisteet (lista, sisältää liukulukuja)
- Palauttaa:
- annetun suoran arvot pisteissä (lista, sisältää liukulukuja) ', 45, 6), ('cleanup', '
Funktiossa tulee siis luoda uusi lista, joka sisältää lasketut suoran arvot.
\n', 52, 1), ('separator', '\n', 54, 1), ('paragraph', '
Pääohjelma:
\n', 56, 1), ('paragraph', 'Ohjelma kysyy käyttäjältä kaksi pistettä muodossa x y käyttäen uutuudenkiiltävää kysy_kaksi_lukua-funktiota.
\n', 58, 1), ('paragraph', 'Argumentiksi
annettavan kyselyn löydät allaolevista esimerkeistä. Tämän jälkeen ohjelma tulostaa pisteitä vastaavan suoran arvot alla annetuissa x-akselin pisteissä laskettuna. Pääohjelman testauksessa käytetään seuraavaa listaa x-akselin pisteistä:
\n', 60, 1), ('code', 'x_akseli = [\n 0.0, 0.25, 0.5, 0.75, 1.0, 1.25, 1.5, 1.75, 2.0, 2.25, 2.5,\n 2.75, 3.0, 3.25, 3.5, 3.75, 4.0, 4.25, 4.5, 4.75, 5.0\n]\n
Funktioita luonnollisesti testataan muillakin listoilla. Tulostus esimerkin mukaisesti onnistuu käyttämällä allaolevaa silmukkaa, jossa käytetään print-funktion valinnaista end-argumenttia vaihtamaan loppuun tulostettava rivinvaihto välilyönniksi. Materiaalissa esiteltyä join-
\n', 69, 1), ('code', 'metodia
ei voi tässä käyttää helposti, koska suoran y-arvot eivät ole merkkijonoja.for y in suora:\n print(f"{y:.4f}", end=" ")\n
\n', 76, 1), ('paragraph', '
Esimerkit toiminnasta:
\n', 78, 1), ('code', "Anna ensimmäinen piste: aasi\nAnna kaksi lukua välilyönnillä erotettuna\nAnna ensimmäinen piste: 0 0\nAnna toinen piste: 1 1 \nSuoran arvot ovat:\n0.0000 0.2500 0.5000 0.7500 1.0000 1.2500 1.5000 1.7500 2.0000 2.2500 2.5000 2.7500 3.0000 3.2500 3.5000 3.7500 4.0000 4.2500 4.5000 4.7500 5.0000\n
Anna ensimmäinen piste: 0.0 1.0\nAnna toinen piste: 0\nAnna kaksi lukua välilyönnillä erotettuna\nAnna toinen piste: 1.0 0.0\nSuoran arvot ovat:\n1.0000 0.7500 0.5000 0.2500 0.0000 -0.2500 -0.5000 -0.7500 -1.0000 -1.2500 -1.5000 -1.7500 -2.0000 -2.2500 -2.5000 -2.7500 -3.0000 -3.2500 -3.5000 -3.7500 -4.0000\n
Anna ensimmäinen piste: 0 0\nAnna toinen piste: 2 1\nSuoran arvot ovat:\n0.0000 0.1250 0.2500 0.3750 0.5000 0.6250 0.7500 0.8750 1.0000 1.1250 1.2500 1.3750 1.5000 1.6250 1.7500 1.8750 2.0000 2.1250 2.2500 2.3750 2.5000\n
Anna ensimmäinen piste: -5 5\nAnna toinen piste: 0 0\nSuoran arvot ovat:\n0.0000 -0.2500 -0.5000 -0.7500 -1.0000 -1.2500 -1.5000 -1.7500 -2.0000 -2.2500 -2.5000 -2.7500 -3.0000 -3.2500 -3.5000 -3.7500 -4.0000 -4.2500 -4.5000 -4.7500 -5.0000\n
\n \n \n \n \n
\n\n\n', 'revision': 26131, 'max_points': 4, 'urls': {'stats_url': '/stats/single-exercise/oa-suoraa-puhetta/', 'feedback_url': '/feedback/statistics/oa-fitech-2023-2024/oa-suoraa-puhetta/', 'download_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-suoraa-puhetta/download_answers/', 'summary_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-suoraa-puhetta/answer_summary/', 'batch_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-suoraa-puhetta/batch_grade/', 'reset_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-suoraa-puhetta/reset_completion/', 'edit_url': '/exercise-admin/file-upload/253/change/', 'submit_url': '/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-suoraa-puhetta/26131/check/', 'edit_content_url': '/staff/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-suoraa-puhetta/editform/edit/', 'delete_content_url': '/staff/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-suoraa-puhetta/editform/delete/', 'add_content_url': '/staff/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-suoraa-puhetta/add/'}}
{'slug': 'oa-insinöörin-pikku-apuri', 'content': [('heading', "Piiritehtävä: Insinöörin pikku apuri¶
\n", 0, 1), ('paragraph', 'Tässä harjoituksessa tehdään funktio, jolla voidaan toteuttaa Piiri pieni pyörii -lopputyöhön käyttöä merkittävästi mukavoittava ominaisuus: komponenttien arvojen syöttäminen käyttämällä kerrannaisyksikköitä (kilo, mega, milli, mikro...).
\n', 2, 1), ('paragraph', 'Opittavat asiat: Kerrannaisyksikön erottaminen
\n', 4, 1), ('paragraph', 'merkkijonosta
. Kertoimen hakeminen sanakirjasta
.Tavoite: Ohjelma, joka osaa muuttaa kerrannaisyksikön sitä vastaavaksi kymmenen potenssiksi.
\n', 6, 1), ('separator', '\n', 8, 1), ('paragraph', '
Alustus:
\n', 10, 1), ('paragraph', 'Jotta muunnos onnistuu kätevästi, tiedoston alkuun kannattaa määritellä sanakirja, joka sisältää kerrannaisyksiköiden tunnukset
\n', 12, 1), ('separator', 'avaimina
ja niitä vastaavat kertoimet arvoina. Yksiköt kertoimineen löydät siis täältä. Tehtävässä halutaan sanakirja, josta löytyy kaikki linkin taulukossa olevat yksiköt paitsi deka (ts. kaikki yksikirjaimiset). Käytä mikrolle "u"-merkkiä, koska sellainen on helpompi kirjoittaa näppäimistöllä kuin "μ".\n', 14, 1), ('paragraph', '
Toteutettava funktio:
\n', 16, 1), ('list', 'muuta_kerrannaisyksikko
- Dokumenttimerkkijono: ', 18, 1), ('cleanup', '
"""\nMuuttaa annetun luvun ja mahdollisen kerrannaisyksikön vastaavaksi liukuluvuksi.\n"""\n
- Parametrit:
- muutettava luku (merkkijono)
- Palauttaa:
- muunnettu luku (liukuluku) ', 24, 4), ('cleanup', '
Funktio
ottaa parametrina saadun arvon ja palauttaa vastaavan liukulukuarvon
tai Nonen jos yksikko tai luku ei ole kelvollinen. Muunnos tulee tehdä yllä ohjeistetun sanakirjan avulla. Ratkaisut joissa on (suurin piirtein) yhtä monta ehtohaaraa
kuin kerrannaisyksiköitä hylätään. Funktioon liittyy parikin ratkaistavaa osaongelmaa: mahdollinen kerrannaisyksikkö pitäisi irrottaa muusta luvusta; lisäksi pitäisi saada arvo muunnettua.\n', 31, 1), ('paragraph', '
Pääohjelma:
\n', 33, 1), ('paragraph', 'Pääohjelmaan tulee tehdä testausta varten silmukka, jossa kysytään käyttäjältä muutettavaa arvoa kunnes tämä antaa kelvollisen, ja lopuksi tulostetaan em. funktion palauttama arvo. Jos funktio palauttaa None, tulostetaan sen sijaan
\n', 35, 1), ('separator', '"Arvo ei ole kelvollinen"
. Ohjelman toimintaa voit ihmetellä esimerkeistä. Pääohjelman tulee siis kysyä vain yksi kelvollinen syöte!\n', 37, 1), ('paragraph', '
Esimerkit toiminnasta:
\n', 39, 1), ('code', "Anna muutettava arvo: 2k\n2000.0\n}}}\n{{{\nAnna muutettava arvo: 1.5G\n1500000000.0\n}}}\n{{{\nAnna muutettava arvo: 220\n220.0\n}}}\n{{{\nAnna muutettava arvo: 5B\nArvo ei ole kelvollinen\nAnna muutettava arvo: aasiK\nArvo ei ole kelvollinen\nAnna muutettava arvo: 0.1m\n0.0001\n
Jos arvo on riittävän suuri tai pieni, Python muuttaa sen automaattisesti 10-potenssiesitykseksi. Tästä ei siis tarvitse itse huolehtia:
\n', 62, 1), ('code', "Anna muutettava arvo: -560p\n-5.6e-10\n
\n \n \n \n \n
\n\n\n', 'revision': 28598, 'max_points': 4, 'urls': {'stats_url': '/stats/single-exercise/oa-insin%C3%B6%C3%B6rin-pikku-apuri/', 'feedback_url': '/feedback/statistics/oa-fitech-2023-2024/oa-insin%C3%B6%C3%B6rin-pikku-apuri/', 'download_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-insin%C3%B6%C3%B6rin-pikku-apuri/download_answers/', 'summary_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-insin%C3%B6%C3%B6rin-pikku-apuri/answer_summary/', 'batch_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-insin%C3%B6%C3%B6rin-pikku-apuri/batch_grade/', 'reset_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-insin%C3%B6%C3%B6rin-pikku-apuri/reset_completion/', 'edit_url': '/exercise-admin/file-upload/250/change/', 'submit_url': '/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-insin%C3%B6%C3%B6rin-pikku-apuri/28598/check/', 'edit_content_url': '/staff/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-insin%C3%B6%C3%B6rin-pikku-apuri/editform/edit/', 'delete_content_url': '/staff/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-insin%C3%B6%C3%B6rin-pikku-apuri/editform/delete/', 'add_content_url': '/staff/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-insin%C3%B6%C3%B6rin-pikku-apuri/add/'}}
{'slug': 'oa-kehä-kolmosen-ulkopuolella', 'content': [('heading', "Sorsatehtävä: Sisäpiiri¶
\n", 0, 1), ('paragraph', 'Sisäpiiriin on kiva kuulua. Määritelmällisestihän se voidaan käsittää tarkoittavan jonkin piirin sisällä olemista, mikä voidaan toteuttaa myös ohjelmallisesti. Tästä tekniikasta on hyötyä mm. kun halutaan ampua ritsalla lintuja taivaalle.
\n', 2, 1), ('separator', '\n', 4, 1), ('paragraph', '
Opittavat asiat: Kahden pisteen välisen etäisyyden laskeminen. Ympyrän ulkopuolella olevan pisteen siirtäminen ympyrän kehälle siten että kulma keskipisteeseen nähden säilyy.
\n', 6, 1), ('paragraph', 'Tavoite: Ohjelma joka etsii pisteelle oikean paikan ymypärän sisällä tai kehällä.
\n', 8, 1), ('separator', '\n', 10, 1), ('paragraph', '
Alustus:
\n', 12, 1), ('paragraph', 'Ensimmäisen harjoituksen Sininen funktio -tehtävässä tehdystä funktiosta saattaa olla apua tässä tehtävässä, riippuen siitä millaisen ratkaisun haluaa toteuttaa.
\n', 14, 1), ('separator', '\n', 16, 1), ('paragraph', '
1. Toteutettava funktio:
\n', 18, 1), ('list', 'laske_etaisyys
- Dokumenttimerkkijono: ', 20, 1), ('cleanup', '
"""\nLaskee kahden pisteen välisen etäisyyden ja palauttaa sen.\n"""\n
- Parametrit:
- Ensimmäinen pisteen x-koordinaatti (liukuluku)
- Ensimmäisen pisteen y-koordinaatti (liukuluku)
- Toisen pisteen x-koordinaatti (liukuluku)
- Toisen pisteen y-koordinaatti (liukuluku)
- Palauttaa:
- Pisteiden välinen etäisyys (liukuluku) ', 26, 7), ('cleanup', '
Pisteiden välisen etäisyyden kaavan selvittäminen on osa tehtävää.
\n', 34, 1), ('separator', '\n', 36, 1), ('paragraph', '
2. toteutettava funktio:
\n', 38, 1), ('list', 'rajaa_ympyraan
- Parametrit:
- Pisteen x-koordinaatti (liukuluku)
- Pisteen y-koordinaatti (liukuluku)
- Ympyrän keskipisteen x-koordinaatti (liukuluku)
- Ympyrän keskipisteen y-koordinaatti (liukuluku)
- Ympyrän säde (liukuluku)
- Palauttaa:
- Pisteen uusi x-koordinaatti (liukuluku)
- Pisteen uusi y-koordinaatti (liukuluku) ', 39, 9), ('cleanup', '
Funktion tulee ensin selvittää onko annettu piste ympyrän sisällä. Mikäli piste on ympyrän sisällä, sen koordinaatit palautetaan sellaisenaan. Mikäli kuitenkin piste on ulkopuolella, se tulee "vetää" ympyrän kehälle siten, että kulma ympyrän keskipisteeseen nähden säilyy samana, mutta etäisyys on tasan ympyrän säteen verran.
\n', 49, 1), ('separator', '\n', 51, 1), ('paragraph', '
Pääohjelma:
\n', 53, 1), ('paragraph', 'Voit testata koodia annetun ympyrän arvoilla.
\n', 55, 1), ('code', 'keski_x = 10\nkeski_y = 20\nsade = 100\n
Kirjoita pääohjelma, joka pyytää pisteen käyttäjältä kahtena syötteenä ja tulostaa sitten pisteen lopulliset koordinaatit em. ympyrän sisälle rajoitettuna. Esimerkit löydät alta. Huom: tarkistin antaa myös liukulukuja, jotka tulee hyväksyä syötteinä.
\n', 63, 1), ('paragraph', 'Esimerkit toiminnasta:
\n', 65, 1), ('code', "Piste rajoitetaan 100 säteelle pisteestä (10, 20)\nAnna x-koordinaatti: -140\nAnna y-koordinaatti: -40\nKoordinaatit ympyrän sisällä: (-82.85, -17.14)\n
Piste rajoitetaan 100 säteelle pisteestä (10, 20)\nAnna x-koordinaatti: 50.0\nAnna y-koordinaatti: 80.0\nKoordinaatit ympyrän sisällä: (50.00, 80.00)\n
Piste rajoitetaan 100 säteelle pisteestä (10, 20)\nAnna x-koordinaatti: 30\nAnna y-koordinaatti: -30\nKoordinaatit ympyrän sisällä: (30.00, -30.00)\n
Piste rajoitetaan 100 säteelle pisteestä (10, 20)\nAnna x-koordinaatti: 40.0\nAnna y-koordinaatti: -110.0\nKoordinaatit ympyrän sisällä: (32.49, -77.44)\n
Piste rajoitetaan 100 säteelle pisteestä (10, 20)\nAnna x-koordinaatti: -50\nAnna y-koordinaatti: 40\nKoordinaatit ympyrän sisällä: (-50.00, 40.00)\n
Alla myös visuaalinen esitys näiden pisteiden käyttäytymisestä:
\n', 102, 1), ('image', "\n \n \n \n \n
\n\n\n', 'revision': 32943, 'max_points': 4, 'urls': {'stats_url': '/stats/single-exercise/oa-keh%C3%A4-kolmosen-ulkopuolella/', 'feedback_url': '/feedback/statistics/oa-fitech-2023-2024/oa-keh%C3%A4-kolmosen-ulkopuolella/', 'download_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-keh%C3%A4-kolmosen-ulkopuolella/download_answers/', 'summary_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-keh%C3%A4-kolmosen-ulkopuolella/answer_summary/', 'batch_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-keh%C3%A4-kolmosen-ulkopuolella/batch_grade/', 'reset_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-keh%C3%A4-kolmosen-ulkopuolella/reset_completion/', 'edit_url': '/exercise-admin/file-upload/644/change/', 'submit_url': '/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-keh%C3%A4-kolmosen-ulkopuolella/32943/check/', 'edit_content_url': '/staff/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-keh%C3%A4-kolmosen-ulkopuolella/editform/edit/', 'delete_content_url': '/staff/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-keh%C3%A4-kolmosen-ulkopuolella/editform/delete/', 'add_content_url': '/staff/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-keh%C3%A4-kolmosen-ulkopuolella/add/'}}
Lopputyötehtävät 2¶
Näistäkin pitäisi tehdä yksi. Nämä tehtävät eivät ole pakollisia minimikurssisuoritukseen.
{'slug': 'oa-ö-luokkaista-toimintaa', 'content': [('heading', "Miinatehtävä: Ö-luokkaista toimintaa¶
\n", 0, 1), ('paragraph', 'Miinantallaaja-polun seuraajat hyötyvät tämän tehtävän salaisuuksien mestaroimisesta. Tehtävänäsi on auttaa urhoollista sankaria laskemaan häntä ympäröivien ninjojen lukumäärä. Saavuttaaksesi kisällin tason miinantallaaja-polun taitolajissa, pääset toteuttamaan funktion jolla voi ninjojen lisäksi aika mutkattomasti laskea vaikka miinoja...
\n', 2, 1), ('paragraph', 'Opittavat asiat: Ympäröivien ruutujen käsittely kaksiulotteisessa
\n', 4, 1), ('paragraph', 'listassa
sekä niissä olevien tiettyjen merkkien laskeminen. Tavoite: Ohjelma, joka laskee annetun ruudun ympärillä olevat ninjat.
\n', 6, 1), ('separator', '\n', 8, 1), ('paragraph', '
Toteutettava funktio:
\n', 10, 1), ('list', 'laske_ninjat
- Dokumenttimerkkijono: ', 12, 1), ('cleanup', '
"""\nLaskee annetussa huoneessa yhden ruudun ympärillä olevat ninjat ja palauttaa\nniiden lukumäärän. Funktio toimii sillä oletuksella, että valitussa ruudussa ei\nole ninjaa - jos on, sekin lasketaan mukaan.\n"""\n
- Parametrit:
- valitun ruudun x-koordinaatti (kokonaisluku)
- valitun ruudun y-koordinaatti (kokonaisluku)
- huonetta kuvaava rakenne (lista, joka sisältää listoja jotka sisältävät yksittäisiä merkkejä)
- Palauttaa:
- ninjojen lukumäärän (kokonaisluku) ', 20, 6), ('cleanup', '
Ympäröiviä ruutuja on maksimissaan 8, eli myös viistoon lasketaan. Koordinaateista tulee aina tarkistaa, että ei yritetä laskea huoneen ulkopuolella olevia ninjoja (saati vastakkaisella seinällä olevia jos indeksi menee negatiiviseksi!). Miinaharavoinnin mestariksi hamuavat toteuttavat ympäröivien ruutujen läpikahlaukset
\n', 27, 1), ('paragraph', 'silmukoilla
. Funktion tulee toimia kaiken kokoisilla huoneilla. Tämä tarkoittaa siis sitä, että rajojen selvitykseen tarvittavat leveys ja korkeus täytyy selvittää saatua tietorakennetta mittaamalla (len-funktiolla).
\n', 29, 1), ('separator', '\n', 31, 1), ('paragraph', '
Pääohjelma:
\n', 33, 1), ('paragraph', 'Kirjoita funktion lisäksi
\n', 35, 1), ('code', 'pääohjelma
, jossa määritellään testausta varten huone seuraavasti:huone = [\n ['N', ' ', ' ', ' ', ' '],\n ['N', 'N', 'N', 'N', ' '],\n ['N', ' ', 'N', ' ', ' '],\n ['N', 'N', 'N', ' ', ' '],\n [' ', ' ', ' ', ' ', ' '],\n [' ', ' ', ' ', ' ', ' ']\n]\n
Ohjelman pitäisi myös tulostaa huone, ja pyytää käyttäjältä sankarin koordinaatit. Tämän jälkeen tulostetaan ympäröivien ninjojen lukumäärä. Huoneen tulostamiseen voit käyttää oheista koodinpätkää:
\n', 48, 1), ('code', 'print(" ", "- " * 5)\nfor rivi in huone:\n print("|", " ".join(rivi), "|")\nprint(" ", "- " * 5)\n
Esimerkit toiminnasta:
\n', 57, 1), ('code', "- - - - - \n| N |\n| N N N N |\n| N N |\n| N N N |\n| |\n| |\n - - - - - \nAnna x-koordinaatti: 1\nAnna y-koordinaatti: 2\nRuutua ympäröi 8 ninjaa\n}}}\n{{{\n - - - - - \n| N |\n| N N N N |\n| N N |\n| N N N |\n| |\n| |\n - - - - - \nAnna x-koordinaatti: 4\nAnna y-koordinaatti: 0\nRuutua ympäröi 1 ninjaa\n
\n \n \n \n \n
\n\n\n', 'revision': 25968, 'max_points': 4, 'urls': {'stats_url': '/stats/single-exercise/oa-%C3%B6-luokkaista-toimintaa/', 'feedback_url': '/feedback/statistics/oa-fitech-2023-2024/oa-%C3%B6-luokkaista-toimintaa/', 'download_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-%C3%B6-luokkaista-toimintaa/download_answers/', 'summary_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-%C3%B6-luokkaista-toimintaa/answer_summary/', 'batch_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-%C3%B6-luokkaista-toimintaa/batch_grade/', 'reset_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-%C3%B6-luokkaista-toimintaa/reset_completion/', 'edit_url': '/exercise-admin/file-upload/251/change/', 'submit_url': '/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-%C3%B6-luokkaista-toimintaa/25968/check/', 'edit_content_url': '/staff/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-%C3%B6-luokkaista-toimintaa/editform/edit/', 'delete_content_url': '/staff/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-%C3%B6-luokkaista-toimintaa/editform/delete/', 'add_content_url': '/staff/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-%C3%B6-luokkaista-toimintaa/add/'}}
{'slug': 'oa-välillä-on-kiva-koodata', 'content': [('heading', "Spektritehtävä: Välillä on kiva koodata¶
\n", 0, 1), ('paragraph', 'Tästä aihetehtävästä voi olla apua Spektriä pukkaa-harjoitustyön tekemisessä. Kyseessä on kohtalaisen yleinen ongelma, jossa meillä on kaksi datalistaa joista halutaan valita vain osa siten, että toinen datalista sisältää mittauspisteet ja toinen pisteissä mitatut arvot. Jotta tämä onnistuu, tulee selvittää mitkä datalistan indeksit sisältävät halutut mittauspiteet, jotta voidaan rajata mittaustulokset siten, että niistä otetaan vain vastaavat pisteet.
\n', 2, 1), ('paragraph', 'Opittavat asiat:
\n', 5, 1), ('paragraph', 'Indeksien
hakeminen listoista
arvoilla, jotka eivät suoraan osu mihinkään listan alkioon
. Tavoite: Ohjelma, joka hakee yhdestä datalistasta alueen annetulta arvoväliltä sekä toisesta datalistasta vastaavat indeksit.
\n', 7, 1), ('separator', '\n', 9, 1), ('paragraph', '
Alustus:
\n', 11, 1), ('paragraph', 'Edellisen tehtävän
\n', 13, 1), ('separator', 'kysy_kaksi_lukua
-funktiota
voi käyttää tässäkin tehtävässä. Nyt ei kysytä koordinaatteja vaan kaksi arvoa samalta akselilta. Tässä viimeistään huomataan miten kätevää on, että funktiolle voi vain antaa kysymysmerkkijonon argumenttina - itse funktio nimittäin toimii tässä tehtävässä sellaisenaan.\n', 15, 1), ('paragraph', '
Toteutettava funktio:
\n', 17, 1), ('list', 'etsi_indeksit
- Dokumenttimerkkijono: ', 19, 1), ('cleanup', '
"""\nEtsii annetusta numeerista dataa sisältävästä listasta alku- ja päätepisteet\nsiten, että alueen arvot ovat annettujen minimi- ja maksimiarvojen välissä.\nPalauttaa näiden pisteiden indeksit.\n"""\n
- Parametrit:
- mittauspistesarja josta alue valitaan (lista, sisältää liukulukuja)
- alueen minimiarvo (liukuluku)
- alueen maksimiarvo (liukuluku)
- Palauttaa:
- alueen alkuindeksi (kokonaisluku)
- alueen loppuindeksi (kokonaisluku) ', 27, 7), ('cleanup', '
Funktion tulee siis etsiä missä kohtaa datassa on ensimmäistä kertaa minimiä suurempi (tai yhtä suuri)
\n', 35, 1), ('separator', 'alkio
- tämän alkion indeksi on välin alkupiste. Lisäksi pitää etsiä missä on ensimmäistä kertaa maksimia suurempi arvo - tämän arvon indeksi on loppupiste. Pythonin omien indeksointien
mukaisesti päätepiste on siis ensimmäinen indeksi jota ei oteta mukaan alueeseen! Mikäli maksimi on suurempi kuin listan viimeinen alkio, palautetaan päätepisteen indeksinä listan pituus. Mikäli molemmat ovat suurempia kuin listan viimeinen alkio, palautetaan molemmiksi indekseiksi listan pituus..\n', 37, 1), ('paragraph', '
Pääohjelma:
\n', 39, 1), ('paragraph', 'Pääohjelmassa luodaan kaksi listaa: ensimmäisessä listassa ovat mittauspisteet ja toisessa mittauspisteistä saadut arvot. Listat on annettu alla.
\n', 41, 1), ('code', "mittauspisteet = [\n 10.000, 10.244, 10.429, 10.576, 10.589, 10.606, 10.714, 10.794, 10.879, 10.99,\n 11.263, 11.448, 11.596, 11.836, 11.869, 11.936, 12.174, 12.182, 12.243, 12.282,\n 12.285, 12.297, 12.363, 12.417, 12.629, 12.71, 12.816, 13.138, 13.153, 13.215,\n 13.27, 13.32, 13.367, 13.368, 13.923, 13.97, 14.171, 14.204, 14.235, 14.382,\n 14.481, 14.581, 14.588, 14.645, 14.7, 14.704, 14.711, 14.803, 14.936, 15.000\n]\nmittausarvot = [\n 30.4, 74.165, 118.615, 54.293, 174.187, 162.399, 25.643, 181.571, 151.84, 147.307,\n 85.115, 81.337, 65.852, 127.676, 10.409, 131.279, 32.595, 89.49, 40.263, 32.712,\n 114.974, 7.967, 131.166, 124.827, 172.936, 145.234, 156.433, 118.446, 2.253, 69.263,\n 99.249, 23.344, 119.2, 169.069, 187.976, 113.63, 173.847, 193.978, 54.206, 60.27,\n 199.026, 167.434, 138.631, 3.259, 23.886, 88.825, 49.804, 109.179, 62.388, 126.052\n]\n
Pääohjelman toteuttamista varten voit käyttää edellisen tehtävän kyselyfunktiota kysymään käyttäjältä lukuväli. Ohjelman tulee tämän jälkeen tulostaa väliä vastaavat mittausarvot.
\n', 60, 1), ('separator', '\n', 62, 1), ('paragraph', '
Esimerkit toiminnasta:
\n', 64, 1), ('code', "Anna kaksi mittauspistettä välilyönnillä erotettuna: hemuli\nAnna kaksi lukua välilyönnillä erotettuna\nAnna kaksi mittauspistettä välilyönnillä erotettuna: 11\nAnna kaksi lukua välilyönnillä erotettuna\nAnna kaksi mittauspistettä välilyönnillä erotettuna: 11 13\nAntamaasi väliä vastaavat mittaustulokset:\n[85.115, 81.337, 65.852, 127.676, 10.409, 131.279, 32.595, 89.49, 40.263, 32.712, 114.974, 7.967, 131.166, 124.827, 172.936, 145.234, 156.433]\n
Anna kaksi mittauspistettä välilyönnillä erotettuna: 10.606 11.936\nAntamaasi väliä vastaavat mittaustulokset:\n[162.399, 25.643, 181.571, 151.84, 147.307, 85.115, 81.337, 65.852, 127.676, 10.409, 131.279]\n
Anna kaksi mittauspistettä välilyönnillä erotettuna: 10 15\nAntamaasi väliä vastaavat mittaustulokset:\n[30.4, 74.165, 118.615, 54.293, 174.187, 162.399, 25.643, 181.571, 151.84, 147.307, 85.115, 81.337, 65.852, 127.676, 10.409, 131.279, 32.595, 89.49, 40.263, 32.712, 114.974, 7.967, 131.166, 124.827, 172.936, 145.234, 156.433, 118.446, 2.253, 69.263, 99.249, 23.344, 119.2, 169.069, 187.976, 113.63, 173.847, 193.978, 54.206, 60.27, 199.026, 167.434, 138.631, 3.259, 23.886, 88.825, 49.804, 109.179, 62.388, 126.052]\n
\n \n \n \n \n
\n\n\n', 'revision': 28560, 'max_points': 4, 'urls': {'stats_url': '/stats/single-exercise/oa-v%C3%A4lill%C3%A4-on-kiva-koodata/', 'feedback_url': '/feedback/statistics/oa-fitech-2023-2024/oa-v%C3%A4lill%C3%A4-on-kiva-koodata/', 'download_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-v%C3%A4lill%C3%A4-on-kiva-koodata/download_answers/', 'summary_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-v%C3%A4lill%C3%A4-on-kiva-koodata/answer_summary/', 'batch_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-v%C3%A4lill%C3%A4-on-kiva-koodata/batch_grade/', 'reset_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-v%C3%A4lill%C3%A4-on-kiva-koodata/reset_completion/', 'edit_url': '/exercise-admin/file-upload/249/change/', 'submit_url': '/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-v%C3%A4lill%C3%A4-on-kiva-koodata/28560/check/', 'edit_content_url': '/staff/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-v%C3%A4lill%C3%A4-on-kiva-koodata/editform/edit/', 'delete_content_url': '/staff/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-v%C3%A4lill%C3%A4-on-kiva-koodata/editform/delete/', 'add_content_url': '/staff/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-v%C3%A4lill%C3%A4-on-kiva-koodata/add/'}}
{'slug': 'oa-nytkös-kytkös-katkes', 'content': [('heading', "Piiritehtävä: Nytkös kytkös katkes?¶
\n", 0, 1), ('paragraph', 'Vastusten pyörittely on sähköpiireissä kenties sieltä yksinkertaisemmasta päästä, joten niistä on hyvä aloittaa eteneminen kohti Piiri pieni pyörii -lopputyötä. Tässä tehtävässä lasketaan siis yksinkertaisia sarjaan- ja rinnankytkentöjä.
\n', 2, 1), ('paragraph', 'Opittavat asiat: Asioiden kasaaminen käyttäjän
\n', 4, 1), ('paragraph', 'syötteistä
listoihin
sekä näiden listojen käyttäminen laskutoimituksissa.Tavoite: Ohjelma, joka osaa laskea sarja- ja rinnankytkettyjen vastusten kokonaisresistansseja.
\n', 6, 1), ('separator', '\n', 8, 1), ('paragraph', '
1. toteutettava funktio:
\n', 10, 1), ('list', 'kysy_arvot
- Dokumenttimerkkijono: ', 12, 1), ('cleanup', '
"""\nPyytää käyttäjältä liukulukuarvoja kunnes käyttäjä syöttää tyhjän. Syötetyt\narvot palautetaan listana.\n"""\n
- Palauttaa:
- syötetyt liukulukuarvot listana (lista) ', 19, 2), ('cleanup', '
Funktioon tulee toteuttaa
\n', 22, 1), ('separator', 'silmukka
, jossa pyöritään kunnes käyttäjän antama syöte on tyhjä (""
, eli sen totuusarvo on False). Funktion alussa on syytä määrittää lista, johon kaikki käyttäjän syöttämät kelvolliset liukuluvut lisätään. Muunlaiset syötteet tietenkin hylätään virheilmoituksen kera.\n', 24, 1), ('paragraph', '
2. toteutettava funktio:
\n', 26, 1), ('list', 'laske_sarja
- Dokumenttimerkkijono: ', 28, 1), ('cleanup', '
"""\nLaskee annettujen vastusten kokonaisresistanssin kun ne oletetaan sarjaan\nkytketyiksi.\n"""\n
- Parametrit:
- lista vastusarvoista (lista, joka sisältää liukulukuja)
- Palauttaa:
- kokonaisresistanssi (liukuluku) ', 35, 4), ('cleanup', '
Laskee listassa olevien vastusten kokonaissarjaresistanssin ja palauttaa sen.
\n', 40, 1), ('separator', '\n', 42, 1), ('paragraph', '
3. toteutettava funktio:
\n', 44, 1), ('list', 'laske_rinnan
- Dokumenttimerkkijono: ', 46, 1), ('cleanup', '
"""\nLaskee annettujen vastusten kokonaisresistanssin kun ne oletetaan rinnankytketyiksi.\n"""\n
- Parametrit:
- lista vastusarvoista (lista, joka sisältää liukulukuja)
- Palauttaa:
- kokonaisresistanssi (liukuluku) ', 52, 4), ('cleanup', '
Tärkeää on huomioida, että vastusten arvot saadaan sellaisinaan, ei käänteisarvoina. Käänteisarvot tulee laskea funktion sisällä.
\n', 57, 1), ('separator', '\n', 59, 1), ('paragraph', '
Toteutettava pääohjelma:
\n', 61, 1), ('paragraph', 'Ohjelman täytyy kysyä käyttäjältä vastuksia
\n', 63, 1), ('separator', 'kysy_arvot
-funktion avulla ja ilmoittaa kokonaisresistanssit näiden sarjaan- ja rinnankytkennöille. Huomionarvoista on, että jos käyttäjä ei syötä yhtään vastusta, kokonaisresistansseja ei tule laskea, koska rinnankytkennän laskeminen aiheuttaa tässä tapauksessa poikkeuksen
.\n', 65, 1), ('paragraph', '
Esimerkit toiminnasta:
\n', 67, 1), ('code', "Anna vastusarvo: 0\nKomponentin arvon on oltava nollaa suurempi luku.\nAnna vastusarvo: 100\nAnna vastusarvo: 200\nAnna vastusarvo: 300\nAnna vastusarvo: \n\nSarjaresistanssi: 600.0\nRinnakkaisresistanssi: 54.54545454545455\n
Anna vastusarvo: Yksi Ohmi\nKomponentin arvon on oltava nollaa suurempi luku.\nAnna vastusarvo: 1.00\nAnna vastusarvo: Kaksi Ohmia\nKomponentin arvon on oltava nollaa suurempi luku.\nAnna vastusarvo: 2.00\nAnna vastusarvo: \n\nSarjaresistanssi: 3.0\nRinnakkaisresistanssi: 0.6666666666666666\n
Anna vastusarvo: \nEt antanut yhtään vastusta\n
\n \n \n \n \n
\n\n\n', 'revision': 25972, 'max_points': 4, 'urls': {'stats_url': '/stats/single-exercise/oa-nytk%C3%B6s-kytk%C3%B6s-katkes/', 'feedback_url': '/feedback/statistics/oa-fitech-2023-2024/oa-nytk%C3%B6s-kytk%C3%B6s-katkes/', 'download_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-nytk%C3%B6s-kytk%C3%B6s-katkes/download_answers/', 'summary_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-nytk%C3%B6s-kytk%C3%B6s-katkes/answer_summary/', 'batch_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-nytk%C3%B6s-kytk%C3%B6s-katkes/batch_grade/', 'reset_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-nytk%C3%B6s-kytk%C3%B6s-katkes/reset_completion/', 'edit_url': '/exercise-admin/file-upload/254/change/', 'submit_url': '/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-nytk%C3%B6s-kytk%C3%B6s-katkes/25972/check/', 'edit_content_url': '/staff/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-nytk%C3%B6s-kytk%C3%B6s-katkes/editform/edit/', 'delete_content_url': '/staff/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-nytk%C3%B6s-kytk%C3%B6s-katkes/editform/delete/', 'add_content_url': '/staff/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-nytk%C3%B6s-kytk%C3%B6s-katkes/add/'}}
{'slug': 'oa-törmäystarkistus-testi', 'content': [('heading', "Sorsatehtävä: Törmäystarkistus¶
\n", 0, 1), ('paragraph', 'Tässä tehtävässä tutustutaan kappaleiden välisten koordinaattien vertailuun kaksiulotteisessa avaruudessa. Tehtävässä käytettävä törmäysmalli perustuu ympyröihin, eli kunkin kappaleen "törmäysalue" määritetään keskipisteen ja säteen avulla. On olemassa toinenkin tyypillinen tapa, joka perustuu laatikoihin. Tällöin "törmäysalue" määritetään yhden kulman, leveyden ja korkeuden kautta.
\n', 2, 1), ('paragraph', 'Opittavat asiat: Koordinaattien vertailu, kohteiden läpikäyminen listasta
\n', 4, 1), ('paragraph', 'Tavoite: Ohjelma, joka tunnistaa kahden kappaleen välisen osuman.
\n', 6, 1), ('separator', '\n', 8, 1), ('paragraph', '
1. toteutettava funktio:
\n', 10, 1), ('list', 'kysy_kaksi_lukua
- Dokumenttimerkkijono: ', 12, 1), ('cleanup', '
"""\nPyytää käyttäjältä kaksi kokonaislukua välilyönnillä erotettuna. Syötettä kysytään\nkunnes käyttäjä antaa kaksi kelvollista kokonaislukua. Syötetyt luvut palautetaan\nkokonaislukuina.\n"""\n
- Parametrit:
- kysymysmerkkijono (merkkijono)
- virhemerkkijono (merkkijono)
- Palauttaa:
- pisteen x-koordinaatti (kokonaisluku)
- pisteen y-koordinaatti (kokonaisluku) ', 20, 6), ('cleanup', '
Kysyy
käyttäjältä kaksi kokonaislukua käyttäen pyyntönä annettua kysymysmerkkijonoa. Kyselyä toistetaan kunnes käyttäjä syöttää kaksi kokonaislukua välilyönnillä erotettuna. Virheen tapahtuessa tulostetaan toisena parametrina saatu virhemerkkijono. Kun kelvollinen syöte saadaan, luvut palautetaan kokonaislukuina.\n', 29, 1), ('paragraph', '
2. toteutettava funktio:
\n', 31, 1), ('list', 'testaa_osuma
- Dokumenttimerkkijono: ', 33, 1), ('cleanup', '
"""\nLaskee kappaleiden välisen etäisyyden ja palauttaa totuusarvona osuivatko ne toisiinsa.\n"""\n
- Parametrit:
- kappale_1 (sanakirja)
- kappale_2 (sanakirja)
- Palauttaa:
- Totuusarvo, joka on True jos kappaleet osuvat toisiinsa, muuten False ', 39, 5), ('cleanup', '
- Parametreina annettavilla sanakirjoilla on seuraavat avaimet:
- "x": Kappaleen keskipisteen x-koordinaatti (kokonaisluku)
- "y": Kappaleen keskipisteen y-koordinaatti (kokonaisluku)
- "r": Ympyräkappaleen säde (kokonaisluku) ', 45, 4), ('cleanup', '
Funktio määrittää sille annettujen ympyräkappaleiden koordinaattien perusteella, osuivatko ne toisiinsa. Funktion tulee siis palauttaa totuusarvona tieto siitä, olivatko vertailtavat kappaleet päällekkäin jossakin pisteessä. Muista käyttää hyödyksi tietoa ympyräkappaleen säteestä.
\n', 50, 1), ('separator', '\n', 52, 1), ('paragraph', '
Pääohjelma:
\n', 54, 1), ('paragraph', 'Tee ohjelma, joka kysyy käyttäjältä kaksi pistettä muodossa x y käyttäen kysy_kaksi_lukua-funktiota.
\n', 56, 1), ('paragraph', 'Argumentiksi
annettavan kyselyn löydät allaolevista esimerkeistä. Käytä säteelle literaaliarvoa 1. Tämän jälkeen ohjelma tulostaa osuttiinko pääohjelman alussa alustettuihin maalitauluihin.Pääohjelmassa voit käyttää seuraavaa listaa maalitauluista:
\n', 58, 1), ('code', 'maalit = [\n {'x': 10, 'y': 10, 'r': 1},\n {'x': 25, 'y': 32, 'r': 3},\n {'x': 50, 'y': 50, 'r': 3},\n {'x': 73, 'y': 12, 'r': 3},\n {'x': 79, 'y': 12, 'r': 5}\n]\n
Huomaa, että pääohjelma tulostaa ainoastaan kerran tiedon maaliin osumisesta, vaikka tarkasteltavana olisi useampi maali kuin yksi.
\n', 70, 1), ('separator', '\n', 72, 1), ('paragraph', '
Esimerkit toiminnasta:
\n', 74, 1), ('code', 'Anna kaksi kokonaislukua muodossa "x y": 1 2\nAmmus meni ohi :(\n
Anna kaksi kokonaislukua muodossa "x y": 1\nSyötettä ei annettu kahtena kokonaislukuna!\nAnna kaksi kokonaislukua muodossa "x y": yksi kaksi\nSyötettä ei annettu kahtena kokonaislukuna!\nAnna kaksi kokonaislukua muodossa "x y": 1 2 3\nSyötettä ei annettu kahtena kokonaislukuna!\nAnna kaksi kokonaislukua muodossa "x y": 10 9\nAmmus osui maaliin!\n
\n \n \n \n \n
\n\n\n', 'revision': 30428, 'max_points': 4, 'urls': {'stats_url': '/stats/single-exercise/oa-t%C3%B6rm%C3%A4ystarkistus-testi/', 'feedback_url': '/feedback/statistics/oa-fitech-2023-2024/oa-t%C3%B6rm%C3%A4ystarkistus-testi/', 'download_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-t%C3%B6rm%C3%A4ystarkistus-testi/download_answers/', 'summary_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-t%C3%B6rm%C3%A4ystarkistus-testi/answer_summary/', 'batch_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-t%C3%B6rm%C3%A4ystarkistus-testi/batch_grade/', 'reset_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-t%C3%B6rm%C3%A4ystarkistus-testi/reset_completion/', 'edit_url': '/exercise-admin/file-upload/600/change/', 'submit_url': '/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-t%C3%B6rm%C3%A4ystarkistus-testi/30428/check/', 'edit_content_url': '/staff/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-t%C3%B6rm%C3%A4ystarkistus-testi/editform/edit/', 'delete_content_url': '/staff/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-t%C3%B6rm%C3%A4ystarkistus-testi/editform/delete/', 'add_content_url': '/staff/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-t%C3%B6rm%C3%A4ystarkistus-testi/add/'}}
Anna palautetta
Kommentteja harjoituksista?