wiki:k2012/demot/demo9
Last modified 5 years ago Last modified on 2012-07-04 12:12:46

Demot » Demo 9, 12.3.2012

Palautus NETTIDEMOWWW-ohjelmalla. Tähdellä (*) merkitty ne tehtävät, jotka ehdottomasti kannattaa tehdä.

Tämän demon tehtävät 1-4 on mukaeltu aikaisempien vuosien välikokeista. Myös muut tehtävät (erityisesti B1-2) voisivat olla koetehtäviä. Tämän kerran kokeeseen tulee luonnollisesti jotakin testaamiseen liittyvääkin.

Tietorakenteet voivat olla esim. samanlaisia kuin tehtävän 7 Taulukko.java -tehtävässä. Yleensä pyrin laittamaan ainakin yhden "omatoimista soveltamista" mittaavan tehtävän, eli vähän erilaisen kuin näissä harjoituksissa - kuitenkin kurssin sisältöön liittyvän. Muistakaa se yhden A4:n lunttilappu. Esim. tiedostojen avaamisrutiinit kannattaa kirjoittaa siihen.

Testaaminen

Kaikki "Järkevästi" testattavissa olevat ohjelmat testattava automaattitestillä (JUnit tai ComTest). Jos testaa GUI-ohjelmia esim Lift-kirjastolla saa merkitä yhden lisäbonuspisteen. NettiDemoWWW:hen tämä "tilitetään" palauttamalla tiedosto guitest.txt johon kirjoitetaan mitkä tehtävä on testattu ja vähän mielipiteitä testaamisesta.

Ville V1

Ville tehtävien tilalle 6 haluamaasi tehtävää harjoituksista: http://jhave.org/jhavepop/java/exercises.html Tuossa ensin lataantuu Java-applet (hermoja, se kestää...), johon kirjoitetaan koodia. Esim. 9. tehtävään lisättäisiin rivit:

Node n = p;
while ( n.next != null ) {
  n = n.next;
}
n.next = p;

tai rivi (vain tässä esimerkissä toimiva):

p.next.next.next = p;

ja sitten painettaisiin OK (kokeile 9 tehtävää) ja steppailtaisiin koodia läpi katsoen mitä kuvassa tapahtuu. Palautus kuten Ville tehtävissä, eli tiedosto ville.txt johon vähän tilitystä siitä mitä oppi ja mielellään copy/pastena ne lisätyt rivit. Jos serveri sattuu olemaan toimimattomalla päällä, niin kirjoita itse sinne Ville.txt-tiedostoon ne rivit, mitä kuvittelet tarvittavan tehtävän vastaukseksi. (Tiistaina tuo jhave.org palvelin toimi, keskiviikkona ei).

Tehtävä 1. Pöytätesti

Mitä seuraava ohjelma tulostaa? Tutki PÖYTÄTESTIN avulla! Merkitse pöytätestiin myös milloin mikäkin olio muuttuu roskaksi. Pohjana voi käyttää poyta03tyhja.xls tai poyta03tyhja.html (Vinkki: Katso esimerkiksi 2005 mallit) (6p)

package demo.d9;
/**
 * Tutki pöytätestin avulla mitä ohjelma tulostaa.
 * Merkitse myös milloin mikäkin olio muuttuu "roskaksi". 
 * @author Vesa Lappalainen
 * @version 1.0, 09.03.2003
 */
public class VKseko02 {

  /* 09 */ public static class Sorsa {
  /* 10 */   private int vari;
  /* 11 */   private String nimi;
  /* 12 */
  /* 13 */   public Sorsa() { nimi = "Repe"; vari = 0; }
  /* 14 */   public Sorsa(StringBuffer inimi) {
  /* 15 */     inimi.append("Aku"); vari = 2;
  /* 16 */   }
  /* 17 */
  /* 18 */
  /* 19 */
  /* 20 */   void hyppaa(Sorsa apu) {
  /* 21 */     apu.nimi = "Senkin Sorsa";
  /* 22 */     vari++;
  /* 23 */   }
  /* 24 */   void tulosta() {
  /* 25 */     vari++;
  /* 26 */     System.out.println(nimi + " " + vari);
  /* 27 */   }
  /* 28 */ }
  /* 29 */
  /* 30 */ public static void main(String[] args)
  /* 31 */ {
  /* 32 */   StringBuffer nimi = new StringBuffer("Väiski");
  /* 33 */   Sorsa aku = new Sorsa(nimi);
  /* 34 */   System.out.println(nimi);
  /* 35 */   aku.tulosta();
  /* 36 */   {
  /* 37 */     Sorsa repe = new Sorsa();
  /* 38 */     repe.tulosta();
  /* 39 */     aku.hyppaa(repe);
  /* 40 */     aku.tulosta();
  /* 41 */     aku = repe;
  /* 42 */   }
  /* 43 */   aku.tulosta();
  /* 44 */ }
}

Tehtävä 2. Pisin nouseva

