ITKP102 Ohjelmointi 1 (6 op), arvosteluraportti

Samankaltaiset tiedostot
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), 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), arvosteluraportti

ITKP102 Ohjelmointi 1 (6 op)

ITKP102 Ohjelmointi 1 (6 op)

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

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

Ohjelmointi 1 C#, kevät 2013,

Metodien tekeminen Javalla

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

Ohjelmointi 1 / 2009 syksy Tentti / 18.12

1. Mitä tehdään ensiksi?

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

Olio-ohjelmointi Javalla

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

Ohjelmointi 1 Taulukot ja merkkijonot

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

17. Javan omat luokat 17.1

Ohjelmointi 2, välikoe

Ohjelmointi 2 / 2010 Välikoe / 26.3

Harjoitus Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti:

Ohjelmointi 1 C#, kevät 2014, tentti

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

20. Javan omat luokat 20.1

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

Ohjelmoinnin perusteet Y Python

Listarakenne (ArrayList-luokka)

Java-kielen perusteet

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

ITKP102 Ohjelmointi 1 Tentti

Ohjelmoinnin jatkokurssi, kurssikoe

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

17. Javan omat luokat 17.1

Taulukot. Jukka Harju, Jukka Juslin

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

Kääreluokat (oppikirjan luku 9.4) (Wrapper-classes)

Java-kielen perusteita

Java-kielen perusteet

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

815338A Ohjelmointikielten periaatteet Harjoitus 2 vastaukset

Luokan sisällä on lista

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

1. Kun käyttäjä antaa nollan, niin ei tulosteta enää tuloa 2. Hyväksy käyttäjältä luku vain joltain tietyltä väliltä (esim tai )

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

13. Loogiset operaatiot 13.1

12. Javan toistorakenteet 12.1

11. Javan toistorakenteet 11.1

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

Ohjelmoinnin perusteet Y Python

Java kahdessa tunnissa. Jyry Suvilehto

Informaatioteknologian laitos Olio-ohjelmoinnin perusteet / Salo

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

Java-kielen perusteita

List-luokan soveltamista. Listaan lisääminen Listan läpikäynti Listasta etsiminen Listan sisällön muuttaminen Listasta poistaminen Listan kopioiminen

1. Omat operaatiot 1.1

4. Luokan testaus ja käyttö olion kautta 4.1

Ohjelmoinnin perusteet Y Python

Kysymystyypit. Tentin kysymystyypit. Monivalinta

7. Oliot ja viitteet 7.1

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

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

12. Javan toistorakenteet 12.1

Se mistä tilasta aloitetaan, merkitään tyhjästä tulevalla nuolella. Yllä olevassa esimerkissä aloitustila on A.

812341A Olio-ohjelmointi Peruskäsitteet jatkoa

58131 Tietorakenteet ja algoritmit (syksy 2015)

Ehto- ja toistolauseet

Java-kielen perusteet

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

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

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

14. Hyvä ohjelmointitapa 14.1

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

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

Harjoitus 4 (viikko 47)

Metodien tekeminen Javalla

Ohjelmoinnin perusteet, kurssikoe

Ohjelmointiharjoituksia Arduino-ympäristössä

Mikä yhteyssuhde on?

Tietotekniikan valintakoe

Tietorakenteet ja algoritmit syksy Laskuharjoitus 1

YHTEYSSUHDE (assosiation)

Luku 6. Dynaaminen ohjelmointi. 6.1 Funktion muisti

AS C-ohjelmoinnin peruskurssi 2013: C-kieli käytännössä ja erot Pythoniin

13. Loogiset operaatiot 13.1

815338A Ohjelmointikielten periaatteet Harjoitus 5 Vastaukset

Ohjelmoinnin peruskurssi Y1

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

Olio-ohjelmointi Syntaksikokoelma

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

14. Poikkeukset 14.1

Sisällys. 7. Oliot ja viitteet. Olion luominen. Olio Java-kielessä

Apuja ohjelmointiin» Yleisiä virheitä

Ohjelmoinnin peruskurssi Y1

Transkriptio:

