ITKP102 Ohjelmointi 1 (6 op), arvosteluraportti

Samankaltaiset tiedostot
ITKP102 Ohjelmointi 1 (6 op), arvosteluraportti

ITKP102 Ohjelmointi 1 (6 op)

ITKP102 Ohjelmointi 1 (6 op), arvosteluraportti

ITKP102 Ohjelmointi 1 (6 op), arvosteluraportti

ITKP102 Ohjelmointi 1 (6 op), arvosteluraportti

ITKP102 Ohjelmointi 1 (6 op), arvosteluraportti

ITKP102 Ohjelmointi 1 (6 op), arvosteluraportti

ITKP102 Ohjelmointi 1 (6 op)

ITKP102 Ohjelmointi 1 (6 op)

ITKP102 Ohjelmointi 1 (6 op), arvosteluraportti

ITKP102 Ohjelmointi 1 (6 op)

ITKP102 Ohjelmointi 1 (6 op), arvosteluraportti

Pisteytys: Eri kommentointitavat tiedetty: 0,5 pistettä, jos puuttuu niin ei voinut saada täysiä pisteitä.

Ohjelmointi 1 C#, kevät 2014, 2. uusintatentti NIMI:

1. Mitä tehdään ensiksi?

Ohjelmointi 1 C#, kevät 2013, 2. tentti

Pong-peli, vaihe Aliohjelman tekeminen. Muilla kielillä: English Suomi. Tämä on Pong-pelin tutoriaalin osa 3/7. Tämän vaiheen aikana

Olio-ohjelmointi Javalla

Apuja ohjelmointiin» Yleisiä virheitä

Harjoitus Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti:

Operaattoreiden ylikuormitus. Operaattoreiden kuormitus. Operaattoreiden kuormitus. Operaattoreista. Kuormituksesta

Ohjelmassa henkilön etunimi ja sukunimi luetaan kahteen muuttujaan seuraavasti:

Ohjelmoinnin perusteet Y Python

Informaatioteknologian laitos Olio-ohjelmoinnin perusteet / Salo

Ohjelmointi 2 / 2010 Välikoe / 26.3

Ohjelmointi 1 / 2009 syksy Tentti / 18.12

Ohjelmoinnin jatkokurssi, kurssikoe

Pong-peli, vaihe Aliohjelmakutsu laskureita varten. 2. Laskurin luominen. Muilla kielillä: English Suomi

58131 Tietorakenteet ja algoritmit (syksy 2015)

Sisällys. 1. Omat operaatiot. Yleistä operaatioista. Yleistä operaatioista

Java-kielen perusteet

12. Javan toistorakenteet 12.1

Ohjelmointi 1 C#, kevät 2013,

1. Omat operaatiot 1.1

Ohjelmointitaito (ict1td002, 12 op) Kevät Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen

17. Javan omat luokat 17.1

Ohjelmoinnin perusteet Y Python

12. Javan toistorakenteet 12.1

Koottu lause; { ja } -merkkien väliin kirjoitetut lauseet muodostavat lohkon, jonka sisällä lauseet suoritetaan peräkkäin.

Kompositio. Mikä komposition on? Kompositio vs. yhteyssuhde Kompositio Javalla Konstruktorit set-ja get-metodit tostring-metodi Pääohjelma

Sisältö. 2. Taulukot. Yleistä. Yleistä

Taulukot. Jukka Harju, Jukka Juslin

Ohjelmoinnin perusteet Y Python

Pong-peli, vaihe Koordinaatistosta. Muilla kielillä: English Suomi. Tämä on Pong-pelin tutoriaalin osa 2/7. Tämän vaiheen aikana

Ohjelmoinnin perusteet, kurssikoe

Metodien tekeminen Javalla

Yleistä. Nyt käsitellään vain taulukko (array), joka on saman tyyppisten muuttujien eli alkioiden (element) kokoelma.

Mikä yhteyssuhde on?

Java kahdessa tunnissa. Jyry Suvilehto

Tietorakenteet ja algoritmit syksy Laskuharjoitus 1

Ohjelmointi 1 C#, kevät 2014, tentti

Sisältö. 22. Taulukot. Yleistä. Yleistä

Ohjelmointi 2, välikoe

7. Näytölle tulostaminen 7.1

Ohjelmointi 1 Taulukot ja merkkijonot

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä. Tiedonkätkentä. Aksessorit. 4.2

