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.

  1. (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:
    1. 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)
    2. 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.
    3. void show (const char *fname), kirjoittaa näkyviin kaiken binääritiedostoon fname tallennetun tiedon,

  2. 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.

  3. (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.

  4. (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.

  5. (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.

.