C-ohjelmointi syksy 2007


Harjoitus 6

Kokeeseen saa ottaa yhden A4-arkin kokoisen muistilapun, jonka voi täyttää molemmin puolin.

Tehtävät käsitellään harjoitustilaisuuksissa 11-12.10.2007

  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 {
      long 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ä 11-6) Kirjoita funktio input, jolla on kaksi parametria: fname, joka kertoo tekstitiedoston nimen ja storage, joka on taulukko osoittimia mekkijoinoihin:
    #define MAX 100
    char* storage[MAX];
    
    input() lukee tiedoston fname ja tallettaa rivit tästä tiedostosta taulukkoon. Älä tee mitään oletuksia rivien pituudesta. Käytä funktiota getline() kirjan esimerkistä 10.3. Funktion input() pitää poistaa taulukosta kaikki rivit, jotka ovat tyhjiä (sisältävät vain rivinvaihtomerkin ja mahdollisesti välilyöntejä ennen sitä) ja kertoa kuinka monta riviä on poistettu. Tee myös main funktio, joka kutsuu funktiota input() ja tulostaa taulukon sisällön standardi syöttövirtaan.

  4. (Kirjan tehtävä 8-9) Kirjoita funktio
    void compareGen(const void *block1, const void *block2, size_t elemSize,
                    size_t block1Size, size_t block2Size,
                  int (*compareIt) (const void*, const void*));
    
    joka tekee kahden lohkon leksiograafisen vertailun. Testaa ohjelmasi käyttäen double lohkoja ja lohkoja, joissa on osoittimia double:hin.

  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 moduuliasi kokoelmalla, jossa on alkioina double-arvoja ja kokoelmalla, jossa on alkioina kokonaislukuja.

.