Vertailulauseet. Ehtolausekkeet. Vertailulauseet. Vertailulauseet. if-lauseke. if-lauseke. Javan perusteet 2004

Ohjelmistotekniikan menetelmät, koe

812341A Olio-ohjelmointi Peruskäsitteet jatkoa

1. Miten tehdään peliin toinen maila?

20. Javan omat luokat 20.1

Sisällys. 20. Javan omat luokat. Java API. Pakkaukset. java\lang

17. Javan omat luokat 17.1

11. Javan toistorakenteet 11.1

Luokka Murtoluku uudelleen. Kirjoitetaan luokka Murtoluku uudelleen niin, että murtolukujen sieventäminen on mahdollista.

Ohjelmointitaito (ict1td002, 12 op) Kevät Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen

ITKP102 Ohjelmointi 1 Tentti

Ohjelmoinnin perusteet Y Python

Metodit. Metodien määrittely. Metodin parametrit ja paluuarvo. Metodien suorittaminen eli kutsuminen. Metodien kuormittaminen

Sisällys. 12. Javan toistorakenteet. Yleistä. Laskurimuuttujat

Ohjelmoinnin perusteet Y Python

Tietorakenteet. JAVA-OHJELMOINTI Osa 5: Tietorakenteita. Sisällys. Merkkijonot (String) Luokka String. Metodeja (public)

7. Oliot ja viitteet 7.1

Java-kielen perusteet

1 Tehtävän kuvaus ja analysointi

// Tulostetaan double-tyyppiseen muuttujaan "hinta" tallennettu // kertalipun hinta ja vaihdetaan riviä. System.out.printf("%.1f euros.

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin perusteet Y Python

C:\MyTemp\ohj1\ohjdemot\k2012\demot\vastaukset\demo11\PP1\TokaPisin.cs 1 using System; 2 using System.Collections.Generic; 3 using System.

Tietorakenteet (syksy 2013)

Ohjelmoinnin perusteet Y Python

Tehtävä 1. Tehtävä 2. Arvosteluperusteet Koherentti selitys Koherentti esimerkki

Olio-ohjelmointi Syntaksikokoelma

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä ja ulkopuolelta. Attribuuttien arvojen käsittely aksessoreilla. 4.2

Ohjelmoinnin peruskurssi Y1

Javan perusteita. Janne Käki

Java-kielen perusteet

1. Taustatietoa näppäimistönkuuntelusta

Olion elinikä. Olion luominen. Olion tuhoutuminen. Olion tuhoutuminen. Kissa rontti = null; rontti = new Kissa();

IDL - proseduurit. ATK tähtitieteessä. IDL - proseduurit

Java-kielen perusteita

13. Loogiset operaatiot 13.1

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin perusteet Y Python

Luokat ja oliot. Ville Sundberg

Sisällys. 11. Javan toistorakenteet. Laskurimuuttujat. Yleistä

Ohjelmointi 2 / 2011 Välikoe / 25.3

Ohjelmoinnin perusteet Y Python

C-kielessä taulukko on joukko peräkkäisiä muistipaikkoja, jotka kaikki pystyvät tallettamaan samaa tyyppiä olevaa tietoa.

Ohjelmoinnin peruskurssi Y1

Transkriptio:

ITKP102 Ohjelmointi 1 (6 op), arvosteluraportti Tentaattori: Antti-Jussi Lakanen 20. huhtikuuta 2018 Yleistä Tentti 1 oli pistekeskiarvon (13.8) perusteella vaikeudeltaan keskitasoa. Omasta tehtäväpaperista saa kopion Antti-Jussilta, huone C414.2. Laita sähköpostia tai soita 040 805 3276 etukäteen. Uusintojen ajankohdat löydät kurssin Korppi-sivulta. Tehtävä Teki Keskiarvo Keskihajonta Tarkastaja T1 185 3.29 1.93 Panu Lappalainen T2 182 4.20 1.85 Oscar Calderon T3 178 2.96 1.25 Antti-Jussi Lakanen T4 178 3.24 2.06 Mikko Häyrynen Yht 13.8 5.64 Arvosteluasteikko Arvolause Pistemäärä (alaraja) 5 24 4 21 3 18 2 15 1 12 1 http://users.jyu.fi/~anlakane/ohjelmointi1/tentit/2018-04-20-tentti1.pdf 1

