Ohjelmointi 2 / 2008

Demo 4 / 4.2

Pisteytyksestä

Pisteet aina niin, että yksi tehtä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. Esimerkiksi tehtävässä 7*8 on käsketty tehdä luokka, 2 funktiota ja testi joten sen 2 pistettä voi ajatella koostuvan 4*0.5 pistettä. 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.
Tehtävissä pyydetyt testit voit kirjoittaa toistaiseksi joko:

Tehtävät

1*.
Kirjoita Java-ohjelma, joka toimisi seuraavasti:
C:\OMA>java Ika[RET]
Kerron sinulle paljonko täytät tänä vuonna!
Anna syntymävuotesi>1978[RET]
Täytät tänä vuonna 30 vuotta.
2*3.
Kirjoita funktio, joka palauttaa suorakulmaisen kolmion hypotenuusan pituuden kun para­metrina on kateettien pituus. Kirjoita testi. Kirjoita vielä funktio kolmion_ala, jo­ka laskee vastaavista tiedoista suorakulmaisen kolmion pinta-alan. Testaa tämäkin funktio. Muista että funktiot eivät tulosta mitään!
4.
Kirjoita seuraavat funktiot tai aliohjelmat sekä testit, jolla testataan niiden toimivuus.
a) Funktio 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
b) Funktio demopisteet jolle viedään opiskelijan tekemien demopisteiden summa ja de­motehtävien maksimimäärä ja funktio palauttaa sitten Ohjelmointi 2-kurssin taulukon mu­kaiset demopisteet.
5*.
Tutki pöytätestin avulla mitä ovat muuttujien arvot seuraavassa ohjelmassa kunkin lauseen suorittamisen jälkeen. Mitä ohjelma tulostaa?
/**
 * 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 */ }
}
6.
Mitä ovat muuttujien arvot seuraavien ohjelmanpätkien jälkeen? Sisennä (ja selvennä) ohjel­manpätkät "oikein"!
/* 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;   
7*8.
Kirjoita luokka Henkilo, jossa on sukunimi, etunimi ja syntymävuosi. Kirjoita metodi kysy, joka kysyy henkilön tiedot. Kirjoita metodi tulosta, joka tulostaa henkilön tiedot (ks. monisteen luku 9.2). Kirjoita myös main-metodi jossa .luodaan ainakin yksi henkilö ja kutsutaan noita metodeja. Tällä kertaa tämä ei tarvitse automaattista testiä.
G1-4.
Katso Demo 3:n guru-tehtävässä G1-2 käsiteltyä tiedostoa users.html ja tiedostoa files.txt . 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. Agorassa n:\kurssit\ohj2\demot\demo08\demo1), niin henkilön files.txt on alihake­mistossa käyttäjänimi (eli esim. 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@jyu.fi (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.