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.