Kirjoita funktio pisinNouseva, joka palauttaa Javan merkkijonosta pisimmän pelkästään kasvavan (samoja tai aakkosissa aina edeltäjäänsä "suurempia" merkkejä sisältävän) merkkijoukon pituuden

Esimerkki:
  "abajiuxac"   => 3  (eli iux)
  "kissa"       => 3  (eli iss) 
  1. Kirjoita ensin algoritmi, saat jakaa ongelman pienempiinkin osiin :-). (2p)
  2. Toteuta em. algoritmi Java -kielellä. (T) (4p)

Tehtävä 3. Tiedostosta kopiointi

Kirjoita ohjelma (kieli vapaa), joka lukee tiedostoa, jossa on välilyönnein toisistaan erotettuja lukuja ja sanoja, ja kopioi toiseen tiedostoon ne rivit, joiden alussa on luku, joka on suurempi kuin 30. (T, tällä kertaa riittää hahmotelma) (6p)

Tiedostosta:             tulee tiedosto:   
-----------------------------------------------------
33 hiljaa 1 hiipii       33 hiljaa 1 hiipii
hyvä 33 tulee            36 1 3 5 55      
36 1 3 5 55
nyt 33 riittää         
-----------------------------------------------------

Tehtävä 4. Ehdokas

Kirjoita luokka Ehdokas, jota voidaan käyttää kuten seuraavassa pääohjelmassa. Kirjoitettava koko luokka (attribuutit, kaikki metodit yms.) (T) (6p)

public static void main(String[] args)  {
    Ehdokas ehd1 = new Ehdokas(100000.0, 0);
    Ehdokas ehd2 = new Ehdokas(20000.0, 300);
    System.out.println(ehd1); // Tulostaa: Rahaa 100000, ääniä 0
    System.out.println(ehd2); // Tulostaa: Rahaa 20000, ääniä 300
    ehd1.osta(200, 100.0); // Ostaa 200 ääntä, 100 mk/kpl
    System.out.println(ehd1); // Tulostaa: Rahaa 80000, ääniä 200
    boolean onnistui = ehd2.osta(300, 100);
    if (!onnistui) System.out.println("Rahat ei riitä :-)");
    System.out.println(ehd2); // Tulostaa: Rahaa 20000, ääniä 300
    if (ehd1.compareTo(ehd2) > 0) System.out.println("Ehdokas 1 voitti!");
    if (ehd1.compareTo(ehd2) < 0) System.out.println("Ehdokas 2 voitti!");
    if (ehd1.compareTo(ehd2) == 0) System.out.println("Taspeli!");
    // Vertailu tehdään äänimäärien perusteella.
    // Esimerkissä tulostuu : Ehdokas 2 voitti!
}

Tehtävä 5. Muutettava Int-luokka

Javan Integer -luokka on muuttumaton (immutable), eli kun kokonaisluku on luotu, sitä ei voi enää muuttaa. Tee oma luokka Int, jonka arvoa voi muuttaakin (mutable). Muuta esimerkki dynaaminen/ArrayListMalliGen.java sellaiseksi, että tietorakenteessa oleva luku voidaan muuttaa kutsulla:

    Int luku = luvut.get(1);
    luku.set(4);
  // tai
    luvut.get(1).set(4);

Luokkaan Int pitää tehdä sen verran metodeja, että esimerkki ArrayListMalliGen.java toimii kun kaikki Integer sanat muutetaan Int. Vaihda tulostuksissa int tilalle Int. Koska autoboxing ei toimi omille luokille, täytyy lisäykset tehdä muodossa

luvut.add(new Int(0));                 

Muista toteuttaa Int luokkaan myös toString-metodi. (T)

Tehtävä 6. Poista taulukosta

Tee aliohjelma

    int poista(int taulukko[],int lkm,int n)

joka "muodollisesti" poistaa taulukosta kaikki luvun n esiintymät. Eli poiston jälkeen taulukossa ei ole yhtään lukua n. Oikeasti taulukkoa ei voi pienentää, mutta alkioita siirretään alkuun päin ja ilmoitetaan "virallisten" alkioiden lkm. Seuraavan esimerkin taulukossa on ensimmäisen "poiston" jälkeenkin 6 kokonaislukua, mutta niistä saa jatkossa käyttää vain 4:ää ensimmäistä. (T)

   int t[]={4,7,9,3,9,2};
   int lkm=6;

   lkm = poista(t,lkm,9);  /* => t = {4,7,3,2,?,?}, lkm = 4  */
   lkm = poista(t,lkm,2);  /* => t = {4,7,3,?,?,?}, lkm = 3  */
   lkm = poista(t,lkm,4);  /* => t = {7,3,?,?,?,?}, lkm = 2  */

Tehtävä 7. Clone

Kirjoita dynaaminen/Taulukko.java (ks. moniste 13.3) taulukolle metodi public Taulukko clone(), jolla voidaan luoda taulukosta identtisesti käyttäytyvä kopio (T):

