ITKP102 Ohjelmointi 1, syksy 2007

Samankaltaiset tiedostot
ITKP102 Ohjelmointi 1, syksy 2007

ITKP102 Ohjelmointi 1, syksy 2007

ITKP102 Ohjelmointi 1, syksy 2007

Java-kielen perusteet

Ohjelmointi 2 / 2010 Välikoe / 26.3

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

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

ITKP102 Ohjelmointi 1 (6 op)

ITKP102 Ohjelmointi 1 (6 op)

Java-kielen perusteet

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

13. Loogiset operaatiot 13.1

ITKP102 Ohjelmointi 1 (6 op)

5. HelloWorld-ohjelma 5.1

13. Loogiset operaatiot 13.1

Ohjelmointi 1 / 2009 syksy Tentti / 18.12

5/20: Algoritmirakenteita III

Metodien tekeminen Javalla

7/20: Paketti kasassa ensimmäistä kertaa

ITKP102 Ohjelmointi 1 (6 op)

Ohjelmoinnin jatkokurssi, kurssikoe

JAVA-PERUSTEET. JAVA-OHJELMOINTI 3op A JAVAN PERUSTEET LYHYT KERTAUS JAVAN OMINAISUUKSISTA JAVAN OMINAISUUKSIA. Java vs. C++?

5. HelloWorld-ohjelma 5.1

11. Javan toistorakenteet 11.1

Java-kielen perusteita

Olio-ohjelmointi Javalla

12. Javan toistorakenteet 12.1

11. Javan valintarakenteet 11.1

Muuttujat ja kontrolli. Ville Sundberg

12. Javan toistorakenteet 12.1

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

1. Omat operaatiot 1.1

815338A Ohjelmointikielten periaatteet Harjoitus 2 vastaukset

Javan perusteet. Ohjelman tehtävät: tietojen syöttö, lukeminen prosessointi, halutun informaation tulostaminen tulostus tiedon varastointi

Ohjelmointi 2 / 2011 Välikoe / 25.3

Java-kielen perusteita

Informaatioteknologian laitos Olio-ohjelmoinnin perusteet / Salo

Ohjelmointi 2 / 2008 Välikoe / Pöytätestaa seuraava ohjelma.

Ohjelmointiharjoituksia Arduino-ympäristössä

7. Näytölle tulostaminen 7.1

17. Javan omat luokat 17.1

Ohjelmoinnin perusteet, syksy 2006

Ohjelmoinnin perusteet Y Python

ITKP102 Ohjelmointi 1 (6 op), arvosteluraportti

8. Näppäimistöltä lukeminen 8.1

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

8. Näppäimistöltä lukeminen 8.1

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

Harjoitus 3 (viikko 39)

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

Ohjelmoinnin perusteet Y Python

Harjoitus 2 (viikko 45)

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 )

Alkuarvot ja tyyppimuunnokset (1/5) Alkuarvot ja tyyppimuunnokset (2/5) Alkuarvot ja tyyppimuunnokset (3/5)

Harjoitus Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti:

20. Javan omat luokat 20.1

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

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

Ohjelmassa muuttujalla on nimi ja arvo. Kääntäjä ja linkkeri varaavat muistilohkon, jonne muuttujan arvo talletetaan.

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

Tässä tehtävässä käsittelet metodeja, listoja sekä alkulukuja (englanniksi prime ).

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

2. Lisää Java-ohjelmoinnin alkeita. Muuttuja ja viittausmuuttuja (1/4) Muuttuja ja viittausmuuttuja (2/4)

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

Ohjelmoinnin perusteet Y Python

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

Ohjelmoinnin peruskurssi Y1

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

Ohjelmoinnin perusteet Y Python

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

815338A Ohjelmointikielten periaatteet Harjoitus 5 Vastaukset

Algoritmit 2. Demot Timo Männikkö

System.out.printf("%d / %d = %.2f%n", ekaluku, tokaluku, osamaara);

Lyhyt kertaus osoittimista

Harjoitus 5 (viikko 41)

Harjoitustyö: virtuaalikone

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

TIEP114 Tietokoneen rakenne ja arkkitehtuuri, 3 op. Assembly ja konekieli

7. Oliot ja viitteet 7.1

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

Sisällys. 12. Näppäimistöltä lukeminen. Yleistä. Yleistä

11. Javan valintarakenteet 11.1

Javan perusteita. Janne Käki

58131 Tietorakenteet ja algoritmit (syksy 2015)

Ohjelmoinnin perusteet Y Python

Taulukoiden käsittely Javalla

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

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

Mikä yhteyssuhde on?

System.out.printf("%d / %d = %.2f%n", ekaluku, tokaluku, osamaara);

Harjoitus 5. Esimerkki ohjelman toiminnasta: Lausekielinen ohjelmointi I Kesä 2018 Avoin yliopisto 1 / 5

Rekursiolause. Laskennan teorian opintopiiri. Sebastian Björkqvist. 23. helmikuuta Tiivistelmä

Ohjelmoinnin perusteet, kurssikoe

Ohjelmoinnin peruskurssi Y1

9. Periytyminen Javassa 9.1

Ohjelmoinnin perusteet Y Python

Tähtitieteen käytännön menetelmiä Kevät 2009 Luento 4: Ohjelmointi, skriptaus ja Python

Taulukot. Taulukon käsittely. Tämän osan sisältö. Esimerkki. Taulukon esittely ja luonti. Taulukon alustaminen. Taulukon koko

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

Java-kielen perusteet

Transkriptio:

Tenttirunko 6.11.2007: koodit, koodattava toiminnallisuus, syntaksikysymys, lukuarvot lukujärjestelmäkysymyksissä ovat eri tenttikerroilla aina erilaiset, mutta kysymysten aihepiirit ja muotoilu ovat samat. HUOM: Opettajat varaavat oikeuden tehdä pieniä rakennemuutoksia ennen ensimmäistä tenttikertaa! Näistä tiedotetaan sähköpostilistalla ennen tenttiä. Voit tässä vaiheessa antaa palautetta, joka saattaa vaikuttaa tenttipaperiin, jonka Sinäkin tulet tekemään! Neljä tehtävää, joista maksimipistemääräksi tulee 24. Kurssin läpäisy edellyttää vähintään 12 pistettä tentistä. Vastaa jokaiseen tehtävään OMALLE, ERILLISELLE VASTAUSPAPERILLE! Tämä siksi, että kunkin tehtävän tarkastaa eri opettaja. Säännön noudattamatta jättäminen maksaa automaattisesti 6 pistettä! (Demoissa olevaan esitenttiin vastauksesi ovat kysymyksiin 1 ja 2 tekstitiedostot, tehtäviin 3 ja 4 Java-lähdekoodit.) Sivu 1 / 7

