Ohjelmointi 2, välikoe 21.3.2014 Vastaa neljään tehtävään kuudesta siten, että jokainen tehtävä tulee omalle konseptilleen. Mikäli vastaat useampaan kuin neljään tehtävään, pisteiden laskussa huomioidaan neljä heikointa tehtävää. Vastauksissa saa tarvittaessa käyttää kurssille tehtyjä kirjastoja (Ali.jar, GUI.jar ja graphics.jar) sekä tietysti Javan omia kirjastoja. Pienet epätarkkuudet parametrien järjestyksessä yms. sallitaan, jos ei ulkoa ihan tarkkaan muista kutsujen muotoa. TEHTÄVÄ 1. Luokan täydennys Tässä on esitelty luokat Kana ja Kanala. Täydennä luokat siten, että Kanala-luokassa oleva pääohjelma toimii. Pääohjelmasta löytyy yhteensä neljä TODO-kohtaa, jotka pitää tehdä. Testejä ei tarvitse kirjoittaa. public class Kana { private String nimi; private int muniaviikossa = 0; * Palautetaan kanan nimi * @return kanan nimi public String getnimi() { return nimi; * Palautetaan kanan tuotantokyky eli munia/viikko * @return kuinka monta munaa kana munii viikossa public int getmuniaviikossa() { return muniaviikossa; public class Kanala { private ArrayList<Kana> kanat; public Kanala() { kanat = new ArrayList<Kana>(); * Lisää kanan kanalaan * @param lisattavakana lisattava kana public void lisaakana(kana lisattavakana) { kanat.add(lisattavakana); Ohjelmointi 2, välikoe 21.3.2014 1/7
* Testataan luokkia Kanala sekä Kana. * @param args ei käytössä. public static void main(string[] args) { // TODO a) Kirjoita Kana-luokalle tarvittavat muodostajat. Kana kana1 = new Kana("Klaara", 3); Kana kana2 = new Kana("Kotkot", 6); Kana kana3 = new Kana("Juniori"); // TODO b) Muokkaa Kana-luokkaa siten, että seuraavat tulostukset toimivat System.out.println(kana1); // Tulostus: Klaara munii 3 munaa/viikko. System.out.println(kana2); // Tulostus: Kotkot munii 6 munaa/viikko. System.out.println(kana3); // Tulostus: Juniori munii 0 munaa/viikko. // TODO c) Lisää Kana-luokaan compareto-metodi, joka toimii esitetyllä // tavalla. Vertailu tehdään munintamäärän perusteella. if(kana1.compareto(kana2) < 0) System.out.println(kana2.getNimi() + " munii useammin kuin " + kana1.getnimi()); if(kana1.compareto(kana2) > 0) System.out.println(kana1.getNimi() + " munii useammin kuin" + kana2.getnimi()); if(kana1.compareto(kana2) == 0) System.out.println(kana1.getNimi() + " ja " + kana2.getnimi() + " munivat yhtä usein"); Kanala kanala = new Kanala(); kanala.lisaakana(kana1); kanala.lisaakana(kana2); kanala.lisaakana(kana3); // TODO d) Lisää Kanala-luokalle puuttuvat metodit. System.out.println("Kanalan tuotantokyky on: " + kanala.munienmaaraviikossa() + " munaa/viikko"); // Tulostus: Kanalan tuotantokyky on 9 munaa/viikossa // Paras munija on se, joka munii eniten viikossa. Kana parasmunija = kanala.parasmunija(); if(parasmunija!= null) { System.out.println("Kanalan paras munija on: " + parasmunija.getnimi()); //Tulostus: Kanalan paras munija on: Kotkot TEHTÄVÄ 2. Testaus ja aliohjelmat a) Tee ComTest tai JUnit-testit b-kohdan ailohjelmalle. Muista erilaiset erikoistapaukset! Testien tarkoitus on myös dokumentoida miten erilaisissa erikoistapauksissa toimitaan. (2p) Ohjelmointi 2, välikoe 21.3.2014 2/7
b) Tee funktioaliohjelma pisimmanjalyhimmanerotus. PisimmanJaLyhimmanErotus palauttaa kaksiulotteisen String taulukon lyhyimmän ja pisimmän Stringin välisen ylijäämän. Eli jos taulukon lyhyin String olisi he ja pisin peruna, palauttaisi aliohjelma runa ja jos lyhyin String olisi nero ja pisin kissa, palauttaisi ohjelma a. (4p) Seuraavan pääohjelman tulisi toimia: public static void main(string[] args){ String[][] teksteja = {{"a", "matikkaa", {"kissa","koira" ; String erotus = pisimmanjalyhimmanerotus(teksteja); System.out.println(erotus); //Tulostaa: atikkaa String[][] lisaateksteja = {{, {"","koira", {"lentokone", "laiva" ; erotus = pisimmanjalyhimmanerotus(lisaateksteja); System.out.println(erotus); //Tulostaa: lentokone TEHTÄVÄ 3. Teoria (Mika) Vastaa seuraaviin kysymyksiin lyhyesti. a. Mitä eroa on while- ja do-while-silmukalla? b. Olkoon alustettu seuraava kaksiulotteinen taulukko: int ruudukko[][] = {{6, 9, 4, {-2, 5, 8, {0, -7, 3; Mitä seuraavalla rivillä tapahtuu? System.out.println(ruudukko[1][2] + ruudukko[2][3]); c. Mitä merkitsee, jos luokan metodin esittelyrivi alkaa sanalla private? d. Mitä tarkoittaa käsite "saantimetodi"? e. Olemassa olevia luokkia voi käyttää hyväkseen koostamisella ja/tai perinnällä. Miten nämä kaksi tapaa eroavat toisistaan? f. Olkoon int a = 1; int b = 3; int c = -5; Mitkä ovat tällöin seuraavien lausekkeiden arvot? b + 2 * a - c c + a / b Entä mitkä ovat seuraavien lausekkeiden totuusarvot? b < 3 * a (b < c) (-a < -c) Ohjelmointi 2, välikoe 21.3.2014 3/7
TEHTÄVÄ 4. Pöytätesti Tutki ohjelman toimintaa pöytätestillä käyttäen ohessa olevaa pöytätestilomaketta. Merkitse muuttujien kohdalle muuttujan arvo, jos se on muuttunut. Tulostuksen voi merkitä usealle riville mikäli tila ei riitä, mutta se tulee aloittaa oikealta suoritusriviltä.merkitse tulostukseen välilyönnit alleviivalla tms. jotta tarkastaja voi laskea välilyönnit helposti. Käytä merkinnöissä seuraavia merkkejä: & = viittaus (esim. &N1 viittaa N1-olioon keossa, N1 = 1. new:llä luotu olio) Merkitse * jokaisen muuttujan päälle joka on viitemuuttuja. ROSKA = olio muuttuu roskaksi. Iso X tai harmaa "suttaus" muuttujan kohdalle jos sitä ei ole olemassa. tostring-metodin palauttaman merkkijonon voit käsitellä ilman että "luot" sille tilaa keosta (koska sitä käytetään vain yhteen tulostukseen). /* 01 package vk; /* 02 /* 03 Karkkipussiluokka /* 04 @SuppressWarnings("all") /* 05 public class Karkkipussi { /* 06 /* 07 Tikkariluokka /* 08 public static class Tikkari { /* 09 private StringBuilder tikkari = new StringBuilder(""); /* 10 private String maku; /* 11 private boolean syoty; /* 12 /* 13 /* 14 /* 15 * Alustaa tikkarin /* 16 * @param nimi Nimi, joka tikkarille annetaan /* 17 * @param maku Maku, joka tikkarille annetaan /* 18 /* 19 public Tikkari(StringBuilder nimi, String maku) { /* 20 if (nimi!= null) this.tikkari = nimi; /* 21 this.maku = maku; /* 22 syoty = false; /* 23 /* 24 /* 25 /* 26 /* 27 * Merkitään tikkari syödyksi /* 28 * @param maara paljonko syöty /* 29 /* 30 public void herkuttele(int maara) { /* 31 if (syoty) /* 32 return; /* 33 syoty =!syoty; /* 34 maara--; tikkari.append(" " + maara); /* 35 /* 36 /* 37 /* 38 /* 39 * Palauttaa tikkarin tiedot merkkijonona /* 40 /* 41 @Override Ohjelmointi 2, välikoe 21.3.2014 4/7
/* 42 public String tostring() { /* 43 if (syoty) return "Tikkari: " + tikkari + maku /* 44 + ", mutta se onkin jo mennyt parempiin suihin ; /* 45 return "Tikkari: " + tikkari + maku /* 46 + " löytyy vielä pussista ja on valmiin syötäväksi ; /* 47 /* 48 /* 49 /* 50 /* 51 * @param args Ei käytössä /* 52 /* 53 public static void main(string[] args) { /* 54 int maara = 0; /* 55 Tikkari tikkari = new Tikkari(null, ""); /* 56 maara++; /* 57 StringBuilder nekku = new StringBuilder("Chupa Chups"); /* 58 tikkari.herkuttele(maara); /* 59 System.out.println(tikkari); /* 60 String maku = "Omena"; /* 61 Tikkari tikkari2 = new Tikkari(nekku, maku); /* 62 maara++; /* 63 System.out.println(tikkari2.toString()); /* 64 tikkari2.herkuttele(maara); /* 65 System.out.println(tikkari2.toString()); /* 66 System.out.println(maara); /* 67 /* 68 /* 69 TEHTÄVÄ 5. Perintä (Matias) Tee luokka MetsaAlue, joka perii alla olevan OmistusAlue-luokan, ja sisältää tarvittavat privaatit attribuutit sekä metodit, jotta alla oleva pääohjelma toimii ja tulostaa oikein. Yliluokan muodostajaan pääsee käsiksi super-viitteellä. Luokka tulee omaan MetsaAlue.java-tiedostoon samaan pakettiin kuin OmistusAlue. Kommentteja eikä testejä ei tarvitse kirjoittaa, mutta annotaatiot (@Override) tulee merkitä. package valikoe; * OmistusAlue-luokka, joka pitää sisällään tiedon alueen pinta-alasta ja omistajasta * @author mp * @version 15.03.2014 public class OmistusAlue { private final static int ALOITUS_ALA = 10; protected double pintaala; private String omistaja; * Muodostaja OmistusAlue-luokalle * @param omistaja alueen omistaja merkkijonona public OmistusAlue(String omistaja) { pintaala = ALOITUS_ALA; this.omistaja = omistaja; Ohjelmointi 2, välikoe 21.3.2014 5/7
* Palauttaa omistusalueen omistajan * @return omistusalueen omistajan public String getomistaja(){ return omistaja; * Asettaa parametrina annetun omistajan omistajaksi * @param omistaja omistaja, joka halutaan asettaa public void setomistaja(string omistaja){ this.omistaja = omistaja; * Palauttaa merkkijonona omistusalueen tiedot @Override public String tostring(){ return "Alaa on yhteensä " + pintaala + "neliömetriä, omistaja " + omistaja; * Testipääohjelma * @param args ei käytössä public static void main(string[] args){ MetsaAlue alue = new MetsaAlue("Kalle Kala", "koivu", "erinomainen"); alue.valtaaalaa(); System.out.println(alue); // Tulostaa: Metsäalueella lääniä yhteensä 20.0 neliömetriä // täynnä puulajia koivu ja kunto on erinomainen. Omistaja on Kalle Kala. alue.valtaaalaa(); alue.vaihdaomistaja("seppo Särki"); System.out.println(alue); // Tulostaa: Metsäalueella lääniä yhteensä 40.0 neliömetriä // täynnä puulajia koivu ja kunto on erinomainen. Omistaja on Seppo Särki. TEHTÄVÄ 6. Tiedoston luku ja kirjoitus (Teemu) Tutkit tietokonettasi ja löydät sieltä liisanlinkit.txt-tiedoston. Tiedoston ensimmäisellä rivillä on otsikko, sitten on tyhjä rivi ja sen jälkeen n kappaletta linkkejä. Tiedoston sisältö on seuraava: Liisan linkkilista http://www.google.fi = hirmusen hyvä hakukone http://www.iltalehti.fi = Täältä luetaan uutiset http://www.jyu.fi = Yliopiston sivut https://korppi.jyu.fi/kotka/course/student/opiskurssit.jsp?status=1 = Kurssit korpissa Ohjelmointi 2, välikoe 21.3.2014 6/7
Tee ohjelma, joka 1. lukee em. tiedoston 2. kirjoittaa samalla toiseen.html-päätteiseen tiedostoon linkit siten, että ne toimivat selaimessa klikattaessa. Älä lue liisanlinkit.txttiedostoa listaan tai muuhun tietorakenteeseen vaan käsittele jokainen rivi välittömästi rivin lukemisen jälkeen. Ohjeita html-tiedoston tekemiseen: Html-tiedoston saat tehtyä tulostamalla.html-päätteisen tiedoston alkuun rivit <!DOCTYPE html> <html><head> <title>linkkilista</title> <meta charset="utf-8"> </head><body> ja tiedoston viimeiseksi rivin </body></html> Body-tagien (<body>...</body>) väliin tehdään otsikkorivi sekä jokaisesta linkistä oma rivi seuraavasti: <h1>tähän sivun otsikko</h1> ja <a href="tähän tulee sivun osoite">tähän tulee sivun nimi</a><br> Liisan linkkilistan ensimmäinen linkki olisi tällöin <a href="http://www.google.fi">hirmusen hyvä hakukone</a><br> Eräs ohjelma liisanlinkit.txttiedoston käsittelemiseen tuottaa seuraavanlaisen html-tiedoston: <!DOCTYPE html> <html><head> <title>linkkilista</title> <meta charset="utf-8"> </head><body> <h1>liisan linkkilista</h1> <a href="http://www.google.fi">hirmusen hyvä hakukone</a><br> <a href="http://www.iltalehti.fi">täältä luetaan uutiset</a><br> <a href="http://www.jyu.fi">yliopiston sivut</a><br> <a href="https://korppi.jyu.fi/kotka/course/student/opiskurssit.jsp?status=1">kurssit korpissa</a><br> </body></html> Ohjelmointi 2, välikoe 21.3.2014 7/7