ITKP102 Ohjelmointi 1, syksy 2007

Samankaltaiset tiedostot
ITKP102 Ohjelmointi 1, syksy 2007

ITKP102 Ohjelmointi 1, syksy 2007

ITKP102 Ohjelmointi 1, syksy 2007

Ohjelmointi 2 / 2010 Välikoe / 26.3

Java-kielen perusteet

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)

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

Java-kielen perusteet

5. HelloWorld-ohjelma 5.1

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

ITKP102 Ohjelmointi 1 (6 op)

Ohjelmointi 1 / 2009 syksy Tentti / 18.12

13. Loogiset operaatiot 13.1

ITKP102 Ohjelmointi 1 (6 op)

5/20: Algoritmirakenteita III

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

13. Loogiset operaatiot 13.1

7/20: Paketti kasassa ensimmäistä kertaa

Metodien tekeminen Javalla

Ohjelmoinnin jatkokurssi, kurssikoe

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

1. Omat operaatiot 1.1

Ohjelmointi 2 / 2011 Välikoe / 25.3

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

Olio-ohjelmointi Javalla

5. HelloWorld-ohjelma 5.1

Java-kielen perusteita

12. Javan toistorakenteet 12.1

ITKP102 Ohjelmointi 1 (6 op), arvosteluraportti

12. Javan toistorakenteet 12.1

Ohjelmointiharjoituksia Arduino-ympäristössä

ITKP102 Ohjelmointi 1 (6 op), arvosteluraportti

14. Hyvä ohjelmointitapa 14.1

Muuttujat ja kontrolli. Ville Sundberg

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

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

Java-kielen perusteet

Ohjelmoinnin perusteet, syksy 2006

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

815338A Ohjelmointikielten periaatteet Harjoitus 5 Vastaukset

11/20: Konepelti auki

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

Java-kielen perusteita

1 Tehtävän kuvaus ja analysointi

1. Mitä tehdään ensiksi?

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

13. Hyvä ohjelmointitapa (osa 1) 13.1

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

Taulukot. Jukka Harju, Jukka Juslin

ITKP102 Ohjelmointi 1 (6 op), arvosteluraportti

Ohjelmointi 2, välikoe

9. Periytyminen Javassa 9.1

Ohjelmoinnin perusteet Y Python

Mikä yhteyssuhde on?

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

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

Rajapinta (interface)

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

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

Ohjelmoinnin perusteet, kurssikoe

11. Javan toistorakenteet 11.1

15. Ohjelmoinnin tekniikkaa 15.1

Ohjelmoinnin perusteet Y Python

Harjoitus 4 (viikko 47)

Ohjelmoinnin perusteet Y Python

Harjoitus 6 (viikko 42)

Harjoitus 6. Käytä String-luokasta vain charat- ja length-operaatioita.

7. Näytölle tulostaminen 7.1

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

Javan perusteita. Janne Käki

Ohjelmoinnin perusteet Y Python

Ohjelmointi 1 / syksy /20: IDE

Tietotyypit ja operaattorit

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

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

815338A Ohjelmointikielten periaatteet Harjoitus 3 vastaukset

Ohjelmoinnin peruskurssi Y1

Sisällys. 6. Metodit. Oliot viestivät metodeja kutsuen. Oliot viestivät metodeja kutsuen

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

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

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

11. Javan valintarakenteet 11.1

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

815338A Ohjelmointikielten periaatteet Harjoitus 2 vastaukset

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

Harjoitus Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti:

VIII. Osa. Liitteet. Liitteet Suoritusjärjestys Varatut sanat Binääri- ja heksamuoto

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

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 )

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

20. Javan omat luokat 20.1

58131 Tietorakenteet ja algoritmit (syksy 2015)

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

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

Harjoitus 5 (viikko 41)

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

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

Transkriptio:

ITKP102 Ohjelmointi 1, syksy 2007 Tentti 14.12.2007, suomenkielinen Neljä tehtävää, joista maksimipistemääräksi tulee 24. Kurssin läpäisy edellyttää vähintään 12 pistettä tentistä. Demotehtävät vaikuttavat arvosanaan siten kuin kurssin WWW-sivulla on ilmoitettu. Tentissä ei saa olla mukana laskinta eikä muuta tietoteknistä välinettä. Mukana saa olla yksi kirjallinen materiaalikokonaisuus, esim. kirja, kansio, tuloste tai moniste, jossa ei ole ilman väkivaltaa irtoavia osia. Materiaalissa saa olla myös itse tehtyjä lisämerkintöjä. (Kysymykset on laadittu siten ettei vastaamisen edellyttämiä taitoja ehdi opiskella tenttitilaisuuden aikana. Referenssimateriaali kuitenkin kuuluu ohjelmointiin sekä oikeasti että tenttitilanteessa.) Vastaa jokaiseen tehtävään OMALLE, ERILLISELLE VASTAUS- PAPERILLE! Tämä siksi, että kunkin tehtävän tarkastaa eri opettaja. Säännön noudattamatta jättäminen maksaa automaattisesti 6 pistettä! Jokaiseen paperiin myös täydelliset otsikkotiedot! Kysymyspaperia ei tarvitse palauttaa. Siihen kannattanee tehdä itselle apumerkintöjä. Sivu 1 / 8

Kysymys 1: Ohjelman ymmärtäminen ITKP102 Ohjelmointi 1, syksy 2007 Tutki seuraavaa ohjelmaa. Oleta, että se on olemassa tietokoneella siten että se voidaan kääntää ja suorittaa Java-työkaluilla. 1 public class ExamProgram3 { 2 private static S t r i n g mystery ( int [ ] data, int i, int val ) { 3 while ( i >= 0){ 4 data [ i ] = val ; 5 i ; 6 } 7 int l a s t = data [ data. length 1 ] ; 8 return I n t e g e r. t o S t r i n g ( l a s t ) ; 9 } 10 public static void main ( S t r i n g [ ] args ) { 11 int [ ] numbers = { 1, 2, 3, 4 } ; 12 S t r i n g s = null ; 13 14 s = mystery ( numbers, 1, 5); 15 s = mystery ( numbers, 0, 6); 16 17 for ( short i =0; i < numbers. length ; i ++){ 18 System. out. p r i n t ( numbers [ i ] ) ; 19 System. out. p r i n t ( ) ; 20 } 21 System. out. p r i n t l n ( s ) ; 22 } 23 } Vastattavat kohdat (10 kpl) ja painoarvot pisteytyksessä (yht. 6p): a) Mikä on sen 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 4, 5, 7, 8, 11, 12, 14, 15 suoritetaan? Kirjoita em. rivinumerot siinä järjestyksessä kuin virtuaalikone suorittaa rivit (monta numeroa, osa mahdollisesti useita kertoja!) (2p) e) Mitä ohjelma tulostaa? (0.5p) f) Tutki kaikki metodien, parametrien ja paikallisten muuttujien esittelyt. Mitkä erilaiset tyyppimäärittelyt löydät näistä, kun viitteet eri luokkien olioihin tulkitaan eri tyypeiksi? Siis luettele kaikki tyypit, joita ohjelma käyttää. (0.5p) Sivu 2 / 8

g) Mitkä muuttujat ja parametrit ovat olemassa, kun rivi 21 suoritetaan? Luettele muuttujien nimet. (0.5p) h) Mitkä ovat olemassaolevien primitiivimuuttujien arvot, kun rivi 21 suoritetaan? Jos ei ole yhtään primitiiviä, ilmoita se. (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? Oleta ettei yhtään komentoriviargumenttia annettu käynnistettäessä. (0.5p) j) Ajattele tilannetta, jossa riviä 21 suoritetaan. Montako 8-bittistä tavua muistia tässä ohjelmassa määritellyt parametrit ja paikalliset 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 32 bittiä. Sivu 3 / 8

