wiki:k2014/demot/demo3
Last modified 4 years ago Last modified on 2014-06-12 15:45:38

Demot » Demo 3, 3.2.2014

English version

Tähdellä (*) merkitty ne tehtävät, jotka ehdottomasti kannattaa tehdä. Palautus: NettiDemoWWW

Viitteissä tyyliin "Luvun 7.5" noudatetaan luentomonisteen numerointia. Demoissa saa käyttää vapaasti aliohjelmapaketteja ohj2/ali. Hakemistossa on kirjaston käyttöohje. Sitä onkin käytetty tehtäviin 5 ja 6 liittyvissä java-tiedostoissa sekä sivun lopussa olevissa vinkeissä. Java-ohjelmien testit saa tehdä aina myös ComTestiä tai JUnittia käyttäen, eli ei ole pakko kirjoittaa pääohjelmaa jos sitä ei erikseen vaadita.

Mitä palautetaan? Itse tehdyt tiedostot. Eli Javasta .java. Jos testit tehdään ComTestillä, niin se generoi toisen *Test.java tiedoston, joka siis ei ole itse kirjoitettu ja tätä EI palauteta. Mutta jos testit tehdään JUnitilla ja ITSE kirjoitetaan tuo testitiedosto, niin silloin se toki palautetaan. *.class -tiedostoja EI MISSÄÄN NIMESSÄ palauteta.

VIDEO 1

Muista että voit saada demopisteitä myös indeksoimalla luento/demovideoita. Lisää vähintään 3-linkkiä ja kerro tiedostoon video.txt mitkä linkit lisäsit. Tehtävän numeroksi VIDEO1. Jatkossa voi joka demokerralle merkitä vastaavasti yhden VIDEO-tehtävän kolmesta linkistä vaikka erikseen Video-tehtävää ei olisi mainittukaan. Video-tehtävä ei saa olla yksi pakollisesta kahdesta tehtävästä.

Tauno T1 (0.5 p)

Tee iTaunolla- seuraavat tehtävät:

  1. Taulukon parillisissa paikoissa olevien lukujen summa miinus parittomissa paikoissa olevien summa
    Esim:
      5 4 6 2 9 1 => (5-4) + (6-2) + (9-1) = 13
    
  2. Taulukon summa (1. - viimeinen) + (2. - toiseksi viimeinen) jne...

Jos haluat kokeilla ohjelmien oikeellisuutta, voit tehdä sen ajamalla nämä JAVA Villen tehtävinä 12.5 ja 12.6.

Halutessasi voit tehdä kokeilun myös Eclipsellä:

  1. luo Eclipsessä uusi projekti vaikka nimelle demot (jos sellaista ei jo ole sinulla).
  2. luo src-kansion alle uusi paketti demo.d3
  3. luo paketin alle uusi Java-luokka TaulukonSummia
  4. Kopioi Java-pohja tuon tiedoston sisällöksi

Ville V1 (0.5 p)

Tee JAVA Villestä tehtävät 4.1-4.6 Ehtolauseet.
1.4 Ville-tehtävien palautus NettiDemoWWW:llä.

Tehtävä 1. Algoritmi: Jokerimerkki ?

Kirjoita algoritmi joka tarkistaa onko merkkijono sama kuin kysymysmerkkejä sisältävä merkkijono (? = mikä merkki vaan). Kysymysmerkki tarkoittaa siis mitä tahansa yhtä merkkiä. TDD: keksi lisää erilaisia testattavia asioita.

 jono        maski
"Kissa"     "K?ss?"    => samat
"Kiss"      "K?ss?"    => ei samat
"Kissa"     "Kassa"    => ei samat

Tehtävä 2. Java: Jokerimerkki ?

TDD: Java-toteutus ja testipääohjelma edelliselle algoritmille. Testin saa tehdä myös ComTestiä käyttäen tai JUnittia käyttäen.

funktion esittely:
public static boolean onkoSamatKysymysmerkilla(String jono, String maski)
...
ja funktiota voidaan kutsua esim:
  if ( onkoSamatKysymysmerkilla("Kissa","K?ss?") ) ...

Tehtävä 3. Poista jonosta kaikki esiintymät

