Ohjelmointi 2 / 2007 Demot
Demo 10 / 19.3
Taas T:llä merkitty ne joissa JUnit-testi on pakko kirjoittaa. Vähintään kahteen palautettuun tehtävään pitää olla tehtynä testit jotta palautus hyväksytään. Tiedostojen testaamisesta katso edellisen demon vastauksia ja ota uusin Ali.jar avuksi.
1*.
Kirjoita Java-ohjelma joka tulostaa tiedoston
koe.txt:
123456789012345678901234567890123456789012345678901234567890
Kissa istuu puussa
ja ihmettelee
mualiman menoa
sisällön siten, että kunkin rivin alkuun tulee rivinumero ja kustakin rivistä tulostetaan korkeintaan 40 merkkiä (T):
/* 01 */ 1234567890123456789012345678901234567890
/* 02 */ Kissa istuu puussa
/* 03 */ ja ihmettelee
/* 04 */ mualiman menoa
2.
Kirjoita ohjelma, joka kysyy tiedoston nimen ja tulostaa tiedostosta kaikki ne rivit jotka alkavat
** (T).
3*.
Kirjoita ohjelma, joka lukee tiedoston (tietovirtoja käyttäen) ja tulostaa lopuksi kuinka monta kertaa mikäkin aakkosten kirjain esiintyi tiedostossa ('A'='a').
Vihje: Mieti ensin mitä itse tekisit jos joutuisit moisen homman tekemään, eli esimerkiksi kertomaan tästä demopaperista monestiko mikäkin kirjain esiintyi. (T)
4.
Lisää esimerkkiin
dyna/TaulukkoGen.java automaattinen taulukon koon kasvatus, mikäli alkuperäisen varatun taulukon koko käy liian pieneksi.
5.
Lisää luokkaan
dyna/
TaulukkoGen.java metodi
clone(), joka luo syväkopioinnilla kloonin oliosta. Syväkopiointi tarkoittaa sitä, että olio on kopio toisesta oliosta, mutta niillä ei ole yhteisiä viitteitä, vaan kaikki viitatutkin oliot on syväkopioitu (paitsi Javan tapauksessa
immutable luokkia ei tarvitse kopioida). Testiohjelma:
TaulukkoGenTest.java
. Luokan esittelyn joutuu muuttamaan muotoon:
public class TaulukkoGen<TYPE extends Int> implements Cloneable
ja silloin siihen voi tallentaa vain Int
-
luokan olioita tai sen jälkeläisiä. Pitääkö jotakin vielä muuttaa luokassa Int?
6.
Seuraavana esimerkki linkitetyn listan käytöstä (vrt. luennolla tehty muutos
dyna/
Taulukko.java tietorakenteeseen:
dyna/
LinLista.java. Piirrä kuva tietorakenteesta pääohjelman suorituksen jälkeen.
import fi.jyu.mit.ohj2.*;
/**
* Esimerkki linkitetystä listasta,
* @author Vesa Lappalainen
* @version 1.0, 15.03.2003
*/
public class Koulu {
public static class Oppilas {
private String nimi;
private double keskiarvo;
private Oppilas seuraava;
public Oppilas(String nimi, double keskiarvo) {
this.nimi = nimi; this.keskiarvo = keskiarvo;
}
public String toString() {
return Mjonot.fmt(nimi,-22) + " keskiarvo: " +
Mjonot.fmt(keskiarvo,5,2);
}
}
private String luokka;
private int oppilaita;
private Oppilas ensimmainen;
private Oppilas viimeinen;
public Koulu(String luokka) { this.luokka = luokka; }
public void lisaa(Oppilas oppilas) {
}
public void tulosta(OutputStream os) {
PrintStream out = new PrintStream(os);
}
public void poista_kaikki() {
}
public static void main(String[] args) {
Koulu luokka = new Koulu("1b");
luokka.lisaa(new Oppilas("Ankka Aku",5.0));
luokka.lisaa(new Oppilas("Ankka Tupu",7.0));
luokka.lisaa(new Oppilas("Hiiri Mikki",9.0));
luokka.tulosta(System.out);
luokka.poista_kaikki();
luokka.tulosta(System.out);
}
}
Seuraavat tehtävät liittyvät tuohon
Koulu.java
-ohjelmaan. Valmis testiohjelma
KouluLuokkaTest
.
java
(tosin tuossa
Koulu sanan tilalla on
KouluLuokka).
7*.
Täydennä metodi
lisaa.
8*.
Täydennä metodi
tulosta (tulostaa luokan omat tiedot ja kaikkien oppilaiden tiedot, käyttää metodia
Oppilas.toString)
GURU ja Bonus-tehtävät
B1-2
Muuta
Koulu.java
-esimerkin rakenne sellaiseksi, että luokka
Oppilas ei sisällä viitettä seuraavaan, vaan on erikseen luokkaa
ListanAlkio, jossa on
Oppilas
-viite
ja viite seuraavaan alkioon. Näin luokasta saadaankin luokka, jolla voi tallentaa mitä tahansa objekteja. Pääohjelma ei saa muuttua.
G1-2
Kirjoita
Koulu.java
:n luokaan
Koulu metodi
kaanna, joka kääntää linkitetyn listan päinvastaiseen järjestykseen.