Ohjelmointi (Pascal) Harjoitus 10, 18.-22.11. (monisteen sivut 1 - n.49) (Oh! Pascal! sivut 2 - n. 455, 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) 10.1 & 10.2 Standardinmukaisella Pascalilla voisi toteuttaa vaihte- levanmittaisen merkkijonon vaikka seuraavasti: const MAX = 64; type string = record len: 0..MAX; str: packed array[1..MAX] of char end; Esimerkkejä operaatioista: function length(s: string):integer; begin length := s.len end; procedure empty(var s: string); {s := ''} begin s.len := 0; end; procedure writestring(s: string); var i: integer; begin for i := 1 to s.len do write(s.str[i]); end; a) Toteuta operaatio readstring(var s: string), joka ohittaa välilyönnit ja rivinvaihdot ja sitten lukee s:lle arvon välilyöntiin tai rivinvaihtoon asti. Jos merkkijonon pituus olisi yli MAX, arvo katkaistaan. Merkkijono kuitenkin luetaan kokonaisuudessaan. b) Tee proseduuri catenate(var a: string; b: string), joka suorittaa merkkijono-operaation a := a + b. Jos merkkijonon pituus kasvaa yli MAXin, arvo katkaistaan. c) Laadi operaatio trim(var s: string), joka poistaa parametristaan loppuvälilyönnit. d) Ohjelmoi pos(e, s: string):integer, joka palauttaa ensimmäisen indeksin, josta alkaen e sisältyy s:ään. Jos ei sisälly, arvo on 0. 10.3 Opiskelija tekee luennolla muistiinpanoja pienellä sylimikrolla. Luennoija on surkea; aina silloin tällöin hän toteaa, että kaikki mitä hän on sanonut, olikin aivan väärin ja on syytä heti unohtaa. Tee opiskelijalle ohjelma, jolla hän voi tallentaa luentomuistiin- panot tekstitiedostoksi. Ohjelmalle ilmoitetaan komentomerkillä '#', että kaikki tähänastinen on syytä unohtaa ja siis tiedoston kirjoittaminen pitää aloittaa alusta. Ohjelman pitää varmistaa käyttäjältä, että on todella tarkoitus unohtaa kaikki tähän mennessä kirjoitettu, jottei sormen lipsahdus '#'-näppäimelle vahingossa hävittäisi tiedostoa. Merkki '%' ilmoittaa ohjelmalle, että luento on päättynyt. 10.4 & 10.5 Suunnittele lehden tilaajatieto-ohjelman (9.4,5,6) tietorakenteen talletus tiedostoksi ja toteuta proseduurit TiedotTurvaan ja TiedotTurvasta, joiden avulla tietorakenteen tiedot saadaan säilymään tiedostossa ohjelman suorituskerrasta toiseen. a) Tietorakenne talletetaan tekstitiedostona Turva. b) Tietorakenne talletetaan 'binääritiedostona' tiedostoon Turva, jonka tyyppi on file of tilaaja. c) Tietorakenne talletetaan tiedostoon, jonka komponenttityyppi on sama kuin koko taulukon tyyppi. Miksi tuolle tyypille on nyt annettava nimi. Älä unohda muuttujaa ViimKayt. Se on oleellinen osa tietorakennetta! Saat latausproseduurissa olettaa, että tiedosto on talletettu vastaavalla talletusproseduurilla eikä siellä ei ole virheitä. 10.6 a) Tee funktio Riveja, jonka arvona on parametrina annetun teksti- tiedoston rivien lukumäärä. b) Tee proseduuri Listaa, joka tulostaa kuvaruudulle parametrina annetun tekstitiedoston. Ohjelma tulostaa kuvaruudullisen tekstiä kerrallaan ja pyytää lupaa jatkamiseen. ____________________________________________________________________ Turbo-Pascalin ja SPARCompiler 3.0:n tiedostojen käsittelystä Turbo: o puskurimuuttujia ei ole lainkaan! o ulkoinen dos-tiedostonimi liitetään ohjelman sisäiseen tiedostomuuttujaan ennen reset- tai rewrite-operaatiota: assign(tdsto, 'nimi.dat') o tiedostot pitää itse sulkea ennen ohjelman loppua: close(tdsto) SPARC: o ulkoiset tiedostonimet voidaan liittää sisäisiin tiedostomuuttujiin esim. seuraavasti: reset(tdsto1, 'nimi.jotakin') ja rewrite(tdsto, 'nimi.muuta') o jos näissä käyttää vain yhtä parametria, tiedoston ulkoiseksi nimeksi oletetaan tiedostomuuttujan nimi! Molemmissa tiedoston ulkoinen nimi voi olla myös merkkijonomuuttujassa, jolloin siis avattavan tiedoston nimen voi kysyä vaikkapa ohjelman käyttäjältä!