Kirjoita algoritmi, jolle annetaan kaksi merkkijonoa ja joka poistaa toisesta jonosta kaikki toisen jonon esiintymät. Lopputulokseen ei saa jäädä enää yhtään poistettavan merkkijonon esiintymää (vihje: tee "runsaasti" apualiohjelmia):

 jono      poista        tulos
Catcat      at      =>    Cc
Paatti      at      =>    Pi
Puatit      at      =>    Puit 

TDD: keksi lisää esimerkkejä jotka pitää testata.

Kokeile osaatko tehdä Java-toteutusta jossa on automaattinen testi (kuten edellä) (vapaaehtoinen +1 bonuspiste, eli jos algoritmi JA Java-toteutus JA testi, voit merkitä yhteensä kaksi pistettä. Pelkällä Java-toteutuksella vain yksi piste. Algoritmi pitää silloinkin olla!).

Tehtävä 4*. Päivämäärä-olio

Toteuta luokka, jolla kuvataan päivämäärä. Kirjoita ainakin sopiva muodostaja ja metodi toString, jolla päivämäärä saadaan merkkijonoksi. Luonnollisesti testit tavalla tai toisella. Katso mallia: Aika.java. Pääohjelman voit kopioida vaikka luentojen mallista Aika.java. Toimintona riittää että päivämäärä syntyy ja saadaan tulostettua (ei tarvita mitään Lisaa-metodeja).

Tehtävä 5*. Huoneen mitat

Suunnittele ja kirjoita Java-ohjelma, jossa on dialogi (frame) huoneesta mitattujen tietojen syöttämiseksi ja sitten näiden perusteella lasketaan ja näytetään huoneen pinta-ala ja tilavuus. Toteuta ohjelma luennon esimerkin ja monisteen 7.11 Mittakaavaohjelma graafisena -luvun mukaisesti aliohjelmia käyttäen. Katso malliksi Mittakaava.java.

Tehtävä 6*. Samanlaisen koodin muuttaminen yhdeksi aliohjelmaksi

Demokerran 2 mallivastauksessa Etusuku.java:ssa on kaksi samankaltaista aliohjelmaa. Muuta nämä yhdeksi aliohjelmaksi vaihdaAlkuLoppu (sopiva määrä parametrejä, mieti mitä) ja toteuta sitten alkuperäiset kaksi aliohjemaa yhden rivin aliohjelmina jotka kutsuvat vaihdaAlkuLoppu.

Tehtävä 7*. Muuttujiin viittaaminen

Lue monisteen luku: 7.4 Viitteet. Näytä kuvan avulla (piirrä kuva kunkin sijoituksen jälkeen uudelleen) mitä ovat muuttujien arvot seuraavien sijoitusten jälkeen (kun muuttujat ovat sijoittuneet muistipaikkoihin kuten kuvassa). Piirrä kuvaan myös mihin viitteet b, c ja p loogisesti aina "osoittavat".

ks. Viitteet.java:

int a;
StringBuilder b = new StringBuilder("1");
StringBuilder c = new StringBuilder("2");
StringBuffer p;
a = 19;
p = b;
p.append("0");
p = c;
p.append(a);
c = b;
c.append("3");
     
     a = 19     p = b   p.app(0)  p = c   p.app(a)  c = b   c.app(3) 
    +-----+    +-----+  +-----+  +-----+  +-----+  +-----+  +-----+  
100 |     | a  |     |  |     |  |     |  |     |  |     |  |     |  
    +-----+    +-----+  +-----+  +-----+  +-----+  +-----+  +-----+  
104 |900  | b  |     |  |     |  |     |  |     |  |     |  |     |  
    +-----+    +-----+  +-----+  +-----+  +-----+  +-----+  +-----+  
108 |940  | c  |     |  |     |  |     |  |     |  |     |  |     |  
    +-----+    +-----+  +-----+  +-----+  +-----+  +-----+  +-----+
112 | ??  | p  |    o+- |    o+- |    o+- |    o+- |    o+- |    o+- 
    +-----+    +-----+  +-----+  +-----+  +-----+  +-----+  +-----+  
                                                                     
Keko:                                                                
    +-----+    +-----+  +-----+  +-----+  +-----+  +-----+  +-----+  
900 | 1   |    |     |  |     |  |     |  |     |  |     |  |     |  
    +-----+    +-----+  +-----+  +-----+  +-----+  +-----+  +-----+  
940 | 2   |    |     |  |     |  |     |  |     |  |     |  |     |  
    +-----+    +-----+  +-----+  +-----+  +-----+  +-----+  +-----+  

Tehtävä 8. Järjestä 1. ja 2.

Kirjoita Java-ohjelma, joka lukee yhden merkkijonon (rivin) ja tulostaa toisen merkkijonon siten, että merkkijonon 1. ja 2. sana ovat aakkosjärjestyksessä. Tulostetaan aina vain kaksi sanaa, vaikka syötetyssä merkkijonossa olisi useampikin sana. Toteutus mielellään funktion jarjesta1ja2 -avulla (eli kirjoita ko. funktio, vrt Etusuku.java).

TDD: Kirjoita "kaikki mahdolliset" testattavat tapaukset. Jos teet "automaattisen" testin, ei tarvitse kysyä merkkijonoa. Merkkijonon saa ottaa ja näyttää myös graafisessa käyttöliittymässä jos haluaa.

Tehtävä B1. Jokeri *

Kirjoita algoritmi (vrt. tehtävä 1) joka tarkistaa onko merkkijono sama kuin mahdollisesti YHDEN (tai ei yhtään, mutta ei enempää, jos saa olla monta *, niin asia vaikeutuu oleellisesti) *-merkin sisältävä jono (*:n kohdalla voi siis olla miten monta, myös 0, ja mitä merkkiä tahansa)

 jono        maski
"Kissa"     "K*a"    => samat
"Kissa"     "Kassa"  => ei samat
"Joutsen"   "Jo*sen  => samat
"Kissa"     "K*i"    => ei samat
"Kissa"     "K*"     => samat
"Lintu"     "K*"     => ei samat

Mikäli kuitenkin haluat kokeilla useamman tähden toteutusta, niin vinkiksi yksi sana: rekursio.

Tehtävä G1-2 Tiedosto

Hae tiedosto users.html:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html>
<head>
<base target=m1>
</head>
<body>
93 <a href="vesal/index.html?r=">Vesa Lappalainen</a> = 8.5<br>
94 <a href="mattim/index.html?r=">Matti Meikäläinen</a> = 8<br>
95 <a href="teppot/index.html?r=">Teppo Teikäläinen</a> = 9<br>
</body>
</html>

ja tee sitten ohjelma, joka lukee tiedoston ja tulostaa sen muodossa:

93 Vesa Lappalainen = 8.5 - vesal
94 Matti Meikäläinen = 8  - mattim
95 Teppo Teikäläinen = 9  - teppot

eli riisuu pois kaikki rivit, joissa ei ole linkkiä ja linkkiriveistä tulostetaan em. tiedot em. muodossa

Java vinkkejä

Miten merkkijono luetaan:

  String s = Syotto.kysy("Anna jono");
  System.out.println("Jono oli: \"" + s + "\"");

Tiedosto luetaan (TiedostonLukeminenJ7.java):

package demo.d3;
import java.io.*;

/**
 * Luetaan tiedosto ja tulostetaan se näytölle.
 * @author Vesa Lappalainen
 * @version 1.0, 22.01.2012
 */
public class TiedostonLukeminenJ7 {

    /**
     * Esimerkkiohjelma tiedoston lukemisesta Java 1.7 tavalla.
     * @param args ei käytössä
     * @throws IOException jos ongelmia tiedoston kanssa
     */
    public static void main(String[] args) throws IOException {

        try (BufferedReader f = new BufferedReader(new FileReader("users.html")) ) {
            String rivi;
            while ( ( rivi = f.readLine() ) != null ) {
                System.out.println(rivi);
            }
        } catch (FileNotFoundException ex) {
                System.out.println("Tiedosto ei aukea!"); return;
        }         

    }
}

Katso myös vaihtoehtoiset tavat lukea tiedosto:

Merkkijonon muuttaminen numeroksi:

  String s = "123";
  int i = Mjonot.erotaInt(s,0);