Ohjelmointi 2 / 2007 Demot

Demo 4 / 5.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 testipääohjelma joten sen 2 pistettä voi ajatella koostuvan 4*0.5 pistettä.
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ä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 28 vuotta.
2*3.
Kirjoita funktio, joka palauttaa suorakulmaisen kolmion hypotenuusan pituuden kun para­metrina on kateettien pituus. Kirjoita testiohjelma. 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ä testiohjelma, jolla testataan niiden toimivuus.
a) Funktio int etumerkki(double x, double eps) joka palauttaa
-1  mikäli x<-eps
 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 testipääohjelma.
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@cc.jyu.fi <<EOF
Tiedostossa kavely.txt ei ole nimeäsi.
Tiedostoa guru2.cpp ei löydy.
EOF
mailx -s Demo1 mattim@cc.jyu.fi <<EOF
Tiedostoa files.txt ei löydy.
EOF
mailx -s Demo1 teppot@cc.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\cpp\demot\demo07\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@cc.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.