...
public static void main(String args[]) {
  Taulukko luvut = new Taulukko(7);
  luvut.lisaa(0); luvut.lisaa(2);
  System.out.println(luvut); // Tulostaa " 0 2" 
  Taulukko taul = luvut.clone();
  luvut.lisaa(77);   
  System.out.println(taul);  // tulostaa saman kuin edellä " 0 2"
}

Tehtävä 8. Poista Taulukko-luokasta

Kirjoita Taulukko-luokalle 6. tehtävää vastaava metodi poista. Mitä parametreja tämä metodi tarvitsee? (T)

Tehtävä 9. Tiedoston kirjoittaminen

Pääteohjauksessa 2 piti kirjoittaa seuraava tiedosto:

000 En enää turhaan kirjoita!
001 En enää turhaan kirjoita!
002 En enää turhaan kirjoita!
003 En enää turhaan kirjoita!
...
099 En enää turhaan kirjoita!

Tee nyt ohjelma, joka kirjoittaa tiedoston puolestasi. Mitä ohjelma voisi kysellä käyttäjältä? (T, riittää hahmotelma testaamisesta)

Tehtävä B1-2. Kuvasta luokka

Kirjoita Java-kieliset luokkamäärittelyt, joilla saat loogisesti seuraavan näköiset rakenteet sekä kirjoita vastaavien muuttujien määrittelyt ja metodikutsut, jotta rakenteessa olisi samat tiedot kuin kuvassa:

 +-------------+ 
 |     7       |
 |     3       |
 |      o------+----------------------------------------+ 
 |      o------+-----------------+                      |
 |      o      |                 |                      |
 +------+------+                 v                      |
        |                    +--------------+           v
        v             +----->|Kassinen Katto|        +-----+
  +----------+        |      |Katto         |        |  5  | 0
0 |     o----+--------+      |3452          |        +-----+
  +----------+               |       o------+------->|  9  | 1
1 |     o----+--------+      +--------------+        +-----+
  +----------+        +----->+-------------+         |  3  | 2
2 |     o----+-------------->|Susi Sepe    |         +-----+
  +----------+               |Takametsä    | +------>|  2  | 3
3 |          |               |-            | |       +-----+
  +----------+               |       o-----+-+       |  1  | 4
4 |          |               +-------------+         +-----+
  +----------+                                       |  0  | 5
5 |          |                                       +-----+
  +----------+              
6 |          |              
  +----------+                                                

Tehtävä B3. Pylvas prosentteina

Ota Pylvas.java ja peri siitä luokka PylvasPros, jolla toimii seuraava testiohjelma:

public static void main(String[] args) {
    PylvasPros p5 = new PylvasPros(1,5,0); // leveys,korkeus, välitason kor
    PylvasPros p8 = new PylvasPros(1,8,2);

    Window window = new Window();
    window.scale(0,0,5,8);
    p8.move(2,0,0);
    p8.setValiColor(Color.RED);

    window.add(p8);
    window.add(p5);
    window.showWindow();

    Syotto.kysy("Asettaa 5 pylvään välin");      p5.setValiPros(80);
    Syotto.kysy("Pienennä 8 pylvään korkeutta"); p8.setKorkeus(6);
    p8.setLukittu(true); // seuraavassa väli muuttuu 2:sta 1:ksi.
    Syotto.kysy("Pienennä 8 pylvään korkeutta"); p8.setKorkeus(3);
}

Lukitsemisen tarkoitus on, että jos pylväs on "lukittu", niin sen korkeuden muuttaminen muuttaa samalla myös välitason korkeutta niin, että suhteellinen prosenttiosuus pysyy samana. Ilman lukitusta välitason absoluuttinen määrä pysyy samana (ja prosenttiosuus muuttuu) korkeuden muuttuessa.

Myös seuraavan testin tulee toimia:

/**
 * Asettaa pylvään korkeuden.  Mikäli lukittu, muuttaa
 * välin tilannettakin.
 * @param korkeus pyvään korkeus
 * 
 * @example
 * <pre name="test">
 *   PylvasPros p = new PylvasPros(1,10,5);
 *   p.getKorkeus()  ~~~ 10.0;
 *   p.getVali()     ~~~  5.0;
 *   p.setKorkeus(20.0);
 *   p.getKorkeus()  ~~~ 20.0;
 *   p.getVali()     ~~~  5.0;
 *   p.getValiPros() ~~~ 25.0;
 *   p.setLukittu(true);
 *   p.setKorkeus(10.0);
 *   p.getVali()     ~~~  2.5;
 * </pre>
 */
@Override
public void setKorkeus(double korkeus) {...}

Tehtävä B4-5. Tiedostojen testaaminen

Tehtävien 3 ja 9 testit toteutettuna. Ks: http://users.jyu.fi/~vesal/kurssit/ohj2/ali/ ja sieltä VertaaTiedosto

Välikokeet 2003 - 2009

Treenausta varten vuosien 2003 - 2009 välikokeet ja niiden vastaukset: