Praktikum 9 Failide lugemine ja kirjutamine Vaatame üle näited faili_kirjutamine.py ja faili_lugemine.py Tekstifailide lugemine seostub stringide töötlemisega, sest tekstifailist loetakse andmed stringidena. Edasi tuleb neid tükeldada, teisendada, listidesse kirjutada jms, et nad ülesande lahendamiseks sobilikule kujule viia. Katsetame veidi faili kirjutamise ja failist lugemisega. Proovime täna lahendada mõned ülesanded kooliõpilaste informaatika olümpiaadidelt Ülesanne 1. Keskmised skoorid Vt eraldi ülesande linki ja testide linki kursuse veebilehel. Loe ülesanne läbi ja mõtle, kuidas lahendada. Üldpilt peaks tuttav olema. Loe järjest sisse erinevad sisendfailid ja kirjuta tulemus väljundfaili. NB! Sisend ja väljundfailide nimed erinevad ülesande tekstis toodust. See on seotud olümpiaadil kasutatava testimisesüsteemiga. Faile ei pea hakkama ümber nimetama. Proovime koos läbi andmete failist massiivi lugemise. Lisaks põhiülesandele: täienda programmi nii, et see loeks ise järjest sisse kõik testifailid ja kirjutaks vastused erinevate numbritega vastusefailidesse. Kiirematele täienduseks: kui nüüd kõik vastused on failidesse kirjutatud - kas oskaksid kirjutada kontrolliprogrammi? Programm avab järjest Sinu kirjutatud failid ja õiged vastused ning trükib ekraanile iga testi kohta, kas vastus on õige ning test läbitud või mitte. Ülesanne 2. Palindroomid Palindroomiks nimetatakse stringi, mis on ühesugune nii vasakult paremale kui ka paremalt vasakule lugedes. Näiteks kirik on palindroom, aga kirjak ei ole. Kirjutada programm, mis kontrollib, kas antud tekstidest kõigi mittetähtede (numbrid, tühikud, kirjavahemärgid jne) eemaldamise järel saavad neist palindroomid. Sisend. Tekstifaili pal.sis esimesel real on uuritavate tekstide arv N (1 <= N <= 100) ja järgmisel N real igaühel üks ladina tähtedest, numbritest, tühikutest ja kirjavahemärkidest koosnev tekst pikkusega kuni 100 märki. Väljund. Tekstifaili pal.val väljastada täpselt N rida. Reale i (1 <= i <= N) väljastada sõna JAH või EI vastavalt sellele, kas sisendfaili real i + 1 olev tekst muutub kirjavahemärkide ja tühikute eemaldamisel palindroomiks või mitte. Suur- ja väiketähti võrdlemisel mitte eristada. Näide. pal.sis 2 kirik kirjak pal.val JAH EI Lihtsustame ülesannet esialgu sel viisil, et eeldame, et ta sisaldab vaid tähti (st kirjavahemärke jms ei ole vaja välja visata / ignoreerida). Kirjutamise mõttes oleks lihtsaim viis reverse()-meetodiga string tagurpidi pöörata ja seejärel võrrelda. Aga me teeme seda veidi keerulisemalt. Võrdleme stringi 1. ja viimast, 2. ja eelviimast jne tähte, kuni avastame paari, milles tähed on erinevad. See ütleb meile, et string ei ole palindroom. Võrdlemise juures rakendame varem vaadeldud otsimise ideed. Mõned ilusad palindroomid: kuulilennuteetunneliluuk või: aias sadas saia Edasi - kuidas saada üle suur-ja väiketähtede erinevusest ja mida teha "mitte-tähtedega"? Siin tasub mõelda juba lahendatud Caesari salakirjale. Testid leiad failist palindroom.rar Kiiremad: kas saad hakkama uue kontrollimiseprogrammiga, mis selle ülesande genereeritud faile kontrolliks? Eelnevalt võiks ka lahendamise tsüklisse panna, et kõik sisendfailid järjest läbi töötada. Ülesanne 3 Kolmas pikkus On antud N õpilase pikkused. Kirjutada programm, mis leiab pikkuselt kolmanda õpilase pikkuse. Sisend. Tekstifaili pikk.sis esimesel real on täisarv N (3 <= N <= 10 000) ja järgmisel real N täisarvu A1, A2, . . . , AN (0 < Ai <= 1000), õpilaste pikkused. Väljund. Tekstifaili pikk.val ainsale reale väljastada üks arv, pikkuselt kolmanda õpilase pikkus. Näide. pikk.sis 5 175 173 169 173 171 pikk.val 173 Pikima õpilase kasv on 175 cm, teist ja kolmandat kohta jagavad 173 cm pikkused õpilased. NB! Ära sorteeri! Ei käsitsi ega ka vastava listi meetodiga. Proovi sobivalt muuta maksimumi leidmise algoritmi. Veebilehelt leiad ka testid.