Demonumero: | 9/11 |
---|---|
Palautus: | tiistaina 4.7.2006 klo 18 mennessä. |
Laskennallinen tehtävämäärä: | |
9 kpl. | |
Pisteitä saa korkeintaan: | |
12 kpl. |
(Tämä on viimeinen demo, joka lasketaan mukaan, kun lasketaan sitä 105% suoritusta.)
(esim. 12 tehtyä kohtaa -> 11 pistettä Korppiin)
Tässä demossa on tehtäviä, jollaisia on ollut kurssin välikokeessa vuosien varrella. Jotain tällaisia kehitän teidänkin pään menoksi. Saatanpa kehittää jotain erilaistakin. Mallia katson ainakin näistä vanhoista välikokeista tehtävineen, mallivastauksineen ja arvosteluperusteineen:
Katsokaapa tekin...
1: | Mitä seuraava ohjelma tulostaa? Tutki PÖYTÄTESTIN avulla! Merkitse pöytätestiin myös milloin mikäkin olio muuttuu roskaksi. (6p): /** * 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 */ } } |
---|---|
2: | Kirjoita funktio pisin_nouseva, 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)
|
3: | 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.(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ää ----------------------------------------------------- |
4: | Kirjoita luokka Ehdokas, jota voidaan käyttää kuten seuraavassa pääohjelmassa. Kirjoitettava koko luokka (attribuutit, kaikki metodit yms.) ja luokan on oltava mielellään "hyvä" eikä mikään "hack". (6p): public static void main(String[] args) { Ehdokas ehd1 = new Ehdokas(100000.0,0),ehd2 = new Ehdokas(20000.0,300); ehd1.tulosta(); // Tulostaa: Rahaa 100000, ääniä 0 ehd2.tulosta(); // Tulostaa: Rahaa 20000, ääniä 300 ehd1.osta(200,100.0); // Ostaa 200 ääntä, 100 mk/kpl ehd1.tulosta(); // Tulostaa: Rahaa 80000, ääniä 200 boolean onnistui = ehd2.osta(300,100); if ( !onnistui ) System.out.println("Rahat ei riitä :-)"); ehd2.tulosta(); // 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! } |
5: | 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) ja muuta esimerkki ArrayListMalli.java sellaiseksi, että tietorakenteessa oleva luku voidaan muuttaa kutsulla: ((Int)luvut.get(1)).set(4); Luokkaan Int pitää tehdä sen verran metodeja, että esimerkki ArrayListMalli.java toimii kun kaikki Integer sanat muutetaan Int. |
6: | Tee aliohjelma: int poista(int taulukko[],int lkm,int n) joka "muodollisesti" poistaa taulukosta kaikki luvun n esiintymät. Eli poiston jälkeen taulukkossa ei ole yhtään lukua n. Oikeasti taulukkoa ei voi pienentää, mutta alkioita siirretään alkuunpäin ja ilmoitetaan "virallisten" alkioiden lkm. Seuraavan esimerkin taulukossa on "poiston" jälkeenkin 6 kokonaislukua, mutta niistä saa käyttää vain 4:ää ensimmäistä. int t[]={4,7,9,3,9,2}; int lkm=6; lkm = poista(t,lkm,9); /* => t = {4,7,3,2}, lkm = 4 */ |
7: | Kirjoita Taulukko.java taulukolle metodi public Object clone(), jolla voidaan sijoittaa taulukkoon toinen taulukko: ... public static void main(String args[]) { Taulukko luvut = new Taulukko(7); luvut.lisaa(0); luvut.lisaa(2); System.out.println(luvut); Taulukko taul = (Taulukko)luvut.clone(); System.out.println(taul); // tulostaa saman kuin edellä } |
8: | Kirjoita Taulukko -luokalle 6. tehtävää vastaava metodi poista. Mitä parametrejä tämä metodi tarvitsee? |
9: | 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ä? |
B1-2: | Kirjoita Java-kieliset luokkamäärittelyt, joilla saat loogisesti seuraavan näköiset rakenteet sekä kirjoita vastaavien muuttujien määrittelyt ja metodi-kutsut jotta rakenteessa olisi samat tiedot kuin kuvassa: (olioita, taulukoita ja viitteitä:) +-------------+ | 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 | | +----------+ |
---|---|
G1: | Kokeile kuinka paljon tehtävässä 5 auttaisi Java 1.5:n uudet geneeriset ominaisuudet (ks. ArrayListMalliGen.java) |
G2: | (Bruce Willis) Muuta Astia2.java olio-ohjelmaksi, joka toimisi suurinpiirtein seuraavasti: ... public static void main(String args[]) { AstiaPeli peli = new AstiaPeli(); peli.lisaa_astia("8",8); peli.lisaa_astia("5",5); peli.tulosta_ohje(); peli.pelaa(); } Astia2-luokkaan ei tarvitse tehdä mitään muutosta ja voit käyttää sitä sellaisenaan (Astia2-luokkaa ei tarvitse muuttaa, mutta osan siellä olevista staattisista metodeista voit kopioida tavallisiksi metodeiksi AstiaPeli-luokkaan). Pelin "graafinen versio" löytyy osoitteesta: http://www.mit.jyu.fi/~vesal/kurssit/winohj/moniste/tentit/v00/ |
G3-4: | (Säikeet, tietorakenteet, "thread safety", kokeilevaa oppimista) |
Tehdään tee-se-itse -itseopiskelupaketti säieohjelmoinnin perusperusteista:
Toteuta yhteen maaliin pelattava millisekuntijalkapallo (peli, jossa säikeet tekevät miljoona maalia sekunnissa) säieohjelmointina ja kokeile kriittisen alueen ohjelmointiin liittyvää problematiikkaa:
Tässä on höpöhöpöluokka, josta voi instantoida jalkapallomaalin:
class Maali { HashMap maalit = new HashMap(); long yhteensa = 0; public void ime(String nimi){ yhteensa++; if (maalit.containsKey(nimi)){ long luku = ((Long)(maalit.get(nimi))).longValue(); luku++; maalit.put(nimi, new Long(luku)); } else { maalit.put(nimi, new Long(1)); } } public String toString(){ StringBuffer sb = new StringBuffer(""); String s; long yht = 0; for (Iterator i = maalit.keySet().iterator(); i.hasNext();){ s = (String)i.next(); sb.append(s + ":" + maalit.get(s) + " | "); yht += ((Long)maalit.get(s)).longValue(); } sb.append("Maali imenyt yhteensä: " + yht); return sb.toString(); } }
Maalilla on siis metodi ime(String joukkue), ja sen pitää laskea, montako maalia minkäkin nimisen joukkueen pelaajat ovat yhteensä tehneet. Käyttö esim. kassi.ime("Saksa"); ja kassi.ime("Italia");
Tee säieluokka, josta voi instantoida ja käynnistää yksittäisen pelaajan, jolla on merkkijonona nimi ja edustusjoukkue sekä viite maaliin, jota kohti pelaaja laukoo. Maaleja on oltava testiohjelmassa yksi.
Jokainen pelaajasäie tykittää jatkuvasti päättymättömässä luupissa maaleja maaliolioon, ja laskee montako maalia se on laukaissut. Maalin ajatus on imeä kaikki laukaukset, eli pelaajasäikeen tehtävä on olennaisesti yhteinenmaali.ime(this.joukkueenNimi);
Kokeile ajaa ohjelmaa eri määrällä pelaajasäikeitä ja tutustu yksinkertaisen synkronointiongelman ilmenemiseen: Siis katso, mitä tapahtuu, jos jätät maalin tuollaiseksi kuin yllä. Tee tarvittavia tulosteita.
Korjaa maali siten, että se toimii useiden säikeiden kanssa oikein, eli vaikkapa jotakin tuollaista interaktiivisessa testiohjelmassa:
q lopettaa; muu syöte tarkastaa säikeiden tilan > Maaliin on mennyt: Italia:5770031 | Saksa:11161113 | Maali imenyt yhteensä: 16931144 Podolski 5685953 Neuville 5475160 Gilardino 5770031 Pelaajat laukoneet yhteensä: 16931144 q lopettaa; muu syöte tarkastaa säikeiden tilan > Maaliin on mennyt: Italia:6456962 | Saksa:12301110 | Maali imenyt yhteensä: 18758072 Podolski 6211279 Neuville 6089831 Gilardino 6456962 Pelaajat laukoneet yhteensä: 18758072 q lopettaa; muu syöte tarkastaa säikeiden tilan >q Maaliin on mennyt: Italia:7040982 | Saksa:13383956 | Maali imenyt yhteensä: 20424938 Podolski 6682099 Neuville 6701857 Gilardino 7040982 Pelaajat laukoneet yhteensä: 20424938