Kysymys 1: Ohjelman ymmärtäminen Tutki seuraavaa ohjelmaa. Oleta, että se on olemassa tietokoneella siten että se voidaan kääntää ja suorittaa Java-työkaluilla. 1 public class Tenttiohjelma2 { // Ajanpuutteen v u o k s i 2 public static int teelukujonosta ( S t r i n g luku ){ // l i i a n samanlainen kuin 3 return I n t e g e r. p a r s e I n t ( luku ) ; // aiempi demo! O i k e a s t i 4 } // v o i o l l a mitä tahansa 5 // vastaavan t a s o i s t a! 6 public static void main ( S t r i n g [ ] args ){ // /////////////////////// 7 int lukum = 4 ; 8 int i =0; 9 int [ ] taulu = { 1, 2, 3, 4}; 10 S t r i n g B u i l d e r sb = new S t r i n g B u i l d e r ( ) ; 11 12 for ( i = 0 ; i <lukum ; i ++){ 13 if ( i == lukum / 2){ 14 break ; 15 } else { 16 taulu [ i ] = teelukujonosta ( 12 ) ; 17 } 18 sb. append ( taulu [ i ] ) ; 19 } 20 S t r i n g t u l o s t e = sb. t o S t r i n g ( ) ; 21 System. out. p r i n t l n ( t u l o s t e ) ; 22 } 23 } Vastattavat kohdat (10 kpl) ja painoarvot pisteytyksessä (yht. 6p): a) Mikä on tiedoston nimi, johon lähdekoodi on tallennettu? (0.3p) b) Mikä on ajettavan tavukooditiedoston nimi? (0.3p) c) Millä komentorivikomennoilla käännät ja suoritat ohjelman? (0.4p) d) Missä järjestyksessä rivit 3, 7, 8, 9, 10, 13, 14, 16, 18, 20, 21 suoritetaan. Eli kirjoita em. rivinumerot siinä järjestyksessä kuin virtuaalikone suorittaa rivit (monta numeroa, osa mahdollisesti useita kertoja!) 2p e) Mitä ohjelma tulostaa? (0.5p) f) Mitkä erilaiset tyyppimäärittelyt löydät ohjelmasta, kun viitteet eri luokkien olioihin tulkitaan eri tyypeiksi? Luettele. (0.5p) g) Mitkä muuttujat ovat olemassa, kun rivi 21 suoritetaan? (0.5p) Sivu 2 / 7

h) Mitkä ovat olemassaolevien primitiivimuuttujien arvot ohjelman lopussa? (0.5p) i) Moneenko eri olioon olisi saatavilla viite, jos rivin 21 jälkeen pitäisi lisätä koodirivi, joka käyttäisi jotakin aiemmin syntynyttä oliota? (0.5p) j) Ajattele tilannetta, jossa riviä 21 suoritetaan. Montako 8-bittistä tavua muistia tässä ohjelmassa määritellyt muuttujat vaativat sillä hetkellä yhteensä? Jätä huomioimatta olioiden kekomuistista käyttämä tila, mutta ota huomioon paikallisten viitemuuttujien viemä tila. (Javan tilavaatimukset oletuksineen luetellaan liitteessä) (0.5p) Kysymyksen 1 liite: Javan tyypit Javan tyypit ja niiden tallennustila bitteinä ilmoitettuna. Tavu on 8 bittinen, joten tavumäärän saa jakamalla bittimäärän kahdeksalla. Tyyppi koko literaaliesim. Totuusarvot boolean? * true, false Merkit char 16 A, \u0041 Kokonaisluvut byte 8 14, 123, -128, 0x72 short 16-14, 0123, 32767 int 32 14, -1234, 32767 long 64 14L, 9223372036854775807 Liukuluvut float 32 14.0, 1.234, 3.4e38 double 64 14.0, 1.234, 4.9e-324 Olioviitteet LuokanNimi 32 ** Huomautukset: * Riippuu toteutuksesta ** Riippuu toteutuksesta; tentissä oleta kooksi neljä tavua. Sivu 3 / 7

Kysymys 2: Käytännön taitoja Kuusi kohtaa, yht. 6p. Kahdessa ensimmäisessä kohdassa tarkastele seuraavaa ohjelmakoodin pätkää: 1 / Question : V a r i a b l e s and assignments / 2 int a = 4 ; 3 int b = 6 ; 4 int c = 1 0 ; 5 int d ; 6 7 System. out. p r i n t l n ( d = a ( b + a ) / c ) ; 8 9 / Question : Objects and r e f e r e n c e s / 10 S t r i n g nul = null ; 11 S t r i n g hup = nul ; 12 S t r i n g B u i l d e r sb = new S t r i n g B u i l d e r ( nul ) ; 13 sb. append ( hup ) ; 14 S t r i n g [ ] t = {hup, sb. t o S t r i n g ( ) } ; 15 hup = null ; a) Jäsennä rivi 7 kokonaan: Missä järjestyksessä kone suorittaa yksittäiset operaatiot? Taulukoi joka suorituksesta: operaattori, vasemman operandin lukuarvo, oikean operandin lukuarvo ja operaatiosta syntyvän tuloksen lukuarvo? (1.5 p) b) Piirrä graafisesti ohjelmanpätkän suorituksesta syntyvät paikalliset viitemuuttujat, oliot sekä kaikki viitteet paikallisista muuttujista olioihin tai olioista toisiinsa. Kuvassasi olio on laatikko, johon on kirjoitettu sen luokka ja sen verran sisältöä, että oliot tunnistaa kuvassa toisistaan. Viite on nuoli viittaajasta viitteen kohteeseen. (1 p) c) Kirjoita Java-kielen heksadesimaaliliteraalina bittijono 010011100101. (0.5p) d) Kirjoita Java-kielen oktaaliliteraalina bittijono 010011100101. (0.5p) e) Kirjoita Java-kielen 10-järjestelmän kokonaislukuliteraalina heksaluku 2a9. (0.5p) f) Määrittele syntaksi eli kielioppi, jonka mukaisesti voi kirjoittaa useita rivejä, joista jokaisella on pilkulla erotettuja kokonaislukuja vähintään yksi. Mitään muita merkkijonoja syntaksisi ei saa sallia. Johda yksittäisen merkin tarkkuuteen saakka. Merkkaa rivinvaihtoa symbolilla \n. Sallittu esim: 4,-7,100 2-19 129814719,0 Piirrä diagrammina tai käytä BNF-tyyppistä tekstinotaatiota. (2p) Sivu 4 / 7

