wiki:k2015/demot/demo4
Last modified 3 years ago Last modified on 2015-02-06 18:16:19

Demot » Demo 4, 9.2.2015

English version

https://www.mit.jyu.fi/demowww/ohj2/

Tähdellä (*) merkitty ne tehtävät, jotka ehdottomasti kannattaa tehdä. TIM merkityt tehtävät voi tehdä ja ajaa myös TIMissä. Vaikka tekisit tehtävät TIMissä, niin palauta ne silti normaalisti nettidemoon.

Viitteissä tyyliin "Luvun 7.5" noudatetaan luentomonisteen numerointia. Demoissa saa käyttää vapaasti aliohjelmapaketteja ohj2/ali. Hakemistossa on kirjaston käyttöohje.

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.

Pisteytyksestä

Pisteet aina niin, että yksi perustehtävä on yksi piste (jos tehty ja ohjelmatehtävä koneella testattu). Jos samassa tehtävässä on kaksi tehtävänumeroa, esim. 2*3, niin silloin siinä on kaksi tehtävää, eli pis­teet 1+1. Jos yhden pisteen tehtävässä on kohdat a ja b, niin vastaavasti yksi kohta on 0.5 pistettä. Jos tehtävässä on vaikka 4 selvästi eri funktiota tai kohtaa, niin silloin tehtävän voi ajatella koostu­van 4 osasta. Syöttöä vaativissa tehtävissä saa käyttää Ali.jar:in funktioita. Ja muistakaa että Java-ohjelmien on käännyttävä ja toimittava kuten pyydettiin sekä sisällettävä Javadoc-tyyliset kommentit, jotta sen saa merkitä täyden veroisena.

Testit

Tehtävissä pyydetyt testit voit kirjoittaa toistaiseksi joko:

Jos testaa GUI-ohjelmia esim Lift-kirjastolla saa merkitä yhden lisäbonuspisteen. NettiDemoWWW:hen tämä "tilitetään" palauttamalla tiedosto guitest.txt tehtäväksi U1, johon kirjoitetaan mitkä tehtävä on testattu ja vähän mielipiteitä testaamisesta.

Itsearvio A1 (0p mutta pakollinen)

Jollet tehnyt jo maanantain demopalautuksessa, niin täytä edellisen (esim. demo1:n arvion demo 2 kerralla) kerran itsearviolomake: arvio.txt (lataa ja muokkaa) ja palauta NettiDemoWWW:hen nimellä A1 tiedosto arvio.txt tai jos täytät käsin paperille demon aikana etkä jaksa kirjoittaa koneelle, niin ota kuva tai skannus paperista ja paluta arvio.X (missä X on joku seuraavista: pdf, jpg, png).

Tauno T1 (0.5 p)

Tee iTaunolla- seuraavat tehtävät:

  1. Tee ensin muuttuja lisattava, jonka arvo on 5. Sitten lisää tämän muuttujan arvo jokaiseen taulukon alkioon.
    Esim:
      taulukko 5 4 6 2 9 1 muuttuu taulukoksi 10 9 11 7 14 6
    
  2. Laske yhteen peräkkäisissä paikoissa olevat taulukon alkiot ja laita tulos aina parilliseen (0,2,4) paikaan. Vastaavaan parittomaan paikkaan laitetaan arvo 0. Eli taulukon summa pysyy samana, mutta parittomissa (1,3,5) paikoissa olevat alkiot nollautuvat.
    Esim:
      taulukko 5 4 6 2 9 1 muuttuu taulukoksi 9 0 8 0 10 0
    

Koita vastauksissa välttää turhia apumuuttujia ja mieti kuinka hyvin ratkaisusi yleistyy jos taulukon kokoa kasvatetaan.

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.d4
  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 5.1-5.7 Toistolauseet.
1.4 Ville-tehtävien palautus NettiDemoWWW:llä.

Tehtävä 1*. Käyttöliittymä

Kirjoita Java-GUI-ohjelma, joka toimisi seuraavasti:

Kerron sinulle paljonko täytät tänä vuonna!
Syntymävuotesi [1978]
Täytät tänä vuonna 37 vuotta.

Tehtävä 2.* Kolmio

Kirjoita funktio, joka palauttaa suorakulmaisen kolmion hypotenuusan pituuden, kun para­metreina on kateettien pituus. Kirjoita testi. Kirjoita funktio kolmionAla, jo­ka laskee vastaavista tiedoista suorakulmaisen kolmion pinta-alan. Kirjoita testit. Muista, että funktiot eivät tulosta mitään! TIM

Tehtävä 3. Tarkkuus

Kirjoita funktio ja testit: int etumerkki(double x, double eps), joka palauttaa

-1  mikäli x < -eps,   eps on aina >= 0
 0  mikäli -eps <= x <= eps
 1  mikäli x > eps

TIM

Tehtävä 4. Demopisteet

Kirjoita funktio demopisteet, jolle viedään opiskelijan tekemien demopisteiden (aka palautettujen tehtävien pisteiden) summa ja de­motehtävien maksimimäärä. Funktio palauttaa sitten Ohjelmointi 2-kurssin taulukon mu­kaiset hyvityspisteet, jotka siis vastaavat demopisteprosenttia. Luonnollisesti myös testit. TIM

Tehtävä 5*. Pöytätesti

Tutki pöytätestin avulla mitä ovat muuttujien arvot seuraavassa ohjelmassa kunkin lauseen suorittamisen jälkeen. Funktiot i ja set käsitellään "atomaarisina", eli niiden sisään ei mennä pöytätestissä. Mitä ohjelma tulostaa? Mallia katso luentomoniste sekä luentovideot

/**
 * Mitä ohjelma tulostaa?? 
 * @author  Vesa Lappalainen
 * @version 1.0, 19.01.2003
 */
public class Alisotk2 {

  private static int i(StringBuffer s) {
    return Integer.parseInt(s.toString());
  }
  private static void set(StringBuffer s,int i) {
    s.delete(0, s.length()).append(""+i);
  }

/* 01 */ private static StringBuffer b; private static int c;
/* 02 */
/* 03 */ private static void s_1(StringBuffer a, int b)
/* 04 */ {
/* 05 */   int d;
/* 06 */   d  = i(a);
/* 07 */   c  = b + 3;
/* 08 */   b  = d - 1;
/* 09 */   set(a,c - 5);
/* 10 */ }
/* 11 */
/* 12 */ private static void a_2(int a, StringBuffer b)
/* 13 */ {
/* 14 */   c  = a + i(b);
/* 15 */   { int c; c = i(b);
/* 16 */   a = 8 * c; }
/* 17 */   set(b,175);
/* 18 */ }
/* 19 */
/* 20 */ public static void main(String[] args) {
/* 21 */   StringBuffer a = new StringBuffer("4"); int d=9;
/* 22 */   System.out.println("" + a + " " + b + " " + c + " " + d);
/* 23 */   b=new StringBuffer("3"); c=2; d=1;
/* 24 */   s_1(b,c);
/* 25 */   a_2(d,a);
/* 26 */   s_1(a,3+d);
/* 27 */   System.out.println("" + a + " " + b + " " + c + " " + d);
/* 28 */ }
}

Tehtävä 6. if-lauseiden uudelleen järjestely

Mitä ovat muuttujien arvot seuraavien ohjelmanpätkien jälkeen? Sisennä (ja selvennä) ohjel­manpätkät "oikein"! Huomaa että alla on kahdessa sarakkeessa 4 toisistaan riippumatonta koodinpätkää.

/* 1 */ a=4; b=2; c=0;     |    /* 2 */ a=4; b=2; c=0;
if ( a-b != 0 ) c++; a=1;  |    if ( c != 0 ) 
b=3;                       |      c--; else b=1;
                           |    a = b-2;

/* 3 */ a=4; b=2; c=0;     |    /* 4 */ a=4; b=2; c=0;
if ( a > 0 ) if ( b > 1 )  |    if ( c++ != 0 ) if ( a-- != 0);
  c=9;                     |    else b-=3; else c+=8;
else if ( c == 1 ) ;       |
else b = 0;                |
a = 3;                     |

Tehtävä 7-8*. Henkilo-luokka

Malliluokassa Aika kaikki attribuutit olivat int-tyyppisiä. Kissa/ Elain- esimerkissä oli myös String-tyyppisiä attribuutteja.

Kirjoita luokka Henkilo, jossa on (attribuutteina) sukunimi, etunimi ja syntymävuosi. Tee luokka sellaiseksi, että alla olevan kaltainen pääohjelma toimii:

public static void main(String[] args) {
    Henkilo aku = new Henkilo("Aku", "Ankka", 1934);
    System.out.println(aku.getNimi());  // tulostaa Aku Ankka
    System.out.println(aku.getSyntymavuosi());  // tulostaa 1934
    System.out.println(aku.toString()); // tulostaa Aku|Ankka|1934
}

TIM

Tehtävä B1. Raajoja heilutteleva ukko

Katso Ohj1-kurssin Wikistä miten käytetään Graphics.jar-kirjastoa.

https://svn.cc.jyu.fi/srv/svn/ohj1/graphics/trunk/sample/UkkoSample.png

Ota malliohjelma UkkoSample.java ja muuta se sellaiseksi, että ainakin yksi ukko pyörittää jokaista jalkaansa ja kättänsä.

Tehtävä B2-3. Äärellinen automaatti 1.

Lue syksyn 2012 pääsykokeen tehtävä 2.

Tee aliohjelma tutkiJono, jolle annetaan merkkijono muodossa "01001" ja aliohjelma palauttaa true niistä jonoista, joita b-kohdan automaatti hyväksyisi, muista palautetaan false. Älä kuitenkaan toteuta tehtävää automaattia tekemällä (se tehdään Guru-tehtävässä}.

Tehtävä G1-4. Virheilmoitukset puuttuvista demoista

Tarkoituksena on tehdä Linux-konetta varten postitustiedosto (=komentojono postita) kaikista niistä, jotka ovat unohtaneet oman nimensä pois demovastauksista, tai demovastauksissa on jotakin muuta "syntaktista" vikaa.

Katso Demo 3:n guru-tehtävässä G1-2 käsiteltyä tiedostoa users.html ja tiedostoa files.txt (ks luku 2.1 alkaen kuvaus). Kirjoita ohjelma, joka tarkistaa jokaiselta henkilöltä, että hänellä on kussakin vastaustiedostossaan ainakin oma nimensä. Jos nimeä ei ole, files.txt:tä ei ole tai files.txt:ssä mainittua tiedostoa ei ole, henkilölle lähetetään sähköposti, jossa maini­taan asiasta. Sähköposti lähetetään tekemällä Unix-konetta varten seuraavanlainen komento­jono postita:

#!/bin/sh
mailx -s Demo1 vesal@jyu.fi <<EOF
Tiedostossa kavely.txt ei ole nimeäsi.
Tiedostoa guru2.cpp ei löydy.
EOF
mailx -s Demo1 mattim@jyu.fi <<EOF
Tiedostoa files.txt ei löydy.
EOF
mailx -s Demo1 teppot@jyu.fi <<EOF
Tiedostoa t9.cpp ei löydy.
EOF

postita ajettaisiin (siis demossa ei tarvitse ajaa) sitten sopivassa Unix/Linux koneessa. Jos Linuxissa ei ole komentoa mailx voidaan vaikka tehdä alias. Myöskään WWW:stä ei tarvitse osata lukea, vaan riittää osata lukea normaalista tiedostojär­jestelmästä. Jos users.html on hakemistossa demo1 (esim. demo11\demo1), niin henkilön files.txt on alihake­mistossa käyttäjänimi (eli esim. demo11\demo1\vesal\files.txt). Vastaavasti vastaustiedostot ovat suhteessa tähän hakemistoon. Oletetaan että jos käyttäjän tunnus on vesal, niin hä­nen sähköpostiosoitteensa on vesal@… (oikeasti koko postiosoite on käytössä ja se ehkä tuleekin users.html :ään) Vinkki: Käytä "hajota ja hallitse" -tekniikkaa. Teet mm. aliohjelmia joita kutsutaan:

kasitteleKaytaja("vesal",virhetiedosto);
if ( onkoTiedostossa("kavely.txt","Vesa Lappalainen") ) ...

Lisäideoita katso Demon 3: mallivastauksesta LueUsers.java.

Tehtävä G5-7. Äärellinen automaatti 2.

Lue syksyn 2012 pääsykokeen tehtävä 2.

Kirjoita luokat Solmu ja Automaatti joiden avulla pääohjelmassa muodostat b-kohdan automaatin. Anna automaatille syötteeksi merkkijonoja tyyliin "01001" ja testeillä kokeile, että automaattisi palauttaa oikean tuloksen.

Tehtävä G8. Äärellinen automaatti 3.

Jatkoa edelliseen. Tee pääohjelma, jolla kokeilet e-kohdan automaatin toimintaa.