The referenced paragraph does not exist.

Ohjelmointi 2 2016 / Demo 3

Ne tehtävät, jotka ehdottomasti kannattaa tehdä on merkitty tähdellä (*).

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.

# itsearvio1
==================================================
Tauno T1
==================================================


==================================================
Ville V1
==================================================



==================================================
Tehtävä 1
==================================================




==================================================
Tehtävä 2
==================================================

 

Olis kätevää, jos tämän 'tehtävän' yhteydessä olis aina tuo asianomainen (eli edellisen demon) linkki.

31 Jan 16

vl: se linkki on tuossa 10 cm ylempänä

31 Jan 16

VIDEO 1

Muista että voit saada demopisteitä myös indeksoimalla luento/demovideoita, ks: videohakemisto. Demopisteen saat lisäämällä vähintään 3 linkkiä. Video-tehtävä ei saa olla yksi pakollisesta kahdesta tehtävästä.

# video1

Mitkä videolinkit lisäsin:

 

# tauno

Tauno T1 (0.5 p)

Katso Taunon käyttöohjeita.

Kunkin Tauno-tehtävän aluksi klikkaa Click here to show Tauno -linkkiä. Lopuksi muista ajaa Test.

# laskesummaparillisissa

Tehtävä Tauno T1 a (0.25p)

Lisää aluksi Taunossa tulos-niminen muuttuja ja tee sitten Taunolla ohjelma, joka laskee taulukon parillisissa paikoissa olevien lukujen summan ja vähentää siitä parittomissa paikoissa olevien summan.

int tulos = 0;

 

# laskesummaerotuksella

Tehtävä Tauno T1 b

Lisää aluksi Taunossa tulos-niminen muuttuja ja tee sitten Taunolla ohjelma, joka laskee taulukon summan seuraavasti: (1. - viimeinen) + (2. - toiseksi viimeinen) jne...

int tulos = 0;

 

Ville V1 (0.5 p)

Tee JAVA Villestä tehtävät 4.1-4.6 Ehtolauseet.

Palauta tehtävä kirjoittamalla alla olevaan tekstilaatikkoon mitä opit ja mitä mieltä olit kerran Ville-tehtävistä ja auttoivatko Ville-tehtävät sinua yhtään. Muutama rivi riittää.

# VilleV1

 

Tehtävä 1. Algoritmi: Jokerimerkki ?

# v01
Tehtävä 1 selitys video (1m56s)

Kirjoita algoritmi joka tarkistaa onko merkkijono sama kuin kysymysmerkkejä sisältävä merkkijono (? = mikä merkki vaan). Kysymysmerkki tarkoittaa siis mitä tahansa yhtä merkkiä.

Ohje: Kirjoita ensin ihan sanallinen kuvaus ja sen jälkeen sellainen missä on muutettu numeroiduiksi kohdiksi.

TDD: keksi lisää erilaisia testattavia asioita.

jono        maski
"Kissa"     "K?ss?"    => samat
"Kiss"      "K?ss?"    => ei samat
"Kissa"     "Kassa"    => ei samat
# Tehtava1
- kerro ensin idea karkeasti

- sitten kirjoita vaihe vaiheelta etenevä algoritmi

 

Tehtävä 2. Java: Jokerimerkki ?

TDD: Java-toteutus ja testipääohjelma edelliselle algoritmille. Testin saa tehdä myös ComTestiä 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?") ) ...

Vinkki: yhden merkin ottaminen merkkijonosta ks: String-luokan dokumentaatio.

# jokeri

Tehtävä 2. Jokerimerkki ?

Tee Java-ohjelma, joka tarkistaa, onko merkkijono sama kuin kysymysmerkkejä sisältävä merkkijono.

//

    public static void main(String[] args)
    {
        if ( onkoSamatKysymysmerkilla("Kissa","K?ss?") )
            System.out.println("On samat");
        //TODO: kirjoita lisää testejä tähän
    }

    public static boolean onkoSamatKysymysmerkilla(String jono, String maski)
    {
        //TODO: aliohjelman toteutus tähän
        return false;
    }

 

HUOM! Testin ajaminen vaatii että koodiin on ITSE kirjoitettu ComTest testejä. Muuten valittaa puutuvasta koodista.

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

# v01
Tehtävä 3 selitys video (1m8s)

Kirjoita algoritmi, jolle annetaan kaksi merkkijonoa ja joka poistaa toisesta jonosta kaikki toisen jonon esiintymät. Huom. Tehtävässä on tarkoitus poistaa nimenomaan koko merkkijono, ei yksittäisiä kirjaimia. 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.

# Tehtava3alg

Algoritmi

 

Kokeile osaatko tehdä Java-toteutusta jossa on automaattinen testi (kuten edellä) (vapaaehtoinen +1 bonuspiste).

# Tehtava3koodi

Tehtävä 3. Poista esiintymät

Tee Java-ohjelma, joka poistaa annetusta merkkijonosta kaikki toisen annetun merkkijonon esiintymät.

    public static void main(String[] args)
    {
        //
    }

    public static String poistaEsiintymat(String jono, String poistettava)
    {
        //TODO:  aliohjelman toteutus tähän
        return "";
    }

 

Vinkki StringBuildereilta löytyy hyödyllisiä metodeja Stringien tutkimiseen ja osien poistamiseen.

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

# v01
Olioista luennolla video (17m24s)

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).

# aika

Tehtävä 4. Päivämäärä

   public static void main(String[] args) {
       Pvm p1 = new Pvm(21, 1,  2015);
       Pvm p2 = new Pvm(12, 12, 2012);
       Pvm p3 = new Pvm(19, 8,  1990);
       System.out.println(p1);
       System.out.println(p2);
       System.out.println(p3);
   }

   //TODO: kirjoita ainakin muodostaja ja toString-metodi

 

Tehtävä 5*. Huoneen mitat

# v01
Mittakaavaohjelma luennolla video (24m13s)

JavaFX-projektin voi tehdä olemassa olevan projektin päällekin pienellä kikkailulla:

Suunnittele SceneBuilderillä ja sitten täydennä Java-ohjelma, jossa on dialogi (ikkuna) huoneesta mitattujen tietojen syöttämiseksi. Sitten näiden tietojen 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 matkaFX.

HUOMAUTUS: Ole huolellinen tiedostojen nimien kanssa kun palautat. Mikäli paketin nimi on vaikkapa demo.d3.fx, niin tallenna HuoneGUIView.fxml nimelle demo/d3/fx/HuoneGUIView.fxml ja vastaavasti .css tiedostolle. Mikäli paketin nimi on demo3, kelpaa oletusnimet.

# huoneenmitatCss

Palautus css-tiedostolle

 

# huoneenmitatView

Palautus fxml-tiedostolle

 

# huoneenmitatController

Palautus controllerille

 

# huoneenmitatMain

Palautus pääohjelmalle

 

Pitikö myös laskennan toimia ajamisen jälkeen?
- VL: TIM nappaa käyttöliittymsätä kuvan n. 0.5 sek sen jälkeen kun ohjelman on lähtenäyt käyntiin ja sen enempää toimintaa näihin graaafisiin ei saa. Toki sillä tavalla että ohjelmassa tai -fxml-tiedostossa on annettu jotkut arvot syöttöruutuihin ja ohjelman käynistyessä (vaikka Initialize) käydään suorittamassa laseknta niillä arvoilla. Mutta sen enempää ei voi saada äärillisellä vaivalla toimimaan.

29 Jan 16 (edited 30 Jan 16)

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

# v01
Tehtävä 6 selitys video (21s)

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.

# etusuku
//

   /**
    * Vaihtaa annetun merkkijonon alku- ja loppuosat keskenään.
    * @param
    * ....
    * @return
    * @example
    * <pre name="test">
    *   vaihdaAlkuLoppu(PARAMETRIT) === "";
    * </pre>
    */
   public static String vaihdaAlkuLoppu(PARAMETRIT) {
        return "";
   }


   /**
    * Vaihtaa etunimen ja sukunimen keskenään,
    * Jukka Pekka Palo => Palo Jukka Pekka
    * @param nimi Etunimi Sukunimi jota vaihdetaan
    * @return Sukunimi Etunimi
    * @example
    * <pre name="test">
    *   vaihdaEtuSuku("") === ""
    *   vaihdaEtuSuku(" ") === ""
    *   vaihdaEtuSuku("Pele") === "Pele"
    *   vaihdaEtuSuku("Aku Ankka") === "Ankka Aku"
    *   vaihdaEtuSuku("Jukka Pekka Palo") === "Palo Jukka Pekka"
    * </pre>
    */
   public static String vaihdaEtuSuku(String nimi) {
       StringBuilder sukunimi = new StringBuilder(nimi);
        String etunimet = Mjonot.erota(sukunimi, ' ', true);
        if ( sukunimi.length() == 0 ) return etunimet;
        return sukunimi + " " + etunimet;
   }


   /**
    * Vaihtaa sukunimen ja etunimen keskenään,
    * Palo Jukka Pekka => Jukka Pekka Palo
    * @param nimi Sukunimi Etunimi jota vaihdetaan
    * @return Etunimi Sukunimi
    * @example
    * <pre name="test">
    *   vaihdaSukuEtu("") === ""
    *   vaihdaSukuEtu("Pele") === "Pele"
    *   vaihdaSukuEtu("Ankka Aku") === "Aku Ankka"
    *   vaihdaSukuEtu("Palo Jukka Pekka") === "Jukka Pekka Palo"
    * </pre>
    */
   public static String vaihdaSukuEtu(String nimi) {
       StringBuilder etunimet = new StringBuilder(nimi);
        String sukunimi = Mjonot.erota(etunimet);
        if ( etunimet.length() == 0 ) return sukunimi;
        return etunimet + " " + sukunimi;
   }

 

