58127 C-ohjelmointi - Harjoitustyö
Tähän tulevat linkit muualle harjoitustyön tekoa varten.
Ohjeet harjoitustyön tekemiseen
Aiheet
-
1. Yksinkertainen laskin
Toteuta yksinkertainen laskin, joka lukee yhden lausekkeen yhdeltä riviltä. Rivin voi syöttää ohjelmalle joko tiedostosta tai näppäimistöltä.Laskutoimituksen lausekkeen voi kuvata joko tavanomaisesti kuten (15 *3 ) /7 + 5 *8 - 12324 % 10
Tai käyttäen ns. käänteistä puolalaista notaatiota, jolloin em. kuvaus olisi 15 3 * 7 / 5 8 * + 12324 10 % -
Toteuta ohjelmasi siten, että käytät pinoa apuna laskutoimituksessa. Tallenna välitulokset pinoon. Tuo käänteinen puolalainen laskutoimitus on helpompi toteuttaa. Harjoituksen vuoksi pinon toteutuksen pitää käyttää osoittimia ja dynaamisuutta. Katso tietorakenteiden kurssilta pinon perusoperaatiot ja toteuta ne osaksi ohjelmaasi.
Käyttäjän pitää voida halutessaan antaa operaatiot sisältävän tiedoston nimi komentoriviparametrina.
-
2. Sanalaskuri
Tee ohjelma, joka lukee yhden tekstitiedoston. Käyttäjän pitää voida valita tiedoston syöttötapa. Hän voi joko antaa tiedoston nimen komentoriviparametrina tai ohjelma voi olettaa tiedon tulevan stdin-tiedostosta.Ohjelman pitää tulostaa tiedostosta löytyneet sanat (vähintään kaksi peräkkäistä kirjainmerkkiä) ja niiden esiintymisten lukumäärät aakkosjärjestyksessä. Kukin sana ja sen esiintymisten lukumäärä tulostetaan omalle rivilleen. Tulostiedoston nimi käsitellään samoin kuin syöttötiedoston.
Käytä ratkaisussasi tietorakenteena binääripuuta. Toteuta binääripuu käyttäen osoittimia ja dynaamisuutta. Puutoteutuksesi on tarkoitus käyttää tietorakenteet -kurssilla opittuja puun perusoperaatioita.
3. Kaupan kassan simulointi
Tee ohjelma, joka simuloi (eli jäljittelee) kaupan kassan toimintaa. Kassalle saapuu asiakkaita ja meillä on vain yksi kassapiste, johon asiakkaat joutuvat jonottamaan. Kun piste vapautuu, siirtyy seuraava jonottaja palveltavaksi.Voit aluksi olettaa että asiakkaiden kassalle saapumisten väli vaihtelee satunnaisesti 1 ja 4 minuutin välillä. Samoin asiakkaiden palveluaika kassalla vaihtelee 1 ja 4 minuutin välillä. Varaudu kuitenkin muuttamaan tuota vaihteluväliä (molemmista päistä).
Simulointi tapahtuu seuraavasti: Arvotaan ensimmäisen asiakkaan saapumisaika ja laitetaan tämä asiakas jonoon. Tapahtumajonossa ovat kaikki tapahtumat (asiakas saapui jonoon, asiakas poistui kassalta) niiden aikajärjestyksessä. Jonosta otetaan aina ensimmäinen tapahtuma (ja aika eteni siihen kohtaan) 1) asiakas saapui - laita asiakas palvelujonoon - arvo seuraavan asiakkaan saapusaika ja laita tämä tieto tapahtumajonoon 2) asiakas poistui kassalta - ota palvelujonosta ensimmäinen jonottaja - arvo palvelunkesto ja sijoita asiakkaan poistumishetki tapahtumajonoon Ohjelmasi pitää tulostaa kaikki tapahtumat ja niiden ajankohdat tiedostoon. Lisäksi simulaattorit keräävät kaikenlaista tilastotietoa, joten ohjelman pitää myös raportoida: palvelupisteen käyttöaste (palveluajat yhteensä / kokonaisaika), keskimääräinen jonotusaika (jonotusaikojen summa / jonottajien lkm), pisin hetkellinen jononpituus, pisin jonotusaika.
Varaudu ohjelmassasi siihen, että palvelupisteitä voidaan lisätä ja että asiakkaiden saapumisaikojen ja palveluaikojen jakaumia (tai ainakin vaihteluväliä) voidaan vaihtaa esimerkiksi komentoriviparametreilla.
Käytä toteutuksessasi dynaamista jonotietorakennetta ja sen perusoperaatioita. Jonon voi toteuttaa esimerkiksi linkitettynä listana.
4. Lennon varausjärjestelmä
Lentoyhtiö FlyCheap on juuri aloittamassa toimintaansa ja se tarvitsee asiakaspalveluaan varten lennonvarausjärjestelmän, jolla asiakaspalvelijat (tai asiakkaat itse) voivat varata lentoja.Yhtiöllä on vain kolme konetta ja kaksi reittiä, joita ne lentävät korkeintaan kolme kertaa päivässä. Kuhunkin koneeseen mahtuu korkeintaan 30 matkustajaa. Tee yhtiölle yksinkertainen ohjelma, jossa voidaan varata paikka nimetylle matkustajalle tietylle reitille ja lähtöajalle. Kalenterisi voi kattaa esimerkiksi kolme päivää, yhden viikon tai kokonaisen kuukauden. Oikeita päivämääriä ei ole välttämätöntä käyttää. Matkustajan pitää voida myös ottaa kantaa paikkanumeroonsa. Ohjelmasi pitää siis pitää kirjaa lentokoneiden varaustilanteesta. Tiedot pitää myös pitää tallessa ohjelman suorituskertojen välillä.
Yhtiö on erityisen kiinnostunut palvelemaan jo olemassa olevia asiakkaitaan tehokkaasti, joten toteuta järjestelmääsi erittäin nopea (esim. binääripuu) talletusrakenne matkustajakohtaisille tiedoille. Ohjelman pitää siis nopeasti voida tulostaa tietyn matkustajan kaikki varaukset. Sen sijaan yksittäisen vuoron vapaiden paikkojen etsimiseen voi käyttää hiukan enemmän aikaa, jos et keksi hyvää tietorakenneratkaisua.
Käytä järjestelmäsi toteuttamiseen dynaamisia tietorakenteita, jotta yhtiö voi halutessaan helposti kasvattaa lentokoneiden kokoa ilman, että ohjelmistoasi tarvitsee vaihtaa. Voit esimerkiksi ottaa nuo rajat komentoriviparametreina, jolloin ne ovat suorituskerroittain vaihdettavissa ilman käännöstä.
5. Työntekijärekisteri
Tee ohjelma, joka pitää kirjaa yrityksen työntekijöistä. Voit olettaa, että henkilöiden nimissä on vain kirjaimia ja että yrityksen palkkalistoilla ei ole kahta samannimistä henkilöä. Rekisterissä on työntekijöiden nimien lisäksi heidän palkkansa ja aloitusvuosi.Ohjelmasi pitää tarjota seuraavat toiminnot:
- - työntekijän lisäys rekisteriin. Jos rekisterissä on jo saman niminen, niin lisäystä ei tehdä ja käyttäjää varoitetaan asiasta.
- - työntekijän poistaminen rekisteristä. Jos työntekijää ei löydy, niin varoita käyttäjää, mutta älä lopeta ohjelman toimintaa tähän.
- - työntekijän etsintä nimellä. Tulosta käyttäjälle palkka ja aloitusvuosi.
- - työntekijöiden tietojen talletus tekstitiedostoon
- - tietojen luku tekstitiedostosta.
- - lopetus. Jos muutoksia ei ole tallennettu, niin varmista käyttäjältä ja tee tarvittaessa tallennus.
Käytä ratkaisussasi hajautustaulua työntekijän nimen mukaan.
6. Ravintolan simulointi
Toteuta jonorakenne käyttämällä linkitettyjä listoja. (Vain taulukkoa käyttäviä ratkaisuja ei hyväksytä.) Tee rakenteen avulla ohjelma, joka simuloi ravintolan toimintaa seuraavasti:Ravintolassa on ruokalista, jolta asiakas voi tilata haluamansa ruuan. Jokaiselle ruualla on oma valmistusaikansa. Ruokalistan voit lukea vaikkapa tiedostosta. Ravintolassa on neljä kokkia, joista jokainen voi valmistaa kerrallaan kahta eri ruokalajia. Salli ainakin kokkien määrän vaihtaminen komentoriviparametrina.
Kun asiakas tilaa ruuan, hänen tilauksensa sijoitetaan tilausjonon viimeiseksi. Kun joku kokeista vapautuu (hänellä on valmistettavanaan enää yksi tai ei yhtään ruokaa), hän ottaa valmistettavakseen tilausjonon ensimmäisen tilauksen, joka tällöin poistetaan jonosta.
Ohjelman käyttäjä antaa uusia tilauksia ja voi sopivalla käskyllä kasvattaa simulointijärjestelmän kelloa esim. yhdellä minuutilla kerrallaan. Ohjelma kertoo, milloin kukin ruokalaji on valmistunut.
Katso simuloinnin ohjeita myös tehtävästä 3 Kaupan kassan simulointi.
7. Sukupuu
Tee ohjelma, jonka avulla käyttäjä voi tallentaa sukupuun. Sukupuuhun voi tallettaa tietoja henkilöistä (nimi, syntymäaika, kuolinaika), näiden välisistä suhteista (sekä viralliset avioliitot että epäviralliset suhteet - jälkimmäiset halutaan tallettaa esim. sen vuoksi, että voidaan helposti pitää kirjaa lasten vanhemmista) ja suhteista syntyneistä lapsista. Yksinkertaisuuden vuoksi voit tehdä järjestelmän sellaiseksi, että jokaisella henkilöllä on eri nimi.Ohjelmasi pitää tarjota ainakin seuraavat toiminnot:
- - henkilön lisäys (henkilö voidaan lisätä joko "itsenäisenä" tai joidenkin lapsena)
- - henkilön tietojen muutos
- - suhteen lisäys
- - annetun henkilön kaikkien jälkeläisten tulostus
- - annetun henkilön kaikkien esivanhempien tulostus
- - annetun henkilön kaikkien rekisteröityjen suhteiden tulostus.
Ohjelmasi täytyy käyttää dynaamista muistinvarausta - vain taulukoihin perustuvia ratkaisuja ei hyväksytä.
8. Kokkaavan ystävän apu
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, mitään koko ruudun täyttäviä valikkosysteemiä ei tarvita.Tietorakenneratkaisun pitää pohjautua dynaamiseen muistinvaraukseen ja osoittimien käyttöön. Puhdasta taulukkototeutusta ei hyväksytä.
Information in English still missing
Sivu luotu 17.2.2006