Ohjelmointi 2 2005/ 14.3

Demo 9



Huom! 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 ollaa koetehtäviä.

Tietorakeneet voivat olla esim. samanlaisia kuin tehtävän 7 Taul_d.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.
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) 
a)
Kirjoita ensin algoritmi, saat jakaa ongelman pienempiinkin osiin :-).(2p)
b)
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.)(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 arvo voi muuttaakin (mutable) ja muuta esimerkki dyna/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 dyna/ArrayListMalli.java toimii kun kaikki Integer sanat muutetaan Int.

6*
Tee aliohjelma
    int poista(int taulukko[],int lkm,int n)
joka poistaa taulukosta kaikki luvun n esiintymät.
   int t[]={4,7,6,3,6,2};
   int lkm=6;

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

7*.
Kirjoita dyna/Taulukko.java (ks. moniste 16.3) 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:
 +-------------+ 
 |     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. dyna/ArrayListMalliGen.java )

Välikokeet 2003 ja 2004

Treenausta varten vuosien 2003 ja 2004 välikokeet ja niiden vastaukset:
http://www.mit.jyu.fi/vesal/kurssit/ohjelmointi2003/tentti/
http://www.mit.jyu.fi/vesal/kurssit/ohjelmointi2004/tentti/