7. Kuupäeva algoritmi rakendamine

 

Sissejuhatus ja kodused testid7. nädala tunnitöö

Programmidele on võimalik lähteandmeid ette anda mitmeti:

  • Klaviatuurilt kirjutades
  • Juhuarve genereerides
  • Initsialiseerides koodis
  • Failidest
  • Andmebaasidest
  • Sensoritelt (temperatuur, õhuniiskus, valgustugevus jne)
  • Teistest programmidest
  • jne

Senini oleme käsitlenud kuidas seda teha klaviatuurilt inimese poolt ja initsialiseerides muutujaid deklareerides. Oma programmide testimiseks mitmekülgsete lähteandmetega jääb sellest aga väheks ning siin võtame appi meetodi mida kutsutakse voogude suunamiseks. Seda võib ka võtta kui vahesammu kuniks kevadel failidest andmete lugemiseni jõuame.

Saamaks paremini aru voo mõistest tuleks esmalt selgitada, et programmides on tüüpiliselt 3 erinevat voogu – sisend (stdin), väljund (stdout) ja vigade (strerr) voog.

Senimaani on meil sisendvooks olnud klaviatuur ehk siis mida me programmile käsitsi oleme ette trükkinud ning väljundvooks terminaliaken, kuhu siis kõik tekst on kuvatud. Antud voogusid on aga võimalik ümber suunata teiste allikate peale. Näiteks me võime sisend- või väljundvoo suunata ümber tavalisse tekstifaili. Vajadusel saame ka mõlemad vood korraga ära suunata. Kusjuures fail ei ole ainuke koht, kuhu me neid paigutada võime – ka mitme programmi väljund- ja sisendvood on võimalik omavahel kokku ühendada, mille tulemusel ühe programmi väljundvoog on paralleelselt teise programm sisendvoog ja vastupidi.

https://en.wikipedia.org/wiki/Redirection_(computing)

Etapid tulemuseni jõudmiseks

Esmalt on meil vaja kahte faili. Lihtsuse huvides võiks need paigutada ühte ja samasse kausta.

  • programm (NB! Lähtekood, st .c laiendiga fail ei ole programm. Programm on lähtekoodi kompileerimisel saadud binaarfail – windowsis nt .exe laiendiga fail, linux laiendit ei nõua)
  • andmefail (tekstifail, mis sisaldab teksti, mida tavapäraselt oleksime klaviatuurilt sisestanud)

Andmefaili ehk testandmete puhul tasub kindlasti need läbi mõelda, et kirja saaks võimalikult palju erinevaid testjuhtumeid. Vajadusel võib ka andmefaile olla mitu.

Antud juhul toon näite mis on loodud 6. nädala tunnitöö põhjal, kus oli vaja genereerida 7×7 ruutmaatriks. Loon järgmise andmefaili ning salvestan kausta kus saab olema ka minu programm.

Erinevalt 6. nädala tunnitööst, kus olid andmed algväärtustatud, tuleb sel korral taastada varasemalt harjumuspärane käsitsi andmete sisestamine. Kui kood juba olemas, siis piisab vaid tühja 7×7 massiivi loomisest ja massiivi täitmisest kasutaja sisestustega. Kui koodi pole, siis võib testimiseks kasutada järgnevat.

Nagu ka allolevast koodist järeldada võib, ei pea me andmevoogu suunates oma koodis midagi muutma võrreldes senisega!

Järgmise sammuna tuleb programm kompileerida, seda võib juba teha juba harjumuspäraseid meetodeid kasutada. Oluline on, et pärast igat muudatust koodis see uuesti kompileeritaks. Programmi ennast käivitada tavapäraselt mõtet pole. Seda peab tegema käsurealt.

Esmalt avame käsurea. Windowsis on seda mugav teha samas kaustas, kus on ka meie programm, hoides all shift klahvi ning paremklikkides hiirega tühjal alal. Tuleb nähtavale valik ‘Open command window here’. Alternatiivina võib ükskõik kust command prompti avada ja ‘cd’ käsuga minna õigesse kausta.