Kysymys 3: Koodin selkeys ja toimivuus Kysymyksissä 3 ja 4 tarkastele seuraavaa ohjelmakoodia: 1 public class HuonoOhjelma2 2 public static double maxarvo ( double [ ] taulu ) { 3 double r e s = Double.MAX VALUE; 4 for ( int i = 0 ; i < taulu. length ; i++) { 5 if ( taulu [ i ] > r e s ) 6 r e s = taulu [ i ] ; } 7 return r e s ; 8 } 9 10 public static double minarvo ( double [ ] taulu ) { 11 r e s = Double.MAX VALUE; 12 for ( int i = 0 ; i <= taulu. l ength ; i++) { 13 if ( taulu [ i ] < r e s ) 14 r e s = taulu [ i ] ; 15 } 16 return r e s ; 17 } 18 19 public static double [ ] s a t u n n a i s e t V a l i l t a ( int lukumaara, 20 double a, double b ) { 21 double [ ] r e s = new double [ lukumaara ] ; 22 for ( int i = 0 ; i <= r e s. l ength ; i++) { 23 r e s [ i ] = a + Math. random ( ) ( b a ) ; 24 } 25 } 26 27 public static void main ( S t r i n g [ ] args ) { 28 System. out. p r i n t l n ( Generoin satunnaisia lukuja analysoitavaksesi. ) ; 29 double [ ] taulu = s a t u n n a i s e t V a l i l t a (1000, 100, 1 0 0 ) ; 30 31 System. out. p r i n t l n ( Mitä haluat että teen luvuille? ) ; 32 S t r i n g [ ] v a l i k k o = { e t s i minimi, e t s i maksimi, kerro luvulla } ; 33 int ve = Apukirjasto. luevaihtoehdonindeksi ( v a l i k k o ) ; // k o n s o l i s t a 34 if ( ve == 0) { 35 System. out. p r i n t l n ( Pienin luku on + minarvo ( taulu ) ) ; 36 } else if ( ve == 1) { 37 System. out. p r i n t l n ( Suurin luku on + minarvo ( taulu ) ) ; 38 } else if ( ve == 2) { 39 double k e r r o i n = Apukirjasto. luedouble ( Anna kertoja ) ; 40 System. out. p r i n t l n ( KERTOMISTA EI OLE VIELÄ TOTEUTETTU! ) ; 41 } 42 } 43 } Sivu 5 / 7

Vastauksen muoto kysymyksiin 3 ja 4 On viisi tärkeätä sääntöä, joiden noudattamatta jättäminen vie vastaavan vastauskohdan pisteet selkeästi nollaksi: Muutokset: Jos jotakin riviä on muutettava, ilmoita rivin numero ja kirjoita kyseinen rivi uudelleen. Kysymyksessä 3 perustele korjaus kommentiksi rivin loppuun. Poistot: Jos rivi on poistettava, ilmoita rivin numero ja pois. Kysymyksessä 3 perustele poisto. Lisäykset: Jos on lisättävä rivejä, ilmoita lisäystä edeltävän koodirivin numero ja kirjoita lisättävä koodi (yksi tai useampia rivejä). Kysymyksessä 3 perustele lisäys. Kohdassa 3a kirjoita RIVIN ALUSSA OLEVAT VÄLILYÖNNIT NÄKYVIIN (tai vähintään ilmoita niiden määrä). Kaikki ilmoittamasi rivinumerot olkoot ALKUPERÄISEN koodin rivejä; ei siis pidä miettiä, mihin rivit siirtyvät poistojen tai lisäysten yhteydessä! Tästä johtuen huolehdi yksiselitteisyydestä: Jos johonkin kohtaan tulee useita peräkkäisiä rivejä lisää, ne on syytä kirjoittaa yhtenä pitkänä lisäyksenä, koska muuten niiden keskinäistä järjestystä ei oikein voi päätellä vastauksesta. Kysymyksen 3 kaksi kohtaa a) Korjaa koodi hyvien koodauskäytänteiden mukaisiksi. Muista perustella muutokset. Koodilistauksessa on seuraavat tahalliset virheet, jotka tulee korjata: tyhjämerkkien käyttö lähdekoodissa ei täysin vastaa ohjelman rakennetta (yht. 3p) b) Ohjelman toiminnassa on selkeitä vikoja, jotka löytyvät, kun tutkii tarkkaavaisesti. Korjaa toiminnallisuuden viat. Muista perustella. Koodilistauksessa on seuraavat tahalliset virheet: kolme syytä, joiden takia ohjelma ei käänny kaksi kohtaa, joiden takia ohjelma kaatuu varmasti yksi syy, jonka takia ohjelma ei toimi niinkuin se väittää toimivansa (0.5 pistettä per kohta, yht. 3p) Sivu 6 / 7

