Ohjelmointi (Pascal) Harjoitus 11, 25.-29.11. (monisteen sivut 1 - n.55) (Oh! Pascal! sivut 2 - n. 491, ei lukuja 5-2, 9-2, 11-3, 12-3, 10 vain kursorisesti, ei sivuja 237-239, 244-245 nyt myös 8-2, ei get- ja put-operaatioita) 11.1 Tehtävässä 6.4 laadittiin turvallinen väline kokonaislukujen lukemiseen, proseduuri LueInteger. Siinä oli kuitenkin pieni puute: lukujonoa seuraava merkkikin luetaan. Jos siis vaikka syöttörivillä on: ' 123ABC, KISSA KÄVELEE ', aliohjelma käyttää myös ensimmäisen A-kirjaimen ja seuraavaksi luettava merkkijono tulee puutteelliseksi: 'BC, KISSA KÄVELEE '. Muuta LueInteger puskurimuuttujaa käyttäen sellaiseksi, että vain lukujono luetaan ja ensimmäisksi lukemattomaksi merkiksi jää ensimmäinen ei-numero. 11.2 Eräässä ohjelmassa käsitellään milloin mitäkin tekstitiedostoa. Siinä olevien syöttöalkioiden - mitä ne sitten ovatkaan - alkamisen ilmaisemiseen käytetään merkkejä '%', '&' ja '@'. Tee ohjelmalle ns. virheestätoipumisproseduuri, joka etsii tiedostosta seuraavan aloitusmerkin. Tätä merkkiä ei saa kuitenkaan lukea. Tutki tiedoston puskurimuuttujan avulla, mikä merkki on seuraavana luettavissa. Varo tiedoston loppumista. Miten yleistät ratkaisua joukkotyyppisellä parametrilla sellaiseksi, että toipumismerkit voivat olla mikä tahansa merkkijoukon osajoukko? (Virheestä toipuminen tarkoittaa, että tilanteessa, jossa syöttö- tiedoston rakenteessa on ollut sellainen vika, että ohjelma ei enää ymmärrä, mitä tietoalkiota pitäisi odottaa, yritetään etsiä jokin syöttötietojen kohta, josta eteenpäin taas voidaan yrittää ymmärtää syötettä. Esimerkiksi Pascal-kääntäjälle yksi ns. 'toipumismerkki' voisi olla lauseiden erotin ';'.) 11.3 Tee tyylianalyysiohjelma, joka selvittää, mitä kirjaimia teksti- tiedostossa esiintyy. Saat standardista poiketen olettaa, että kirjainmerkit 'a':sta 'z':aan ovat merkkityypissä peräkkäisiä arvoja. Laadi ohjelma sellaiseksi, että se pyytää käyttäjältä tutkittavan tekstitiedoston nimen ja liittää sen tiedostomuuttujaan joko TurboPascalin assign-operaatiolla tai SPARC- Pascalin laajennetulla reset-operaatiolla. Kerää tiedoston merkit set of char -tyyppiseeen muuttujaan ja tutki tämän joukon leikkausta joukon ['A'..'Z', 'a'..'z', 'Å', 'Ä','Ö', 'å', 'ä', 'ö'] kanssa. 11.4 Linkitetty lista on määritelty: type osoitin = ^tietue; tietue = record tieto : integer; linkki : osoitin end; var p, q : osoitin; a) Kirjoita lauseet, jotka luovat p:n osoittaman linkitetyn listan, jossa on luvut 37, 5, 70 ja 19. b) Kirjoita lauseet, jotka tutkivat, onko luku 21 q:n osoittamassa listassa. Oletetaan, että q on asetettu osoittamaan listaan. 11.5 Linkitetty lista on määritelty samoin kuin edellisessä tehtävässä. a) Kirjoita proseduuri Liitä, joka saa parametreina kaksi listaa ja liittää ne yhteen. Ensimmäinen parametri asetetaan osoittamaan yhdistettyyn listaan, toinen saa arvon nil. b) Kirjoita funktio Suurin, joka saa parametrina osoittimen listaan ja palauttaa arvonaan osoittimen listan suurimpaan alkioon. c) Kirjoita funktio Suurinarvo, joka saa parametrina osoittimen listaan ja palauttaa arvonaan listan suurimman alkion arvon. Voit käyttää tai olla käyttämättä b)-kohdan funktiota. d) Kirjoita proseduuri Poista, joka saa parametrina osoittimen listaan ja osoittimen poistettavaan alkioon tässä listassa. Proseduuri poistaa listasta poistettavan alkion. 11.6 Linkitetty lista on määritelty samoin kuin edellisessä tehtävässä. Tee proseduuri Jarjesta, joka järjestää parametrina saamansa listan nousevaan suuruusjärjestykseen.