Tehtävä 1 (Tarkastaja: Panu Lappalainen) Yleiset huomiot 30 Opiskelijaa 20 10 0 0 0.5 1 1.5 2 2.5 3 3.5 4 4.5 5 5.5 6 Pistettä Tehtävässä piti numeroida rivit malliratkaisun mukaisesti ja antaa esimerkki jokaisesta rivistä. Myös sisennys ja kirjainkoko merkitsi arvioinnissa. Malliratkaisu 2. using System; 5. public class Tehtava1 8. 1. public static void Main() 10. 3. int x; 7. Random random = new Random(); 6. x = random.next(1, 7); 4. Console.WriteLine(x); 11. 9. Rivikohtaiset huomiot: 2. Konsolin ja Random-olion käyttö vaatii System-kirjaston, eikä siten esim. System.Text riittänyt. Turhien kirjastojen käyttöönotosta ei rangaistu. Tyhjä rivi ei ollut pakollinen. 5. Luokan ja Random-olion nimen sai valita vapaasti kurssin nimeämiskäytänteiden mukaisissa rajoissa. Skandeista ei rangaistu, vaikkei niiden käyttöä suositellakaan. 3. Muuttujan nimi piti olla x, kuten tehtävänannossa sanottiin. Muuttujaan arvon sijoittamisesta tällä rivillä (esim. int x = 0) ei rangaistu. 7. Rivit 3 ja 7 voivat olla myös päinvastaisessa järjestyksessä, mutta muuttujat eivät voineet olla attribuutteja, koska Main on staattinen. 6. Funktiokutsussa tuli huomata, että Random-olion Next-funktion ensimmäinen parametri on inklusiivinen ja toinen parametri eksklusiivinen. Koska Jypeli.RandomGen.NextIntfunktiota käytettiin kurssin esimerkeissä varsin runsaasti, joten myös sen oikealla käytöllä saattoi saada maksimipisteet, vaikka rivi 7 (ja Jypeli-kirjaston käyttöönotto) olisi puuttunut kokonaan. 4. Muuttujan arvo piti tulostaa, ei palauttaa. 2

Pisteytys ja virheet Yleisimmät virheet (-0.5 pistettä kukin) random.next(1, 6) tai vastaavia virheitä liittyen parametrien arvoihin. Sisennys väärin. Muuttuja x nimetty väärin. Pääohjelmaa ei merkattu static- ja/tai void-avainsanoilla. Avainsana (public, new, using,... ) kirjoitettu väärin. Muita syntaksivirheitä (puuttuva tai ylimääräinen puolipiste, ylimääräisiä merkkejä using-lauseessa tai luokan esittelyrivillä, jne.) Olion luonnissa (Random-olion konstruktorin kutsu) tai Next-funktion kutsu kirjoitettu väärin, vääränlaiset sulkeet tai muu pienehkö kirjoitusvirhe. Väärä tyyppi (esim. double) tai tyyppi kirjoitettu myöhemmin saman muuttujan eteen (tämä määrittelee uudelleen muuttujan). Yleinen virhe oli kirjoittaa int sekä riville 3 että riville 6. Saman virhetyypin toistuessa virheestä rangaistiin vain kerran. Moni oli numeroinut rivit suuruusjärjestyksessä 1 11 eikä malliratkaisun mukaisessa järjestyksessä; tästä ei rangaistu mikäli rivit oli muuten tulkittu oikein. Oikea rivijärjestys tuotti tehtävälle vähintään yhden pisteen. Taulukko- ja listaviritelmät tuottivat parhaillaan 2.5 pistettä koko tehtävälle. Parametrien käyttö Random-olion alustuksessa rivillä 7 tuotti vastauskohtaisesti noin 4 pistettä. Dokumentoinnista ei saanut tai menettänyt pisteitä. Tehtävä 2 (Tarkastaja: Oscar Calderon) Yleiset huomiot 60 Opiskelijaa 40 20 0 0 0.5 1 1.5 2 2.5 3 3.5 4 4.5 5 5.5 6 Pistettä Tehtävän a-kohta oli osattu hyvin; neljä viidestä opiskelijasta vastasi oikein. Oikeaan vastaukseen riitti yksi kirjain, sanallisia perusteluita ei tehtävässä pyydetty eikä niitä arvioitu. Kohta b oli selvästi kaksijakoinen: nollaa ja kolmea pistettä tuli paljon. Ainoastaan itse funktio arvioitiin. Mainit, classit ja kaikki muu jätettiin arvostelussa huomiotta. B-kohtaa ratkaistiin sekä rekursiivisesti, että iteratiivisesti. Molemmilla tavoilla tuli paljon oikeita ja vääriä vastauksia. 3