Kysymys 4: Ohjelmakoodin tuottaminen Kysymys 4 arvostellaan riippumattomasti, mutta tässä käsitellään samaa ohjelmakoodia ja käytetään samaa muotoa vastaukselle kuin kysymyksessä 3. On tärkeätä, että käytät alkuperäisen (rikkinäisen) koodin rivinumeroita muutoskohtien ilmoittamiseen, koska tämän vastauksen tarkastaa eri henkilö eikä hän tiedä edellisessä kohdassa tehtyjä muutoksia! Riippumatta siitä, osaatko vastata kysymykseen 3, oletetaan että ohjelmaan on nyt tehty tarvittavat korjaukset ja että se lähtökohtaisesti toimii niinkuin se lupaa käyttäjälle. Laajenna nyt ohjelmaa seuraavilla uusilla ominaisuuksilla: a) Ohjelman valikossa on toiminto, jota ei ole vielä toteutettu: Toteuta siis ensinnäkin loppuun taulukon arvojen kertominen käyttäjältä kysytyllä luvulla. Täydet pisteet toimivasta ratkaisusta, johon sisältyy uuden aliohjelman lisäys. (1.5p) b) Muuta toiminnallisuus sellaiseksi, että ohjelman suoritus jatkuu aina uudella toiminnolla niin kauan kunnes käyttäjä haluaa lopettaa. Tulkoon tästä lisävalinta samaan dialogiin, jossa kysytään suoritettavaa toimenpidettä. Analysoitavan lukutaulukon arvoja ei kuitenkaan tule arpoa satunnaisesti uudelleen joka kierroksella. (1.5p) c) Toteuta uusi ominaisuus: Taulukon arvojen tulostaminen rivitettynä. Tulkoon tästä uusi ominaisuus Tulosta arvot ohjelman päävalikkoon. Toiminto kysyy käyttäjältä alkioiden määrän, joka tulostetaan aina yhdelle riville; tätä varten on olemassa aliohjelma Apukirjasto.lueInteger(String ohjeteksti). Sitten pitää tulostua taulukon arvot siten että rivi katkaistaan aina halutun alkiomäärän jälkeen. Tulostuksen tulee toimia vaikka taulukon koko olisi erilainen jokaisella tulostuskerralla. Sijoita toiminto aliohjelmaan. (3p) HUOM: Luokka Apukirjasto on olemassa ja sen käyttö onnistuu ilman ongelmia siten kuin ohjelmassa sitä on käytetty! Arvostelu: Virheistä sakotetaan; pahimpana suunnitteluvaikeudet tai kykenemättömyys oikean toiminnallisuuden aikaansaamisessa, toiseksi pahimpana loogiset virheet, viimeisenä rakenteelliset ja ei juuri minään syntaktiset virheet. Tarkennuksia: Syntaksin tulee olla mahdollisimman lähelle oikeellista Javaa, mutta ensisijaisesti arvosteltava asia tässä on algoritmin toimivuus. Reilu riviväli auttaa täydennysten tekemisessä paperille koodatessa. Pyri selkeyteen. Vaikka muutoksesi aiheuttaisi tarpeen sisentää jotain aiempaa, alkuperäisen koodin sisennyksiä ei tarvitse tentissä muokata. Riittää että tuottamasi tai muuttamasi koodin osat toimivat siten kuin tehtävässä pyydetään. Tässä kysymyksessä ei ole kyse aiemman koodin korjaamisesta kuten edellisessä. Sivu 7 / 7