Tehtävä 7*. Muuttujiin viittaaminen

# v02
Tehtävä 7 selitys video (1m52s)

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");
StringBuilder p;
a = 19;
p = b;
p.append("0");
p = c;
p.append(a);
c = b;
c.append("3");

Vinkki: Laita editori Highlight-tilaan ja paina Ins niin, että kursori on alleviiva. Silloin kirjoittaminen ei lisää sarakkeita. Highlight-tilassa voi tehdä useita pystyviivoja kerralla niin, että Alt pohjassa maalaa yhden kirjaimen levyisen ja korkuisen suorakulmion ja painaa siihen |.

# Tehtava7viitteet

Muuttujiin viittaaminen

          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.

# v02
Tehtävä 8 selitys video (23s)

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.

Kesä2016: Ei pääse sisään korppitunnuksilla. Millä pitäisi kirjautua?

01 Jun 16
# t8jarjesta12

 

Tehtävä B1. Jokeri *

# v02
Tehtävä B1 selitys video (37s)

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.

# TehtavaB1jokeriTahti

 

Joono en ite ainakaa saanu tota rekursiivista toimimaa järkevästi, jos puhutaan sadoista tuhansista tähdistä maskissa. Ois kiva tosiaa nähä joku rekursiivinen ratkasu siihen.

31 Jan 16 (edited 01 Feb 16)

Olisin testannut 100000 *-merkillä mutta jos käytetään merkkijonoja niin javac huutaa error: constant string too long ja jos käyttää taulukoita niin javac huutaa error: code too large

01 Feb 16

993 tähteä :)

Image

Image

01 Feb 16 (edited 01 Feb 16)

Tehtävä G1-2 Tiedosto

Hae tiedosto users.html:

# valuutattxt
<!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.

# g12Users
package demo.d3;

 

aavielon: Testiä ajaessa tulee virheilmoitus

...error: cannot find symbol...
symbol:   class List
location: class TiedostoTest`

Veikkaan että johtuu siitä että testitiedostoon ei synny importti riviä Listille?

-vl: joo, importit pitää itse laittaa. kyllä eclipse ehdottaa kun tekee siellä.

31 Jan 16 (edited 31 Jan 16)

Ongelma on TIMin luomassa testitiedostossa, josta puuttuu importti. Itsekirjoittama koodi kyllä importtaa kaiken ja Eclipsessä ohjelma toimii hyvin 8)
-vl: Mikäli käytätte ComTest-koodissa listoja tms, pitää ne testisä itse importata. Eli ComTest riveillä pitää olla #import...

31 Jan 16 (edited 31 Jan 16)

Aah, nyt selkis, kiitos

31 Jan 16

java.io.FileNotFoundException: users.html (No such file or directory) at java.io.FileInputStream.open0(Native Method) at java.io.FileInputStream.open(FileInputStream.java:195) at java.io.FileInputStream.(FileInputStream.java:138) at java.io.FileInputStream.(FileInputStream.java:93) at demo.d3.HtmlToTaulukko.main(HtmlToTaulukko.java:24)

timin ajohakemistossa ei ole users.html-tiedostoa
31 Jan 16

Paina tallenna users.html laatikon alta

01 Feb 16

JUnit-testien palautukset

Mikäli joku haluaa palauttaa JUnitilla tehtyjä testejä, niin palauta ne tähän. Voit kerätä samaan testiluokkaan useampiakin testcaseja ja vaikka eri tehtävistä.

# junit

 

Java vinkkejä

Miten merkkijono luetaan:

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

Tiedosto luetaan (TiedostonLukeminenJ7.java):

# Plugin1
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: * TiedostonLukeminenList.java:

(Jos tiedoston lukemisessa ongelmia, varmista että tiedosto on projektin root-kansiossa. Jos ko. tiedosto on esim. samassa packagessa kuin itse ohjelma, niin tiedoston lukeminen ei onnistu.)

Merkkijonon muuttaminen numeroksi:

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

These are the current permissions for this document; please modify if needed. You can always modify these permissions from the manage page.