Malliratkaisu a) Kuvio d b) Ratkaisu rekursion avulla: /// <summary> /// Laskee luvun kertoman. /// </summary> /// <param name="n">luku, jonka kertoma lasketaan.</param> /// <returns>kertoma</returns> public static int Kertoma(int n) if (n < 1) return 1; return n * Kertoma(n-1); b) Ratkaisu iteraation (silmukan) avulla: public static int Kertoma(int n) for (int i = n - 1; 1 < i ; i--) n = n * i; return n; Pisteytys ja virheet A-kohdasta oikeasta vastauksesta sai 3 p., väärä ja tyhjä antoi 0 p. B-kohdassa pisteitä annettiin seuraavasti: Funktio dokumentoitu kurssin käytäntöjen mukaisesti, 0.5 p. Esittelyrivi ja arvon palautus oikein, 0.5 p. Funktion varsinainen toteutus, 2 p. Virheitä oli monenlaisia, tässä muutamia yleisimpiä. Funktion tyyppiksi oli määritelty void (ei paluuarvoa), -0.5 p. return-lause puuttui, -0.5 p. Kuitenkin edellisen virheen kanssa yhdessä esiintyessään vähennystä tuli enintään -0.5 p. Lasku loppui yhden pykälän liian myöhään (kerrottiin palautettava luku lopuksi nollalla), -0.25 p. Lasku alkoi yhden liian aikaisin (kerrottiin alkuperäinen luku tulokseen kahdesti), -0.25 p. 4

Rekursio piti lopettaa palauttamalla return ja kertoman arvo, mutta jos kirjoitti vain kirjoittaneet return ilman arvoa. -0.25 p. param ja returns-kohtia puuttui dokumentaatiosta jonkin verran, -0.25 p. tai -0.5 p. Muita yksilöllisiä virheitä oli paljon, niistä sakotettiin vakavuuden mukaan. Parametrin nimi sai olla mitä tahansa. public tai static-sanan mukanaolo/puuttuminen ei vaikuttanut pisteisiin. Tehtävä 3 (Tarkastaja: Antti-Jussi Lakanen) Yleiset huomiot Tehtävä osoittautui aavistuksen haastavaksi. Erityisesti kohta 4 oli monille vaikea. 50 40 Opiskelijaa 30 20 10 0 0 1 2 3 4 5 6 Pistettä Malliratkaisu 1C, 2C, 3D, 4C, 5B, 6A. Kohta 1: Oikea vastaus oli C, jonka valitsi puolet vastaajista. Voi esimerkiksi kutsua if (OnkoAnagrammi("aajii"))... ilman että tulosta tallennetaan muuttujaan. C#:ssa bool-arvo on aina joko true tai false, toisin kuin joissain muissa kielissä, esimerkiksi C:ssä, jossa melkein mikä tahansa asia (muun muassa 0 tai 1) voi toimia bool-arvona. Kohta 2: Oikea vastaus oli C. Tämä meni hyvin, 85% tiesi vastauksen. Kohta 3: Oikea vastaus oli D, jonka valitsi noin puolet. Toiseksi yleisin valinta oli B, mutta se on väärin, sillä taulukon viimeisen alkion indeksi on Length-1. Kohta 4: Oikea vastaus oli C. Tämä oli varsin vaikea kysymys, ja vain 15% sai tästä pisteen. Luennolla näytettiin lyhyesti esimerkki ikuisen silmukan tekemisestä 5

