

                           C-ohjelmointi, syksy 1997
                                       
Harjoitustyöaiheita

   Valitse yksi harjoitustyön aiheista ja toteuta se C-kielellä.
   Lisäohjeita löydät opastussivulta.

    1. Kirjoita ohjelma, joka tulostaa syötteenä saamansa tekstin
       tavutettuna.  Lisää ohjelmaan optiot, joilla voit määrätä rivin
       pituuden, tasamittaisten rivien tulostuksen ja luvun tiedostosta.
       Eräs tavutusalgoritmi on seuraava.  Olkoon c seuraava käsiteltävä
       merkki.
         1. c = sanan alkukirjain
         2. jos c on vokaali, niin jatka kohdasta 4
         3. jos c on sanan viimeinen kirjain, niin algoritmi on LOPPU,
            muuten ota seuraava kirjain ja jatka kohdasta 2
         4. jos c on sanan viimeinen kirjain, niin algoritmi on LOPPU,
            muuten ota seuraava kirjain
         5. joc c on konsonantti, niin jatka kohdasta 10
         6. jos c muodostaa yhdessä edeltävän kirjaimen kanssa jonkin
            seuraavista pareista: aa ai au ee ei eu ey ie ii iu oi oo ou
            ui uo uu yi yy yö äi äy ää öi öy öö, niin jatka kohdasta 8
         7.  aseta tavuviiva ennen c:ta ja jatka kohdasta 4
         8. jos c on viimeinen kirjain, niin algoritmi on LOPPU, muuten
            ota seuraava kirjain
         9. jos c on vokaali, niin jatka kohdasta 7
        10. jos c on viimeinen kirjain, niin algoritmi on LOPPU
        11. jos c:ta seuraa vokaali, niin aseta tavuviiva ennen c:ta ja
            ota seuraava kirjain; jatka kohdasta 4.  Muuten ota seuraava
            kirjain ja jatka kohdasta 10

       Huom.  Yo. algoritmi on tarkoitettu suuntaa antavaksi eikä itse
       ohjelman rungoksi.

    2. Ystäväsi on päättänyt ryhtyä mestarikokiksi, mutta hänellä on
       jatkuvasti ongelmia ruoka-aineiden suhteen.  Niinpä sunnuntain
       Lasagne-ateria muuttui tonnikalavoileiviksi, kun kaapissa ei
       ollutkaan jauhelihaa.  Tällaista linjaahan ei kukaan kestä kovin
       pitkään.  Kirjoita siis ohjelma, jonka avulla ystäväsi voi
       tallettaa reseptejä ja ruoka-aineita, sekä tarkastaa paljonko
       jotain ruoka-ainetta on jäljellä.  Ohjelman käyttöliittymä voi
       olla rivipohjainen, eli mitään koko ruudun täyttäviä
       valikkosysteemiä ei tarvita .
       (Tämä muuten on se tehtävä, millä aikanaan myytiin tietokoneita,
       kun yritettiin keksiä niille jotain järkevää kotikäyttöä).

    3. Erästä pasianssia pelataan seuraavasti:
       Pelaaja lyö 52 kortin pakasta kortteja neljään pinoon kuvapuoli
       ylöspäin.  Aina jos näkyvillä on kaksi tai useampi samaa maata
       olevaa korttia, niin niistä pienempiarvoiset poistetaan pinoista.
       Sen jälkeen mahdollinen allaoleva kortti voidaan poistaa, tai sen
       ilmestymisen johdosta jokin sitä pienempi samaa maata oleva kortti
       poistetaan.  Pasianssi on mennyt läpi, jos yhden pakan jälkeen on
       pinoissa jäljellä vain ässä pinoa kohti.
       Tee ohjelma, joka pelaa ko. pasianssia n kertaa, missä n annetaan
       parametrina komentorivillä.  Ohjelma tulostaa lopuksi
       todennäköisyyden millä pasianssi menee läpi.

    4. TRIE-puu on eräs tapa tallentaa merkkijonoja. Merkkijonot
       tallennetaan siten, että yhteen solmuun tulee yksi kirjain.
       Yhdellä tasolla yksi kirjain tallennetaan vain kertaalleen.
       Kuvassa on esimerkki TRIE-rakenteesta, johon on tallennettu sanat
       auta, auto, autio, kisa ja kissa (kuvassa kirjaimet edustavat
       rakenteen solmuja).
                                A
                               /
                              /
                      -A--U--T--I--O
                     /        \
                    /          \
                   /            O
       (tyhjä juuri)
                   \
                    \
                     \
                      -K--I--S--A
                              \
                               \
                                S--A

       Toteuta puhelinmuistio TRIE-puuna. Yksinkertaisuuden vuoksi
       kahdella henkilöllä ei voi olla samaa sukunimeä.  Jokaisesta
       talletetusta henkilöstä halutaan lisäksi tietää etunimi,
       mahdollinen osoite, puhelinnumero ja lisätietoja.  Näihin
       tietoihin on linkki siitä solmusta mihin nimi päättyy.  Huomaa,
       että jonkun sukunimi voi olla toisen sukunimen alku. Esim.
       rakenteesta voi löytyä sekä sukunimi Aalto että sukunimi Aaltonen.
       Ohjelmassasi täytyy olla mahdollisuus lisätä uusia nimiä ja muita
       tietoja, muuttaa tietoja (sukunimeä lukuunottamatta), poistaa
       nimiä sekä kysyä jonkun henkilön muita tietoja, kun sukunimi
       tiedetään.
       
    5. Miinaharava on Windows-ympäristössä oleva tunnettu peli.  Siinä
       kone sijoittaa ruudukolle joukon pommeja, jotka pelaajan pitää
       pystyä merkitsemään purkamista varten.  Pelissä pelaaja valitsee
       vuorollaan aina yhden ruudun.  Jos ruudussa on pommi, pelaaja
       räjähtää ja peli loppuu pelaajan tappioon.  Muuten kone näyttää
       luvulla montako pommia on valitun ruudun viereisissä ruuduissa.
       Pelaaja voittaa, jos hän saa merkittyä kaikki pommit oikein ja
       valittua kaikki muut ruudut.
       Kirjoita ohjelma, joka pelaa miinaharavaa.  Pelissä pitää voida
       antaa parametreina pommien määrä ja ruudukon koko.  Valitse
       ruudukolle sellainen maksimikoko, että koko ruudukko mahtuu
       ruudulle.   Ruudukko kannattaa tulostaa jokaisen siirron jälkeen
       uudestaan, jolloin ei tarvita muuta näytönkäsittelyä kuin
       tavallista rivi kerrallaan tulostusta.
