Piiri pieni pyörii¶
Tehtäväsi on toteuttaa ohjelma, joka laskee vaihtovirtapiirin komponenttien jännitteet ja virrat ilmoittaen ne osoitinmuodossa. Kytkemisestä aiheutuvia muutoksia emme tässä laske, vaan tasoittuneen (steady-state) tilanteen. Ohjelman ei myöskään tarvitse ymmärtää dc-tasoa.
Ohjelman toiminta¶
Ensin käyttäjältä on kysyttävä piirin tehonlähteen jännite (merkitään kirjamella U) ja taajuus (f), sekä piirin komponentit ja niiden arvot. Komponenteille on laskettava impedanssit. Lopuksi yksittäisille komponenteille on laskettava jännite ja virta. Yksinkertaisuuden vuoksi riittää, että jännitelähteestä voi lähteä useita haaroja, ja haaroissa komponentit ovat sarjoissa. Haaroja käsitellään laskuissa erillisinä piireinä eli ne eivät vaikuta toisiinsa.
Tosin ohjelman hyödyllisyyden vuoksi on perusteltua vaatia, että haaran sisällä on voitava olla rinnankytkettyjä komponentteja. Tiedonkäsittelyn ja laskennan helpottamiseksi riittää, että haarassa oleva rinnankytkentä käsitellään yhtenä komponenttina. Rinnankytkennän syöttämisen jälkeen sitä saa käsitellä yhtenä impedanssina, joka on sarjassa muiden haaran komponenttien kanssa. Haarassa olevalle rinnankytkennälle ei siis tarvitse laskea komponenttikohtaisia virtoja ja jännitteitä, vaan ainoastaan rinnankytkennän yli oleva jännite ja läpi kulkeva virta.
Tarpeellista teoriaa¶
Piirin komponentit ja impedanssien laskeminen:
Vastuksista on kysyttävä resistanssit (R), kondensaattoreista kapasitanssit (C) ja keloista induktanssit (L). Suluissa olevilla kirjaimilla kuvataan yleisesti kyseistä suuretta.
Impedanssi kuvaa komponentin aiheuttamaa vastusta sähkövirralle vaihtovirtapiirissä. Impedanssia kuvataan yleisesti kirjaimella Z.
Vastuksien impedanssien laskeminen on helppoa, sillä vastuksen impedanssi on sama kuin sen resistanssi. Eli vastuksille
<math>
Z = R
</math>
Kondensaattorin impedanssi on
<math>
Z = {1 \over { (2 \cdot \pi \cdot f \cdot C \cdot 1j) }}
</math>
Kelan impedanssi on
<math>
Z = 2 \cdot \pi \cdot f \cdot L \cdot 1j
</math>
Edellisissä esiintyvä j on imaginääriyksikkö, jota käytetään laskiessa kompleksiluvuilla.
Seuraavassa pari tärkeintä laskusääntöä imaginääriyksiköihin liittyen:
1 / 1j = -1j
(1j) ** 2 = -1 (näin imaginääriyksikkö määritellään, koodissasi tuskin tarvit tätä)
Vastuksista on kysyttävä resistanssit (R), kondensaattoreista kapasitanssit (C) ja keloista induktanssit (L). Suluissa olevilla kirjaimilla kuvataan yleisesti kyseistä suuretta.
Impedanssi kuvaa komponentin aiheuttamaa vastusta sähkövirralle vaihtovirtapiirissä. Impedanssia kuvataan yleisesti kirjaimella Z.
Vastuksien impedanssien laskeminen on helppoa, sillä vastuksen impedanssi on sama kuin sen resistanssi. Eli vastuksille
<math>
Z = R
</math>
Kondensaattorin impedanssi on
<math>
Z = {1 \over { (2 \cdot \pi \cdot f \cdot C \cdot 1j) }}
</math>
Kelan impedanssi on
<math>
Z = 2 \cdot \pi \cdot f \cdot L \cdot 1j
</math>
Edellisissä esiintyvä j on imaginääriyksikkö, jota käytetään laskiessa kompleksiluvuilla.
Seuraavassa pari tärkeintä laskusääntöä imaginääriyksiköihin liittyen:
1 / 1j = -1j
(1j) ** 2 = -1 (näin imaginääriyksikkö määritellään, koodissasi tuskin tarvit tätä)
Osoitinmuoto¶
Osoitinmuodossa ilmoitetaan kompleksiluvun etäisyys origosta, ja suuntakulma. Etäisyys on reaali- ja kompleksiosien toisten potenssien summan neliöjuuri.
Osoitinmuodossa:
1j = 1 < 90°
-1 = 1 < 180°
1 + 1j = 1,41421 < 45°
Merkinnällä 1 < 90° tarkoitetaan, että luvun etäisyys origosta on 1, mutta se on 90 asteen kulmassa (vastapäivään) positiiviseen reaaliakseliin nähden. Merkittäessä kulmaa jännitteelle ja/tai virralle, asteilla merkitään sen siirtymä verrokkisignaaliin (jännitelähteeseen) nähden, tätä siirtymää sanotaan vaiheeksi. Jäljessä tulevan signaalin vaihe on negatiivinen. Etuajassa olevalla signaalilla vaihe on positiivinen.
Käytä yksittäisestä imaginääriyksiköstä merkintää 1j, jotta python ymmärtää sen oikein. Tutustu ehdottomasti cmath-moduuliin, sillä siitä löytyy funktioita, jotka helpottavat paljon työtäsi! Esimerkiksi muunnokselle reaali+imaginääri -muodosta osoitinmuotoon löytyy funktio, joka hoitaa kaiken, kuten etäisyyden ja suuntakulman laskemisen.
Osoitinmuodossa:
1j = 1 < 90°
-1 = 1 < 180°
1 + 1j = 1,41421 < 45°
Merkinnällä 1 < 90° tarkoitetaan, että luvun etäisyys origosta on 1, mutta se on 90 asteen kulmassa (vastapäivään) positiiviseen reaaliakseliin nähden. Merkittäessä kulmaa jännitteelle ja/tai virralle, asteilla merkitään sen siirtymä verrokkisignaaliin (jännitelähteeseen) nähden, tätä siirtymää sanotaan vaiheeksi. Jäljessä tulevan signaalin vaihe on negatiivinen. Etuajassa olevalla signaalilla vaihe on positiivinen.
Käytä yksittäisestä imaginääriyksiköstä merkintää 1j, jotta python ymmärtää sen oikein. Tutustu ehdottomasti cmath-moduuliin, sillä siitä löytyy funktioita, jotka helpottavat paljon työtäsi! Esimerkiksi muunnokselle reaali+imaginääri -muodosta osoitinmuotoon löytyy funktio, joka hoitaa kaiken, kuten etäisyyden ja suuntakulman laskemisen.
Sarjaan- ja rinnankytkennät¶
Sarjaankytkentä tarkoittaa, että komponentit ovat kytketty peräkkäin. Sarjaankytkennän kokonaisimpedanssi on sarjaan kytkettyjen komponenttien impedanssien summa.
Rinnankytkentä tarkoittaa, että komponentit on kytketty vierekkäin. Rinnankytkennän kokonaisimpedanssi on rinnankytkettyjen komponenttien impedanssien käänteisarvojen summan käänteisarvo.
Rinnankytkentä tarkoittaa, että komponentit on kytketty vierekkäin. Rinnankytkennän kokonaisimpedanssi on rinnankytkettyjen komponenttien impedanssien käänteisarvojen summan käänteisarvo.
Jännitteiden ja virtojen laskeminen¶
Rinnakkain olevilla komponenteilla ja haaroilla on sama jännite (jos ei olisi, se tasoittuisi heti, sillä jännite on kuin vedenpinnan korkeus).
Sarjassa (peräkkäin) olevilla komponenteilla on sama virta (koska virta ei pääse haarautumaan muuallekaan, vähän kuin vesi joessa).
Virtaa merkitään usein kirjaimella I.
Jännitteiden ja virtojen välillä on myös vaihtovirran tapauksessa yhteys, sillä U = Z * I, eli jännite on impedanssin ja virran tulo.
Sarjaankytkennässä jännite jakautuu impedanssien suhteessa (jos sarjassa olisi komponentit, joiden impedanssit olisivat 1 ja 2 ohmia, ja niiden yli kytkettäisiin 3 voltin jännite, 1 ohmin impedanssin yli olisi 1 voltin jännite, ja 2 ohmin yli olisi 2V jännite.)
Rinnankytkennässä virta jakautuu johtavuuden mukaan, eli impedanssien käänteisarvojen mukaan (jos rinnan olisi 1 ja 2 ohmin impedanssit ja rinnankytkennän läpi kulkisi 3A virta, kulkisi 1 ohmin läpi 2A virta, ja 2 ohmin läpi 1A virta.)
Sarjassa (peräkkäin) olevilla komponenteilla on sama virta (koska virta ei pääse haarautumaan muuallekaan, vähän kuin vesi joessa).
Virtaa merkitään usein kirjaimella I.
Jännitteiden ja virtojen välillä on myös vaihtovirran tapauksessa yhteys, sillä U = Z * I, eli jännite on impedanssin ja virran tulo.
Sarjaankytkennässä jännite jakautuu impedanssien suhteessa (jos sarjassa olisi komponentit, joiden impedanssit olisivat 1 ja 2 ohmia, ja niiden yli kytkettäisiin 3 voltin jännite, 1 ohmin impedanssin yli olisi 1 voltin jännite, ja 2 ohmin yli olisi 2V jännite.)
Rinnankytkennässä virta jakautuu johtavuuden mukaan, eli impedanssien käänteisarvojen mukaan (jos rinnan olisi 1 ja 2 ohmin impedanssit ja rinnankytkennän läpi kulkisi 3A virta, kulkisi 1 ohmin läpi 2A virta, ja 2 ohmin läpi 1A virta.)
Toimiva toteutus¶
Edellä oli tehtävän kannalta tarpeellisia perusjuttuja sähköopista, mutta kerrataanpa vielä tiivistetysti mitä hyväksytyltä lopputyöltä odotetaan:
Tärkeimpänä vaatimuksena, joka erottaa hyväksytyn ja hylätyn lopputyön toisistaan on ohjelman toimivuus. Hyväksytyn lopputyön pystyttävä seuraaviin asioihin:
- Ohjelmalle voi syöttää erilaisia piirejä graafisesta käyttöliittymästä
- Syötössä voidaan käyttää SI-kerrannaisyksiköitä
- Ohjelma piirtää piirikaavio näkyviin ja päivittää sitä aina kun lisätään uusi komponentti
- Ohjelma tulostaa piirin valmistuttua käyttöliittymässä olevaan tekstilaatikkoon oikein lasketut jännitteet ja virrat
- Tulokset ovat ymmärrettävissä ja jännitteet sekä virrat esitetään osoitinmuodossa
Grafiikka¶
Käyttöönotto¶
Kirjasto rakentuu Pythonin normaaliasennuksessa mukana tulevan TkInter-kirjaston päälle, ja tarjoaa siitä rajusti yksinkertaistetun rajapinnan funktioiden kautta. Kirjaston dokumentaatiomerkkijonot kertovat miten sitä käytetään. Kirjaston pääohjelmassa on myös lyhyt esimerkki siitä, miten sillä tehdään yksinkertainen käyttöliittymä. Piirien piirtely vaatii myös matplotlib-kirjaston asentamisen (
pip install matplotlib
), sekä SchemDraw-kirjaston asentamisen (pip install SchemDraw
), johon löytyy myös alta lisäapalikka, joka tarvitaan siihen, että piirit saadaan piirrettyä käyttöliittymäikkunan sisälle. Käyttöliittymäkirjastojen 101¶
Käyttöliittymäohjelmoinnissa kirjastoissa on tyypillisesti pääohjelmasilmukka, joka pyörii ns. konepellin alla. Kaikki mitä käyttäjä tekee käyttöliittymässä kytketään yleensä käsittelijäfunktioihin. Kun käyttäjä vaikkapa painaa nappia, kutsutaan nappiin kiinnitettyä käsittelijäfunktiota, joka tekee Jotain (tm). Ohjelma ei siis etene samalla tavalla lineaarisesti kuin tähän asti on totuttu. Käyttöliittymät muodostuvat elementeistä joita kutsutaan widgeteiksi. Nämä voivat olla yksinkertaisia, kuten painonapit, tai monimutkaisempia kuten vaikkapa kokonainen tiedostonavausikkuna, joita näkee useimmissa ohjelmissa.
Tyypillisesti pääohjelmassa luodaan käyttöliittymän ulkoasu valitsemalla mitä elementtejä sinne laitetaan. Samalla määritellään elementtien ominaisuudet ja erityisesti niiden käsittelijäfunktiot. Loppu koodauksesta on näiden käsittelijäfunktioiden sekä erilaisten apufunktioiden tekemistä (joita käsittelijäfunktiot käyttävät).
Yksi erityispiirre on se, että koska funktioita kutsutaan ulkoisesti kirjaston toimesta, emme voi hallita sitä mitä tietoa niille annetaan. Ohjelman tilaa ei siis voi kuljettaa funktion argumenteissa, vaan se täytyy esittää jollain muulla tavalla. Hyvä vaihtoehto tämän lopputyön kontekstissa on tehdä sanakirja, johon talletetaan esim. ladattu data sekä pisteet, jotka käyttäjä on valinnut. Jos sanakirja on määritelty pääohjelmassa, sitä voidaan muuntuvuutensa ansiosta käsitellä kaikissa funktioissa. Tällöin mikä tahansa funktio voi lukea ja muuttaa ohjelman tilaa ilman, että sille tarvii antaa sitä argumenttina.
Piirien piirtely¶
Piirin esillepanoa varten käyttöliitymäikkunaan tulee luoda erillinen piirinpiirtoalue. Piirin piirto aloitetaan jännitelähteen piirtämisellä, jonka jälkeen piirretään yksi haara kerrallaan. Kirjasto huolehtii suurimmasta osasta piirin asettelua. Piirtelyn pitäisi onnistua siis kohtalaisen hyvin kunhan luet huolellisesti piiristo-moduulin dokumenttiimerkkijonoista ohjeet.
Yhteistyö¶
Me tykkäämme tällä kurssilla yhteistyöstä. Näitä viikottaisia kivoja pikku tehtäväpakettejakin on värkkäilty monen assistentin voimavaroilla. Yhdessä näitä ongelmia on varmaan myös kivempi ratkoa. Kaverilla voi olla parempi käsitys jostain asiasta, ja muutenkin kaksi silmäparia on tehokkaampi virheitä etsiessä. Usein oman virheensä tajuaa jo siinä vaiheessa kun alkaa kaverille avautumaan siitä, että ohjelma ei toimi. Niinpä siis emme missään nimessä halua ryöstää teiltä tätä yhdessä tekemisen riemua ja kannustammekin kysymään assistenttien lisäksi apua myös kavereilta.
Tällä kurssilla on kuitenkin vaatimus, että jokainen opiskelija oppisi ohjelmoimaan ihan itse. Tämä on hyvä pitää mielessä kun värkkäilee koodia kaverin tai useamman kanssa. Mitään ei kannata naputella omaan koodiin ilman, että tajuaa, mitä siinä tapahtuu. Vaadi kavereiltasi selitystä, jos et ymmärrä saamaasi neuvoa! Koodin muilta kopioinnissa on semmoinen ikävä puoli, että kaikki häviävät. Se joka kopioi, ei itse viisastu kopioimastaan millään tavalla, ja se, jolta kopioidaan, ei pääse syventämään omaa ymmärrystään asiasta muotoilemalla sen ymmärrettävään muotoon.
Näitä tapauksia sattuu kuitenkin vuosittain, joten pelkkien kauniiden ajatusten lisäksi kurssilla on selkeät ja helposti ymmärrettävä pelisäännöt yhteistyötä koskien. Noudatahan näitä sääntöjä niin vältyt ongelmilta. Ongelmat yleensä tarkoittavat, että suoritusmerkintääsi saatetaan pantata jonnekin hamaan tulevaisuuteen kun asiaa selvitetään. Pahimmassa tapauksessa voi käydä niinkin ikävästi, että joudut uusimaan kurssin. Säännöt voi tiivistää muutamaan kohtaan:
- Älä kopioi koodia mistään tai keneltäkään ja pidä huoli siitä että ymmärrät aina kaiken koodin mitä kirjoitat
- Ilmoita aina kenen kanssa olet tehnyt yhteistyötä. Tiedostotehtävissä on tätä varten oma kenttänsä
- Jos otat mallia jostain muualta (Internet), merkitse kommenteilla koodin yläpuolelle mistä se on otettu
Lopputyötä voi tehdä yhdessä kaverin tai useamman kanssa (max ryhmäkoko: 3). Tällöin on kuitenkin pidettävä huoli siitä, että kaikki tekijät ovat kartalla siitä, mitä ohjelmassa tapahtuu ja osallistuvat sen tekemiseen. Kannattaa huomioida, että lopputyön tarkastamisessa ja katselmoinnissa keskitytään siihen, miten hyvin sinä itse osaat ohjelmoida ja miten se tulee esiin. Maailman paraskaan koodi ei mene läpi, jos se on kokonaan jonkun muun tekemä.
Kaikki koodit ajetaan samankaltaisuutta nuuskivan työkalun läpi, ja jos ryhmien välillä löytyy suuria samankaltaisuuksia, asiasta pyydetään ryhmiltä kommentit, joiden perusteella päätetään miten edetään.
Työn hyväksyminen¶
Hyväksyttävään työhön vaaditaan ohjelma, joka toteuttaa tällä sivulla esitetyt vaatimukset. Ellei koodisi ole aivan luokattoman huonoa, tyypillisesti kaikki täysin toimivat ohjelmat hyväksytään. Puutteiden paikkaamiseen on mahdollisuus kunhan työn ensimmäinen versio on palautettu ajoissa. Työn palautuksen lisäksi hyväksyttyyn suoritukseen kuuluu 15 minuutin keskustelu assistentin kanssa.
Työtä ei nykyään pisteytetä, mutta alla ovat edelleen nähtävissä aiemmin käytetyt koodin laatuun liittyvät pisteytyskriteerit joita apuna käyttäen voi miettiä onko koodi sellaista, että sitä kehtaa näyttää muillekin.
Koodin laatu¶
Hyvän yleiskuvan koodin laadusta saa Pylint-tarkistuksella. Alla lisäksi muutamia muita huomioita.
Muuttujat ja nimeäminen¶
- huono: Muuttujien ja funktioiden nimistä on mahdoton päätellä mihin ne on tarkoitettu tai mitä ne sisältävät.
- hyvä: Muuttujien ja funktioiden nimistä pystyy pääasiassa päättelemään mihin ne on tarkoitettu, vaikka osa nimistä voikin olla lähinnä "vähän sinne päin". Asioita on nimetty usealla eri kielellä ja nimeämiskäytäntö ei muutenkaan ole välttämättä kauhean yhdenmukainen.
- erinomainen: Ohjelmassa on johdonmukainen ja yhtenäinen nimeämiskäytäntö. Lisäksi muuttujien määrä on hillitty, ja ohjelmassa on vältetty turhia muuttujaansijoituksia. Vastaavasti ohjelmassa on käytetty muuttujaansijoitusta silloin, kun koodirivistä uhkaa muuten tulla liian pitkä.
Ehtolauseiden käyttö¶
- huono: Ehtolauseiden
elif
- jaelse
-osien käyttö puuttuu kokonaan tai on hyvin vajavaista. Vastaavastiand
- jaor
-operaattorit eivät ole hallussa. Näistä johtuen ehtolauseet näyttävät todella hankalilta. Ylipäätään ehtolauseet saattavat toimia enemmänkin vahingossa kuin tarkoituksella. - hyvä: Pääosin ehtolauseet ovat järkeviä. Tämä tarkoittaa sitä, että
elif
- jaelse
-osia on osattu käyttää, kuten myös sisäkkäisiä ehtolauseita sekä em. loogisia operaatioita. Ehtolauseet saattavat kuitenkin olla vähän huteran näköisiä ja tarpeettoman monihaaraisia. - erinomainen: Ehtolauseet ovat nättejä ja ytimekkäitä. Kaikkia em. keinoja on käytetty siten, että ne parantavat koodin luettavuutta ja mahdollistavat erilaisten tilanteiden tunnistamisen siten, että käyttäjällekin pystytään kertomaan, mitä pelissä tapahtuu.
Tietorakenteet (lue: listat, monikot, sanakirjat)¶
- huono: Tietorakenteita ei ole käytetty lainkaan, tai hyvin vähän. Tämä ilmenee koodissa siten, että siellä on paljon muuttujia, joiden nimessä on numero. Vähiä tietorakenteita on väärinkäytetty siinä määrin, että pahaa tekee.
- hyvä: Listoja ja kumppaneita on käytetty muodostamaan järkeviä tietorakenteita sellaisiin paikkoihin, joissa niitä selkeästi tarvitaan. Sellaisissa paikoissa, joissa tarve ei ole ilmeinen, on sen sijaan saatettu käyttää numeroituja muuttujia tai muita vastaavia keinoja.
- erinomainen: Tietorakenteita on käytetty ilmeisten paikkojen lisäksi silloin, kun niillä saa aikaan tiivimpää ja selkeämpää koodia. Myös sisäkkäiset tietorakenteet ovat selkeästi hallussa. Tietorakenteita on toteutuksen kannalta minimaalinen määrä.
Silmukoiden käyttö¶
- huono: Kaikki silmukat on tehty samaan muottiin, vaikka väkisin. Esimerkiksi kaikki silmukat on voitu tehdä
while True
-muottiin, vaikka siellä käytäisiin sisällä läpi listaa. - hyvä: Silmukoissa on osattu tunnistaa milloin tarvitaan
while
a ja milloinfor
ia. Silmukkamuuttujien käyttöfor
-lauseissa saattaa olla vähän hakusissa, ja silmukointi ei välttämättä ole optimaalista. - erinomainen: Silmukat ovat tehokkaita, ja niiden määrä sekä niissä pyörittyjen kierrosten määrä on pääasiassa juuri sen verran kuin on tarpeen eikä yhtään ylimääräistä. Silmukkamuuttujia käytetään hyvin – erityisesti sisäkkäisten listojen tapauksessa – ja temput kuten enumerate ovat hallussa, jos niitä tarvitaan.
Funktioiden käyttö¶
- huono: Ei lainkaan funktioita, tai funktioita on käytetty lähinnä funktioiden käyttämisen vuoksi. Funktiot eivät millään järkevällä tavalla jaa ohjelmaa toiminnallisiin kokonaisuuksiin. Argumenttien käyttöä on liberaalisti kierretty käyttämällä globaaleja muuttujia.
- hyvä: Funktiot jakavat ohjelman loogisiin kokonaisuuksiin, vaikka kokonaisuudet saattavat ollakin ajoittain turhan suuria. Argumenttien ja paluuarvojen käyttö on ymmärretty oikein. Mahdollinen globaalien muuttujien käyttö on rajallista ja perusteltavissa.
- erinomainen: Funktiot on jaettu siinä määrin hyvin, että ne kaikki ovat miellyttävän lyhyitä ja selkeästi rajattuja toiminnaltaan. Ainoastaan pääohjelma tai -funktio voi olla hieman lihavampi. Sekin on kuitenkin järjellisissä rajoissa. Argumenttien kuskaus funktiosta toiseen on tehty järkevästi siten, ettei kaikkea tarvitse raahata joka paikkaan. Jos globaaleja muuttujia on käytetty, niiden käyttö on perusteltu.
Moduulien käyttö¶
- huono: Moduuleja ei ole käytetty lainkaan, minkä takia ohjelma ei edes toimi toivotulla tavalla. Nollan pisteen arvoinen suoritus on myös käyttää pelkästään
from import
ia vaikkei siinä olisi mitään järkeä. - hyvä: Tarvittavat moduulit on löydetty ja niitä on osattu käyttää.
- erinomainen: Ohjelmassa on osattu käyttää moduulien hieman kehittyneempiä ominaisuuksia (esim. time-moduulin muotoilufunktiot) tai on käytetty jotain uutta moduulia lisäominaisuuden tekemiseen. Oma koodi on jaettu moduuleihin, jos se on tarpeen (tiiviin koodin tapauksessa yleensä ei ole!)
Virheenkäsittely¶
- huono: Ohjelmassa ei ole lainkaan virheenkäsittelyä, joten aina kun jotain menee pieleen käyttäjälle heitetään Pythonin virheilmoitusräjähdys. Ohjelma ei muutenkaan selviä virhetilanteista hajoamatta, mikä voi kaatumisen lisäksi ilmetä sellaiseen tilaan joutumisella, että siitä ei päästä pois.
- hyvä: Virheet on pääasiassa käsitelty joitain eksoottisia tapauksia lukuunottamatta. Käyttäjällä on jonkinlainen haju siitä miten tulee toimia, ettei ohjelma hajoile. Virheenkäsittelymenetelmät eivät aina ole sieltä optimaalisimmasta päästä.
- erinomainen: Virheenkäsittelymenetelmät on valittu järkevästi siten, että käyttäjälle saadaan aina mahdollisimman hyvää tietoa vikatilanteessa. Pääasiassa
try
-lohkot sisältävät hyvin minimaalisen määrän koodia. Ohjelma osaa käsitellä eksoottisetkin ongelmatapaukset.
Palautus¶
Arvostelutilaisuus¶
Kurssin hyväksymiseen vaaditaan, että opiskelija on käynyt työn tarkastaneen assistentin kanssa n. 15 minuutin pituisen keskustelun lopputyön tekemisestä kurssin viimeisellä viikolla. Ajanvaraus julkaistaan myöhemmin.