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

Demonumero:10/11
Palautus:tiistaina 11.7.2006 klo 23 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.

1-2:

(Kokonaisen pikkuohjelman tekeminen)

Toteuta rahanvaihto-ohjelma, jossa on kurssitaulukko tyyliin

valuutta

kurssi

mk

1.0

$

5.7

EUROA

5.94573

SKr

0.6

ja jonka toiminta näyttäisi seuraavalta:

Määrä ja valuutta>10 Skr[RET]
10.00 Skr on 6.00 mk.
Määrä ja valuutta>2 EUROA[RET]
2 EUROA on 11.89 mk.
Määrä ja valuutta>loppu[RET]
Kiitos!

Tee ohjelma niin, että valuuttataulukko luetaan tiedostosta. Tiedostoon pitää voida lisätä uusia valuuttoja, ja kursseja pitää voida vaihtaa, ilman että itse ohjelmaan tarvitsee tehdä mitään muutoksia.

Muista, että ohjelmaa voidaan ohjelmoida pieni pala kerrallaan!

3:

("Peer review", koodien lukeminen ristiin; + kurssin painotukset)

Arvostele aakkosissa seuraavan henkilön vastaukset demon 9 tehtäviin 1-4. (Väisänen arvostelisi Hirvosen, ja muut sitten aina seuraavan users-listassa). Muodosta oma arviosi demo9:n mallivastausten [julkaisen ne torstaina 6.7. klo 17 mennessä] ja edellisten vuosien arvosteluperusteiden avulla, ks:

Jos annat alle 6 pistettä/tehtävä; perustele vähennyksen syy oman tulkintasi mukaan.

Lähetä arvostelu privaatilla sähköpostilla henkilölle itselleen sekä minulle. Kaikilla näyttäisi toimivan sähköpostiosoite TUNNUS@cc.jyu.fi. Demonpalautuksessa kirjoita tekstitiedostoon "Tehty." ja anna itsellesi piste files.txt -tiedostoon.

4:

(Aiemman koodin muuttaminen; dynaamisuus)

Lisää esimerkkiin Sanat.java automaattinen taulukon koon kasvatus, mikäli alkuperäisen varatun taulukon koko käy liian pieneksi (tarvitset myös luokan Sana.java) .

5:

(Syväkopiointi; suositeltava tehtävä koska oppii taas uutta!)

Lisää luokkaan Sanat.java metodi clone(), joka luo syväkopioinnilla kloonin oliosta. Syväkopiointi tarkoittaa sitä, että olio on kopio toisesta oliosta, mutta niillä ei ole yhteisiä viitteitä, vaan kaikki viitatutkin oliot on syväkopioitu (paitsi Javan tapauksessa immutable luokkia ei tarvitse kopioida). Seuraavassa esimerkki kutsusta:

sanat.kasitteleRivi("kissa, istuu kissa puussa");
sanat.tulosta(System.out);
Sanat sanat2 = (Sanat)sanat.clone();
sanat2.tulosta(System.out);

Pitääkö jotakin vielä muuttaa luokassa Sana?

6:

(Lisää uuden tiedon etsimistä; volatile-avainsana)

Selvitä, mitä Javan avainsana volatile tarkoittaa, ja kirjoita ymmärryksesi mukainen selvitys suomen kielellä.

7:

(Oikeellisuustarkistukset)

Kirjoita luokka Kello jossa on metodi tarkista(String jono), joka tarkistaa onko parametrina viety merkkijono oikeata muotoa kellonajaksi. Jos on vikaa, niin funktio palauttaa merkkijonona vian, muuten null-viitteen.

Jos kyseessä on loppukäyttäjän syöte, täytyy ajatella miten käyttäjä ehkä haluaa luonnollisella tavallaan syöttää kellonaikoja. Mieti siis useita erilaisia formaatteja kellonajalle! esim. "12:37", "12:37:56", "5pm", "17", ... ja miten muuten voikaan olettaa käyttäjän ajattelevan.

8:

(Funktio-oliot; matemaattiset algoritmit)

Kirjoita funktio (=luokkametodi, static) fun_min, jolle viedään parametrinä minimoitava funktio-olio ja x:n vaihteluväli. Funktio palauttaa funktion "minimin", siis pienimmän arvon, jonka funktio voi saavuttaa annetulla välillä. Katso mallia Integroi2.java.

9-10:

(Funktio-oliot)

Ohjelma joka piirtää funktion sin(x) kuvaajan seuraavasti (automaattinen skaalaus y-akselille, funktion vaihto helpoksi (täytyy olla vaihdettavissa vaikka exp(x*x)+2 tai mitä vaan ), ks. Integroi2.java ja tehtävä 8):

Piirrän funktion sin(x)
Anna väli ja tiheys jolla piirretään (-5.00  5.00  0.50) >[ret]
                                           *
                                           *
                                       *
                               *
                     *
            *
     *
    *
       *
              *
                       *
                                 *
                                        *
                                           *
                                          *
                                   *
                          *
                *
        *
    *
    *

Pääohjelma malliksi:

public static void main(String[] args)  {
  double x1=-5,x2=5,dx=0.5,y1,y2; String s;
  FunktioRR f = new SinFun();

  System.out.println("Piirrän funktion sin(x)");
  s = Syotto.kysy("Anna väli ja tiheys jolla piirretään",
                  Mjonot.fmt(x1,4,2) + " " + Mjonot.fmt(x2,4,2) + " " +
                  Mjonot.fmt(dx,4,2));
  StringBuffer sb = new StringBuffer(s);
  x1 = Mjonot.erota(sb,' ',x1);
  x2 = Mjonot.erota(sb,' ',x2);
  dx = Mjonot.erota(sb,' ',dx);

  y1 = fun_min(f,x1,x2,dx);
  y2 = fun_max(f,x1,x2,dx);

  piirra(f,x1,x2,y1,y2,dx);

}

Bonus-osio

B1-2:

(Kokonaisen ohjelman tekeminen; aiemmin nähdyn soveltamista)

Kirjoita ohjelma, joka kyselee nimiä kunnes annetaan tyhjä rivi ja tulostaa tämän jälkeen nimet aakkosjärjestyksessä. Nimet syötetään muodossa "Aku Ankka", mutta siitä huolimatta ne lajitellaan siten, että "Iines Ankka" < "Hannu Hanhi", eli sukunimen mukaan.

Pohdittavaksi ("hyvä vastaus" soveltaa pohdinnan tulosta): Tehtävänannossa luetaan syötteet konsolilta (System.in), joten ohjelman tulee tietysti toimia niin... Tällaisen kokonaisuuden testaaminen on kuitenkin työlästä, koska pitää syöttää testidata näppäimistöltä. Mieti testilähtöistä ohjelmointia ja automaattista testausta. Miten automaattisuus vaikuttaa suunnitteluratkaisuihisi? Miten luultavasti ratkaisun rakenne poikkeaa sellaisesta, joka mahdollisesti tulee ensimmäisenä mieleen (ainakin kokemattomammalle ohjelmoijalle)?

B3-:

[Tullee vielä lisää tehtäviä, joista voi valita puuhasteltavaa]

Guru-osio

G1-2:Tee piirtämisestä (tehtävä 9-10) kunnon graafinen versio. Pohjaksi käy esim. PiirtoMalli.java tai PiirtoMalliSwing.java
G3-:[Tullee vielä lisää tehtäviä, joista voi valita puuhasteltavaa]