Kysymys 2: Käytännön taitoja Kuusi kohtaa, yht. 6p. Kohdissa a ja b tarkastele seuraavaa koodinpätkää: 1 / Question : V a r i a b l e s and assignments / 2 int a = 1 ; 3 int b = 2 ; 4 int c = 1 3 ; 5 int d = 0 ; 6 dosomething ( c % ( d = a + b b ) ) ; 7 8 / Question : Objects and r e f e r e n c e s / 9 S t r i n g abbacd = ABBA CD ; 10 S t r i n g acdc = AC/DC ; 11 S t r i n g B u i l d e r xyz = new S t r i n g B u i l d e r ( ) ; 12 xyz. append ( acdc ) ; 13 S t r i n g B u i l d e r zy = xyz ; 14 zy. append ( abbacd ) ; 15 acdc = xyz. t o S t r i n g ( ) ; 16 xyz = null ; a) Jäsennä rivi 6 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) Tilanteesta, jossa kaikki koodirivit on suoritettu, piirrä graafisesti: paikalliset viitemuuttujat, oliot sekä viitteet paikallisista muuttujista olioihin tai olioista toisiinsa. Kuvassa olio on laatikko, johon on kirjoitettu sen luokka ja sen verran sisältöä, että oliot tunnistaa toisistaan. Viite on nuoli viittaajasta viitteen kohteeseen. (1 p) c) Kirjoita Javan heksadesimaaliliteraalina bittijono 011111110011. (0.5p) d) Kirjoita Javan oktaaliliteraalina bittijono 011111110011. (0.5p) e) Kirjoita Javan 10-järj. kokonaislukuliteraalina heksaluku 14d. (0.5p) f) Määrittele (miel. diagrammina tai BNF:nä) syntaksi, jonka mukaisesti voi kuvailla henkilöiden harrastuneisuutta. Nimeksi käy symboli Nimi ja erottimeksi piste. Harrastuksia kolme: kalastaa, ratsastaa, feisbuukkaa. Vaihtoehtoisesti voi lisätä paljon tai vähän. Sallittu esim: Matti ratsastaa vähän. Maija feisbuukkaa. Paavo feisbuukkaa. Paavo feisbuukkaa paljon. (2p) Sivu 4 / 8

Koodiliite ja vastausohjeet loppuosioon ITKP102 Ohjelmointi 1, syksy 2007 Kysymyksissä 3 ja 4 tarkastele seuraavaa ohjelmaa: 1 / Olennainen l ä h d e v i i t e : h t t p ://www. k y t t a a j a t. net /vv t a r k k a i l u c1. shtml / 2 public class KyttayksenAvustaja { 3 private static void tulostaopastus ( java. i o. PrintStream out ) { 4 out. p r i n t l n ( Taloyhtiön kohdennetun kyttäyksen avustaja ) ; 5 out. p r i n t l n ( Kertoo kuinka hassuja talonne asukkaiden nimet ovat. ) ; 6 } 7 private static double laskehassuus ( S t r i n g nimi, S t r i n g merkinhassuus ) { 8 double summa = 0. 0 ; 9 int kirjainmerkkienmaara = 0 ; 10 int hassuinmahdollinen = merkinhassuus. l ength ( ) ; 11 for ( int i = 0 ; i < nimi. length ( ) ; i++) { 12 char c = Character. tolowercase ( nimi. charat ( i ) ) ; 13 if (! Character. i s L e t t e r ( c ) ) 14 continue ; 15 int h = merkinhassuus. indexof ( c ) ; / t u l e e 1 j o s e i löydy / 16 summa += ( h >= 0)? h : hassuinmahdollinen ; 17 kirjainmerkkienmaara ++;} 18 if ( kirjainmerkkienmaara == 0) 19 return hassuinmahdollinen ; 20 return summa / kirjainmerkkienmaara ; 21 } 22 private static double [ ] laskehassuudet ( S t r i n g [ ] nimet, S t r i n g k i r j a i m e t ){ 23 double [ ] hassuudet = new double [ nimet. l ength ] ; 24 for ( int i = 0 ; i < hassuudet. length ; i++) { 25 hassuudet [ i ] = laskehassuus ( nimet [ i ], k i r j a i m e t ) ; } 26 } 27 private static S t r i n g [ ] r a p p u l i s t a n S y o t t o ( int lukum ) { 28 S t r i n g [ ] nimet = new S t r i n g [ lukum ] ; 29 for ( int i = 0 ; i < lukum ; i ++) { 30 S t r i n g ohje = S t r i n g. format ( Syötä nimi %d/%d, i + 1, lukum ) ; 31 nimet [ lukum ] = Apukirjasto. l u e R i v i ( ohje ) ; 32 } 33 } 34 public static void main ( S t r i n g [ ] args ) { 35 / Suomen k i r j a i m e t yleisimmin k ä y t e t y s t ä v ä h i t e n k ä y t e t t y y n : / 36 S t r i n g k i r j a i n t e n Y l e i s y y s = enatrsildokgmvfåuphäcböjyxzwq ; 37 tulostaopastus ( System. out ) ; 38 int lukum = Apukirjasto. l u e I n t ( Montako henkilöä asuu t a l o s sasi ) ; 39 S t r i n g [ ] nimet = r a p p u l i s t a n S y o t t o ( lukum ) ; 40 double [ ] hassuudet = laskehassuudet ( nimet, k i r j a i n t e n Y l e i s y y s ) ; 41 System. out. p r i n t l n ( Tulostus vielä toteuttamatta ; sori. ) ; // TODO 42 } 43 } Sivu 5 / 8

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 jokaisen muuttamasi tai lisäämäsi RIVIN ALUS- SA 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 4 arvostelusta: Virheistä sakotetaan; pahimpana suunnitteluvaikeudet tai kykenemättömyys oikean toiminnallisuuden aikaansaamisessa. Syntaksin tulee olla mahdollisimman lähelle oikeellista Javaa, vaikka ensisijaisesti arvosteltava asia tässä on algoritmin toimivuus. Reilu riviväli auttaa täydennysten tekemisessä paperille koodatessa. Pyri selkeyteen. Tarkennuksia kysymykseen 4: Kysymyksessä 4 ei tarvitse muokata alkuperäisen koodin sisennyksiä, vaikka muutos aiheuttaisi sellaista tarvetta. Riittää että tuotetut tai muutetut koodin osat toimivat siten kuin tehtävässä 4 pyydetään. Siinä ei ole enää kyse aiemman koodin korjaamisesta, jota tehdään tehtävässä 3. Sivu 6 / 8

