58127-1 C-ohjelmointi - syksy 1997 Harjoitustehtävät 6, 1.12. - 7.12. Läsnäolo: 3 tehtävää 1. Kirjoita funktiot void *safe_malloc(size_t size); void *safe_calloc(size_t nobj, size_t size); void *safe_realloc(void *p, size_t size); jotka toimivat kuten vastaavat malloc, calloc ja realloc, mutta lopettavat ohjelman toiminnan sopivaan virheilmoitukseen (tulostettuna stderr:lle), jos muistin varaus ei onnistunut. Toisin sanottuna safe-funktiot eivät koskaan palauta arvoa NULL. 2. Suunnittele linkitetyn listan (struct lista) ja listan solmun (struct solmu) rakenteet kaksisuuntaiselle linkitetylle listalle, jonka alkioina on kokonaislukuja. Kirjoita rakenteisiin perustuen seuraavat funktiot: struct lista *perusta_lista(void); /* perustaa tyhjän listan */ struct solmu *luo_solmu(int arvo); /* luo solmun, jonka arvo on 'arvo' */ int lisaa_solmu(struct lista *l, struct solmu *s); /* lisää solmun listan l alkuun */ struct solmu *poista_solmu(struct lista *l); /* poistaa solmun listan l alusta ja palauttaa osoittimen poistettuun solmuun; solmun tilaa ei vapauteta funktiossa */ Alkioiden lisäksi listassa pidetään kirjaa alkioiden lukumäärästä. Kirjoita myös pääohjelma, jolla testaat funktioitasi. Luentomateriaalista löytyvät vastaavat funktiot yksisuuntaiselle linkitetylle listalle. 3. Kirjoita funktio struct lista *kaanna(struct lista *l); joka kääntää yksisuuntaisen linkitetyn listan sellaiseksi, että viimeisestä solmusta tulee ensimmäinen, toiseksi viimeisestä toinen, jne. Kirjoita myös pääohjelma, jolla testaat funktiotasi. Muut tarvittavat yksisuuntaisen linkitetyn listan käsittelyfunktiot löytyvät luentomateriaalista. 4. Kirjoita ohjelma, joka tulostaa parametreina annetut tiedostot käänteisessä rivijärjestyksessä. Ensiksi tulostetaan viimeisenä annetun tiedoston viimeinen rivi jne. kunnes viimeisenä tulostetaan ensimmäisenä annetun tiedoston ensimmäinen rivi. Jos tiedostonimiä ei anneta, stdin tulostetaan käänteisessä rivijärjestyksessä. Rivin maksimipituus on 255 merkkiä ja jokainen rivi päättyy rivinvaihtoon \n. Vihje: Talleta rivit linkitettyyn listaan. 5. Kirjoita mikä tahansa C-ohjelma (joka ei ole vielä esiintynyt luennolla, oppikirjassa tai harjoituksissa), jossa on dynaamista muistinhallintaa ja komentorivin parametrien käsittelyä. Ohjelman ei tarvitse olla pitkä, mutta sen pitää tehdä jotain "järkevää". Eli pelkkä rivien sijoittelu peräkkäin ei riitä. Esimerkiksi tail-tyyppinen ohjelma, joka saa parametrina tiedostonimen ja kokonaisluvun n, ja tulostaa annetusta tiedostosta viimeiset n riviä, toteuttaa annetut ehdot (mutta yksinkertaisempiakin ohjelmia löytynee). 6. Täytä ja palauta kurssikysely laitoksen WWW-kotisivulla. Osoite on http://www.cs.helsinki.fi/kurssit/kyselyt/syksy_1997/58127-1-fi.ht ml ______________________________________________________________________