Seejärel tuleb vaid programm käivitada ning lisada sisendvoo suunamiseks sümbol ‘<‘ ning failinimi, kust sisend võetakse.
Nt: 7_base_read_matrix.exe < input.txt

Linuxis käib asi sisuliselt samamoodi – vaja avada käsurida õigest kaustast paremkliki abil või siis liikuda käsuga cd õigesse kausta. Kausta sisu näeb Linuxis käsuga ‘ls’, kus Windowsi puhul oli kasutusel käsk ’dir’. Erinevalt Windowsist pole tüüpiliselt tekstifailidel ja programmidel Linuxis kasutusel faililaiendeid, st käsk võiks välja näha järgnev: 7_base_read_matrix < input

Veel lugemist:

Ülesande kirjeldus

Tuleb luua programm, mis suudab eristada tõeseid ja vigaseid kuupäevi.

Tingimused
  • Kuvab iga kuupäeva puhul kas tegu on reaalse või vigase kuupäeva
  • Aastate vahemik on piiratud 1900 – 2099
  • Liigaasta kontroll
  • Peab olema võimeline töötlema 100 kuupäeva ühe käivitusega.
  • Programm saab oma testandmed sisendvoost mis on suunatud andmefaili
  • Kuupäevad vastavad kõik formaadile DDMMYYYY
Edasijõudnutele:
  • Anna põhjus miks kuupäev ei valideerunud (nt skoobist väljas, vale kuu, liiga palju päevi kuus jne)
  • Kuupäevade arv pole piiratud
  • Ära eelda, et kasutaja sisestus allub formaadile. Kasutaja võib sisestada ka tähemärke, vale arvu numbreid jne
  • Luba kuupäeva vähemalt kahes erinevas formaadis (nt [DDMMYYYY], [DD.MM.YYYY], [mm/dd/yyyy], [dd. mmm yyyy] https://en.wikipedia.org/wiki/Date_format_by_country

Etapid tulemuseni jõudmiseks

Alususeks peame tegema andmefaili. Sinna kirjutame samad andmed, mida muidu trükiksime klaviatuurilt iga kord programmi testides.  Lähtefaili kirjutades oleks soovitatav arvestada kõikvõimalike erinevate juhtudega,  mis programmis esineda võivad. Kuupäeva verifitseerimise korral võiksid need testid sisaldada näiteks ebareaalseid kuupäevi (nt 13. kuu), liigaastat , erineva päevade arvuga kuud jne. See võiks näha välja näiteks selline (võid julgelt kuupäevi lisada või üldsegi enda versiooni kirjutada)

Teiseks oleks meil vaja programmi, mis neid kontrollima hakkaks.

Programmi baaskood
Lähtefailid olemas, nüüd oleks vaja programm kompileerida. Selleks võid kasutada juba senini tuttavat metoodikat.

Seejärel oleks vaja käsurida viia asukohani, kus me need 2 faili oleme salvestanud.

Veendume, et failid on kõik seal, kus peaks:

Antud kaustas on 3 faili:

  • kp – nn binaarfail ehk programm, mida ma saan käivitada (kompileerimise tulemus)
  • kp.c – koodifail, mille põhjal ma kompileerisin oma programmi
  • sisend – tekstifail, mis sisaldab kuupäevi mida testida ehk testandmed.

 

Nüüd käivitame programmi sedasi, et klaviatuurilt trükkimise asemel loetakse andmed ette söödetud failist (kasutades voo ümbersuunamist). Selleks kirjutame järgneva rea: ./programminimi < andmefailinimi

./programminimi – sedasi saad programmi käima linuxis käsurealt
< – tähistab, et programmi klaviatuurilt tulevad sisestused juhitakse ümber
andmefailinimi – siit hakatakse lugema mida programmile ette sööta ehk siis kust sisestus tuleb

Pärast algoritmi rakendamist võiks su programm näidata juba niimoodi:
 

Edasijõudnutele

Edasijõudnute programm võiks oma väljundis juba täpsem olla

Veel lugemist: