Kuupäeva algoritmi rakendamine

Tunnitöö ülesanneLisa: liittingimustestLisa: voo suunamine Windowsil

Ü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. Sisendvoog tuleb failist, kuhu on salvestatud erinevad testkuupäevad. Kuupäevad on ette antud käesolevas dokumentatsioonis.
  • Kuupäevad vastavad kõik formaadile DDMMYYYY
Edasijõudnutele:
  • Ül1: Anna põhjus miks kuupäev ei valideerunud (nt skoobist väljas, vale kuu, liiga palju päevi kuus jne)
  • Ül2: Ära eelda, et kasutaja sisestus allub formaadile. Kasutaja võib sisestada ka tähemärke, vale arvu numbreid jne
  • Ül3: 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
Algoritm

Etapid tulemuseni jõudmiseks

Alususeks peame tegema andmefaili. Sinna kirjutame samad andmed, mida muidu trükiksime klaviatuurilt iga kord programmi testides. Teisisõnu kirjutame oma testandmed ühekordselt ära ja hiljem lihtsustame oma testimist sedasi.

Lähtefaili kirjutades tuleks arvestada kõikvõimalike erinevate juhtudega,  mis programmis esineda võivad. Kindlasti tuleb testida nii sobilike kui ka mittesobivaid kuupäevi. Näiteks võib siin olla tavapäraseid kuupäevi – 11. detsember 1981, kuid samuti ka ebareaalseid kuupäevi – 51. detsember, kuu nr 22 jne. Eriti olulised on piirjuhud – nt 29. veebruar liigaastal ja tavaaastal. Järgnevalt on välja pakutud üks võimalik loetelu kuupäevi (võid julgelt kuupäevi lisada loetelu lõppu, kuid need peavad kindlasti sisalduma testis)

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 läbi geany või siis teha seda käsurealt.

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õudnute näidislahendus

Edasijõudnute programm peab oma väljundis juba täpsem olema

Liittingimuste kasutamine

Selleks, et mitut tingimust kombineerida loogiliselt on võimalik kasutada loogilisi operaatoreid. Antud ülesande lahendamisel on abiks kolm peamist – loogiline liitmine (või, disjunktsioon), loogiline korrutamine (ja, konjunktsioon) ja inversioon (eitus). Samad vasted eksisteerivad ka hulgaalgebras, vastavalt siis ühend, ühisosa ja täiend.

Järgnevalt on toodud tõeväärtustabelid, kus && tähistab loogilist korrutamist, || loogilist liitmist ning ! inversiooni. Väärtust T käsitletakse tõesena (true, 1), väärtust F väärana (false, 0). A ja B võib võtta kui erinevaid loogikatehteid.

A B A && B A || B
F F F F
F T F T
T F F T
T T T T
A !A
F T
T F

Näited tehetest

Oluline on loogikatingimusi kombineerides tähelepanu pöörata tehete järjekorrale. Seda eriti kui kombineerida loogilisi liitmisi ja korrutamisi omavahel. Olemaks kindel, et järjekord on sobilik, tasub kasutada sulge prioriteetide määramiseks.

Täiendavalt tuleks teada, et C keeles on kõik mittenulliks arvutuvad tingimused tõesed. Samuti tuleb tähele panna, et iga kontrollitav väärtus tuleb täispikalt välja kirjutada (vt näitest rida 8).  Kui taolisi väärtusi on palju ning eraldi väljakirjutamine ebaotstarbekaks kujuneb, siis võib luua massiivi, kus on otsitavad väärtused sees ning tsüklitega lahendada olukord.

Järgmine näide on voo suunamisest Windows keskkonnas. Linuxi puhul on suurem pilt sama, kuid üldiselt kutsutakse käsurida terminaliks, programmidel laiendit ei ole ning programmi ette pannakse “./”.

  1. Veendu, et kõik failid on õiges kaustas

Minimaalselt peab sul olema 2 faili:

  • Programm (windowsis .exe laiendiga)
  • Tekstifail(id) sisendiga (üldiselt .txt laiendiga, kuid ei pea olema). On oluline, et tegu on kõige lihtsamal kujul ASCII tekstifailideaga – selliseid võid kirjutada kasutades nt Geany või Notepad programme. Kindlasti ei tohiks kasutada wordpadi, MS Wordi ja teisi keerukamaid redaktoreid.

Tõenäoliselt on seal aga neid faile rohkem – nt ka .c fail kuhu me kirjutame koodi ja sageli ka .o objektfail.

1.1 Näidisfailid

Esiteks andmefail (sisend.txt)

Teiseks koodifail mis seda loeb ja kuvab ekraanile:

1.2 Kui programm veel kompileeritud pole, siis tee seda. 

NB! Pärast igat koodi muutmist tuleb programm uuesti kompileerida enne uuesti jooksutamist!

2, Ava käsurida (command prompt). Käsurida peab näitama sellesse kausta kus parasjagu tööd tehakse. Selleks on mitmeid valikuid. Toon välja 2 kõige lihtsamat.

2a. Võta aktiivseks aadressiriba ja kirjuta sinna “cmd” ning vajuta enter klahvi.

 

2b. Hoia all shift klahvi klaviatuuril. Vajuta tühja ala peal kaustas paremat hiireklahvi. Ava valik “Open command window here”. NB! Alates Windows 10 versioonist 14986 avab see Powershelli akna. Kuigi ka sellega on võimalik seda teha, siis käib see veidi teistmoodi ja seda me siin ei kata.

3 Käivita programm käsurealt kasutades voo suunamist.

Üldine kirjapilt: programm.exe < sisend.txt

Esiteks siis käivitatakse programm. Seejärel öeldakse, et programmi sisendvooog suunatakse ümber ja tuleb failist. Seejärel täpsustatakse faili nimi.

Minu kaustastruktuuri puhul peaksin ma käivitama programmi järgnevalt: 7_base_read_matrix.exe < input.txt

Nüüd see kõik kokku ühes videos meetodiga 2b käsurea avamiseks. Videos on näidatud ka käsku dir , mille abil on võimalik loetleda ette antud kaustas olevad failid. Seda tegema ei pea.

NB! Vooga programmi antud sisendit sa ei näe nii nagu tavaliselt klaviatuurilt kirjutades näeb. Selle nägemiseks pead kontrolliks täiendavaid printimisi kirjutama. Küll aga näed väljundit ätiel määral.

Tüüpviga: Käivitada tuleb programm (windowsis .exe laiendiga). Käivitada ei saa koodifaili (.c laiendiga).

Kasulikke nippe:

  • Selle asemel, et kirjutada programmi või sisendi nimi täispikalt välja, kirjuta sellest välja 1-3 esimest tähemärki (vahel ka rohkem) ning vajuta tab klahvi. See lõpetab faili nime ära sinu eest. Kui kaustas on mitu sama algusega faili nimetust saad järgmise faili juurde minna vajutades tab klahvi kuniks õige fail ette tuleb. Sedasi vähendad näpuvigade tekitamist ning säästad aega.
  • Kui soovid programmi muuta ja uuesti testida, siis ära käsuaket kinni pane. Kirjuta oma uuendus koodi ära, kompileeri kood ja seejärel vajuta käsuaknas ülesnoole klahvi. See võtab ette eelmise käsu ja saad uuendatud programmi käivitada minemata läbi neid toiminguid uuesti. (Üles- ja allanooleklahvid liiguvad ringi programmi ajaloos).
  • Oma programmi testimiseks võid teha mitu sisendfaili. Näiteks testimaks mullsorteerimise koodi tee üks fail, kus numbrid on juhuslikult, teine juba kasvavas järjekorras, kolmas kahanevas järjekorras, neljas kus on mõnda numbrit mitu korda. Sedasi saad kiiresti testida oma programme kõiksugu erinevate lähteandmetega.

Veel lugemist: