Ohjelmointi++ 2002/ 11.2

Demo 4



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 pisteet 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 koostuvan 4 osasta. Esimerkiksi tehtävässä 7*8 on käsketty tehdä 3 funktiota ja testipääohjelma joten sen 2 pistettä voi ajatella koostuvan 4*0.5 pistettä.

Tehtävät


1*.
Kirjoita C++ ohjelma, joka toimisi seuraavasti:
C:\OMA>ika[RET]
Kerron sinulle paljonko täytät tänä vuonna!
Anna syntymävuotesi>1977[RET]
Täytät tänä vuonna 25 vuotta.
2*3.
Kirjoita funktio, joka palauttaa suorakulmaisen kolmion hypotenuusan pituuden kun parametrina on kateettien pituus. Kirjoita testipääohjelma. Kirjoita vielä funktio kolmion_ala, joka 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 kysy_vuosi, joka kysyy käyttäjältä vuosiluvun ja palauttaa käyttäjä kirjoittaman vuoden parametrilistassa. Funktion paluuarvona (return-lausessa) palautetaan 1 mikäli annettu vuosiluku ei ole tältä vuosisadalta tai syöttössä on jotakin väärin. Muutoin palautetaan 0.

5*.
Tutki pöytätestin avulla mitä ovat muuttujien arvot seuraavassa ohjelmassa kunkin lauseen suorittamisen jälkeen. Mitä ohjelma tulostaa? (Lause a=i++; vastaa samaa kuin lauseet a=i; i=i+1; Lause a=++i; vastaa samaa kuin lauseet i=i+1; a=i;)

#include <stdio.h>
/* 01 */
/* 02 */ int *d,c=4,u=9;
/* 03 */
/* 04 */ int huijaus(int a,int *b)
/* 05 */ {
/* 06 */   *(d+1) = ++(*b);
/* 07 */   c = *b - 2;
/* 08 */   *b += a/2;
/* 09 */   return a > 3;
/* 10 */ }
/* 11 */
/* 12 */ int puijaus(int **b)
/* 13 */ {
/* 14 */   int n;
/* 15 */   *b = &u;
/* 16 */   *d =175;
/* 17 */   n = --u;
/* 18 */   return 3 * (*b == d) + n;
/* 19 */ }
/* 20 */
/* 21 */ int main(void)
/* 22 */ {
/* 23 */   int k1 = 31, k2 = 45; d = &c-1;
/* 24 */   k1 = huijaus(k2+*(d+1),&c);
/* 25 */   k2 = puijaus(&d);
/* 26 */   printf("%4d ",*d);
/* 27 */   printf("%4d %4d %4d %4d\n",u,c,k2,k1);
/* 28 */   return 0;
/* 29 */ }


6.
Mitä ovat muuttujien arvot seuraavien ohjelmanpätkien jälkeen? Sisennä (ja selvennä) ohjelmanpätkät "oikein"!
/* 1 */ a=4; b=2; c=0;         /* 2 */ a=4; b=2; c=0;
if ( a-b ) c++; a=1;           if ( c ) 
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++ ) if ( a-- ); c=9; else b-=3; else c+=8; else if ( c == 1 ) ; else b = 0; a = 3;

7*8.
Kirjoita tietue tHenkilo, jossa on sukunimi, etunimi ja syntymävuosi. Kirjoita funktio kysy, joka kysyy henkilön tiedot. Kirjoita funktio 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 mainitaan asiasta. Sähköposti lähetetään tekemällä Unix-konetta varten seuraavanlainen komentojono 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ärjestelmästä. Jos users.html on hakemistossa demo1 (esim: Agorassa n:\kurssit\cpp\demot\demo02\demo1), niin henkilön files.txt on alihakemistossa 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ä "hajoita ja hallitse" tekniikkaa. Teet mm. aliohjelmia joita kutsutaan:
KasitteleKaytaja("vesal",virhetiedosto);
if ( OnkoTiedostossa("kavely.txt","Vesa Lappalainen") ) ...
Lisäideoita katso Demon 3: mallivastauksesta LueUsers.cpp.