ITKP102 Ohjelmointi 1 (6 op), arvosteluraportti Tentaattori: Antti-Jussi Lakanen 7. huhtikuuta 2017 Yleistä Tentti 1 oli pistekeskiarvon (12.9) perusteella vaikeudeltaan tavallista vaikeampi. Omasta tehtäväpaperista saa kopion Antti-Jussilta, huone C414.2. Jos en ole paikalla, laita sähköpostia tai soita 040 805 3276. Papereihin on merkitty virheet, jotka voin käydä kanssasi läpi, tarvittaessa tarkastajan kanssa. Uusintojen ajankohdat löydät kurssin Korppi-sivulta. Tehtävä Teki Keskiarvo Tarkastaja T1 112 3.5 Mikko Häyrynen T2 112 3.5 Otto Jahnukainen T3 112 2.8 Simo Rinne T4 112 2.9 Otto Jahnukainen Yht 12.9 Arvosteluasteikko Arvolause Pistemäärä (alaraja) 5 24 4 21 3 18 2 15 1 12 1 http://users.jyu.fi/~anlakane/ohjelmointi1/tentit/2017-04-07-tentti1.pdf 1

Tehtävä 1 (6 p.) Ensimmäisessä tehtävässä tuli kirjoittaa JononSumma-funktio annettujen tietojen perusteella. Luokkaa, pääohjelmaa tai testejä ei pyydetty, mutta ne on kirjoitettu esimerkkivastaukseen mallin vuoksi. Tehtävä osattiin yleisesti ottaen melko hyvin. Oikeita ratkaisuja oli pääosin kahta eri tyyppiä. Valtaosa vastaajista kasasi summan suoraan yhteen muuttujaan silmukassa, kuten mallivastauksessa. Toiset taas muodostivat ensin parametrien avulla lukujonon taulukkoon tai listaan ja summasivat sisällön yhteen silmukassa. Yleisimmät virheet olivat kummassakin lähestymistavassa seuraavat: Silmukoitiin väärän muuttujan suhteen, aloitettiin tai lopetettiin summa väärästä paikasta tai lisättiin summaan väärää arvoa. Unohdettiin sijoittaa kasvatettu arvo takaisin muuttujaan. Esimerkiksi for-silmukan lopussa luki monella i + askel, eikä i += askel. Ei oltu huomioitu erityistapausta askel == 0. Mallivastaus public class Tentti /// <summary> /// Funktio palauttaa kokonaislukujen jonon summan. /// </summary> /// <param name="alku">jonon ensimmäinen luku.</param> /// <param name="loppu">jonon viimeinen luku.</param> /// <param name="askel">askeleen pituus.</param> /// <returns>summa parametrien määrittämästä jonosta.</returns> /// <example> /// <pre name="test"> /// Tentti.JononSumma(2, 6, 2) === 12; /// Tentti.JononSumma(3, 12, 3) === 30; /// Tentti.JononSumma(10, 15, 2) === 36; /// Tentti.JononSumma(2, 2, 2) === 2; /// Tentti.JononSumma(1, 0, 1) === 0; /// Tentti.JononSumma(1, 5, 0) === 0; /// Tentti.JononSumma(1, 5, -1) === 0; /// Tentti.JononSumma(-2, 2, 1) === 0; /// Tentti.JononSumma(-2, 4, 2) === 4; /// Tentti.JononSumma(2, 5, 10) === 2; /// </pre> /// </example>/ public static int JononSumma(int alku, int loppu, int askel) if (alku > loppu askel <= 0) return 0; 2