for-silmukalla (alustus, toistoehto ja päivityslauseet tyhjänä), mutta vähintäänkin muut vaihtoehdot poissulkemalla tämä olisi pitänyt ratketa. Yleisin vastaus oli kuitenkin D. Kohta 5: Oikea vastaus oli B. Tämäkin oli vaikea, vain 22% antoi oikean vastauksen. Tässä oleellista on, että ennen kuin MerkkienMaara-funktiota kutsutaan, yhdistetään jono-muuttujan sisältö (merkkijono "1") lukuun 23, mutta kuitenkin niin, että luku 23 muutetaan ensin merkkijonoksi. Toisin sanoen, +-operaattori toimii merkkijonoja yhdistävänä operaattorina, koska toinen operandeista on merkkijono. Yleisin vastaus (63%) oli A. Voidaan spekuloida, onko mielekästä, että kielessä voi käyttää yhteenlaskuoperaattoria tällä tavalla (toinen operandi eri tyyppiä kuin toinen), mutta toisaalta se saattaa joissain tilanteissa se lyhentää koodia huomattavasti (vrt. String.Concat("1", 23.ToString())). Kohta 6: Oikea vastaus oli A, jonka tiesi 70% vastaajista. Toiseksi yleisin vastaus oli C, mutta se ei pidä paikkaansa; void-tyyppisessä aliohjelmassa voi olla returnlause, mutta tällöin sen perään ei laiteta mitään arvoa. Pisteytys ja virheet Oikeasta vastauksesta tuli 1 piste, väärästä tai tyhjästä tai usean vaihtoehdon valitsemisesta 0 pistettä. Tehtävä 4 (Tarkastaja: Mikko Häyrynen) Yleiset huomiot Tehtävässä tuli kirjoittaa funktio, joka laskee pankissa olevan talletuksen arvon N vuoden jälkeen käyttäen kaavaa P (1+R) N, missä P on alkupääoma, R on vuosittainen korko ja N on talletuksen pituus vuosina. Potenssiin korotusta ei saanut tehdä valmiilla funktiolla, kuten Math.Pow:lla, ja talletuksen keston sai olettaa olevan kokonaisia vuosia. Pistekeskiarvosta huolimatta tehtävä oli yleisesti ottaen haastavahko. Yleisimpiä virheitä olivat seuraavat: Ei käytetty toistorakennetta potenssin laskemiseksi, vaan se tehtiin ˆ-operaattorilla tai jopa matemaattisella yläindeksinotaatiolla. 6

Moni oli käsitellyt myös vuosia double-tyyppisenä, vaikka tehtävänanto kertoi käyttämään kokonaislukua. Lähes toimivissa ratkaisuissa yleisin virhetilanne oli tallentaa korko-muuttujaan aluksi arvo 1 + R (kun malliratkaisussa sinne tallennettiin 1), jota sitten kerrottiin itsellään silmukassa. Jos muuttujan arvoa muutetaan jokaisella kierroksella, tämä tuottaa väärän lopputuloksen. Useissa funktioissa oli tarpeettomia ehtolauseita. Näistä ei pääosin vähennetty pisteitä, elleivät ehtolauseet rikkoneet funktion toimintaa. Myös turhia muuttujia ja muuta tarpeetonta monimutkaisuutta esiintyi. Muutamilla vastaajilla oli epäselvyyksiä return-lauseen käytön suhteen. Lause oli joko väärässä paikassa tai sitä yritettiin käyttää "palauttamaan" arvo silmukasta ulkopuolelle. Dokumentaatiokommenttien XML-tageissa oli monilla pientä viilaamista. Malliratkaisu /// <summary> /// Pankissa olevan talletuksen arvo N vuoden jälkeen. /// </summary> /// <param name="alkupaaoma">alkupääoma</param> /// <param name="vuosikorko">vuosittainen korko</param> /// <param name="vuodet">talletuksen kesto kokonaisina vuosina</param> /// <returns>talletuksen lopullinen arvo</returns> public static double Talletus(double alkupaaoma, double vuosikorko, int vuodet) double korko = 1; for (int i = 0; i < vuodet; i++) korko *= 1 + vuosikorko; return alkupaaoma * korko; Osa vastaajista oli erottanut potenssin laskemisen omaksi funktiokseen. Tämä oli täysin hyväksyttävää. Pisteytys ja virheet Tehtävässä myönnettiin pisteitä seuraavista osa-alueista: Kurssin käytännön mukainen dokumentaatio, 1 p. Funktion esittelyrivi ja paluuarvo oikein, 1 p. Valittu mielekäs toistorakenne ja toteutettu se oikein, 1 p. Funktio on toteutettu oikein ja tuottaa oikean tuloksen, 3 p. 7

Syntaksivirheistä ja huonosta yleisestä ilmeestä (nimeämiskäytäntö, kirjainkoko avainsanoissa jne.) vähennettiin enintään 2 p. Tehtävässä ei pyydetty kirjoittamaan luokkaa, pääohjelmaa tai testejä, eikä niiden sisällyttämisestä myönnetty tai vähennetty pisteitä. 8