Kysymys 3: Koodin rakenne, selkeys ja toimivuus Kaikki muut kuin tehtävässä mainitut virheet ovat tahattomia tai tenttikompromisseja. Anna niiden olla! Kommentit puuttuvat tilan säästämiseksi; niitäkään ei tarvitse lisätä. a) Korjaa koodi hyvien koodauskäytänteiden mukaiseksi seuraavien tahallisten virheiden osalta: Tyhjämerkkien käyttö lähdekoodissa ei täysin vastaa ohjelman rakennetta. Tahallisia rikkeitä tyhjämerkeissä löytyy yhteensä yhdeksältä koodiriviltä. Niiden pitäisi olla aika selkeitä. (Muista lisätä pieni perustelu korjauksille) (yht. 4p) b) Ohjelman toiminnassa on selkeitä vikoja, jotka löytyvät, kun tutkii tarkkaavaisesti. Korjaa perustellen seuraavat tahalliset viat: 2 kohtaa, joiden takia ohjelma ei käänny Java-kääntäjällä. Eivät ole suoranaisia syntaksivirheitä. 1 kohta, jonka takia ohjelma kaatuu varmasti eikä kyseinen toiminta ole looginen. Sekä kaatuminen että logiikka hoituvat samalla pienellä korjauksella. (0.7 pistettä per kohta, max. 2p) Sivu 7 / 8

Kysymys 4: Ohjelmakoodin tuottaminen ITKP102 Ohjelmointi 1, syksy 2007 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ä edellisen kohdan 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. Luokka Apukirjasto on olemassa ja sen käyttö onnistuu ilman ongelmia siten kuin ohjelmassa sitä on käytetty! Siihen ei saa tehdä muutoksia eikä lisäyksiä. Laajenna nyt ohjelmaa seuraavilla uusilla ominaisuuksilla: a) Toteuta kaikkien nimien hassuuksien keskiarvon laskenta ja tulostaminen. Täydet pisteet toimivasta ratkaisusta, jossa keskiarvo lasketaan aliohjelmassa, mutta aliohjelma itse ei tulosta mitään päätteelle. Samaa voi tottakai kutsua kohdassa c.(1.5p) b) Toteuta kaikkein hassuimman nimen etsiminen ja tulostaminen. (1.5p) c) Toteuta kohdennettu raportointi omaksi aliohjelmakseen: Se tulostaa keskiarvoa suuremmat hassuudet ja näitä vastaavat nimet. Keskinäinen järjestys saa olla sama kuin syötetyssä datassa. (3p) Ohjelman halutaan lopulta toimivan seuraavalla tavoin: Montako henkilöä asuu talossasi>4 Syötä nimi 1/4>Nieminen Syötä nimi 2/4>Virtanen Syötä nimi 3/4>Scully Syötä nimi 4/4>Mulder Keskim. hassuus: 7,031250 Kaikkein hassuin nimi: Scully (13,166667) Erityisesti kannattaa tarkkailla seuraavia: Scully (hassuus: 13,166667) Mulder (hassuus: 7,833333) Sivu 8 / 8