int summa = 0; for (int i = alku; i <= loppu; i += askel) summa += i; return summa; public static void Main() Pisteytys Dokumentaatio 1 p. Funktion esittelyrivi ja paluuarvo oikein 1 p. Kaikki erityistapaukset käsitelty oikein 1 p. Perustapaus käsitelty oikein toistorakenteella 3 p. Tehtävässä ei pyydetty kirjoittamaan luokkaa, pääohjelmaa tai testejä, mutta niiden sisällyttämisestä ei vähennetty pisteitä, ellei toteutuksessa ei ollut merkittäviä virheitä. Tehtävä 2 (6 p.) Tehtävä 2 oli ensimmäinen kahdesta monivalintatehävästä jossa oli 6 kysymystä ja oli suoraviivainen arvosteltava. Keskimäärin tehtävä meni kohtalaisesti ja oli monivalintatehtävistä helpompi pistekeskiarvon perusteella, vaikkakin variaatiota vastauksissa oli hyvin paljon. Täysiä pisteitä oli jokunen mutta myös muutama nolla eksyi joukkoon. Parhaiten osattiin kysymys 2 (C# toiminnallisuus) ja eniten vaikeuksia oli kysymyksessä 5 (rekursio), jossa moni oli valinnut vaihtoehdon a, joka kertoi millainen on hallittu ikuinen silmukka. Rekursiivinen funktio ei kuitenkaan ole silmukka, eikä sillä ole runko-osaa kuten while-, for-, jne. silmukoilla. Vastausavain 1C, 2C, 3C, 4A, 5C, 6B Pisteytys ja virheet Tehtävän pisteytys oli yksinkertainen. Oikein menneestä kohdasta myönnettiin piste, väärin menneestä nolla pistettä. Miinuspisteitä ei annettu mistään syystä. 3

Tehtävä 3 (6 p.) Tehtävä oli ilmeisesti haastava ja monet eivät olleet ottaneet huomioon sitä, että merkkijonoja ei voi muokata samaan tyyliin kuin taulukoita (esim. merkkijono[0] = K ), vaan se pitää ensin muuttaa muuttaa StringBuilder-olioksi tai char-taulukoksi, mikäli noin haluaa tehdä. Malliratkaisu Tehtävän pystyi ratkaisemaan monella eri tavalla, jotka voidaan jaotella karkeasti kahteen kategoriaan: merkkijonon läpikäynti ja välilyönnin jälkeisten merkkien isoksi muuntaminen tai pilkkomalla merkkijono välilyöntien kohdalta ja muuttamalla jokaisen sanan ensimmäinen kirjain isoksi. Alla malliratkaisu käymällä merkkijono merkki kerrallaan läpi ja käyttäen StringBuilderoliota. /// <summary> /// Muuttaa merkkijonon jokaisen sanan ensimmäisen kirjaimen isoksi. /// </summary> /// <param name="merkkijono">merkkijono jota muokataan</param> /// <returns>muutettu merkkijono</returns> public static string MuutaIsoksi(string merkkijono) StringBuilder merkit = new StringBuilder(merkkijono); for (int i = 0; i < merkit.length; i++) if (i == 0 merkit[i - 1] == ) merkit[i] = Char.ToUpper(merkit[i]); return merkit.tostring(); char-taulukkoa voi käyttää myös, jolloin funktion toteutuksen ensimmäisestä rivistä tulisi char[] merkit = jono.tochararray(); ja viimeisestä tulisi return String.Join( "", merkit); koska taulukkoa ei voi muuttaa takaisin merkkijonoksi järkevästi ToStringmetodilla. Alla malliratkaisu pilkkomalla merkkijono sanoiksi ja muuttamalla jokaisen sanan ensimmäinen kirjain isoksi (dokumentaatio on jätetty pois, koska se olisi sama kuin ylemmässä malliratkaisussa): public static string MuutaIsoksi(string merkkijono) // Pilkotaan merkkijono taulukkoon välilyöntien kohdalta. string[] sanat = merkkijono.split( ); 4

for (int i = 0; i < sanat.length; i++) string sana = sanat[i]; // Jätetään tyhjä sana huomiotta. if (sana.length == 0) continue; // K "issa" string isosana = Char.ToUpper(sana[0]) + sana.substring(1); sanat[i] = isosana; // Palautetaan yhdistetty sanat taulukko laittamalla jokaisen // sanan väliin välilyönti. return String.Join(" ", sanat); Pisteytys ja virheet ComTest-testejä ei vaadittu, eikä niiden lisäämisestä ollut haittaa eikä hyötyä. Aluksi tarkistettiin kuuluuko vastaus johonkin alla olevista kategorioista: Tyhjä paperi tai funktio, joka ei selkeästi tee mitään järkevää, 0 p. Funktio, joka toimii vain ja ainoastaan merkkijonoilla kissa tai kissa istuu puussa, 0 p. Funktio, josta näkee, että ollaan oikeilla jäljillä, mutta toteutus on erittäin puutteellinen, 1 2 p. Funktio, joka toimii vain jos merkkijonossa ei ole enempää kuin kolme sanaa, 2 p. Jos pisteet menivät nollaan, niin hyvin tehdyllä dokumentaatiolla sai korotettua sen vielä takaisin yhteen pisteeseen. Mikäli vastaus ei kuulunut mihinkään edellä olevista kategorioista, niin vastaus oli tehty suurin piirtein oikein. Pisteytys aloitettiin silloin 6 pisteestä ja seuraavista asioista tuli vähennyksiä: Dokumentaatio puuttuu tai ei ole tehty XML-tyylisesti kurssilla opetettuun tyyliin, -1 p. Dokumentaatiossa on pieniä puutteita, esimerkiksi <param> tai <returns> puuttuu, -0,5 p. Parametrit tai paluuarvon tyyppi väärin, -1 p. Tehtävänannossa oli annettu vinkki, miten kirjain muunnetaan isoksi. Jos merkin isoksi muuntaminen oli silti tehty väärin ja/tai merkkijonoa yritettiin muokata suoraan indeksoimalla sitä kuin taulukkoa, -1 p. Jos isoksi kirjaimeksi muuntamisessa ainut vika oli se, että on kirjoittanut jono[0].toupper(), vaikka pitäisi olla Char.ToUpper(jono[0]), niin -0,5 p. 5

Vakavista syntaksivirheistä -0,5 p. tai -1 p. jokaisesta erityyppisestä virheestä riippuen vakavuudesta. Saman virheen toistamisesta ei kumulatiivisesti vähennetty pisteitä. Yleisimmät viat: Yksittäisten sulkujen tai puolipisteiden puuttumisesta tai -merkin sijaan "- merkin käytöstä ei vähennetty pisteitä. Jos yksittäinen vertailu tehtiin käyttämällä vain yhtä =-merkkiä, niin pisteitä ei vähennetty, mutta jos kaikki vertailut tehtiin vain yhdellä yhtäsuuri kuin -merkillä, niin -0,5 p. Merkkijonojen tai taulukoiden indeksointi tavallisilla suluilla, -0,5 p. StringBuilderin luonti ilman new-sanaa, esim StringBuilder sb = "kissa", kun pitäisi olla StringBuilder sb = new StringBuilder("kissa"), -0,5 p. Vertailu matemaattisella -merkillä, kun pitäisi olla <=, -0,5 p. Isoksi merkiksi muuntaminen tehty väärin. Esimerkiksi merkkijono[0].toupper(); Tuossa on väärin se, että merkkijono[0] palauttaa merkin, jolla ei ole mitään ToUpper-metodia ja vaikka olisikin, niin se ei voisi muokata merkkijonon sisältöä suoraan. Se voisi korkeintaan palauttaa isoksi muutetun merkin, joka pitäisi sijoittaa jonnekin. Merkkijonon muokkaaminen taulukkomaisesti. Esimerkiksi merkkijono[0] = Char.ToUpper(merkkijono[0]); string-olioiden sisällöt ovat muuttumattomia, eikä niitä voi muokata kuin taulukoita. Tästä syystä merkkijonojen muokkausmetodit palauttavat aina uuden merkkijonon, joka pitää muistaa sijoittaa johonkin muuttujaan. Mikäli merkkijonoa haluaa käsitellä taulukkomaisesti, niin se pitää muuttaa StringBuilder olioiksi tai char-taulukoksi. Malliratkaisusta näkee sen voi tehdä. char-taulukkoa yritettiin muuttaa takaisin merkkijonoksi ToStringillä, joka lopputuloksena tulee vain "System.Char[]". Sen sijaan String.Join("", merkkitaulukko) antaisi oikean lopputuloksen. ToStringin käytöstä ei tosin vähennetty pisteitä, koska tätä esiintyi usealla eikä tämä ei ole mikään ilmiselvä vika. Dokumentaatiosta puutui <returns>-tagi. Monien funktiot kaatuisivat, jos merkkijonon alussa tai lopussa olisi välilyönti. Tästä ei vähennetty pisteitä, koska tehtävänannossa ei mainittu, että välilyöntejä olisi muuallakin kuin sanojen väleissä, eikä tehtävänannossa olleissa testitapauksissa ollut tälläistä tapausta. 6

Tehtävä 4 (6 p.) Tehtävä neljä oli toinen monivalintakysymys tehtävä jossa oli myös 6 kysymystä. Kysymykset olivat selvästi haastavia ja useampi jäi pisteittä. Myös täydet pisteet olivat erittäin harvassa. Kysymyksessä 3 vaikeuksia oli int-muotoisten muuttujien jakamisessa. Kun jaetaan kaksi int-arvoa, saadaan int-arvo tulokseksi (desimaaliosa leikkautuu pois) vaikka se sijoitettaisiin double muuttujaan. Myös kysymyksessä 4 return-lausetta ei voi korvata break-lauseella. Binääritehtävä oli osattu kohtuullisen hyvin ja sai eniten oikeita vastauksia. Vastausavain 1D, 2D, 3D, 4B, 5C, 6B Pisteytys ja virheet Tehtävän pisteytys oli yksinkertainen. Oikein menneestä kohdasta myönnettiin piste, väärin menneestä nolla pistettä. Miinuspisteitä ei annettu mistään syystä. 7