Ohjelmointi (Pascal) Harjoitus 6, 21.-25.10. (monisteen sivut 1 - 33) (Oh! Pascal! 2 - 291, ei lukuja 4-2 ja 5-2, 8-2, ei sivuja 237-239, 244-245) 6.1 a) Toteuta while ehto do lause ilman while-lausetta ja rekursiota. b) Toteuta repeat lause1; lause2 until ehto ilman repeat-lausetta ja rekursiota. c) Toteuta while- ja repeat-lausetta vastaava toiminta rekursiolla. 6.2 Toteuta seuraava peli Pascal-ohjelmana: Ensimmäinen pelaaja syöttää luvun väliltä 0-50. Toisella pelaajalla on 8 yritystä arvata ensimmäisen pelaajan syöttämä luku (toinen pelaaja tietää, että luku on välillä 0-50). Peli päättyy joko oikean luvun arvaamiseen tai kahdeksanteen väärään arvaukseen. Pelin jälkeen ilmoitetaan arvasiko toinen pelaaja luvun oikein vai ei. Jos ensimmäinen pelaaja syöttää virheellisen luvun, toinen pelaaja voittaa. Saat olettaa, että syötetyt luvut ovat kelvollisia kokonaislukuja. 6.3 Varastossa säilytetään vain yhtä tuotetta. Tee varastokirjan- pitoa varten ohjelma, jolla varaston tilannetta hallitaan. Tietorakenne on hyvin yksinkertainen: yksi ainoa kokonaisluku- arvoinen muuttuja, jonka arvona on varastossa olevien tuotteiden lukumäärä. Ohjelman käyttöliittymän toteuttaminen on nyt mielenkiinnon kohteena. Ohjelma lukee ja toteuttaa joukon komentorivejä, jotka kaikki alkavat yksikirjaimisella komennolla. Komennot ovat: V "vie varastoon", komentorivillä on V-kirjaimen lisäksi varastoon lisättävien tuotteiden lukumäärä kokonaislukuna, O "ota varastosta", rivillä on myös otettavien lukumäärä (jos varastossa ei ole pyydettyä määrää, annetaan mitä voidaan ja ilmoitetaan tuotten loppumisesta; ohjelman suoritus ei silti pääty, voihan jo seuraava komento olla V), T "tulosta varastotilanne", L "lopeta ohjelman suoritus". Ohjelmassa on varauduttava virheellisiin komentokirjaimiin, lukujen saa olettaa olevan kokonaislukuja, mutta niidenkin järkevyys on tarkistettava. Näistä virheistä on annettava ilmoitus, ne eivät kuitenkaan saa lopettaa ohjelman toimintaa. Vihjeitä: Jaa osaongelmiksi ja tarkenna asteittain. Case-lause on käyttökelpoinen ja selkeä tässä tehtävässä. Tämä tehtävä on syytä tehdä ja ymmärtää; ratkaisua laajennetaan myöhemmin. Tässä tehdään ns. komentotulkki yksinkertaiselle komentokielelle, vertaa sitä esimerkiksi Unix-käyttöjärjestelmän komentokieleen. 6.4 Tee proseduuri LueInteger(var OK:boolean; var arvo:integer), joka lukee kokonaisluvun merkkimuodossa, palauttaa ensimmäisen parametrin avulla tiedon luvun kelvollisuudesta ja toisen avulla itse luvun, jos kelvollinen löytyi. Proseduuri ohittaa lukua mahdollisesti edeltävät välilyönnit ja rivinvaihdot. Luku voi alkaa etumerkillä. Luku päättyy mihin tahansa merkkiin, joka ei ole numero. Huom: Muista että 'oikeissa ohjelmissa' lukuja ei koskaan lueta muussa kuin merkkimuodossa, jotteivät käyttäjän sormen lipsahdukset kaatasi ohjelmaa! Jos teet tämän proseduurin hyvin, se kannattaa säilyttää myöhempää käyttöä varten. Mitä haittaa voi olla siitä, että proseduuri lukee myös numeroiden jonoa seuraavan merkin? 6.5 Tee ohjelma, joka laskee ja tulostaa tekstitiedostossa input olevien vokaalien ja konsonanttien erilliset prosenttiosuudet kaikista tiedoston kirjainmerkeistä. Myös å, ä ja ö ovat kirjaimia. Lue tavalliseen tapaan. Miksei tässä tehtävässä tarvitse tutkia rivin- vaihtoja? 6.6 Tee ohjelma, joka lukee tekstitiedoston input ja tuottaa teksti- tiedoston output. Tiedostoon ei kopioida tyhjiä rivejä ja muiden rivien alussa mahdollisesti olevat välilyönnit jätetään tulostamatta. Tässä tehtävässä rivinvaihdot on tutkittava! Miksi?