C-ohjelmointi
syksy 2006
Harjoitus 6
Kokeeseen saa ottaa yhden A4-arkin kokoisen muistilapun, jonka voi
täyttää molemmin puolin.
Tehtävät
käsitellään harjoitustilaisuuksissa 12.10 TO 12-14 salissa B119 ja
13.10 PE 12-14 salissa B119.
- (Kirjan tehtävä 11-12)
Binääritiedostoa "fname" käytetään tallentamaan tietoa
työntekijöistä. Jokaisesta työntekijästä on talletettuna nimi,
identifikaatiotunnus ja palkka:
struct employee {
lond id;
char name[50];
double salary;
};
Kirjoita seuraavat funktiot:
-
int add (fname, empId, stringName, salary), missä
fname on merkkijono, joka kertoo binääritiedoston nimen,
empId on kokonaisluku,
stringname on merkkijono ja
salary on double.
Tämä funktio lisää uuden työntekijän binääritiedostoon (empId on
avain ja se identifioi yksikäsitteisesti työntekijän)
-
void moreDollars (fname, empId, incr), missä
fname on merkkijono, joka kertoo binääritiedoston nimen,
empId on kokonaisluku ja
incr on double.
Tämä funktio käyttää binääritiedostoa fname ja lisää parametrin
incr ilmoittaman määrän verran kaikkien niiden työntekijöiden palkkaa,
joiden identifikaatiotunnus on yhtäsuuri tai suurempi kuin empId.
-
void show (const char *fname), kirjoittaa näkyviin kaiken
binääritiedostoon fname tallennetun tiedon,
- Kirjoita ohjelma, joka lukee
opiskelijan suoritukset komentoriviparametrina annetusta tiedostosta
taulukkoon. Kullakin rivillä on kurssin nimi, sen
opintopistemäärä, arvosana ja päivämäärä.
Ohjelma tulostaa tiedot ja laskee opintosuoritusten painotetun
arvosanan. Arvosanat ovat 1-5 ja kurssin nimessä voi olla
välilyöntejä. Opintosuoritusten haluttu
tulostusjärjestys annetaan komentoriviparametrina: ilmoitetaan
kenttä, jonka perusteella opintosuoritukset järjestetään
ja etumerkillä ilmoitetaan, halutaanko suoritukset kentän
perusteella nousevassa (+) tai laskevassa järjestyksessä (-).
Esimerkiksi annetaan komentorivillä ohjelma opinnot +3 , jos halutaan tulostaa tiedostossa opinnot olevat
opintosuoritukset kentän kolme eli arvosanan mukaan nousevassa järjestyksessä.
Jaa ohjelmasi sopivasti funktioihin.
- (Kirjan tehtävä 8-8)
Kirjoita funktio maxi, jolla on kolme parametria, kaksi double
arvoa x ja y ja funktioparametrina
double funktio f(double).
Funktio maxi palauttaa suuremman arvoista
f(x) ja f(y). Kirjoita myös funktio max1,
joka muuten samanlainen kuin funktio maxi, mutta se palauttaa
suurimman arvon neljänessä parametrissa. Testaa funktiot.
- (Kirjan tehtävä 8-10)
Kirjoita funktio
void PrintGen(const void *block, size_t elemSize, size_t blockSize,
void (*printIt) (const void*));
joka tulostaa kaikki lohkon alkiot käyttäen "callback" funktiota
printIt. Testaa ohjelmasi käyttäen lohkoa, jossa on double arvoja
ja lohkoa, jossa on viitteitä double arvoihin.
- (Kirjan tehtävä 8-11)
Toteuta geneerinen moduuli Bags, joka edustaa järjestämätöntä
kokoelmaa (dublikaatit on sallittuja). Moduulilla pitää olla operaatiot,
joilla lisätään alkio kokoelmaan ja poistetaan alkio kokoelmasta. Lisää
kokoelman läpikäynti. Testaa moduliasi kokoelmalla, jossa on alkioina
double-arvoja ja kokoelmalla, jossa on alkioina kokonaislukuja.
.