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

Demonumero:11/11
Palautus:tiistaina 18.7.2006 klo 23:59 mennessä.
Laskennallinen tehtävämäärä:
 10 kpl.
Pisteitä saa korkeintaan:
 10 kpl.

(esim. 12 tehtyä kohtaa -> 10 pistettä Korppiin)

Enää ei tarvitse tehdä yli sataa prosenttia; siihen vaikuttaa vain demot 1-9. Huomaa silti, että kahdessa viimeisessä demossa aletaan vasta päästä asiaan. Näiden merkitys oppimisen kannalta on suuri!!! Eli kannattaa tehdä -- ja ajatella -- näitä mahdollisimman paljon.

Pyydän mitä nöyrimmin vastaamaan tehtävään 0, vaikka siitä ei saa pisteitä.

0:(Palaute ja jälkipyykki; tästä tehtävästä ei saa pistettä)

Saa vastata joko julkisesti (suositeltavaa, kuten aina) tai sitten sähköpostilla suoraan mulle nieminen@cc.jyu.fi:

1:(dynaamisesta tietorakenteesta)

Entäs, jos dynaamisesti kasvatettava tietorakenne vain kasvaa, ja muisti täyttyy periaatteessa käyttämättömästä tilasta, jos jossain vaiheessa taas tarvitaan tilaa vähemmille alkioille?

Toteuta muuttuvankokoinen taulukko, josta voi poistaa alkioita ja joka myös pienenee tarvittaessa. Kannattanee käyttää pohjana jotakin aiempaa dynaamisesti kasvavaa toteutusta (mallivastaus tai oma).

2:(Oppimisen osoitus)

Ota joku oma (mieluummin vähän pidempi) vastauksesi aiempaan demoon - joku sellainen, jossa on mielestäsi paljon parannettavaa. Korjaa se vastaamaan nykyistä käsitystäsi hyvästä ohjelmoinnista, tai tee kokonaan uudelleen niin kuin nyt tekisit. Kommentoi kaikki eroavuudet aiempaan: miksi se on nyt parempi.

3:

(Pientä; Java Bytecode, konekielikäskyt)

Tutustu vaikkapa tähän introon ja JVM Specificationin lukuun Compiling for the Java Virtual Machine (erityisesti esimerkkeihin).

Käännä allaoleva ohjelma komentoriviltä javac ByteCodeDemo.java ja tee käännetystä luokasta "disassembly": javap -c ByteCodeDemo > tavukoodi.txt.

  • Yritä hahmottaa vähän sitä, miten lähdekoodi kääntyy (virtuaali)konekielelle ja miten konekieli tekee esim. olion luonteja, muuttujien asetuksia ja metodikutsuja.
  • Koeta dokumentoida käsky käskyltä metodin plus tavukoodi ja se kohta main-metodista, joka kutsuu plussausta. (Olennaista konekielessä on mm. tapa jolla parametrit välittyvät aliohjelmalle ja tapa jolla paluuarvot saadaan kutsuvan ohjelman paikallisiin muuttujiin. Eli missä ja miten säilytetään "fyysisesti" arvoja.)

Tässä listaus:

/** Tavukoodidemo - yksinkertaisia operaatioita käännettäväksi JVM:lle */
public class ByteCodeDemo {

    private int value = 234;

    ByteCodeDemo(int value){
       this.value=value;
    } 

    public void printout(){
        for (int i=0; i<value; i++){
            System.out.println("Hello world!");
        }
    }

    public static int plus(int a, int b){
        int sum;
        sum = a + b;
        return sum;
    }

    public static void main(String[] args){
        int a = 123, b = -119;
        int number = plus(a,b);
        ByteCodeDemo bcd = new ByteCodeDemo(number);
        bcd.printout();
    }
}
4:

(Suurta; ison ohjelman lähdekoodi ja versionhallinta)

Selaa Eclipsen lähdekoodia netissä CVS-webkäyttöliittymän kautta: http://dev.eclipse.org/viewcvs/index.cgi/#dirlist

Etsi paketti org.eclipse.core.launcher ja sieltä tiedosto Main.java. (Paketin lähdekoodi on hakemiston org.eclipse.platform alla ...)

Kontrollikysymyksiä:

  • Montako versiota versionhallinnassa on kyseisestä lähdekooditiedostosta?
  • Mitä jeff korjasi hetkellä Mon May 10 23:42:23 2004 UTC (2 years, 2 months ago)? Käytä diffiä; kerro mitä korvattiin millä.
  • Millaisen muutoksen prapicau teki Thu Mar 23 16:34:25 2006 UTC (3 months, 3 weeks ago)? Käytä diffiä; kerro mitä korvattiin millä.
  • Moniko eri henkilö on muokannut tiedostoa?
  • Montako kertaa isompi Eclipse on kuin Ohjelmointi 2 -kurssin harjoitustyösi (karkea arvio)?
5-7:

(Calculaattori)

Kirjoita ohjelma joka toimisi seuraavasti (kiinnitä huomiota siihen, että komentovalikoimaa voidaan ohjelmaan lisätä "kohtuullisen" helposti:

Anna komento>Ynnää 3 4 5[RET]
Tulos on 12.
Anna komento>Isoksi kana[RET]
kana isona on KANA
Anna komento>palindromiko saippuakivikauppias[RET]
Sana "saippuakivikauppias" on palindromi!
Anna komento>Ynnää 2 1[RET]
Tulos on 3.
Anna komento>Yn 2 1[RET]
Tulos on 3.
Anna komento>Yh 2 1[RET]
En tunne komentoa YH!
Anna komento>[RET]

Mallivastauksen Java-versiossa on mm.:

  public interface KomentoRajapinta {
    boolean suorita(String parametrit);
  }


  public static class Ynnaa implements KomentoRajapinta { ...
  public static class Apua implements KomentoRajapinta { ...
  public static class Palindromiko implements KomentoRajapinta { ...
  public static class Isoksi implements KomentoRajapinta { ...


... luokkia Komento ja Komennot (sis. mm. metodin: etsi) ...

  public static void main(String[] args)  {
    Komennot komennot = new Komennot();
    Apua apua = new Apua("komento.txt");

    komennot.add(new Komento("?",apua));
    komennot.add(new Komento("apua",apua));
    komennot.add(new Komento("+",new Ynnaa()));
    komennot.add(new Komento("ynnää",new Ynnaa()));
    komennot.add(new Komento("isoksi",new Isoksi()));
    komennot.add(new Komento("palindromiko",new Palindromiko()));

    String s;

    while ( true ) {
      s = Syotto.kysy("Anna komento");
      if ( s.equals("") ) break;
      komennot.tulkitse(s);
    }

  }
8:

("On-line" avustus) Vaikket tekisikään tehtävää 5-7, niin lisää siihen Help.java:aa kayttäen avustus. Eli jos et ole tehnyt tehtävää 5-7, niin kirjoita pääohjelma joka ? painamisella tulostaa avustuksen käyttäen Help.java:n metodeja. Ota uusi .jar-tiedosto itsellesi ali-hakemistosta ja tutki Help.javaa. Kirjoita myös alkeellinen avustustiedosto.

9:

(Tehokkuuskysymykset, ohjelmien empiirinen mittaaminen)

Lue Ohjelmointi 2:n vuoden 2005 sähköpostiarkistosta viestiketju, joka alkaa tästä: https://korppi.jyu.fi/list-archive/ohj05k/0046.html päätyen tähän: https://korppi.jyu.fi/list-archive/ohj05k/0050.html

Tee vastaava pikkutesti, jossa kokeilet suoritusaikojen suhteellista eroa merkkijonon katenoinnissa String-olioita plussaamalla ja käyttämällä StringBuffer.append() -metodia. Jos kiinnostaa kokeilla muitakin ilmiöitä, niin en kiellä...

(Huomaa, että myös suoritusaikamittaukset eli ohjelmien "profilointi" kuuluu sarjaan "usein tarvittavat työkalut", ja sitä varten on esimerkiksi Eclipseen tehty kunnollinen apuväline jollaisia kannattaa aika ajoin etsiä ja opetella käyttämään... sitten joskus, kun on kiinnostusta ja pelkkää aikaa...)

10:

(Rekursio, algoritmien tehokkuutta)

Ks. Wikipediasta sivu http://en.wikipedia.org/wiki/Fibonacci_number

Toteuta Java-aliohjelmina eri algoritmit n:nnen Fibonaccin luvun laskemiseksi.

Vertaile algoritmeja vastaavalla tavalla kuin Stringejä tehtävässä 9.

Bonus-osio

B1-2:

(java.lang.Object -rajapintaa vielä)

Tarkennetaan, miten kannattaisi tehdä equals() ja miten siihen liittyy hashCode():

Lue netistä kirjoitus http://www.javaworld.com/javaworld/jw-06-2004/jw-0614-equals_p.html ja lisää malliharjoitustyön luokkaan Kentta sekä kaikkiin sen aliluokkiin metodit equals() ja hashCode() kirjoituksessa suositellulla tavalla.

B3:

(Object Serialization)

http://java.sun.com/docs/books/tutorial/essential/io/serialization.html

Ota joku aiemmin toteutettu luokka (oma tai mallivastaus), josta voi tehdä olioinstansseja. Korjaa ensin luokka vastaamaan nykyistä käsitystäsi hyvästä olio-ohjelmoinnista. Sitten tee ohjelma, joka tekee olion tai pari, ja tallentaa ja lataa olion Javan Object serialization -systeemin avulla.

Guru-osio

G1-4:

(Rekursion hyödyntäminen; "raakavoima-ratkaisut")

Hevosen hyppely. Hevonenhan voi hypätä shakkilaudalla 2 yhteen suuntaan ja yhden toiseen suuntaan. Tee ohjelma joka etsii hevoselle reitin 5x7 laudalla niin, että hevonen käy tasan yhden kerran jokaisessa ruudussa.

Vinkkejä: Lauta-luokka, jossa on "ruutu" jokaiselle paikalle. "Ruutuun" tallennetaan monesko hyppy tulee tähän ruutuun. 0 on vapaa ruutu. "Siirtovektori" hevosen mahdollisille hypyille.