========================================================================= 1. välikokeen (4.11.96) tarkastusselostus ========================================================================= Tarkastajat: 1. Allan Halme 2. Arto Wikla 3. Satu Eloranta 4. Pasi Huhtiniemi 5. Allan Halme Joissakin tehtävissä on käytetty miinuksia (=0.25) ja puolikkaita. Loppupisteet on pyöristetty ylöspäin. ========================================================================= 1. ========================================================================= From: Allan To: Arto Wikla Subject: Tarkastusselostus t1 ja t5 Date: Wed, 4 Dec 1996 12:17:07 +0200 (EET) Ohjelmointi (Pascal) --- Ensimmäinen välikoe Tehtävien 1 ja 5 korjausmuistiinpanoja Allan Halme Luetellut yleisimmät virheet eivät ole mitenkään minkäänlaisessa järjestyksessä. TEHTÄVÄ 1 ========= Esimerkkiratkaisut: a) ( ln(a) / sqrt(x-y) < abs(sin(z)/cos(z)) ) and ( abs(sin(z)/cos(z)) < sqrt(m*m*m/(n*n*n) + 5 ) b) (m mod 3 <> 0) and (m mod 5 <> 0) and (m mod 7 <> 0) c) ((-10 < x) and (x < 30)) <> (y = 67) Ratkaisuja on toki useampiakin ... Yleisimmät virheet ----------------------------------------------- a) - Vertailuoperaatioiden ketjutus, eli käytety a< - abs puuttuu - Unohdettu sulut funktiokutsussa, eli esimerkiksi kutsuttu sin z ja cos z, kun pitäisi olla sin(z) ja cos(z) - Käytetty tan(z), jota ei ole (p.o. sin(z)/cos(z) - Potenssiinkorotusta a^n ei ole! a^n = exp(n * ln(a)) - Sulutus. Lausekkeet ((a < b) and (b < c)) ja (a < b and b < c) ovat erilaisia; kääntäjä suluttaa toisen näin: (a < (b and b) < c), koska and:illä on suurempi presedenssi kuin <:lla. - Kirjoitettu lausekkeita, eikä lauseita - Kirjoitettu =< kun pitäisi olla <= - käytetty log eikä ln - käytetty [ ja ] m - Kirjoitettu jakolasku ---, eikä n m/n, niin kuin pitäisi b) - Kirjoitettu lauseita eikä lausekkeita - Erinäistä pientä c) - XOR:in käyttö <>:n sijasta - Sulutus kuten a)-kohdassa. - Muut ========================================================================= 2. ========================================================================= Arto Wikla, 4.11.96 'malli': fuction Sekunteina(tun, min, sek:integer): integer; begin Sekunteina := 3600*tun + 60*min + sek end; pistejakauma: 3: 68 % 2: 5 % 1: 12 % 0: 11 % 'kolmen pisteen' virheitä: - ei parametreja 'kahden pisteen' virheitä: - Hämminkiä negatiivisten kanssa, itseisarvojen ottamista. Tarkoitus oli helpottaa tehtävää tuolla 'voivat olla negatiivisia'. (Negatiivisia aikoja voi olla esim. kellokorttikirjanpidossa tms.) - writeä tai readia - ei sijoitusta "Sekunteina := ..." - tahatonta rekursiota: "Sekunteina := Sekunteina + ..." - begin-end puuttuu - arvon palautus parametrina 'yhden pisteen' virheitä: - begin tai end puuttuu - funktion tyyppi puuttuu - piste kertomerkkinä - esimerkkikutsu proseduurimuodossa - parametrien tyyppi puuttuu - funktion tyyppi real - jaetaan, ei kerrota - kertoimet real-tyyppiä - 60:n toiseen potensiin korotus yläindeksinä tai ^-merkkinä - tunti on 1200 tai 360 sekuntia - parametrit määritelty uudelleen paikallisina muuttujina 'nollan pisteen' virheitä: - Turbon longint - parametrit real, kunhan sitten roundataan - puolipisteiden puuttumiset - var-parametrit Pisteiden yhteenlaskuaritmetiikka ei ole välttämättä matematiikasta tuttua: Esimerkikiksi 2+2 miinuspistettä on vain 3. ========================================================================= 3. ========================================================================= From: Satu Eloranta To: Arto Wikla Subject: Re: O(P):tarkastusselostukset Date: Wed, 4 Dec 1996 10:02:03 +0200 (EET) Tehtävä 3. Muodolliset parametrit - arvoparametri on paikallinen muuttuja, joka saa alkuarvokseen kutsussa esiintyvän lausekkeen arvon - muuttujaparametri on paikallinen aliasnimi kutsussa esiintyvälle muuttujalle Kutsuparametrit - arvoparametria vastaavan kutsuparametrin on oltava (sopivan tyyppinen) lauseke - muuttujaparametria vastaavan kutsuparametrin on oltava (oikean tyyppinen) muuttuja Näistä neljästä kohdasta sai vastaavasti neljä pistettä. Tyyppiyhteensopivuudet eivät kuuluneet koealueeseen, joten niistä ei vaadittu tietoa. ========================================================================= 4. ========================================================================= From: Pasi Huhtiniemi To: Arto Wikla Subject: Re: O(P):tarkastusselostukset Date: Tue, 3 Dec 1996 17:15:38 +0200 (EET) Ohjelmointi (Pascal) 1. välikoe 4.11.1996/AW 4. tehtävä, tarkastaja Pasi Huhtiniemi Ratkaisuehdotuksia ja arvosteluperusteita: procedure LaskeSkandit(var lkm : integer; var ka : real); var riveja : integer; merkki : char; begin riveja := 0; lkm := 0; ka := 0; {1. vaihtoehto } while not eof do begin while not eoln do begin read(merkki); if merkki in ['å','ä','ö','Å','Ä','Ö'] then lkm := lkm + 1; end; readln; riveja := riveja + 1; end; {1. vaihtoehto } if riveja > 0 then ka := lkm / riveja; end; {2. vaihtoehto } while not eof do if eoln then begin readln; riveja := riveja + 1; end else begin read(merkki); if merkki in ['å','ä','ö','Å','Ä','Ö'] then lkm := lkm + 1; end; {2. vaihtoehto (ja onhan niitä tietty muitakin) } Yleisimpiä virheitä ja pistemäärät, jotka ne suunnilleen veivät: 1-4p: väärien lukujen laskeminen (jolloin koodi yleensä _puutteellinen_) ~2p: read(merkki) väär(ä/i)ssä paik(oi/a)ssa (EOF/EOLN testaus ei toimi) ~2p: repeat .. until rakenteen käyttö (ei yhtään toimivaa ratkaisua) >1p: epäonnistunut yhden silmukan ratkaisu (pari toimivaakin oli!) ~1p: muuttujien/parametrien määrittely - pelkkä INPUT tai VAR(it) puuttuu - muuttujien alustus puuttuu/väärässä paikassa ~1p: begini(e)n puuttuminen ~1p: EOLN pois lukeminen unohdettu/väärässä paikassa/writeln mukana(?!) <1p: keskiarvon laskemisen puutteet - 0-jaon mahdollisuus (tyhjä tiedosto) huomiotta! - ei käytetty DIV:iä, jos keskiarvo integer Muuta pientä: - ka := lkm/riveja:1:2 (kentän leveydet liittyy tulostukseen!) - joukko kuvattu väärin: [å,ä,ö,Å,Ä,Ö] eli ilman hipsuja tai kaarisuluilla - ; puuttuu, var merkki := char, if a := b then... - EOL, p.o. EOLN - rivilaskuri alustettu yhdelle vaikka se on nolla Tukkimiehen kirjanpidolla saatu pistejakauma (puolikkaat pyör. ylöspäin) 5p: 79 4p: 89 3p: 74 2p: 80 1p: 20 0p: 22 (hmm... jostain on kertynyt ~10kpl liikaa) ========================================================================= 5. ========================================================================= TEHTÄVÄN 5 ========== Yksinkertaisimmillaan ohjelma voisi olla seuraavanlainen: Suunnittelu ^^^^^^^^^^^ begin alkutervehdys repeat luetaan luvut luetaan vastaus if vastaus oli oikein then onnitellaan muuten tulostetaan oikea vastaus kysytään jatketaanko until ei enää jatketa end Toteutus ^^^^^^^^ program KertolaskunHarjoittelu(input, output); var luku1, luku2, veikkaus : integer; c : char; begin writeln('Tervetuloa kertolaskun harjoitteluohjelmaan'); repeat write('Anna ensimmäinen luku: '); readln(luku1); write('Anna toinen luku: '); readln(luku2); write('Anna näiden tulo: '); readln(veikkaus); if (veikkaus = luku1 * luku2) then writeln('Vastaus oli oikein!') else writeln(luku1:1, '*', luku2:1, ' on ', luku1*luku2:1); write('Jatketaanko [k/e]? '); readln(c); until not (c in ['k','K']); writeln('Heippa!'); end. { KertolaskunHarjoittelu } Yleisimmät virheet -------------------------------------------------- - Suunnittelu puuttui (ehkä yleisin virhe) - unohdettu heittomerkit (') merkin ympäriltä - puolipiste käytetty ennen elseä - vertailuoperaationa käytetty ':=' - käytetty ":tä ':n sijaan - puolipisteitä puuttuu - begin tai end puuttuu (tai on ylimääräisiä - eli enemmän endejä kuin beginnejä tai toisin päin) - käytetty pistettä tai x:ää'*' sijaan - ohjelmaa on rajoitettu jollakin tavalla, joka ei ole mainittu tehtävässä - virhe ehtolausessa, esimerkiksi 'while x = ('k' or 'K')' tai 'jatko not in [{joukko}]' - käytetty laittomia merkkejä (_öäå jne) - alaindeksien käyttö - readln väärässä kohdassa - repeatin until-osa väärässä kohdassa - rekursion (väärin)käyttö - ikuinen silmukka - sisennys puutteellinen - var käytetty useammin kuin kerran (lohkossa) (tai puuttuu) - määrittelemättömän tai alustamattoman muuttujan käyttö - silmukan puuttuminen kokonaan - ohjelmaa kutsuttu nimellään kuten ali- ohjelmaa - case kaatuu eli kaikki vaihtodehdot ei ole huomioitu - syntaksivirhe - muuttujan esittelysyntaksissa virhe - aliohjelmakutsu 'procedure nimi' tai 'function nimi' - ei tulosteta tulon oikeata vastausta - funktiokutsusta puuttuu sulut - else-haara ilman lauseosaa - Turbo-piirre käytetty (readkey) - ohjelmassa rakennevirhe - aliohjelmakutsusta puuttuu parametrit - määrittelemättömän proseduurin kutsu - heittomerkki- ja/tai pilkkuvirheitä writelnissa ja readlnssa - (input, output) puuttu programista - funktion kutsuminen väärin (ei otettu paluuarvoa talteen mihinkään tai käytetty sitä ollenkaan -- kutsuttu samoin kuin proseduuria) - kutsuttu (esim) funktiota Tulo(x,y) mutta ei oteta paluuarvoa; sitten tehty (esim) vertailu if vastaus=Tulo ... - muu looginen ohjelmavirhe =========================================================================