1. Harjoitukset: Geomaagista koodimystiikkaa¶
Ensimmäisissä varsinaisissa harjoituksissa treenataan ohjelmoinnin perusasioita: ongelmanratkaisua, ratkaisun osittamista ja Pythonin käyttöä ratkaisun toteuttamiseen. Vaikka ei tässä vaiheessa juuri mitään osattaisikaan, se ei estä meitä etenemästä ammattitaitoisen järjestelmällisesti kohti voittoa. Hyvä ohjelmointiprosessi on parasta kehittää mahdollisimman aikaisessa vaiheessa opettelua, kun ongelmat ovat vielä yksinkertaisia eivätkä yksityiskohdat vaivaa läheskään yhtä paljoa. Tämän kerran tehtävät ovatkin melkein puhdasta matematiikkaa suoraan peruskoulun penkiltä. Ainoastaan se, että lähestymme niitä ohjelmoinnin kautta on uutta.
Prosessia ei tarvitse kehittää tyhjästä. Tämän kerran tehtävät on rakennettu siten, että puhtaasti punaista lankaa seuraamalla saat käsityksen siitä, miten ohjelmoinnissa kannattaa edetä. Tämän harjoituksen eväillä pärjää aivan hyvin kurssin alkupuoliskon kanssa. Puhutaan sitten luennolla lisää asiasta, kun oikea aika koittaa.
Osaamistavoitteet¶
Keskeinen osaamistavoite tälle viikolle on vihkiytyä ohjelmointiprosessiin. Tähän kuuluu ongelman ratkaisun jäsentäminen siten, että sen kulku voidaan kuvata yksiselitteisesti vaihe vaiheelta. Juuri yksiselitteisyys on avainsana ohjelmoinnissa, sillä tietokone ottaa vastaan ainoastaan täsmällisiä ohjeita. Toinen vaihe prosessia on tunnistaa, millä tavalla käytössä olevat työkalut - tässä tapauksessa Python - sopivat kuhunkin ratkaisun vaiheiseen.
Hieman konkreettisempia, teknisempiä tavoitteita tälle kerralle ovat kaksi keskeistä ohjelmointikäsitettä:
muuttujat
ja funktiot
; miten informaatio liikkuu muuttujien avulla ohjelman osasta toiseen - ja erityisesti miten ne liikkuvat funktioiden välillä. Lisäksi opitaan tietenkin syntaksi
sille, miten kaikki nämä perusasiat tehdään. Kurkistamme myös hieman syötteiden
ottamiseen käyttäjältä.Esimerkki¶
Tehtävänanto¶
Palloja on hieman hankala mittailla. Mittanauhalla helpoiten pystyy mittaamaan pallon ympärysmitan, mutta mites sitten suu pannaan, kun kysytäänkin pallon tilavuutta ja pinta-alaa? Mitattavia pallojakin on lyöty eteen kymmeniä erikokoisia... Parempi siis tehdä ohjelma joka laskee nämä tiedot kun siihen lyödään ympärysmitta.
Ratkaisu¶
Tavoitteena on siis ratkaista kaksi mysteeriarvoa: pallon pinta-ala ja tilavuus. Ensimmäinen askel kohti voittoa on siis selvittää, miten nämä saadaan laskettua. On tärkeää lähteä liikkeelle nimenomaan siitä, miten varsinaiseen kysymykseen voidaan vastata, jotta tiedämme, mitä muilla annetuilla tiedoilla voi tehdä. Niin tilavuudelle kuin pinta-alallekin löytyvät olemassaolevat matemaattiset kaavat, jotka voi palautella mieleen koulugeometriasta tai katsoa Wikipediasta.
V = 4 / 3 * pi * r^3 A = 4 * pi * r^2
Nämähän näyttävät oikeastaan jo valmiiksi ohjelmakoodilta. Molemmissa kaavoissa tarvitaan kaksi "tuntematonta": pi ja r. Tiedämme kuitenkin mikä pi on, ja lisäksi tiedämme että sille saa oikein hyvän arvon math-
moduulista
. Selvitettäväksi jää siis r, eli pallon säde. Tätä ennen voimme kuitenkin jo kirjoittaa hieman koodia. Aloitetaan materiaalin loppupuolen asiasta, eli importin
käytöstä. Kaikki importit tulee tehdä kooditiedoston alussa, joten siitä on hyvä aloittaa. import math
Voimme kirjoittaa myös valmiiksi kaksi
funktiota
: yhden pinta-alan laskemiseen ja toisen tilavuuden laskemiseen. Näistä on hyvä tehdä omat funktionsa, koska niiden avulla voidaan helposti laskea minkä tahansa pallon arvot - tätähän tehtävänannossa haluttiin. Molempien kaavojen lopputulos riippuu ainoastaan pallon säteestä, joten se on luonnollinen valinta funktion parametriksi
. Funktioiden luonnollisesti tulisi palauttaa
kaavoista saadut tulokset. Saamme siis aikaan kaksi funktiota, jotka liitetään importin perään: import math
def laske_ala(sade):
return 4 * math.pi * sade ** 2
def laske_tilavuus(sade):
return 4 / 3 * math.pi * sade ** 3
Muistetaan vain, että toisin kuin yllä kuvatuissa kaavoissa, Pythonissa potenssiin korotus tapahtuu **-
operaattorilla
. Nyt pitäisi vielä keksiä, mistä saadaan tuo mystinen säde. Tiedossa siis on pallon ympärysmitta, eli toisin sanoen pallon läpileikkauksen piiri. Pallon muodosta johtuen sen läpileikkauksen piirin säde on sama kuin pallon säde. 
Ympyrän piirin laskemiseen on sillekin oma kaavansa:
p = 2 * pi * r
Tästä voidaan pyöritellä miten lasketaan r, jos tiedetäänkin p:
r = p / (2 * pi)
Aiempaa periaatetta mukaillen tästäkin voidaan tehdä
funktio
, joka laskee siis ympyrän säteen, kun sille annetaan argumenttina
ympyrän piiri. Lisätään funktio muiden joukkoon, jolloin meillä on jotain tämän näköistä:import math
def laske_ala(sade):
return 4 * math.pi * sade ** 2
def laske_tilavuus(sade):
return 4 / 3 * math.pi * sade ** 3
def laske_sade(piiri):
return piiri / (math.pi * 2)
Tässä vaiheessa kaikki osaongelmat on ratkaistu, ja kukin on nätisti omassa funktiossaan. Jäljelle jää ainoastaan kuvata, miten varsinaisen pääongelman ratkaisu etenee. Tätä varten voidaan tehdä oma funktionsa laske_pallon_ominaisuudet:
def laske_pallon_ominaisuudet(piiri):
sade = laske_sade(piiri)
ala = laske_ala(sade)
tilavuus = laske_tilavuus(sade)
return ala, tilavuus
Funktio
saa pallosta mitatun piirin parametrina
, ja tämän jälkeen edetään varsin järjestelmällisesti laskemalla ensin pallon säde sitä varten tehdyllä funktiolla, ja sitten pallon muut ominaisuudet käyttämällä laskettua sädettä. Kiinnitä huomiota erityisesti siihen, kuinka hyvin koodi kertoo prosessin kulun kun se koostuu pelkistä hyvin nimettyjen funktioiden kutsumisista. Jäljelle jää enää tulosten pyöristäminen ja näyttäminen. Pyöristys on hyvä tehdä vasta tulostaessa, koska arvoja
joilla mahdollisesti vielä voitaisiin laskea jotain ei koskaan pitäisi pyöristää. Se on siis hyvä tehdä pääohjelmassa
, jossa tätä funktiota kutsutaan. Piiri saadaan materiaalin lopussa esitetyllä tavalla kysyä käyttäjältä liukuluku:mitattu_piiri = float(input("Anna pallon ympärysmitta: "))
laskettu_ala, laskettu_tilavuus = laske_pallon_ominaisuudet(mitattu_piiri)
print("Tilavuus:", round(laskettu_tilavuus, 4))
print("Pinta-ala:", round(laskettu_ala, 4))
Kun kaikki osat yhdistetään, saadaan tältä näyttävä kooditiedosto:
Tiedostojen nimeämisestä¶
Python-kooditiedosto merkitään .py-päätteellä. Muuten tiedostojen nimeämiseen pätee sama kuin muuttujien: vain kirjaimia ja numeroita ja alaviivoja. Muunlaisia nimiä ei voi ottaa käyttöön
importilla
, mikä on erityisen ongelmallista tarkistamisen kautta koska koodisi otetaan juuri importilla käyttöön tarkistimessa. Tällä kurssilla on myös huomioitavaa, että Lovelace-palvelin ei osaa käsitellä tiedostoja, joiden nimessä on skandinaavisia kirjaimia. Nämä eivät siis ole hyviä tiedoston nimiä ainakaan tällä kurssilla: ensimmäinen harjoitus.py jännää.py t1.5.py aasi-svengaa++.py
Suotavampaa on käyttää alaviivoja sanojen erotteluun. Skandinaaviset kirjaimet korvataan a:lla ja o:lla. Korjattuna em. nimet voisivat olla:
ensimmainen_harjoitus.py jannaa.py t1_5.py aasi_svengaa.py
Tarkistimista¶
Tällä kurssilla kaikki ohjelmointitehtävät tarkastetaan erityisillä tarkistusohjelmilla. Tyypillinen tehtävänanto koostuu yhden tai useamman
funktion
määrittelystä sekä pääohjelmasta
joka käyttää niitä. Tärkeää on ymmärtää, että nämä testataan erikseen. Tämä on erityisen tärkeä ymmärtää funktioiden suhteen, koska vääränlaiset funktiot eivät mene tarkistimista läpi. Funktion on aina tehtävä täsmälleen kuten tehtävänannossa pyydetään. Lisäksi niiden on näytettävä muun ohjelman näkökulmasta juuri sellaisilta kuin tehtävänannossa kuvataan. Tämä siis tarkoittaa, että funktiolle on annettava juuri se nimi joka tehtävänannossa vaaditaan ja sillä on oltava tasan ne parametrit
, jotka vaaditaan ja niiden on oltava vaaditussa järjestyksessä. Lopulta funktion on myös palautettava
juuri sellainen arvo
kuin on määritelty. Jos funktio on väärin nimetty, testausohjelma ei yksinkertaisesti löydä sitä. Jos taas funktiolla on väärä määrä parametreja, testausohjelma ei pysty kutsumaan sitä testiarvoilla. Jos funktion parametrit ovat väärässä järjestyksessä, se toimii väärin testiarvoilla. Esimerkkinä tämän harjoituksen neljäs tehtävä jossa pyydetään laskemaan ympyräsektorin pinta-ala käyttämällä kahta parametria. Jos parametrit ovat funktion määrittelyssä toisin päin kuin tehtävänannossa, funktio tulee antamaan vääriä tuloksia, koska se käyttää säteenä annettua kulmaa ja päinvastoin. Tyypillisesti funktiota testaan vertaamalla sen palauttamaa arvoa tai arvoja referenssifunktion tulokseen. Mikäli opiskelijan funktio palauttaa vääräntyyppisiä arvoja, nämä vertailut epäonnistuvat ja ohjelma ei mene tarkistimesta läpi.
Tyypillisesti testit on laadittu siten, että ohjelmaa testataan sekä satunnaisilla arvoilla että rajatapauksilla (esim. virheelliset syötteet, nolla, todella suuret tai todella pienet luvut jne.) Usein juuri kutakin opiskelijan
funktiota
kutsutaan eri argumenteilla
toistuvasti tarkistuksen aikana (yleensä 10 kertaa). Tästä johtuen on oltava tarkkana sen kanssa, että funktio todella toimii kuten funktion kuuluu eikä ole riippuvainen mistään sellaisista arvoista
, joita sille ei anneta parametreina
. Erityisesti tämän viikon päätehtävässä on syytä olla tarkkana tämän kanssa. Tehtävässä pyydetään funktiota joka laskee kuvion pinta-alan kun sille annetaan x:n arvo. Kaikki laskut on tehtävä funktion sisällä! Mikäli osa laskuista tehdään pääohjelmassa
, funktio ei tule toimimaan oikein kun se irrotetaan pääohjelmasta.Tarkistimet pyrkivät aina kertomaan mitä ne ovat tekemässä jotta opiskelija pystyy selvittämään mistä virhe johtui. Tyypillisesti ne antavat tietoa siitä mitä arvoja ne koittivat opiskelijan ohjelmalle/funktiolle antaa, mitä koodi palautti sekä mitä sen olisi pitänyt palauttaa. Joissain tapauksissa palautettuja
arvoja
saatetaan myös verrata yleisiin virheellisiin toteutuksiin jolloin voidaan antaa lisäinformaatiota siitä mikä todennäköisimmin meni pieleen. Tarkistimet eivät kuitenkaan ole hyviä ratkomaan opiskelijan koodissa olevia puhtaita ohjelmointivirheitä joiden takia koodia ei edes voi suorittaa. Varmista siis aina ensin että koodisi ylipäätään toimii, koska viallisten ohjelmien ajaminen omalla koneella komentorivillä
kertoo tyypillisesti tarkemmin mikä on vialla. Tarkistimissa on myös poikkeusten
käsittelyä siten, että se saattaa luulla opiskelijan ohjelmointivirheestä johtunutta poikkeusta joksikin muuksi, koska se olettaa saavansa tarkistettavaksi ohjelman joka toimii. Oman koodin testaus tulkissa¶
Koska tarkistimet testaavat nimenomaan
funktioita
, ongelmien ratkominen on usein helpompaa jos pystyt itsekin kutsumaan koodisi funktioita eri arvoilla. Tämän voi tietenkin aina tehdä kopioimalla funktion määrittelyn tulkkiin, mutta kätevämpi tapa pitkällä aikavälillä on opetella oman koodin käyttöönotto import
-lauseella tulkissa
. Otetaan esimerkkinä yllä luodun pallokoodin funktioiden käyttö. Ladataan siis pallokoodi johonkin sopivaan kansioon nimellä pallo.py
. Tässä vaiheessa ohjelmoinnin opettelua on helpointa olla samassa kansiossa kuin kooditiedosto
joka halutaan suorittaa. Siirrytään siis sinne (ks. ohje tarvittaessa) ja käynnistetään tulkki komennolla ipython
.Koodista voi ottaa funktioita käyttöön joko tavallisella import-lauseella tai from-import-lauseella. Riippumatta siitä miten koodin ottaa käyttöön, sen sisältö suoritetaan. Tästä johtuen tulkkiin tulee välittömästi
pääohjelmassa
olevat kyselyt ja tulostukset. Myöhemmin opimme välttämään tämän, mutta toistaiseksi riittää, että siihen syötetään jotain (niin tarkistinkin tekee). Tämän jälkeen funktioita voidaan kutsua suoraan tulkista eri argumenteilla, alla olevan kuvan mukaisesti:Laatutarkistuksesta¶
Tarkistimiin on myös liitetty koodin laatutarkistus johon käytetään Pylint-nimistä työkalua. Pisteytys pohjautuu Pythonin PEP8-tyylistandardiin. Muutamia ilmoituksia on poistettu käytöstä, mutta muutoin pisteytykseen ei ole koskettu. Koodin laatutarkistusta käytetään kurssin pisteytyksessä siten, että tehtävästä saa lisäpisteen jos toimivan ohjelman lisäksi tyylitarkistus antaa vähintään arvosanan 9. Huomautuksiin huomion kiinnittäminen myös yleisesti auttaa kirjoittamaan koodia, joka ei ole pelkästään miellyttävämpää lukea vaan myös vähemmän virheherkkää. Virheitä on usein myös mukavampi korjata koodista, joka on saanut Pylintistä korkeat pisteet.
Lämmittelytehtävä¶
{'slug': 'oa-viljaympyroita', 'content': [('heading', "Viljaympyröitä¶
\n", 0, 1), ('paragraph', 'Turtlella ympyröiden piirtely haluttuun kohtaan on joskus haastavaa johtuen siitä, että ympyrä piirretään kynän polkuna sen lähtöpisteestä. Jos halutaan keskipisteen avulla sijoitettava ympyrä, tarvitaan hieman matematiikkaa. Koska ympyrän piirtämistä tietyn pisteen ympärille saattaa tarvita jatkossakin, tehdään tässä vaiheessa kätevä funktio jolla se onnistuu aina.
\n', 2, 1), ('paragraph', 'Opittavat asiat:
\n', 4, 1), ('paragraph', 'Funktion
määrittely
sellaiseksi, että sitä voidaan käyttää työkaluna. Lisäksi opitaan hieman koordinaatistoasioita erityisesti Turtlen kontekstissa.Tavoite: Funktio, joka piirtää ympyrän annetun keskipisteen ympärille.
\n', 6, 1), ('separator', '\n', 8, 1), ('paragraph', '
Valmistelu:
\n', 10, 1), ('paragraph', 'Tässä tehtävässä on annettu valmis koodipohja, jossa on funktion määrittely sekä funktiota kutsuva pääohjelmakoodi valmiina. Tehtäväsi on täydentää funktion sisälle piirtokoodi tehtävänannon mukaisesti. Funktioita tulee olla koodissa vain yksi - saman funktion pitäisi pystyä piirtämään kaikki kolme ympyrää kun sille annetaan eri
\n', 12, 1), ('file', ' \n', 14, 1), ('separator', 'argumentit
.\n', 16, 1), ('paragraph', '
Toteutettava funktio:
\n', 18, 1), ('list', 'piirra_ympyra
- Parametrit:
- keskipisteen x-koordinaatti (kokonaisluku)
- keskipisteen y-korodinaatti (kokonaisluku)
- ympyrän säde (kokonaisluku) ', 20, 4), ('cleanup', '
Funktion tulee tehdä seuraavat asiat:
\n', 26, 1), ('list', '- sijoittaa kynä keskipisteestä säteen verran alaspäin (eli pisteeseen (x, y-r)). Tässä kannattaa käyttää setx- ja sety-komentoja.
- piirtää ympyrä säteellä r ', 28, 2), ('cleanup', '
Muista myös nostella ja laskea kynää sen mukaan oletko siirtämässä sitä vai piirtämässä! (ks. uudet komennot alempana).
\n', 31, 1), ('separator', '\n', 33, 1), ('paragraph', '
Funktion testaus:
\n', 35, 1), ('paragraph', 'Kun suoritat pääohjelmakoodin, kynän kärjen pitäisi olla viimeisenä piirretyn ympyrän keskellä alla olevan kuvan mukaisesti.
\n', 37, 1), ('image', "\n', 41, 1), ('paragraph', '
Käytettävät Turtle-komennot
\n', 43, 1), ('paragraph', 'Käytössä ovat jo tutut komennot. Muista aloittaa tiedosto rivillä
\n', 45, 1), ('code', 'from turtle import *\n
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\n
Tarpeen ovat myös nämä uudet komennot:
\n', 62, 1), ('code', 'up() # 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': 24240, 'max_points': 3, 'urls': {'stats_url': '/stats/single-exercise/oa-viljaympyroita/', 'feedback_url': '/feedback/statistics/oa-fitech-2023-2024/oa-viljaympyroita/', 'download_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-viljaympyroita/download_answers/', 'summary_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-viljaympyroita/answer_summary/', 'batch_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-viljaympyroita/batch_grade/', 'reset_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-viljaympyroita/reset_completion/', 'edit_url': '/exercise-admin/file-upload/75/change/', 'submit_url': '/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-viljaympyroita/24240/check/', 'edit_content_url': '/staff/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-viljaympyroita/editform/edit/', 'delete_content_url': '/staff/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-viljaympyroita/editform/delete/', 'add_content_url': '/staff/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-viljaympyroita/add/'}}
Tehtävät¶
{'slug': 'oa-kuviokimara', 'content': [('heading', "Kuviokimara¶
\n", 0, 1), ('paragraph', 'Tämä tehtävä on laajempi kokonaisuus, ja kolme seuraavaa ovat sen osaongelmia. Tämä olisi siis tarkoitus tehdä viimeisenä näistä neljästä tehtävästä (viides tehtävä ei liity tähän). Se on kuitenkin tässä tehtävälistassa ensimmäisenä, koska se kannattaa lukaista läpi ennen muiden tehtävien tekemistä. Tällä tavalla voit muita tehtäviä tehdessäsi miettiä miten niiden ratkaisut liittyvät tähän tehtävään, vai liittyvätkö lainkaan. Alla on esitetty kuvio, josta tiedetään X:n arvo. Tehtävässä kirjoitamme koodin, joka laskee tämän kuvion pinta-alan eri x:n arvoille.
\n', 2, 1), ('paragraph', 'Opittavat asiat: Useiden olemassaolevien
\n', 4, 1), ('paragraph', 'funktioiden
käyttö uuden funktion sisällä. Lisäksi päästään vähän verryttelemään ongelmanratkaisutaitoja.Tavoite: Ohjelma, joka laskee alla kuvatun kuvion pinta-alan.
\n', 6, 1), ('separator', '\n', 8, 1), ('paragraph', '
Valmistelu:
\n', 10, 1), ('paragraph', 'Mieti, miten harjoituksissa tehdyt funktiot sopivat tähän tehtävään ja kopioi niiden koodit
\n', 12, 1), ('separator', 'kooditiedostoosi
. Älä muuta funktioita tai kirjoita uusia. Katso myös koodipohja tämän tehtävänannon lopusta.\n', 14, 1), ('paragraph', '
Toteutettava funktio:
\n', 16, 1), ('list', 'laske_kuvion_ala
- Parametrit:
- pienen neliön sivun pituus (liukuluku, ks. kuva)
- Palauttaa:
- kuvion pinta-ala (liukuluku) ', 18, 4), ('cleanup', '
Funktio siis laskee kuvion pinta-alan ja palauttaa sen, kun sille annetaan x:n arvo
\n', 23, 1), ('paragraph', 'argumenttina
. Käytä laskennassa apuna alla olevissa tehtävissä tehtyjä funktioita ja välituloksia! Laskennasta on paljon helpompi välttää virheitä, jos käytät kunkin osalaskutoimituksen laskemiseen muissa tehtävissä tehtyjä funktioita ja tallennat
niiden paluuarvot
muuttujiin. Lopuksi kun osakuvioiden pinta-alat ovat omissa muuttujissaan, tarvitsee vain palauttaa niiden summa.Kuvio on esitetty alla.
\n', 25, 1), ('image', "
\n', 29, 1), ('paragraph', '
Toteutettava pääohjelma:
\n', 31, 1), ('paragraph', 'Kirjoita koodiisi
\n', 33, 1), ('separator', 'pääohjelma
, jossa kutsut funktiota käyttäjän antamalla x:n arvolla ja tulostat funktion palauttaman lopputuloksen lähimpään neljään desimaaliin pyöristettynä.. Viestimerkkijonot
löydät alla olevasta esimerkistä.\n', 35, 1), ('paragraph', '
Esimerkki toiminnasta:
\n', 37, 1), ('code', "Anna x: 3.467\nKuvion ala: 98.0688\n
\n', 44, 1), ('paragraph', '
Resurssit
\n', 46, 1), ('paragraph', 'Alla on pohja josta näet miten koodi tulisi jakaa funktioihin ja pääohjelmaan
\n', 48, 1), ('file', ' \n', 50, 1)], 'question': '', 'form': '\n\n\n\n \n \n \n \n \n
\n\n\n', 'revision': 24241, 'max_points': 3, 'urls': {'stats_url': '/stats/single-exercise/oa-kuviokimara/', 'feedback_url': '/feedback/statistics/oa-fitech-2023-2024/oa-kuviokimara/', 'download_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-kuviokimara/download_answers/', 'summary_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-kuviokimara/answer_summary/', 'batch_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-kuviokimara/batch_grade/', 'reset_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-kuviokimara/reset_completion/', 'edit_url': '/exercise-admin/file-upload/77/change/', 'submit_url': '/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-kuviokimara/24241/check/', 'edit_content_url': '/staff/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-kuviokimara/editform/edit/', 'delete_content_url': '/staff/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-kuviokimara/editform/delete/', 'add_content_url': '/staff/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-kuviokimara/add/'}}
{'slug': 'oa-sekaisin-neliöistä', 'content': [('heading', "Sekaisin neliöistä¶
\n", 0, 1), ('paragraph', 'Tässä tehtävässä neliöiden kiinnostavuus nousee toiseen potenssiin! Ehkä.
\n', 2, 1), ('paragraph', 'Opittavat asiat: Yksinkertaisen
\n', 4, 1), ('paragraph', 'funktion
määrittely sekä käyttö. Liukulukusyötteen kysyminen käyttäjältä.Tavoite: Ohjelma, joka laskee neliön alan.
\n', 6, 1), ('separator', '\n', 8, 1), ('paragraph', '
Toteutettava funktio:
\n', 10, 1), ('list', 'laske_nelion_ala
- Parametrit:
- neliön sivun pituus (liukuluku)
- Palauttaa:
- neliön pinta-ala (liukuluku) ', 12, 4), ('cleanup', '
\n', 17, 1), ('paragraph', '
Toteutettava pääohjelma:
\n', 19, 1), ('paragraph', 'Tee lisäksi kooditiedostoon
\n', 21, 1), ('separator', 'pääohjelma
, joka laskee pinta-alan neliölle, jolle käyttäjä on antanut sivun pituuden, ja pyöristää lopputuloksen lähimpään neljään desimaaliin. Tulos tulee myös tulostaa.. Käytettävät merkkijonot
löydät alla olevasta esimerkistä.\n', 23, 1), ('paragraph', '
Esimerkki toiminnasta:
\n', 25, 1), ('code', "Anna neliön sivun pituus: 4.628\nNeliön pinta-ala: 21.4184\n
\n \n \n \n \n
\n\n\n', 'revision': 24242, 'max_points': 3, 'urls': {'stats_url': '/stats/single-exercise/oa-sekaisin-neli%C3%B6ist%C3%A4/', 'feedback_url': '/feedback/statistics/oa-fitech-2023-2024/oa-sekaisin-neli%C3%B6ist%C3%A4/', 'download_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-sekaisin-neli%C3%B6ist%C3%A4/download_answers/', 'summary_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-sekaisin-neli%C3%B6ist%C3%A4/answer_summary/', 'batch_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-sekaisin-neli%C3%B6ist%C3%A4/batch_grade/', 'reset_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-sekaisin-neli%C3%B6ist%C3%A4/reset_completion/', 'edit_url': '/exercise-admin/file-upload/78/change/', 'submit_url': '/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-sekaisin-neli%C3%B6ist%C3%A4/24242/check/', 'edit_content_url': '/staff/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-sekaisin-neli%C3%B6ist%C3%A4/editform/edit/', 'delete_content_url': '/staff/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-sekaisin-neli%C3%B6ist%C3%A4/editform/delete/', 'add_content_url': '/staff/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-sekaisin-neli%C3%B6ist%C3%A4/add/'}}
{'slug': 'oa-rosvosektori', 'content': [('heading', "Rosvosektori¶
\n", 0, 1), ('paragraph', 'Hullut tykkää pyöreästä ja pyörinnästä, mutta entä jos pitääkin laskea Pacmanin pinta-ala? Tällöin puhutaan tietenkin ympyräsektorin pinta-alasta. PS. on se Pacmankin sektori, n. 270 asteen sisäkulmalla.
\n', 2, 1), ('paragraph', 'Opittavat asiat:
\n', 4, 1), ('paragraph', 'Funktion
määrittely, kun parametreja
on useampi kuin yksi. Moduulin
tuominen
mukaan koodiin.Tavoite: Ohjelma, joka laskee ympyräsektorin pinta-alan.
\n', 6, 1), ('separator', '\n', 8, 1), ('paragraph', '
Alustus:
\n', 10, 1), ('paragraph', 'Muista ottaa math-moduuli käyttöön, jotta saat pi:lle tarkan arvon!
\n', 12, 1), ('separator', '\n', 14, 1), ('paragraph', '
Toteutettava funktio:
\n', 16, 1), ('list', 'laske_sektorin_ala
- Parametrit:
- ympyrän säde (liukuluku)
- sektorin sisäkulma asteina (liukuluku)
- Palauttaa:
- sektorin pinta-ala (liukuluku) ', 18, 5), ('cleanup', '
Käytä laskutoimituksissa math-moduulin pi:n arvoa. Huomaa, että parametrien järjestyksellä on merkitystä! Ohjelmoijan tulee aina noudattaa sovittua parametrien järjestystä funktioita määrittäessä.
\n', 24, 1), ('separator', '\n', 26, 1), ('paragraph', '
Toteutettava pääohjelma:
\n', 28, 1), ('paragraph', 'Tee funktion lisäksi
\n', 30, 1), ('separator', 'pääohjelma
, jossa lasket pinta-alan ympyräsektorille kun käyttäjä antaa ympyrän säteen ja sisäkulman. Tuloksen tulostus pitäisi jälleen pyöristää lähimpään neljään desimaaliin.. Viestimerkkijonot
löydät alta. \n', 32, 1), ('paragraph', '
Esimerkki toiminnasta:
\n', 34, 1), ('code', "Anna ympyrän säde: 12.742\nAnna sektorin sisäkulma asteina: 68\nSektorin pinta-ala: 96.3455\n
\n \n \n \n \n
\n\n\n', 'revision': 24243, 'max_points': 3, 'urls': {'stats_url': '/stats/single-exercise/oa-rosvosektori/', 'feedback_url': '/feedback/statistics/oa-fitech-2023-2024/oa-rosvosektori/', 'download_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-rosvosektori/download_answers/', 'summary_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-rosvosektori/answer_summary/', 'batch_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-rosvosektori/batch_grade/', 'reset_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-rosvosektori/reset_completion/', 'edit_url': '/exercise-admin/file-upload/80/change/', 'submit_url': '/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-rosvosektori/24243/check/', 'edit_content_url': '/staff/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-rosvosektori/editform/edit/', 'delete_content_url': '/staff/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-rosvosektori/editform/delete/', 'add_content_url': '/staff/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-rosvosektori/add/'}}
{'slug': 'oa-pythagoras-päälaellaan', 'content': [('heading', "Pythagoras päälaellaan¶
\n", 0, 1), ('paragraph', 'Viimeisessä osatehtävässä pääset kehittämään uuden salaisen tekniikan: Vähäisempi käänteinen Pythagoras. Tarkoituksena on siis laskea kateettien pituus tasakylkiselle, suorakulmaiselle kolmiolle, kun sen hypotenuusa tiedetään.
\n', 2, 1), ('paragraph', 'Opittavat asiat: Ongelmanratkaisukykyä matemaattista kaavaa pyörittelemällä.
\n', 4, 1), ('paragraph', 'Tavoite: Ohjelma, joka laskee tasakylkisen, suorakulmaisen kolmion kateetin pituuden hypotenuusasta.
\n', 6, 1), ('separator', '\n', 8, 1), ('paragraph', '
Toteutettava funktio:
\n', 10, 1), ('list', 'laske_sivun_pituus
- Parametrit:
- hypotenuusan pituus (liukuluku)
- Palauttaa:
- sivun pituus (liukuluku) ', 12, 4), ('cleanup', '
\n', 17, 1), ('paragraph', '
Toteutettava pääohjelma:
\n', 19, 1), ('paragraph', 'Kirjoita lisäksi pääohjelma, joka laskee sivun pituuden tasakylkiselle kolmiolle, jonka hypotenuusan pituus on kysytty käyttäjältä. Pyöristä tulos tuttuun tapaan lähimpään neljään desimaaliin ja tulosta se.. Viesti
\n', 21, 1), ('separator', 'merkkijonot
löydät alla olevasta esimerkistä.\n', 23, 1), ('paragraph', '
Esimerkki toiminnasta:
\n', 25, 1), ('code', "Anna tasakylkisen kolmion hypotenuusan pituus: 13.753\nKylkien pituus: 9.7248\n
\n \n \n \n \n
\n\n\n', 'revision': 24244, 'max_points': 3, 'urls': {'stats_url': '/stats/single-exercise/oa-pythagoras-p%C3%A4%C3%A4laellaan/', 'feedback_url': '/feedback/statistics/oa-fitech-2023-2024/oa-pythagoras-p%C3%A4%C3%A4laellaan/', 'download_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-pythagoras-p%C3%A4%C3%A4laellaan/download_answers/', 'summary_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-pythagoras-p%C3%A4%C3%A4laellaan/answer_summary/', 'batch_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-pythagoras-p%C3%A4%C3%A4laellaan/batch_grade/', 'reset_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-pythagoras-p%C3%A4%C3%A4laellaan/reset_completion/', 'edit_url': '/exercise-admin/file-upload/82/change/', 'submit_url': '/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-pythagoras-p%C3%A4%C3%A4laellaan/24244/check/', 'edit_content_url': '/staff/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-pythagoras-p%C3%A4%C3%A4laellaan/editform/edit/', 'delete_content_url': '/staff/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-pythagoras-p%C3%A4%C3%A4laellaan/editform/delete/', 'add_content_url': '/staff/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-pythagoras-p%C3%A4%C3%A4laellaan/add/'}}
{'slug': 'oa-sininen-funktio', 'content': [('heading', "Sininen funktio¶
\n", 0, 1), ('paragraph', 'Kulmien sinien ja kosinien laskenta on aika tyypillistä mm. sovelluksissa, joissa on liikkuvia objekteja. Esimerkkinä mainittakoon vaikka pelit sekä nämä animaatioit, joita materiaaliin on ripoteltu. Napakoordinaattimuoto on nimittäin usein parempi tapa hallita kaarevia liikkeitä luontevan näköisesti. Ongelmana napakoordinaattien käytössä on tietenkin se, että niillä ei voi suoraan piirtää mitään näytölle, vaan liikkuvalle objektille on määriteltävä sijainti x- ja y-koordinaateilla ilmaistuna.
\n', 2, 1), ('paragraph', 'Opittavat asiat: Python-
\n', 4, 1), ('paragraph', 'moduulien
käyttöönotto ja niiden sisältämien funktioiden
sekä vakioiden
käyttö. Bonuksena kertaamme koordinaattimuunnoksen.Tavoite: Funktio joka palauttaa napakoordinaattiesitystä vastaavat x- ja y-koordinaatit.
\n', 6, 1), ('separator', '\n', 8, 1), ('paragraph', '
Toteutettava funktio:
\n', 10, 1), ('list', 'muunna_xy_koordinaateiksi
- Parametrit:
- kulma radiaaneina (liukuluku)
- osoitinvektorin pituus (liukuluku)
- Palauttaa:
- x-koordinaatti (kokonaisluku)
- y-koordinaatti (kokonaisluku) ', 12, 6), ('cleanup', '
Funktio siis suorittaa muunnoksen napakoordinaateista x- ja y-koordinaateiksi (jos et muista miten, voit tutkia asiaa internetistä). Muunnetut koordinaatit tulee myös pyöristää sekä muuntaa kokonaisluvuiksi ennen palautusta.
\n', 19, 1), ('separator', '\n', 21, 1), ('paragraph', '
Pääohjelma:
\n', 23, 1), ('paragraph', 'Pääohjelman
tulee kysyä käyttäjältä kulma radiaaneina sekä osoitinvektorin pituus (tässä järjestyksessä). Pääohjelma tulostaa annettuja napakoordinaatteja vastaavat x- ja y-koordinaatit.Esimerkki toiminnasta:
\n', 27, 1), ('code', "Anna kulma radiaaneina: 1.5708\nAnna osoitinvektorin pituus: 1\nKoordinaatit (x, y): (0, 1)\n
\n \n \n \n \n
\n\n\n', 'revision': 24245, 'max_points': 3, 'urls': {'stats_url': '/stats/single-exercise/oa-sininen-funktio/', 'feedback_url': '/feedback/statistics/oa-fitech-2023-2024/oa-sininen-funktio/', 'download_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-sininen-funktio/download_answers/', 'summary_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-sininen-funktio/answer_summary/', 'batch_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-sininen-funktio/batch_grade/', 'reset_url': '/teacher/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-sininen-funktio/reset_completion/', 'edit_url': '/exercise-admin/file-upload/284/change/', 'submit_url': '/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-sininen-funktio/24245/check/', 'edit_content_url': '/staff/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-sininen-funktio/editform/edit/', 'delete_content_url': '/staff/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-sininen-funktio/editform/delete/', 'add_content_url': '/staff/ohjelmoinnin-alkeet/oa-fitech-2023-2024/oa-sininen-funktio/add/'}}
Lopputyöpohdinta¶
Miten nämä tehtävät liittyivät kurssin lopputyön tekemiseen? Tietenkin ilman perusteita on mahdoton tehdä yhtään mitään. Sen lisäksi kuitenkin opittiin myös lopputyön suunnitteluun liittyvä ensisijaisen tärkeä taito: ohjelman jakaminen funktioihin. Pelkästään se, että miettii minkä nimisiä funktioita ohjelmaan voisi tulla, saattaa olla yllättävän pitkä askel kohti ohjelman valmistumista. Funktiojaon ei tarvi olla mitenkään lopullinen - kaikesta huolimatta se on kuitenkin ensimmäinen, konkreettinen esitys siitä, mitä koodi voisi sisältää, tai millaisia asioita siinä voisi tapahtua.
Anna palautetta
Kommentteja harjoituksista?