Harjoitus 1
3) Oma vuokaavio, Jorma. Omien algoritmien lukeminen oli taas kerran virkistävää. Tähän tehtävään ei annettu nollia. Yleisin mallinnettu teema oli ruoan tai juoman valmistaminen ja nauttiminen. Monessa palautuksessa oli silmukka, mistä kehut. Kaavioissa oli jonkin verran suuntaamattomia nuolia. Kaavion mallintaman algorimin tarkoitus on hyvä lausua sanallisesti, esimerkiksi ”Algoritmi oluen jäädyttämiseen”, vaikka monesti kaavio on myös tarkoituksensa itse selittävä.
6) Nopeuden laskeminen, Kimmo. Tehtävä arvioitiin rennosti. Piste tuli hyvästä yrityksestä. Piste nollaantui lähinnä vain, jos laskennasta puuttui enemmän välivaiheita.
7) Kertolaskun harjoittelu, Kari. Tämänkin tehtävän arvioinnissa otettiin rento linja, koska ohjelmointi on uusi asia. Jos esimerkiksi lukujen tulostus oli unohtunut tai symboleissa oli pienehköä vikaa, niin ratkaisu päästettiin läpi. Mallivastauksiin on syytä tutustua, koska pikkuvikoja oli paljon. Nollat tulivat hyvin puutteellisista tai selvästi väärin toimivista kaavioista.
Harjoitus 2
4) Toinen buginen ohjelma, Kari. Nollia tuli vain WETOn hylkäämille ratkaisuille. Tulostelauseessa valmiina ollut pintaAla-muuttuja aiheutti hieman hämmennystä ja väärinymmärryksiä, joista ei rangaistu.
5) Kolme muuttujaa, Kimmo. Ratkaisut olivat pääasiassa siistiä jälkeä. Sisennyksissä oli osalla pientä heittoa. Muutamassa ratkaisussa ohjelmaan oli lisätty arvojen lukeminen. Ylimääräisestä työstä ei rankaistu.
7) Ajatelman lukeminen ja tulostaminen, Jorma. Tarkistaja korjasi pienien tulostusongelmien vuoksi testeissä hylätyt työt kuntoon, koska kyseessä oli ensimmäinen automaattitarkistettu tehtävä. Suuremmat ongelmat, kuten käännösvirheet, johtivat nollattuun pisteeseen. Ohjelmien tyylissä oli odotetusti jonkin verran ongelmia. Monessa ohjelmassa oli vain WETOn pakottama kommentti ja main-metodin sisennys puuttui toisinaan. Sisennys oli kuitenkin kokonaisuutena hyvin tehty. On huomattava, että luokan otsikon sisältävä rivi tulee aloittaa editorin ikkunan vasemmasta reunasta, vaikka editori ehdottaisi muuta. Main-metodin kootun lauseen sulkeva sulje tulee kirjoittaa samaan sarakkeeseen, josta kootun lauseen avaavan sulkeen sisältävä rivi alkaa. Tyhjiä ”välirivejä” oli jonkin verran väärissä paikoissa. Välirivi on tarkoitettu erottamaan ohjelman ”teemoja” toistaan. Välirivejä ei tule tehdä jokaisen lauseen tai kommentin jälkeen eikä silloin, kun peräkkäisillä riveillä on kootun lauseen sulkevia aaltosulkeita.
Harjoitus 3
5) Vuodenajat switch-case-lauseella, Kimmo. Tehtävä oli sen verran yksiselitteinen ettei siinä ollut erityistä esille nostettavaa. Osassa ratkaisuja tulostettiin switch-case-rakenteessa, osassa ratkaisuissa tulos otettiin rakenteessa ylös ja tulostettiin lopussa. Pääasiassa siistiä koodia, mutta muutama ratkaisu pisti silmään, koska niissä ei ollut laisinkaan sisennystä.
7) Kertotaulu, Kari.Tehtävässä haettiin jälkiehtoista silmukkaa (do-while), koska vuokaaviossa päätös on silmukan lopussa, mutta yllättävän moni oli valinnut esiehtoisen silmukan (while tai for). Scanner-luokkaa oli käytetty poikkeuksellisen paljon. Tässä on uhka, jos käytetään esimerkiksi rivin lukemista ja parseInt-metodia ilman tarkistuksia. Toki tehtävässä sai olettaa, että syöte on numero.
8) ASCII-kala, Jorma. Ohjelmat olivat pitkälti toimivia, vaikka muotoon pakottavaa tarkistusautomaattia ei ollut. Yleisin tyyliongelma oli kommenttien puute. Kevyesti kommentoiduissa ohjelmissa oli usein alussa hyvä lohkokomentti, jossa on tehtävän ja tekijän tiedot, mutta ohjelman rungossa ei ollut kommentteja. Sisennysten kanssa oli isompaa ongelmaa noin neljäsosassa palautuksia. Muutamassa palautuksessa oli koodin toistoa siten, että kuplia tulostavassa silmukassa laskuria päivitettiin kunkin valinnan sisällä. Laskurin päivitys on parasta tehdä selkeyden vuoksi ja virhemahdollisuuksien vähentämiseksi yhdellä lauseella, mikäli vain mahdollista.
Harjoitus 4
3) Sahalaidan tulostus for-silmukalla, Kari.Kaikki hylätyt työt olivat Weton hylkäämiä. Tarkistajan iloksi kaikissa tarkistetuissa oli käytetty pyydetysti for-silmukkaa. Parissa palautuksessa oli if-else-rakenne jossa tutkittiin parillinen ja pariton lukumäärä omissa for-silmukoissaan, jolloin ohjelmassa on tarpeettoman paljon sisältöä (koodin toistoa), koska silmukat ovat lähes samoja.
5) Sulkeiden parit loogisia operaatioita käyttäen, Kimmo. Ratkaisut oli tehty hyvin pyydetyllä tavalla ehtolausekkeita loogisilla operaattoreilla yhdistäen.
7) BizzBuzz-peli, Jorma. Pelisimulaattoria oli tehty melko ahkerasti. Ratkaisuissa oli odotetusti aloitteleville ohjelmoijille tyypillisiä pieniä ja suurempia rakenneongelmia. Rakenteellisesti selvin parantamisen paikka löytyi jonon viimeisen luvun lausumisesta, jossa oli usein päädytty silmukoimaan n – 1 kertaa ja kopioimaan silmukan sisäinen päätösrakenne silmukan jälkeen, jotta viimeinen luku voitiin tulostaa pisteen kanssa. Näin koodia ”monistaen” ohjelmasta tulee selvästi pitempi kuin on tarpeen ja samalla sen luettavuus ja ylläpidettävyys kärsivät. Koodia oli monistettu myös siten, että kaikkien neljään tulostusvalinnan sisään oli tehty if-else-lause, jolla päätettiin tulostetaanko erottimen vai pisteen kanssa, jolloin if- ja else-osien sisällöt olivat lähes samat.
Ohjelma napakoituu selkeästi, jos erottimen ja pisteen välillä valitaan silmukan sisällä (katso mallivastaus) tai jos luku 1 tulostetaan ennen silmukkaa, piste silmukan jälkeen ja silmukan sisässä tulostetaan ensin erotin ja sitten luvun jaollisuuden määrämä tuloste. Pienemmässä määrin turhaa koodia oli ehtolausekkeissa, joita tarvittiin paljon varsinkin, jos ongelma oli ratkaistu peräkkäisillä if-lauseilla. Sisäkkäisillä if-else-lauseilla luvun lausumisen sellaisenaan voi jättää viimeisen else-osan huoleksi, kun tunnistaa ensin järjestyksessä onko luku jaollinen kolmella ja viidellä (ensimmäinen if), kolmella (toinen if) tai viidellä (kolmas if). Älä masennu, jos omassa ratkaisussasi oli liikaa koodia, koska tiivistetympiä ohjelmia harjautuu tekemään lopulta vasta kokokemuksen kautta.
Ohjelmat olivat hyvin sisennettyjä. Toisaalta kommenteissa oli säästelty. Monessa ratkaisussa oli vain yleinen lohkokommentti. Main-operaation sisällä olevissa kommenteissa oli kerrottu harvoin ohjelman vaikeimmista kohdista, joita kommenteilla pitäisi erityisesti avata. Kommenteista pitäisi käydä ilmi millä periaatteella päätellään missä muodossa luku tulostetaan ja kuinka valitaan erottimen ja lopettimen välillä.
Harjoitus 5
1) Sisennys, Kimmo. Tehtävä meni kokonaisuutena hyvin; useassa ratkaisussa ei sisennysvirheitä näkynyt laisinkaan. Yksi tai kaksi pienempää virhettä annettiin anteeksi.
2) Parittomien laskeminen, Kari. Ohjelman korjaaminen osoittautui vaikeaksi. WETO hylkäsi suurimman osan palautettaessa edelleen rikki olleista ohjelmista. Tarkistuksessa tultiin vastaan siten, että vaillinaista kommenteista tai tarpeettomista muutoksista ei annettu nollaa. Parissa ohjelmassa do-while ehtoa oli muokattu siten, että jatkettiin kun inputOK == true. Tämä johtaa lukijaa harhaan, koska syötettä tulisi kysyä uudelleen, kun se ei ole kunnossa (inputOK == false). Parissa ratkaisussa oli lisätty tarpeeton if ennen for-silmukkaa:
// Valinta tarpeeton, koska esiehto estää silmukan suorittamisen, // kun numOfInts <= 0. if (numOfInts > 0) for (int i = 0; i < numOfInts; i++) {
3) Arvosanan laskeminen, Jorma. Valtaosa (noin 75 %) ohjelmista oli tehty tyylikkäästi. Yleisin hylkäyksen syy oli sisennys, joka puuttui toisinaan main-operaatiosta ja toisinaan, kun if- tai else-kohtaan liittyi yksi lause. Esimerkki jälkimmäisestä ongelmasta:
... else { if (...) { // Alla olevasta lauseesta puuttuu sisennys. System.out.println(...); } ...
Jonkin verran löytyi ohjelmia, joissa ei ollut lainkaan komentteja main-operaation sisällä. Hyväksymisen ja hylkäämisen rajatapauksissa oli pientä horjuvuutta sisennyksissä, kevyehköä kommentointia ja tarpeettomia välirivejä erityisesti ennen main-operaation kootun lauseen sulkevaa aaltosuljetta.
Harjoitus 6
1) Sisennys, Kari. Tehtävä oli osattu hyvin. Yksittäisiä pieniä virheitä löytyi monestakin, mutta näistä ei pisteitä nollattu.
3) Ensimmäisen tai viimeisen merkin poisto, Kimmo. Tämäkin tehtävä oli hyvin tehty. Nollia tuli vain kiellettyjen menetelmien – lähinnä substring-operaation – käytöstä. Tehtävän koodia voi käyttää vapaasti Lausekielinen ohjelmointi II -kurssin ensimmäisessä harjoitustyössä, jossa voi olla helpompaa ensin poistaa asteriski osamerkkijonosta kuin huomioida se myöhemmin haussa.
6) Tinkaaja, Jorma. Tehtävä täytti hyvin tarkoituksensa. Tyylitarkistusvaroitus oli huomioitu ottamalla sisennys ja kommentointi haltuun erinomaisesti. Main-operaation rungossa oli kommentteja välillä melkein liikaakin. Sisennys oli paria pientä virhettä lukuun ottamatta juuri niin kuin piti. Nähtyjen ratkaisujen perusteella tehtävän tarkistaja uskoo, että tehtävän koodin voi kierrättää hieman muokattuna Lausekielinen ohjelmointi II -kurssin ensimmäiseen harjoitustyöhön ilman, että tyyliseikoista tulee myöhemmin sanomista.