Ohjelmointi 2 -- kesä 2006 -- Demo 9/11

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) 
  1. Kirjoita ensin algoritmi, saat jakaa ongelman pienempiinkin osiin :-).(2p)
  2. Toteuta em. algorimi Java -kielellä.(4p)
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ä?

Bonus-osio

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: