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.
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ä:
|
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. |
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. |
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. |
---|