Autori risto postitused

PR1ET2: tingimuslaused

Praktikumi materjal

Esitamisele kuuluvad ülesanded

Selles praktikumis on kaks baasülesannet, millest esimene toetub poe kassasüsteemile ja teine poe kaubakaalule. Esimest ülesannet laiendab lisaülesanne, mis lisab boonuspunktide kasutamise võimaluse.

Ülesanne 1 [W02-1]: poekassa

Poekassa ülesandes simuleerime lihtsat kassasüsteemi rakendust, eesmärgiga harjutada tingimuslausete koostamist. Juhindu etteantud aluskoodis olevatest kommentaaridest ning kirjuta vajalikud koodiread pärast kommentaari!

Nõuded
  • Programm peab loogiliselt olema üks-ühene etteantud algoritmiga
  • Programm peab olema ehitatud etteantud aluskoodi põhjale. Sinu ülesanne on lisada vajalikud printf , scanf  laused, arvutustehted ja tingimuslaused sinna kuhu vaja. Juhindu kommentaaridest ja etteantud tegevusdiagrammist.
  • Ära muuda muutujate nimetusi ega programmi struktuuri.
  • Soovitus: Kontrollimaks, et programm käitub korrektselt ja muutujad omavad neid väärtusi, mida ootad, tasub lisada vahele mõni täiendav printf  lause.

Lae alla ülesande 1 aluskood: [et]

Algoritm

Testimine

Järgnevalt pakun välja mõned olulised testid loodavale programmile. NB! Vähemalt ühe olulise testjuhu olen jätnud katmata. Kas tead millise?

Kliki minul, et näha testjuhte!

Test 1: Klient, kellele soodustust ei rakendata, ja sooritab eduka makse. Testime ka murdarvu kasutamist.

Test 2: Klient, kellel on kliendikaart ja lisasoodustus.

Test 3: Klient, kellel on täpselt vajaminev rahasumma kontol.

Test 4: Klient, kes saab ostu sooritada vaid pärast soodustuse rakendamist.

Test 5: Klient, kelle kontol pole piisavalt raha.

Test 6: Klient, kes ei tea oma PIN koodi.

Ülesanne 2 [W02-2]: poekaal

Ülesande raames tuleb luua programm, mis simuleerib toidupoes asetsevat toidukaalu.

Tunnis luuakse ülesande struktuur UML tegevusdiagrammina. Sinu programm peab omama vähemalt samaväärset funktsionaalsust.

Nõuded
  • Kaalul peab olema kokku vähemalt neli erinevat tootevalikut
  • Tootevalikud on esindatud numbri (tootekood) ja nime kombinatsioonidega (nt 1 – banaan)
  • Kasutaja sisestab klaviatuurilt täisarvulise tootekoodi ja reaalarvulise koguse (kilogrammides)
  • Valitud tootekoodi ja toote kilohinna vaste leidmine tuleb realiseerida kasutades switch  lauset
  • Korrektse kaalu ja koodi korral väljastatakse kasutajale valitud tootekood ja toote nimetus, toote kilohind, sisestatud kaal ning kogusumma
  • Väljastatavad rahasummad peavad olema esitatud kahe komakohaga, kaalu puhul võid kasutada kahte või kolme komakohta.
  • Vigase tootekoodi või kaalu korral tuleb väljastada veateade ning programm täitmine katkestada

Lae alla ülesande 2 aluskood: 2_2_scale_base.c

Algoritm

Koopia algoritmist neile, kes jõuavad tunnis kiiremini teise ülesandeni või kaotavad oma koopia algoritmist. Algoritm lahendatakse tunnis läbi koos.

Testimine

Test 1: Korrektse sisestuse korral antakse tulemuseks hind

Test 2: Vigase tootekoodi puhul antakse veateade

Test 3: Vigase kaalu puhul antakse veateade

Lisaülesanne [W02-3]: boonuskonto

Lisaülesandeks on esimese tunniülesande laiendus.  Selleks lisame kasutajale võimaluse kasutada boonuspunkte.

Ülesannet lahendades mõtle hoolikalt kõigele mis võib valesti minna igas tehingu etapis ning kuidas need omavahel seotud on!

Pane tähele – ülesande lahenduse tulemusena tekib üks pikk spagett – kood, mis on kõik ühes funktsioonis. Selle vastu hakkame võitlema alates neljandast nädalast.

Nõuded
  • Programmi lisatakse kasutaja boonuspunktide arv, algväärtustatuna. Boonuspunktid saavad olla vaid täisarvulised numbrid (nt 1 boonuspunkt, 15 boonuspunkti)
  • Enne tehingu sooritamist kuvatakse kasutajale tema boonuspunktide arv ning kui palju punkte tohib maksimaalselt selle ostu jaoks kasutada, arvestades boonuspunktide reegleid.
  • Seejärel küsitakse kasutajalt kas ta soovib boonuspunkte kasutada, kui jah, siis küsitakse kui palju ta soovib kasutada
  • Boonuspunktide reeglid
    • 1 boonuspunkt võrdsustatakse tehingutes 1 eurosendiga
    • Maksimaalselt saab ostu eest tasuda 90% ulatuses boonuspunktides, mis arvestatakse makstavast summast pärast soodustusi
    • Kui kasutaja sisestab suurema boonuspunktide summa kui tal on või kui tohib ostu eest kasutada, asendatakse see maksimaalse lubatud boonuspunktide arvuga
  • Ülejäänud tehingu loogika on täpselt sama
  • Tehingu lõppedes kuvatakse kasutajale täiendavalt tema boonuskonto jääk
Vajaminevad teadmised

Meeldetuletuseks eelmisest tunnist – kahe täisarvu vaheline jagatis on alati täisarv. Kui on vaja teha jagatis, mille tulemus peab olema ujukomaarv (ehk komaga number), siis peab vähemalt üks jagatises osalevatest numbritest olema komaga arv. See muudab kogu tehte murdarvu jagatiseks.

Näiteks 1 / 100 annab täisarvu 0, kuid 1,0 / 100 või 1 / 100,0 annab ujukomaarvu 0,01.

Korrutamisel reaalarvuga sellist probleemi ei ole – st 10 * 0,01 annab tulemuseks 0,1.

Testimine

Esimeses näites on kasutaja, kes kasutab soodustust. Ilma soodustuseta poleks võimalik ostu sooritada.

Teises testnäites on kasutaja, kes ei soovi oma boonuspunkte kasutada.

Kasutaja soovib kasutada rohkem boonuspunkte kui tal on. Tehing ei lähe läbi kuna raha on liiga vähe, boonuspunktide jääk jääb endiseks.

 

Pärast tundi peaksid

  • Teadma, mis asi on tõeväärtustabel ja kuidas seda lugeda
  • Oskama koostada liittingimusi
  • Oskama inversiooni ja tingimuse lühivormi kasutada
  • Oskama algväärtustada muutujat deklareerimise hetkel
  • Teadma, mida De Morgani seadus tähendab
  • Oskama koodiplokke üksteise sisse pesastada tingimuslausete näitel
  • Oskama kasutada sama muutujat mõlemal pool võrdlusmärki tehetes
  • Oskama kasutada ja väljastada murdarvu määratud komakohtade arvuga
  • Teadma kuidas switch lause töötab ning oskama seda kasutada programmikoodis
  • Oskama modelleerida switch lauset tegevusdiagrammina
  • Oskama modelleerida tingimuslauset alternatiivkujul, ilma kommentaarikastita
  • Oskama kasutada ujumisradu (eraldisi, swim lane)
  • Oskama modelleerida algoritme ja koostada programme, millel on mitu erinevat lõppu

Täiendav materjal

PR1ET12: Linux ja käsurida

Labori materjal

Käskude abi

Kui soovid abi mõne käsu kohta, siis selleks on sul 3 peamist meetodit.  Kolmas ja mõneti kõige aeglasem on internetist otsimine, seega seda me siin ei kajasta. Ülejäänud 2 infoallikat on aga kättesaadavad otse käsurealt.

tldr (simplified community-driven man pages)

See on Linuxi kasutajate poolt kokku pandud “käsiraamat”, mille eesmärk on kiiresti ja lihtsalt kirjeldada iga programmi kõige levinumad ja olulisemad kasutusviisid. Seetõttu on aga puudujäägiks sageli vajaliku detailsuse või selgituste puudumine.

Vaikimisi seda Linuxitega kaasa ei tule, aga oleme selle tööriista laboriarvutitesse paigaldanud.

Kasutamiseks kirjuta käsureal tdlr käsu_nimi

Alternatiiv: kasuta veebist https://tldr.sh

Näiteks lugemaks, kuidas faile kopeerida, kirjuta tldr cp

man pages

man ehk manual pages on Linuxiga kaasa tulev manuaal. Siin on olemas manuaalid käskudele, teekidele, süsteemi käskudele jne. Enamasti on iga programmi manuaalis kirjeldatud kogu tema funktsionaalsus. Kasutamiseks kirjuta man käsu_nimi

Näiteks lugemaks, kuidas faile kopeerida, kirjuta man cp

Manuaali sulgemiseks kasuta klahvi q . Manuaalist otsimiseks sisesta /  ning seejärel, mida otsida soovid. Abi teiste käskude kohta näed kui vajutad h  klahvi.

man  eelis tldr  ees on põhjalikkus – üldiselt on selgitused väga detailsed ning mõeldud kogenud kasutajale (professionaalile). Sageli on need algajale liialt mahukad.

Esitamisele kuuluvad ülesanded

Selles laboris on kaks ülesannet, millest mõlemat lõppevad veebivormiga, mis tuleb täita ja esitada! Eraldi ülesande lahendusi ette näitama ei pea.

Ülesanne 1: käsurea kasutamine

Selle ülesande raames tutvume väga põgusalt käsurea kasutamisega. Ülesanne lõppeb veebivormiga, mis tuleb täita. Veebivormi esitamine kinnitab ülesande lahendamist.

Kasutatavad terminid:

Käsuviip – Käsurea alguses olev informatsioon näitamaks ära kasutajanime ja asukohta failisüsteemis.

Käsurida / käsuaken / terminal – Programm, kus me oma käske jooksutame, nn terminal. Sisaldab käskude ajalugu, käsuviipa, võimalust käsku sisestada jms.

Vali viis ülesande lahendamiseks

Enne, kui ülesande juurde saad minna, oleks vaja meil Linux keskkonda ja käsuakent. Valikuid pakun välja kolm.

  1. Lahenda ülesande kooliarvutis.
  2. Lahenda ülesanne üle kaughalduse
    Juhend: RDP abil kaugligipääs
  3. Lahenda ülesanne luues SSH tunnel kooliarvutisse ning tehes kõik üle tunneli
    Juhend: SSH ühenduse loomine
Ülesande lahendamine

Ülesanne on kirjeldatud samm-sammulise töövoona. Kõik tegevused tuleb lahendada kasutades käsurida. Ülesande lõpus tuleb sul esitada oma käskude ajalugu!

Samm 1: Vali kaust, kus labori faile hoiad

Esmalt peaksid otsustama, kuhu paned selle labori jaoks vajalikud failid. Tõenäoliselt võiks see olla midagi sarnast nagu ~/P/iax0583/labor11 .

Järgnevad käsud aitavad sind nagiveerimisel ja kausta loomisel:

  • Käsk pwd  näitab, kus kaustas hetkel asud
  • Käsk cd  võimaldab kaustade vahel liikuda
  • Käsu mkdir  abil saad luua uue kausta
  • Käsk ls  näitab, mis praeguse kausta sees asub. Kasuta täiendavaid argumente detailide nägemiseks.
  • Käsk mv  lubab kaustasid ja faile ümber nimetada ja liigutada.
  • Kasuta tldr käsk  või man käsk , et näha abi käsu kasutamise kohta.

Liigu käsureaga kausta, kus ülejäänud labori teha kavatsed!

Samm 2: Lae alla testprogramm

Labori kulgemist jälgib testprogramm. Programm on kokku pakitud kujul.

Failide allalaadimiseks kasutatakse tööriista nimega wget . Lae seda kasutades testprogramm alla. Selleks käivita järgnev käsk:

Samm 3: Paki testprogramm lahti ja käivita see

Tegu on kokku pakitud zip arhiiviga. Kasuta programmi   unzip selle lahti pakkimiseks. Jälgi hoolikalt arhiivi lahti pakkimise käigus tekkivat väljundit. See on oluline, et teaksid, mis lahti pakiti ja kuhu! Soovitavalt tee topeltkontroll kasutades ls -i, et veenduda selles.

Võimalik, et pead ka programmi käivitatavaks muutma

Mõnel juhul võib osutuda, et programmi ei pakitud lahti käivitusõigustega. Kui see nii juhtus (kontrolli esmalt), tuleb käivitusõigus lisada.  Selleks saad kasutada käsku chmod .

Käivita testprogramm

Nüüdsest on sul võimalik testprogrammi käivitada. Tee seda kohe – pane käima alla laetud programm!

Programm kontrollib labori kulgemist ja jääb seisma kohe, kui märkab täitmata nõuet. Edaspidi jooksuta testprogrammi iga kord, kui oled järgneva sammu ära teinud.

Praegu peaksid nägema järgmist väljundit:

Samm 4: Lae alla Vimi seadefaili

NB! Kui oled juba Vim-i kasutaja ning omad kodukataloogis seadefaili, jäta see samm vahele!

Vim on üks klassikalistest käsureal töötavatest tekstiredaktoritest. Sel on suur kogus erinevaid laiendusi ja seadistusvõimalusi võrreldes primitiivsete tekstiredaktoritega nagu nt nano.

Laeme alla seadefaili, mis teeb selles koodi redigeerimist veidi mugavamaks – nt lisab koodi värvimise, automaatse tabuleerimise jne. Vim’i seadefail tuleb laadida enda kasutaja kodukataloogi – sealt otsib vim seda automaatselt.

1. Mine käsuaknas oma kodukataloogi. Selleks kasuta käsku cd . Kodukataloogi sümboliks on ~ .

2. Kasuta programmi  wget  seadefaili allalaadimiseks. Seadefail asub aadressil  blue.pri.ee/.vimrc

Kasuta testprogrammi kontrollimaks, et seadefaili allalaadimine õnnestus!

Samm 5: Kopeeri üle andmefail, mis sisaldab saladust

Mine M kettale (~/M/). Leia sealt üles oma praktikumi juhendaja kaust ja mine sinna sisse. Selle kausta sees on üks peidetud alamkaust – otsi see üles ja mine sinna sisse. Peidetud alamkausta nimi algab punktiga. Peidetud kausta seest leiadki puuduoleva faili.

Nüüd tuleb sul see fail endale kopeerida. Kopeeri see samasse kausta, kus asub su testprogramm! Kopeerimiseks pead kasutama käsku  cp . Määra ära, mida soovid kopeerida ja kuhu!

Nüüd on aeg jälle testprogramm käivitada ja vaadata, kas saladus leiti.

Samm 6: Järgmiseks pead looma tekstifaili oma matriklinumbriga

Loodava faili nimeks on matricula . See loo samasse kausta, kus on ülejäänud failid. Selleks pakun välja 2 võimalust.

1. võimalus: Ava endale meelepärane tekstiredaktor, loo seda kasutades antud fail ning kirjuta sisse oma matriklinumber.

Vim-i juhis:

    • Käivita programm kirjutades  vim matricula . See käivitab Vim-i ja avab (vajadusel loob) sealjuures faili nimega matricula.
    • Vajuta klahvi ’i’, et minna sisestamise režiimi (insert mode).
    • Nüüd kirjuta sisse oma matriklinumber.
    • Seejärel vajuta klahvi ‘esc’, et tühistada kirjutamisrežiim.
    • Nüüd kirjuta seal aknas  :wq . w ütleb Vim’ile, et muudatused tuleb faili kirjutada ja q ütleb, et seejärel tuleb programm sulgeda. Neid saab ka eraldi kasutada.

2. võimalus: See on see, mida enamik ninapidi asjas olevad inimesed tegelikult teeksid sellise lühikese faili kirjutamiseks. Kasutusele võetaks käsk echo, mis kuvab sellele antud teksti terminaliekraanile tagasi. Echo väljundvoog (stdout) aga suunataks ümber faili, mille tulemusena vajaminev fail valmis kirjutatakse – nt echo "tekst" > fail

Samm 7: Kirjuta programm, mis väljastab “Hello  world!”

NB! Enne selle sammu teostamist meenuta, mis asi on faili laiend (file extension) ning mis laiendeid kasutatakse C-programmeerimiskeele lähtekoodi failidel ning millist programmidel Linuxi keskkonnas.

Taaskord, kasuta koodi loomiseks käsurea tekstiredaktorit. Meie soovitame Vim i kuna see toetab C koodi, aga sa võid kasutada ka mõnda teist tekstiredaktorit.

Kui sul on programmi kood kirjutatud, tuleb see kompileerida (meenuta, mis meie kompilaatori programmi nimi oli!). Kasuta kompilaatorile lipuna -o hello , et määrata väljundprogrammi nimeks “hello”.

Hoiatus: Ära mingil juhul kirjuta -o järele oma lähtekoodi (.c) faili nime. Sedasi kirjutad sa oma lähtekoodi üle.

Nüüd on aeg taas jooksutada meie antud testprogrammi! Kui kõik on edukalt sooritatud, loob see sulle uue faili, mille sisse on kirjutatud juhised. Jälgides neid juhiseid, saad ülesande esitada.

Ülesanne 2: Andmete otsimine ja veebikodu

Selle ülesande raames tutvume tööriistaga, mida kasutatakse laialdaselt oluliste andmete otsimiseks suurematest andmekogudest ning tutvustame sulle, kus asub sinu veebikodu. Lisaks vaatleme ka kuidas töötab toru ehk ühe programmi standardse väljundvoo (stdout) suunamist teise programmi standardsesse sisendvoogu (stdin).

Lähteandmed

Olen genereerinud täiesti juhuslike andmetega tekstifaili, mis võiks matkida roboti poolt tekitatud logisid. Sellised failid on loomult pikad (tavaliselt olulisemalt pikemad kui minu poolt antav) ning enamasti vajame neid vaid siis, kui midagi läheb valesti. Sellisel juhul on aga vaja paljude andmete hulgast just meile vajalik info kätte saada.

Logi asub veebikodus: http://www.tud.ttu.ee/web/Risto.Heinsar/sensors.txt

Andmete filtreerimisest

Pikkade tekstifailide filtreerimiseks on väga hõlbus abiline programm nimega grep . Sellele programmile on võimalik anda parameetrina otsitav muster ning programm kuvab ekraanile ainult need read, mis sisaldavad otsitud mustrit. Ülejäänud ridu ei näidata.

Mustrid võivad olla lihtsad – näiteks ühesõnalised nagu SENSOR , ERROR , firefox jne. Sellisel juhul käivitamegi programmi kirjutades grep muster .

Mustrid võivad olla aga ka keerulisemad – need saavad koosneda regulaaravaldistest (regular expression). Regulaaravaldiste kasutamiseks lisame käivitamisel argumendi -E . Näiteks kirjutades grep -E sensor[1-3]:  leitakse meile kõik read, mis on vastavalt kas sensor1: , sensor2:  või sensor3: . Märka, et ka koolon on otsitav.

Oma regulaaravaldisi saad testida lehel: https://regex101.com

Vihje 1: Sa võid grepi väljundi uuesti greppi saata teise mustriga – kõike ei pea ühe korraga tegema, kui see tundub keeruline.

Vihje 2: grep väljundi saad väljundvoo suunamise abil hõlpsasti uude faili kirjutada.

Vihje 3: Ka loogikaavaldisi saab teha – nt üks või teine otsitav muster.

Ülesande esitamine (baas- ja lisaülesanne)
  1. Otsusta, kas soovid lahendada baas- või edasijõudnute ülesande ning lahenda see
  2. Kopeeri oma fail veebikodusse ja leia selle veebiaadress
  3. Täida lahenduse kinnituseks järgmine veebivorm: https://forms.office.com/r/DcHWy2DVqk

NB! Kui sa oma veebikodu aadressi tuvastada ei suuda või tekivad tehnilised probleemid, anna meile pärast vormi täitmist märku ja näita oma faili asukohta ning aadresse, mis proovisid.

Baasülesande nõuded

Sinu ülesandeks on leida üles minu antud failist kõik read, mille teabetase on viga ehk ERROR ja sensoriks on sinu matriklinumber % 10 .

Näide:

Üliõpilaskood 123456IACB, matrikkel seega 123456.
123456 % 10 on 6

Järelikult tuleb otsida kõik veaolukorrad SENSOR6 kohta. Mõned näited oodatavatest ridadest:

Ülesannet võid lahendada kirjutades kõik käsud ühele reale või tehes seda mitmes osas.

Kirjuta väljund faili, kasutades selleks väljundvoo ümbersuunamist. Loodava faili nimeks peab olema sinu üliõpilaskood.txt – näiteks kui su üliõpilaskood on 123456IACB, siis sa kirjutad tekstifaili 123456iacb.txt

Lisaülesande nõuded

Sinu ülesandeks on leida üles minu antud failist kõik read, mille teabetase on viga ehk ERROR. Ositavad read sisaldavad veateadet kas sensorilt sinu matriklinumber % 10  või mootorilt sinu matriklinumber % 4 .

Leitud read peavad jääma samasse ajalisse järjestusse nagu nad on antud sisendfailis.

Näide:

Üliõpilaskood 123456IACB, matrikkel seega 123456.
123456 % 10 on 6
123456 % 4 on 0

Järelikult tuleb otsida kõik veaolukorrad SENSOR6 või MOTOR0 kohta. Mõned näited oodatavatest ridadest:

Ülesannet võid lahendada kirjutades kõik käsud ühele reale või tehes seda mitmes osas.

Kirjuta väljund faili, kasutades selleks väljundvoo ümbersuunamist. Loodava faili nimeks peab olema sinu üliõpilaskood.txt – näiteks kui su üliõpilaskood on 123456IACB, siis sa kirjutad tekstifaili 123456iacb.txt

Veebiketta kasutamine
NB!

NB! Osadel tudengitel on veebiketas miskil põhjusel katki! Kui tundub, et teed kõik õigesti aga brauser viskab 404, siis anna meile märku ja me vaatame üle, et kõik paistab õige – kui tegid kõik õigesti, siis paneme eraldi kirja, et labori mõttes midagi katki ei jääks. Vorm ülesande täitmise kohta tuleb ikkagi täita, sisestades oletatava aadressi, kus fail peaks olema.

Soovi korral võid rikketeate koostada, et su veebiketas korda tehtaks: https://helpdesk.taltech.ee

Kõigil üliõpilastel on oma veebiketas. Selleks on W ketas. Veebiketta kohta võid rohkem lugeda siit: https://taltech.atlassian.net/wiki/spaces/ITI/pages/38994529/li+pilase+veebikataloog+Online+student+directory

Kopeeri oma loodud fail sensorite väljundiga oma veebikettale. Kopeerimiseks kasutada cp  käsku.

Sinu fail on nüüd veebist kättesaadav ühel järgnevatest aadressidest:

  • http://www.tud.ttu.ee/web/uni-id/üliõpilaskood.txt
  • http://www.tud.ttu.ee/web/Eesnimi.Perenimi/üliõpilaskood.txt

Nüüd täida ära veebivorm!

PR1ET14: Käsurea argumendid

Labori sisu

Esitamisele kuuluvad ülesanded

Selles tunnis on üks ülesanne ning edasijõudnute ülesanded, mis lisavad algsele lahendusele funktsionaalsust juurde.

Tunnitöö: kalkulaator

Selle tunnitöö raames ehitad kalkulaatori, mis töötab kasutades käsurea argumente.

Nõuded
  • Loodavaks programmiks on lihtne kalkulaator, mis
    • teostab liitmist, lahutamist, korrutamist ja jagamist
    • toetab positiivseid täisarvulisi operande
    • teeb vaid ühe tehte korraga (nt 3 + 6)
  • Tehte vastus antakse 2 komakohaga
  • Nii operandid kui operaator loetakse käsurea argumentidena
    • Näide liitmistehtest: ./calculator 3 + 6
  • Programm ei tohi pärast käivitumist kasutajalt sisestust küsida
  • Programm tuvastab ära järgnevad veaolukorrad
    • Vale käsurealt loetud argumentide arv
    • Tundmatu operaator (tehe)
    • Mittenumbriline operand (arv)
    • Nulliga jagamine
  • Vea tekkides kuvatakse kasutajale, mis viga tehti ning seejärel programmi kasutusjuhend
Soovituslik loetelu funktsioonidest
  1. Abiinfo kuvamine
    1. Kuvab juhised, kuidas programmi kasutada
  2. Argumentide kontroll
    1. Kontrollib, mitu argumenti programmile anti
    2. Edasijõudnute versioonis tuvastab --help  argumendi.
  3. Veahalduse funktsioon
    1. Kuvab, mis vea kasutaja tegi
    2. Kutsub abiinfo kuvamise funktsiooni
  4. Operandi kontroll
    1. Kontrollib, kas operand on numbriline
    2. Tagastab operandi, mis on teisendatud arvulisele kujule (nt int)
  5. Arvutamine
    1. Tuvastab kasutaja poolt soovitatud tehte ja arvutab välja vastuse
    2. Tagastab vastuse

Lisaks võib olla kasulik luua ka funktsioonid operaatori kontrollimiseks ja tuvastamiseks.

Näidis

Valmislahenduse testimiseks omal käel soovitame alla laadida näidisprogrammi ja katsetada, kuidas see töötab.

Kõikide testjuhtudega, mida programm toetama peab vaata järgmist peatükki.

Näide 1: Programmi sisend OK, programm annab vastuse

Näide 2: programm käivitatakse vale sisendiga ning kuvatakse veateade ja kasutamisjuhend

Testimine

Järgnevalt olen välja toonud peamised testjuhud kalkulaatorile

Edasijõudnute ülesanne 1: reaalarvud

Muuda oma programmi sedasi, et sisendina oleksid toetatud reaalarvud. St pead toetama negatiivseid ja murdosaga arve.

Testi järgnevate sisenditega

  • -3.3
  • 3-3
  • -3-3
  • 3.3.3

Edasijõudnute ülesanne 2: laiendatud funktsionaalsus

Lisa oma programmi järgnevad funktsioonid:

  • Ruutjuure võtmine
  • Astendamine
  • Abiinfo kuvamine argumendiga --help . Abiinfo kuvades ei tohi tekkida veaolukord.

Kõik lisatud funktsioonid peaksid olema kajastatud ka abiinfos!

Pärast tundi peaksid

  • Saama aru, mis asi on käsurea argument
  • Teadma näiteid teistest programmidest, mis kasutavad käsurea argumente ja kuidas
  • Oskama ise programmile käsurea argumente anda
  • Oskama C koodis käsurea argumente vastu võtta
  • Teadma, et main() funktsioonil on mitu kuju
    • Mõistma, mis asi on argumentide arv (argc, argument count)
    • Mõistma, mis asi on argumentide vektor (argv, argument vector)
  • Teadma, mis on tavaliselt esimene kaasa antav argument
  • Mõistma, kuidas argumentide hulk muutub vastavalt palju argumente programmi käivitades kaasa antakse
  • Mõistma, et * ja [] tähistavad sisuliselt sama asja
  • Mõistma, mida * tähistab käsurealt programmi käivitades ja kuidas on seda sümbolit võimalik programmile anda argumendina
  • Oskama anda edasi mitmest sõnast koosnevat argumenti ühe argumendina
  • Oskama teisendada sõnesid täisarvudeks, murdarvudeks

Täiendav materjal

PR1ET9: maatriksid

Labori materjal

Esitamisele kuuluvad ülesanded

Selles laboris on kaks ülesannet. Teisele üelsandele on pakutud kaks lisaülesannet.

Ülesanne 1: Maatriksist tulemuste leidmine

Selle ülesande raames harjutame maatriksis nagiveerimist ja sealt tulemuste leidmist.

Ülesannet hinnatakse kolmes eraldi osas! Loe lähemalt peatükist “Hinnatavad osad” . Ülesanne tuleb ette näidata kasutades voo suunamist etteantud sisendandmete failiga.

Ülesandega alustamiseks lae alla järgnevad lähtefailid

Nõuded
  • Ülesande jaoks on sulle antud aluskood ja tekstifail sisendiga
  • Programmi jooksuta kasutades voo suunamist.
  • Lisa programmi algse maatriksi väljatrükk. Väljatrükk peab olema joondatud samamoodi nagu näidisel.
  • Leia järgnevad tulemused
    • Peadiagonaalil olevate negatiivsete arvude summa
    • Kõrvaldiagonaali kohal (kõrvaldiagonaalist kõrgemal) olevate positiivsete arvude korrutis
    • Iga rea suurim arv
  • Kõik väärtused tuleb salvestada täisarvulistesse andmetüüpidesse.  Andmetüübid nagu float, double jne ei ole lubatud.
  • Kui soovid kasutada väiksemaid või suuremaid andmetüüpe kui 32-bitised, peavad need olema määratud täpselt (nt inttypes.h  teegi abil). Tüübid nagu long  ja long long  ei ole lubatud
  • Lahendus peab olema ühilduv erinevatel platvormidel. Formaadid nagu %ld  ja %lld  ei ole lubatud
  • Ülesande raames tuleb sul luua nõutud funktsioonid. Loetelu nendest on kirjeldatud järgnevas punktis.
Nõutud funktsioonid

Programmi tuleb lisada kokku 5 funktsiooni. Vajadusel võid neid lisada täiendavalt juurde.

  • Maatriksi lugemine. Funktsiooni töö käigus loetakse maatriks mällu. Tagastust ei ole. Funktsioon on lahendatud sinu eest aluskoodis.
  • Maatriksi väljatrükk. Funktsiooni käigus trükitakse maatriks ekraanile samamoodi nagu näidisel. Tagastust ei ole. Funktsiooni prototüüp antud aluskoodis.
  • Peadiagonaalil olevate negatiivsete arvude summa. Funktsioon tagastab summa main()  funktsiooni, kus see välja trükitakse. Kõrvalmõjud on keelatud! Funktsiooni prototüüp antud aluskoodis.
    NB! Ettevaatust liiasusega! Vaata, millistel indeksitel arvud asuvad ning sea tsükliloendurid täpselt nendele positsioonidele. Käia läbi 49-kohaline maatriks ainult 7 arvu leidmiseks ei ole okei. Kujuta ette kui nt tegu oleks 1000 x 1000 maatriksiga – sellisel juhul käiksid läbi miljon arvu selleks, et leida vaid nendest tuhat. Kogu tööst oleks kasulik sellisel juhul vaid 0.1% (väheneb eksponentsiaalselt)
  • Kõrvaldiagonaali kohal (kõrvaldiagonaalist kõrgemal) paiknevate positiivsete arvude korrutis. Funktsioon tagastab korrutise main() funktsiooni, kus see välja trükitakse. Kõrvalmõju ei ole.
  • Rea-kaupa suurimate arvude leidmine. Disain on sinu enda otsustada. Kõrvalmõjud on lubatud, tulemused võib printida soovi korral funktsiooni sees. Võid lisada ka mõne täiendava abifunktsiooni.
Hinnatavad osad

Sellel ülesandel on 3 hindamiskohta, vastavalt pärast iga tulemuse edukat leidmist.

Kohustuslik, olenemata millist alamosa näitad:

  1. Programmi tuleb jooksutada kasutades voo suunamist
  2. Sisestatud maatriksi väljatrükk

Eraldi hinnatavad alamosad:

  • Osa 1: Peadiagonaalil olevate negatiivsete arvude summa.
  • Osa 2: Kõrvaldiagonaali kohal (kõrvaldiagonaalist kõrgemal) olevate positiivsete arvude korrutis.
  • Osa 3: Iga rea suurim arv.
Vihjeid
  • Vaata, kuidas ReadMatrix()  funktsioon on kirjutatud. Sedasi saad ka oma ülejäänud funktsioonide parameetrid kujundada.
  • Väljatrükk: jällegi, vaata funktsiooni ReadMatrix(). Tsüklite struktuur on juba tehtud selliselt, et see käib läbi kõik maatriksi positsioonid. Peaksid lugemise asendama väljastusega. Reavahetuseks mõtle, mis eesmärki omab sisemine tsükkel ja mis eesmärki välimine (ning kus paikned maatriksi suhtes enne ja pärast välimist tsükli töötamist ning kus asud enne ja pärast sisemise tsükli töötamist).
  • Osa 1: Kirjuta endale välja maatriksi liikmete indeksid, mida sul on vaja summeerida. Vaadates nende indeksite väärtusi mõtle, mitut erinevat muutujat nende jaoks on vaja (ning samaaegselt ka tsüklit).
  • Osa 2: Meenuta, mis juhtus täisarvu ületäitumisel.
  • Osa 3: Maatriksi ühte rida on võimalik edastada funktsiooni. Selleks määrame ära soovitud reaindeksi ning anname kaasa ka rea pikkuse. Nii saad korduvkasutada juba varasemas laboris valmis tehtud funktsiooni. Nt FindMaxValue(matrix[rowIndex], rowLength)
Testimine

Võrdle oma tulemust allolevaga nende õigsuses veendumiseks!

Ülesanne 2: Kinosaal

Meile on antud kinosaali plaan, mis on kujutatud 2-dimensioonilise maatriksina. Sinu peamiseks ülesandeks on väärtuste tõlgendamine antud maatriksist.

Kõik istekohad on kodeeritud järgnevate täisarvuliste numbritega:

  • 0 – istekoht puudub
  • 1 – istekoht on vaba
  • 2 – istekoht on hõivatud

Maatriksis positsioonil (0, 0) asub saali ülemine vasak istekoht.

Lae alla kinosaali algväärtustatud maatriks: https://blue.pri.ee/ttu/files/iax0583/aluskoodid/9_2_cinema_init.c

Nõuded
  • Kuva saali plaan. Programmi väljund peab olema samasugune nagu etteantud näidistel, sh
    • Vasakul ääres on rea numbrid.
    • Kõik read algavad esimesest istekohast, kuid arvestada tuleb, et saal on eest kitsenev (vt näide)
    • Ekraani asukoht on näidatud
    • Vabad istekohad kuvatakse numbritena
    • Hõivatud istekohad kuvatakse suure X tähena
    • Puuduvaid istekohti ei kuvata
  • Küsi kasutajalt soovitud istekoht ning väljasta, kas koht eksisteerib, on vaba või on hõivatud.
  • Minimaalselt loo 2 funktsiooni peale main funktsiooni. Üks saaliplaani kuvamiseks, teine istekoha saadavuse kontrolliks. Võid julgelt ka rohkem funktsioone luua.
Töövoo soovitus
  1. Prindi saaliplaan tavalise maatriksina. Ära veel väljundit kohandama hakka.  Veendu, et saad numbrid kätte ja vormindatud.
  2. Nüüd hakka väljundit kohandama (tõlgendama maatriksis olevaid väärtusi korrektselt). Loo tingimuslause, mille abiga tuvastada, kui koht maatriksis puudub ja väljasta “tühjus” seal oleva numbri asemel.
  3. Seejärel jätka teiste kodeeritud väärtuste tõlgendamist ja visuaali loomist.
  4. Kui saaliplaan on valmis, prindi saaliplaani kõrvale rea numbrid.
  5. Küsi kasutajalt tema soovitud istekoha asukoht.  Kontrolli, et väärtused oleksid “mõistusepärased” (nn sanity check).
  6. Rea numbri maatriksis saad välja arvutada koheselt. Tulba numbri leidmiseks pead arvestama ka puuduvate istekohtadega.
  7. Väljasta maatriksis leitud indeksid veendumaks, et leidsid õige asukoha!
  8. Nüüd lõpeta ülejäänud programm.
Vihjeid
  • Saali plaan on peegeldatud kujul võrreldes massiivi tegelike indeksitega. Abiks võib olla, kui joonistad endale välja ja märgid ära esimese ja viimase rea asukohad.
    • Rida 14 asub massiivis indeksiga 0
    • Rida 1 asub massiivis indeksiga 13
    • Istekoha kontrollis trüki välja massiivi indeksite väärtused (pildil rida algusega DEBUG)
  • Kasuta istekohtade loendamiseks eraldi loendurit.
  • Sellist kodeeritud täisarvu on hea lahendada kasutades switch()  lauset.
Programmi testimine ja näide

NB! Näidistel on kasutatud ka värve, seda sinu lahenduses olema ei pea (kuid võib 🙂 )

Näidises on samuti lisatud silumiseks DEBUG rida, kus kuvatakse massiivi asukoht, kust istekohta otsiti. Sedasi on lihtsam oma programmi õigsust kontrollida.

Ava mind pildi nägemiseks

Lisaülesanne 1: mitu piletit

Lisame võimaluse kasutajal osta mitu piletit korraga.

  • Kasutaja saab sisestada soovitud piletite arvu
  • Kõik istekohad peavad paiknema kõrvuti, samas reas
  • Lähtepunktiks on kasutaja sisestatud istekoht. Täiendavad kohad võivad paikneda sellest nii vasakul kui paremal pool (sh mõlemal pool korraga).
  • Kuva kasutajale pakutavad istekohad.

Lisaülesanne 2: ostukinnitus

Lisame kasutajale võimaluse ümber mõelda oma piletiostu soovi.

  • Selle ülesande eelduseks on esimese lisaülesande lahendus.
  • Pärast istekohtade pakkumist tuleb kasutajalt küsida kinnitust, kas ta soovib pakutavaid istekohti.
  • Kui kasutaja keeldub pakutavatest kohtadest või ei olnud võimalik soovitud asukohas istekohti pakkuda, kuvatakse kasutajale uuesti saali plaan ning pakutakse talle võimalust uuesti istekohti valida

Vihje: Algses maatriksis on pakutud välja 3 kodeeritud väärtust. Võid neid soovi korral lisada. Alternatiivina saad teha algsest maatriksist koopia.

Programmi näide

Näide on koostatud pärast mõlema lisaülesande lahendamist.

Ava mind pildi nägemiseks

Pärast tundi peaksid oskama järgmist

  • Peaksid oskama erineva pikkusega arve kasutada koodis, sh 64-bitist täisarvu.
  • Mõistma, mis hetkel täisarvu ületäitumised juhtuvad koodis
  • Olema suuteline visualiseerima kahedimensioonilist massiivi (maatriksit)
  • Suutma deklareerida ja indekseerida kahedimensioonilist massiivi
  • Suutma indekseerida kindlaid osi kahedimensioonilisest massiivist (nt esimene või viimane rida, kolm esimest rida, teine element kolmandast reast jne)
  • Mõistma ja olema suuteline kasutama maatriksi diagonaalide omadusi
  • Suutma käia maatriksit läbi nii rida-rea haaval kui ka veerg-veeru haaval.

Täiendavat materjali

PR1ET7: sorteerimine

Labori materjal

Esitamisele kuuluvad ülesanded

Selles tunnis on üks tunnitöö, millele on välja pakutud kaks lisaülesannet.

Tunnitöö: Mullsorteerimine

Tunnitöö raames sorteerid kasutaja poolt sisestatud arvujada kasutades mullsorteerimise algoritmi.

Nõuded
  • Kasutajalt küsitakse 5 täisarvu, mis salvestatakse massiivi.
  • Sorteeri massiiv kasutades mullsorteerimise algoritmi.
  • Optimeeri tsüklite kestvust sedasi, et asjatult võrdlusi ei sooritataks – just nii nagu oli slaidil näidatud. Veendu, et kirjutad optimeeringu nii sisemisse kui välimisse tsüklisse!
  • Loenda ja kuva, mitu korda arve võrreldi omavahel. Kui tegid optimeerimise korrektselt, peaksid saama täpselt 10 võrdlust.
  • Kuva massiiv kasvavas järjekorras.
  • Kuva massiiv kahanevas järjekorras.
  • Sorteerida tohid kogu programmi vältel massiivi vaid ühel korral! Teises suunas massiivi kuvamiseks uuesti seda sorteerida ei tohi!
  • Luua tuleb neli funktsiooni. Loetelu nõutud funktsioonidest on loetletud allpool.
  • Meeldetuletuseks!
    • Muutujad lowerCamelCase
    • Funktsioonid UpperCamelCase
    • Makrod SCREAMING_SNAKE_CASE
    • Maagilised numbrid koodist asendatud makrotega
    • Massiivi pikkus antakse funktsiooni alati kaasa

Vasta küsimusele: jälgida saab nii võrdluste kui vahetuste arvu. Kumb neist meie optimeeringu tulemusel väheneb, kumb jääb samaks?

Lahenduses nõutavad funktsioonid

Selles programmis tuleb sul kokku luua 4 funktsiooni

  • Numbrite lugemiseks massiivi
  • Massiivi sorteerimiseks
  • Kaks funktsiooni massiivi kuvamiseks
Vihjed
  • Sa saad juba alustada eelmisel nädalal kirjutatud funktsioonist! Eelmise nädala tunnitöödest on sul mõned funktsioonid juba olemas. Kopeeri sisse ja vajadusel modifitseeri neid, lisa juurde mis puudu.
  • Mullsorteerimise funktsioon on järjekordne funktsioon, mille peaksid oma varasalve panema. Kui funktsiooni endale talletad, võta sealt vahetuste loendamine ära – mida vähem kõrvalmõjusid funktsioonidel on seda parem.
Test 1: Tagurpidine järjestus

Tegu on kõige keerulisema juhuga mullsorteerimiseks. Suurim on esimene, vähim viimane.

Test 2: Juhuslik massiiv

Juhuslik järjekord. Võrdluste arv jääb samaks. Testib ka kitsaid piirjuhte osadel arvutisüsteemidel, kui massiivi piirest üle minnakse. Tegu ei ole põhjaliku ja tõendusliku testiga (selleks on spetsiaalsed tööriistad), aga võib mõnel juhul vea nähtavaks tuua.

Lisaülesanne 1: tsüklite täiendav optimeerimine

Algselt kirjeldatud algoritmi üks puudustest on olukord, kui massiiv saab oluliselt varem sorteeritud, kui algoritmi täielik tööaeg ette näeb. Sellist olukorda on võimalik tuvastada ning ära kasutada.

  • Kui massiiv saab sorteerituks enne viimast välimise tsükli läbikäiku, peata sorteerimine. Väldi tühja töö tegemist.
  • Vihjeks: mõtle, millised tegevused tehakse sorteerimise käigus ning mida ei tehta arvude puhul, mis on juba sorteeritud.
  • Kaitsmisel: Selgita, milliste sisendandmete puhul optimeeritud algoritm parema tulemuse annab, ning tõesta seda oma tulemusega.

Lisaülesanne 2: Maatriksi sorteerimine

Selles ülesandes hüppad veidike teemades ette ning pead omapäi tutvuma 2-dimensioonilise massiivi ehk maatriksiga.

  • Lahenda ülesanne eraldi programmina, kasutades varasemalt tehtut põhjana. Jäta algne lahendus alles! Varem tehtud funktsioonid kuluvad tulevikus ära!
  • Antud lisaülesande võid lahendada funktsioonideta, kuna me pole veel maatriksi edastamisest funktsioonidesse rääkinud.
  • Massiivi asemel tuleb sorteerida 5 x 5 maatriks
  • Sorteerimine toimub rida-rea haaval.
  • Maatriks peab olema algväärtustatud. Kasuta järgnevat maatriksit testimiseks
  • Näite maatriksi väljatrükist ja tsüklitest leiad siit: https://blue.pri.ee/ttu/programmeerimine-i/koodinaited/muutujate-algvaartustamine/
Oodatav tulemus
Vihjeid
  • Soovid oma juba loodud mullsorteerimise funktsiooni ära kasutada? C keeles on võimalik edastada funktsiooni maatriks “rea-kaupa” (tegelikkus on veidi keerulisem, aga täidab meie eesmärki). Selleks kutsu funktsioon nii:
    SortArray(numbers[rowIndex], rowLength); Sedasi näeb su kood oluliselt ilusam välja.

Pärast tundi peaksid oskama järgmist

  • Peaksid saama aru, mis on arvu alus
  • Peaksid teadma enimlevinuid arvusüsteeme, muuhulgas kahend- ja 16ndsüsteemi.
  • Peaksid aru saama, mis vahe on positsioonilisel ja mittepositsioonilisel arvusüsteemil.
  • Peaksid aru saama, mis asi on bitt ja bait ning mitu bitti on baidis.
  • Peaksid oskama teisendusi arvusüsteemides (10 -> 2, 10 -> 16, 10 -> 8, 2 -> 10, 2 -> 16, 16 -> 10, 16 -> 2, 8 -> 10)
  • Peaksid aru saama, mis asi on täisarvu ületäitumine
  • Peaksid mõistma, et sorteerimiseks on väga suur hulk algoritme ning õige algoritmi valimine on olulise tähtsusega reaalsetes rakendustes.
  • Peaksid mõistma, et optimeerimisel ja võimsamal riistvaral on oma koht, kuid parem algoritm või lähenemine annab suurema võidu.
  • Peaksid aru saama, kuidas mullsort töötab ning oskama seda oma rakendustes kasutada.

Täiendav materjal

Üldised viited

Täisarvude ületäitumine reaalses elus

PR2ET6: Massiivid 2

Praktikumi materjal

Sel nädalal tegeleme eelkõige teadmiste kinnistamise ja harjutamisega

Teooriakild 1: Teksti edastamine funktsiooni

Sageli võib tekkida olukord, kus funktsioon ise oleks justkui kenasti korduvkasutatav, kuid kasutajale kuvatav tekst ei sobi. See on tüüpiline üldiste sisend- ja väljundfunktsioonide puhul.

Üks  viis seda lahendada on sama, mida eelmine nädal tegid – trükkisid teksti enne sisendi/väljundiga tegeleva funktsiooni väljakutset (nt loe arv, loe massiiv, väljasta massiiv). See jääb jätkuvalt mu soovituseks enamikes olukordades. Sedasi on funktsioon lihtsam ja kergemini korduvkasutatav.

Teise valikuna pakun lahenduse, mis on funktsioonide koostamise mõttes üsna tavapärane. Vaatame ühte põhilist ideed, millal funktsioon luua –  kui kahe koodilõigu vahel on marginaalne erinevus, mis sunnib sind koodi kopeerima, siis lahenda erinevused kasutades funktsiooni parameetreidSee saab ka meie lahenduseks – me saame väljastatava teksti (sõne) või osa tekstist (nt sõna) edastada parameetrina.

Selline meetod töötab üsna hästi, kui kasutajale on vaja selgitada, mida ta sisestama peab (st mida programm ootab temast). Samuti sobib see enamasti ka näiteks massiivi väljastamisel, kui väljastuse ette tuleks lisada kirjeldus.

NB! Kaks olulist mõtet veel! Mõlemast neist räägime süviti semestri teises pooles.

  1. Tekst on samamoodi massiiv – see on tähemärkidest koosnev massiiv. Kusjuures igal tähemärgil on oma indeks.
  2. Erinevalt arvumassiividest ei ole tekstimassiivi puhul meil selle väljastamiseks vajalik pikkust eraldi kaasa anda (pärast viimast sümbolit kasutatakse erisümbolit, mis annab märku, kui string ehk sõne lõpeb).

Teooriakild 2: Massiivi vs massiivi liikme edastamine

Eelmises tunnis tutvustasime, kuidas peaks massiivi edastama funktsiooni. Oluline oli

  1. Massiiv edastatakse alati viitena originaal asukohale
  2. Massiivi sisu saab muuta alamfunktsioonides, muudatus kehtib kõikjal
  3. Massiiviga tuleb kaasa anda selle pikkus
  4. Massiivi edastades kasutame vaid selle nime, ilma ühegi täiendava märgendita.

Samuti meeldetuletuseks, kasutades massiivi nime järel kantsulge keset koodi, indekseerime me selle massiivi konkreetset liiget.

Siit saame kokku ka järgmise näite, kus võrdleme massiivi vs üksiku liikme edastust massiivist.

Esitamisele kuuluvad ülesanded

Selles tunnis tuleb lahendada kaks ülesannet. Esimest ülesannet laiendab kaks lisaülesannet.

Ülesanne 1 [W06-1]: Uute massiivide koostamine

Antud ülesanne põhineb suuresti algoritmiülesandel. Vastav ülesanne on püstitatud siin:  https://blue.pri.ee/ttu/programmeerimine-i/algoritmide-ulesanded/#Algoritm_3_Negatiivsete_ja_positiivsete_arvude_umberjarjestus

Selle algoritmi lahendus on sulle ette antud. Ülesandele on lisatud algoritmis puuduvaid täiendusi.

Algoritm

Nõuded
  • Programm peab põhinema etteantud algoritmil
  • Kasutajalt loetakse 6 arvu ja salvestatakse need massiivi
  • Programmi vältel koostatakse teine samapikk massiiv põhimõttel negatiivsed arvud ettepoole, positiivsed nende järel. Arvu 0 loetakse positiivseks arvuks
  • Programmi vältel koostatakse ka kolmas massiiv, kuhu kuuluvad vaid nullist suuremad arvud. Massiivi pikkus võib osutuda lühemaks algsest massiivist
  • Pärast massiivide koostamist väljastatakse järjest kõik 3 massiivi
  • Programm peab endas sisaldama kokku nelja funktsiooni – arvude lugemiseks kasutajalt, arvude ekraanile väljastamiseks, nullist suurematest arvudest koosneva massiivi koostamiseks ning etteantud algoritmi alusel järjestatud massiivi koostamiseks.
  • Kõik enda loodud funktsioonid peavad olema välja kutsutud main()  funktsioonist.
Soovitusi ja vihjeid

Alusta programmi koostamist sisestusest ja massiivi ekraanile kuvamisest. Seda oled juba eelmine kord teinud. Loo vajalik massiiv ja korduvkasuta varasemalt tehtud funktsioone. Kui kopeerid  funktsioone eelneva nädala ülesandest, ära unusta ka nendele eelnevat kommentaari kopeerida!

Nüüd lähme ümberjärjestamise juurde. Loo uus massiiv (lisaks olemasolevale), kuhu salvestad ümberjärjestatud arvujada. Uue massiivi pikkus on sama nagu esmase massiivi pikkus. Meenuta, et funktsioonist massiivi tagastada ei ole võimalik, seega massiiv tuleb deklareerida  main() funktsioonis ja edastada funktsioonile. Ümberjärjestamise ülesande lahendamiseks jälgi etteantud algoritmi, mis oli esitatud veidi ülevalpool.

Seejärel kutsu uuesti välja massiivi väljastamise funktsioon, sel korral ümberjärjestatud massiivi väljastamiseks. St kood võiks funktsiooni väljakutsete mõttes näha välja umbes sarnane (nimed ei ole olulised):

Siinkohal kui soovid oma main()  funktsiooni puhtamaks saada, siis tasuks massiivi väljastuse ette minev tekst parameetriga kaasa anda. Selleks vaata esimest teooriakildu!

Nüüd liigu viimase funktsiooni juurde, mis peaks ainult nullist suurematest arvudest massiivi koostama. Struktuurilt on koostamine üsna sarnane eelnevalt tehtud ümberjärjestusele, kuid mõned erinevused siiski eksisteerivad. Kui ümberjärjestatud massiiv oli liikmete arvult samapikk algse massiiviga, siis nullist suuremate arvude massiiv tuleb suure tõenäosusega lühem. Mõtle, kuidas saada koostatud massiivi pikkus alamfunktsioonist välja,  main()  funktsiooni! Kui pikkus käes, kutsu jälle main()  funktsioonis välja massiivi väljatrükk, et ka kolmas massiiv ekraanile väljastada.

Testimine

Esimese testina proovime tavapärast juhtu, kui sisestuses on nii positiivseid kui negatiivseid arve.

Arvesta, et antud olukorras võivad ka nullist suuremad arvud puududa. Väljastus peaks jääma jätkuvalt arusaadavaks.

Ülesanne 2 [W06-2]: kahe arvu võrdlus

Teises ülesandes praktiseerime massiivi indekseerimist, pöördudes vaid soovitud massiivi indeksite poole ning teostame lihtsaid operatsioone leitud väärtustega.

Nõuded

  • Loe klaviatuurilt 5 täisarvu
  • Küsi kasutajalt kahe soovitud arvu positsioon (järjekorranumber)
    • Kontrolli, et need oleksid sobilikus vahemikus enne jätkamist! Vajadusel küsi uuesti
    • Numeratsioon peab olema sama nagu sisendit küsides
    • Soovitus: kontrollimaks kas leidsid õiged arvud, trüki need välja
  • Leia sisestatud positsioonide põhjal nendele vastavad arvud algsest massiivist. Kasutades neid arve tee järgnevat:
    • Võrdle neid kahte arvu ning kuva nende omavaheline suhe (väiksem, suurem, võrdne)
    • Koosta jagamistehe ning kuva selle vastus. Tehe tuleb koostada sedasi, et suurem arv on jagatav ning väiksem arv on jagaja.
    • Vastus anna ühe komakohaga
  • Ülesandes on vaja luua neli funktsiooni. Funktsioonid on sulle vähemal või rohkemal määral kirjeldatud järgnevas peatükis.
Loodavad funktsioonid

1. Massiivi lugemine. Selleks korduvkasuta koodi varasematest programmidest. Kopeeri funktsioon koos sellele eelneva kommentaariga.

2. Indeksi lugemine. Selleks tuleks luua uus funktsioon. Loome korduvkasutatava funktsiooni, mida saad tulevikus kasutada igal korral, kui on vaja kasutajalt lugeda täisarv kindlas vahemikus (nt 0 … 5, -10 … 10 jne). Kui tegid eelmine nädal lisaülesande ära, on sul see funktsioon suure tõenäosusega juba olemas. 

Pakun välja kaks funktsiooni varianti, vali kumb meelepärasem tundub ja realiseeri see.

Esimene versioon eeldab, et kasutajale esitatav küsimus küsitakse väljaspool seda funktsiooni.

Teine versioon eeldab, et küsimus saadetakse funktsiooni kaasa ja väljastatakse selle sees. Vaata esimest teooriakildu.

3. Arvude võrdlemine. Siia funktsiooni tuleks edastada 2 arvu, mida võrreldakse omavahel, ning väljastatakse kumb neist oli suurem (või olid nad võrdsed). Väljastus toimub funktsiooni sees. Väljastus on kujul “a < b”, “a > b” või “a = b”

NB! Arvude edastamiseks siia funktsiooni vaata teist infokildu!

4. Jagatise teostamine.  Siia funktsiooni edastatakse samamoodi kaks arvu. Taaskord toimub arvude võrdlemine nagu ka eelmine kord, kuid sel korral määrab võrdluse tulemus jagamistehte operandide järjekorra.

Testimine

NB! Näites on nähtavale jäetud silumiseks kasutatavad read (algusega DEBUG), mida soovitan ka sinul alguses teha. Need saad hiljem kiirelt välja kommenteerida.

Testid

Järgnevalt pakun välja osalise loetelu testidest, mida proovida

  • Proovi koodi sisenditega, mis peaksid andma tulemuse ilma ühegi veata
  • Proovi indekseid, mis on massiivi piiridest väljas.  Katseta seda nii esimese kui teise sisendiga.
  • Proovi massiivi piiridest välja jäävaid indekseid korduvalt, et programm ei läheks edasi enne, kui sobilik sisend on saadud.
  • Proovi piirjuhtusid
    • Kui loendasid 0 – 4, proovi -1, 0, 4, 5
    • Kui loendasid 1 – 5, proovi 0, 1, 5, 6
  • Proovi sisendeid, mis testiksid läbi kõik 3 võrdlusjuhtu (<, >, ==)
  • Proovi nulliga jagamist. NB! Nulliga jagamine on defineerimata operatsioon. Nulliga jagamine võib jooksutada programmi või isegi kogu arvuti kokku (mikrokontrollerite puhul on tavapärane, et terve seade taaskäivitab end nulliga jagamise tulemusel). Nulliga jagamistehet ei tohi sooritada!

Lisaülesanne 1 [W06-3]: Ühekordsed arvud

Ülesanne on tunnitöö #1 laiendus.

Nõuded
  • Ülesanne peab olema tehtud laiendusena baasülesandele. Baasülesande funktsionaalsus peab säilima täies ulatuses.
  • Loo uus massiiv olemasolevate arvude põhjal. Uus massiiv tuleb luua põhimõttel, et kõik numbrid tohivad esineda vaid ühekordselt.
Näide lahendusest

Lisaülesanne 2 [W06-4]: Vastandarvude paarid

Ülesanne on tunnitöö #1 laiendus.

Nõuded
  • Ülesanne peab olema tehtud laiendusena baasülesandele. Baasülesande funktsionaalsus peab säilima täies ulatuses.
  • Leia ja kuva massiivis olevate arvude ja nende vastandarvude paarid.
  • Samu arve tohib paarina kuvada ühekordselt, olenemata arvude järjestusest või korduste arvust.
Testimine

Testimisel veendu, et paarid ei korduks.

Pärast tundi peaksid

  • Oskama sõnesid (teksti) funktsioonidesse edastada
  • Oskama funktsiooni edastada nii terviklikku massiivi kui ka üksikut massiivi liiget
  • Oskama koostada ning kasutada massiive, mille kõik liikmed (positsioonid) ei ole kasutusel
  • Tundma end mugavamalt massiivi käsitledes ka juhtudel, kus läbikäik pole esimesest elemendist viimaseni
  • Oskama kopeerida ühest massiivist arve teise massiivi, kusjuures kasutades kahte erinevat indeksit ühes samas tsüklis erinevate massiivide indekseerimiseks.
  • Tundma ennast juba natuke kodusemalt funktsioone kasutades

PR1ET5: Massiivid

Praktikumi materjal

Esitamisele kuuluvad ülesanded

Selle nädala tunnitöö on jupitatud kaheks osaks. Alguses lahenda esimene osa ja esita oma lahendus. Seejärel laienda lahendust teise osaga ning esita oma lahendus uuesti.  Baasülesandele on sel korral pakutud 2 laiendavat lisaülesannet.

Ülesanne 1 osa 1 [W05-1]: Ekstreemumite leidmine

Ülesande esimene osa on tunnis tehtud UML tegevusdiagrammi realisatsioon C programmikoodina. Esimeses osas pead sa kokku looma 4 funktsiooni lisaks main()  funktsioonile!

Lae alla ülesande aluskood: https://blue.pri.ee/ttu/files/iax0583/aluskoodid/5_minmax_template.c

Nõuded
  • Esimene ülesande osa peab loogilisel tasemel vastama tunnis tehtud UML tegevusdiagramile
  • Ülesande lahendamiseks pead looma 4 funktsiooni. Funktsioonid on aluskoodis kirjeldatud kommentaaridena. Kirjuta oma funktsioon kohe kommentaari järgi. Lisa puuduvad elemendid nagu makrod, muutujate deklaratsioonid, funktsioonide prototüübid ja väljakutsed.
  • Klaviatuurilt loetakse 6 täisarvu, mis salvestatakse massiivi.
  • Sisestuse kulg peab olema kasutajale arusaadav, näidates mitmendat arvu parasjagu sisestatakse ning mitu arvu kokku kasutajalt oodatakse
  • Massiivist leitakse ja väljastatakse suurim sisestatud arv. Tulemus tuleb leida funktsioonis ning tagastada. Tulemuse väljastus toimub main() funktsioonis
  • Massiivist leitakse ja väljastatakse vähim sisestatud arv. Tulemus tuleb leida funktsioonis ning tagastada. Tulemuse väljastus toimub main() funktsioonis
  • Väljasta eraldi funktsioonis kõik sisestatud massiivi liikmed
Ülesande lahendamise juhend

NB! Enne funktsioonide loomist loe läbi aluskoodis olev funktsiooni kirjeldus ja veendu, et saad sellest aru (st mida funktsioon teeb, mis on selle parameetrid ja kas ning mida see funktsioon tagastab). Iga funktsioon tuleb realiseerida ettekirjutatud funktsiooni kommentaari järel.

  1. Alusta funktsiooni  ReadIntArray()  lahendamisest. See on esimene funktsioon kohe pärast main() funktsiooni. Selleks kirjuta tsükkel, mille igal kordusel küsitakse kasutajalt väärtus, mis salvestatakse massiivi.
  2. Testimaks, kas see töötab, pead selle funktsiooni välja kutsuma. Selleks pead esmalt deklareerima massiivi, kus arve hoida. Seejärel kutsu funktsioon  ReadIntArray()  välja, andes talle kaasa loodud massiiv ning selle pikkus.
    Eeldusel, et pikkust kirjeldav makro nimi on NUM_CNT ja massiivi nimi on numbers , võiks selle funktsiooni väljakutse näha välja midagi sarnast: ReadIntArray(numbers, NUM_CNT);  Proovi nüüd, kas massiivi arvude lugemine toimis.
  3. Veendumaks, et numbrid ka korrektselt loetud said, peaksid massiivi sisu välja trükkima. Selleks realiseeri funktsioon PrintArray()   ja kutsu see välja main() funktsioonist. Sel korral pead tagastuse tüübi ja parameetrid ise valima. Kui funktsioon tehtud ja välja kutsutud, peaksid nägema oma massiivi sisestatud numbreid.
  4. Nüüd tuleb sul veel viimased kaks funktsiooni lõpetada. Mõlemad on kirjeldatud kommentaaridena aluskoodis. Lõpeta funktsioonid ja väljasta tulemused.
    NB! min ja max väärtusi leidvatel funktsioonidel ei tohi olla kõrvalmõjusid, tulemused väljasta main() funktsioonis. 
Testimine

Test 1: min esimene, max viimane

Test 2: min viimane, max esimene

Test 3: Negatiivne min. Min ja max on massiivi keskel.

Ülesanne 1 osa 2 [W05-2]: asukohtade ja korduste arvu leidmine

Ülesande esimeses osas leidsid massiivist ekstreemväärtused. Teises osas tuleb leida nende positsioonid ning mitu korda väärtused massiivis esinesid.

Nõuded
  • Kuva kõik positsioonid, kus asus massiivi suurim väärtus. Tulemus väljastatakse funktsiooni sees, mis positsioone leiab.
  • Kuva kõik positsioonid, kus asus massiivi vähim väärtus. Tulemus väljastatakse funktsiooni sees, mis positsioone leiab.
  • Kuva, mitu korda suurim ja vähim väärtus massiivis eksisteerib. Tulemus tuleb leida eraldi funktsioonis, tagastada ning seejärel väljastada main()  funktsioonis.
  • Kuvatavad positsioonid peavad olema vastavuses sisestusega.
  • Kõigil funktsioonidel su koodis peavad olema funktsiooni kommentaarid (st funktsioonile eelnev kommentaar)
Ülesande lahendamise juhend

Selle osa lahendamiseks pead looma kokku kaks funktsiooni. Mõlemad funktsioonid on kirjeldatud funktsiooni kommentaaridena. Kopeeri funktsiooni kommentaar enda koodi ja kirjuta lahendus selle järel

Esimene funktsioon väljastab eelnevalt leitud ekstreemumväärtuse kõik asukohad massiivis. Selle lahendamiseks pead looma tsükli, mis käib läbi kõik massiivi liikmed. Iga kord, kui massiivi liikme väärtus on sama kui sinu otsitav (nt minimaalne väärtus massiivis), pead väljastama ekraanile oma praeguse asukoha tsüklis (tsükli praeguse korduse väärtus on seotud massiivi positsiooniga). St kogu funktsioon sisaldab ühte tsüklit, ühte tingimuslauset ja ühte väljastuslauset – ongi kõik.

Loodavat funktsiooni pead korduvkasutama (st 2x välja kutsuma) nii minimaalse kui maksimaalse väärtuse asukohtade kuvamiseks! Tulemustele eelnev tekst (nt “Min value position(s)”) tuleks väljastada main() funktsioonis, enne selle funktsiooni väljakutset.

Testi funktsiooni tööd enne lahendamise jätkamist!

Teine funktsioon saab olema vägagi sarnane eelmisele. Sel korral aga peame loendama (st ühte täisarvulist muutujat suurendama sobilikul hetkel) väljastamise asemel. Funktsioon peab oma tulemuse tagastama. Tulemus väljastatakse main() funktsioonis.

Testimine

Test 1: min ja max on ühekordsed

Test 2: min ja max korduvad

Lisaülesanne 1 [W05-3]: Tulemuste leidmine massiivist

Selles osas leiame kolm täiendavat tulemust massiivist

Nõuded
  • Loo kolm funktsiooni, vastavalt summa, korrutise ja aritmeetilise keskmise leidmiseks
  • Aritmeetilise keskmise funktsiooni sisuks ei tohiks olla koopia summa funktsioonist (väldi koodi kopeerimist!). Selle asemel kasuta summa leidmise funktsiooni keskmise leidmise osana.
  • Kõik kolm funktsiooni saavad parameetriteks massiivi ja selle pikkuse ning peavad oma tulemused tagastama. Tulemused väljastatakse main()  funktsioonis.
  • Kuva aritmeetiline keskmine kolme komakohaga
Testimine

Selle ülesande kõige suuremaks komistuskiviks on õige aritmeetilise keskmise leidine.

Lisaülesanne 2 [W05-4]: n-arvu sisestus

Pakkumaks kasutajale veidi kasulikumat programmi, peaks kasutaja saama otsustada mitme numbri pealt ta statistikat soovib leida. Pakume kasutajale võimaluse sisestada sisestatavate arvude koguse.

NB! Kuigi suur osa C keele kompilaatoritest toetab muutuva pikkusega massiivide (VLA – variable length array) kasutamist, ei ole see kõigi C standardite kohustusliku osana. St tugi võib kompilaatoris puududa täielikult)

Täiendavalt on VLAde puhul ka teisi probleeme – nt on need sageli aeglasemad kui staatilise suurusega massiivid. VLAd kasutav kood sisaldab rohkem käske, mis omakorda vajab rohkem protsessori tsükleid (aega) rakenduse jooksutamiseks. Samuti kui ühtegi rangelt nõutud piirangut ei ole, siis on üsna lihtne kogu programm kokku jooksutada, andes ette lihtsalt suurema numbri (nt tahan sisestada 1 000 000 numbrit).

Seetõttu ei ole sul sel korral lubatud kasutada massiive, mille pikkus on määratud teise muutuja kaudu (nt int numbers[numberCount]; , kus numberCount  on täisarvuline muutuja, mis saab oma väärtuse programmi töö ajal). Standardis toetatud universaalne lahendus on kasutada dünaamilist mälu, kuid seda vaatame Programmeerimine 2 aine raames.

Selle ülesande raames peaksid leidma ja määrama maksimaalse võimaliku suuruse, millest kasutaja rohkem numbreid sisestada ei saa. See tähendab, et suure tõenäosusega jääb suur osa massiivi pesadest kasutama. Õnneks on suurused väikesed, seega märkimisväärset probleemi see ei tekita meile.

NB! Enamjaolt on selles aines VLAde kasutamine lubatud. Piirang on seatud ülesandepõhiselt.

Nõuded
  • Luba kasutajal pärast programmi käivitamist otsustada, mitme numbriga programm töötab
  • Piira programmi poolt toetatud numbrite kogust vastavalt loodud massiivi suurusega
  • Kasutaja poolt sisestuse küsimine peab olema teostatud eraldi funktsioonis, mille pead looma selle ülesande jaoks. Funktsioon tohib alles siis tagastada, kui sisestatud number on sobilik
    • Kasuta funktsiooni parameetreid lubatud sisestuse vahemiku määramiseks
    • Funktsioon, mille lood, peab olema korduvkasutatav teistes sarnastes situatsioonides (erinev lubatud numbrivahemik)
  • Numbrite vahemiku võid ise otsustada mõistlikus vahemikus (nt kuni 50 numbrit).
  • Ebasobiva numbrite arvu korral loo veakäitumine.
  • Muutuva pikkusega massiivi (VLA – variable length array) kasutada ei tohi
  • NB! Vaata üle ka koodimisstiil! Muutuja ei tohi olla kirjutatud samas stiilis nagu makro (tüüpviga)
Testimine

Testi hoolikalt kindlasti järgmist

  • Minimaalne lubatud numbrite arv
  • Maksimaalne lubatud numbrite arv
  • Numbrite arv, mis on erinev algsest

Pärast tundi peaksid

  • Teadma, mida tähendab tüübiteisendus ning kuidas seda kasutada (type casting)
  • Teadma, mis asi on murdarvude esitustäpsus ning mis probleeme sellega esineda võib
  • Teadma, mis asi on püsikomaarv (fixed point notation) ja mis on ujukomaarv (floating point notation).
  • Teadma, mis asi on matemaatika teek (math.h), kuidas seda kasutada, mis seal sees on ning kuidas lisada kompilaatorile täiendav lipp, et see ka kompileeruks.
  • Teadma, mis asi on massiiv
  • Oskama massiivi deklareerida
  • Oskama massiivi algväärtustada
  • Oskama indekseerida igat massiivi liiget
  • Oskama indekseerida massiive kasutades tsükleid
  • Oskama leida ekstreemväärtusi arvujadast

Täiendav materjal

PR1ET3: Tsüklid

Praktikumi materjal

Esitamisele kuuluvad ülesanded

Selles praktikumis on kaks baasülesannet, mille raames lood kokku viis programmi. Täiendavalt on lahendamiseks pakutud kaks lisaülesannet.

Ülesanne 1 [W03-1]: 5-arvu summa.

Selle ülesande raames tuleb sul luua programm, mis leiab viie kasutaja poolt sisestatud arvu summa. Programm tuleb sul luua 3 korda – üks programm iga tsükli tüübi kohta. Kõik kolm loodavat programmi täidavad sama ülesannet.

Nõuded
  • Programm küsib kasutajalt 5 arvu
  • Kõigi arvude, peale viimase, sisestamise järel näitab programm praegust vahesummat
  • Pärast viimase arvu sisestamist kuvatakse lõppsumma. Vahesummat ei kuvata
  • Programm peab andma kasutajale arusaadava väljundi, mida temalt oodatakse
  • Programmis ei tohi olla maagilisi arve
  • Programmi disain peab olema selline, et kui sama ülesannet tuleks teha 10, 20 või ka 1000 arvu korral, siis selleks peaksid muutma programmikoodis vaid ühte numbrit! Testi seda enne esitamist – tehes muudatuse vaid ühes kohas kogu programmis, peab see töötama näiteks 7 arvuga.
Vihjeid
  • Mõtle hoolikalt läbi, milliseid muutujaid sul vaja on! Olenemata sellest, mitme arvu summat sa leiad, on muutujate arv alati sama.
  • Tsüklite puhul on soovitatav loendamist alustada nullist. Seda kuna arvutite puhul hakatakse loendama nullist ning väga paljud süsteemid sõltuvad sellest. Tavaline arvutikasutaja aga hakkab loendama ühest. Selleks
    • (i + 1) võtab muutuja i väärtuse ning kasutab seda suurendatud väärtust konkreetse tehte juures. Küll aga ei suurenda see i enda väärtust. Sedasi saame ajutiselt kasutada ühe võrra suuremat väärtust. Näiteks printf("%d", i + 1);
    • Operatsioonid nagu i++, ++i, i += 1 ja i = i + 1 jällegi suurendavad i väärtust jäädavalt.
Testimine

Järgnevalt on kujutatud näide oodatavast programmi väljundist

Ülesanne 2 [W03-2]: Kassasüsteem kontrolliga

Selle ülesande käigus lisame mõned elementaarsed veakontrollid eelmisel nädalal tehtud tunnitööle. Aluskoodiks võid kasutada nii enda eelmise nädala programmi kui ka meie poolt antud valmislahendust.

Tunnitöö 2 aluskood: https://blue.pri.ee/ttu/files/iax0583/aluskoodid/3_1_cashier_starter_loop.c

Nõuded

Programmi tuleb lisada järgnev funktsionaalsus:

1. Kliendikaardi ja lisasoodustuse saamise kontroll.

  • Küsi sisestust senikaua kuniks sisestatakse kas 1 või 0.
  • Kui sisestus polnud sobilik – st polnud 1 või 0, kuva veateade!
  • Soovitus: Kasuta realisatsiooniks järelkontrolliga tsüklit.

2. PIN-koodi tohib sisestada kuni 3 korda.

  • Kui programmi jooksul on PIN koodi 3 korda valesti sisestatud, kuva veateade ja sulge programm.
  • Kui enne kordade arvu täitumist sisestatakse õige PIN kood, kontrolli jääki ja soorita võimalusel tehing.
  • Soovitus: kasuta eelkontrolliga loendavat tsüklit ja katkestust.
Näidis oodatavast tulemusest

Lisaülesanded

Lisaülesanne 1 [W03-3]: Mario torn
  • Kasutades üksteise sisse paigutatud tsükleid, loo trellidest treppide kujutis, kokku 13 trepiastet
  • Treppide ülemises otsas peab olema mehike
    Vihje: ASCII stickman
  • Kõige ülemise astme laius peab olema piisav, et mehikesel oleks jalgealune stabiilne. Iga järgnev aste on ühe võrra laiem.
  • Iga rea lõpus näita, mitu tellist kulus rea jaoks ja palju on kokku kulunud.
  • Joondus peab nii nagu järgneval näidisel!
Lisaülesanne 2 [W03-4]: Torni peegeldus ja kõrgus
  • Küsi kasutajalt platvormi kõige alumise astme laius (vahemikus 7 – 20)
  • Trepid on sel korral peegeldatud kujul, täpselt nii nagu Mario mängus.
  • Kõige madalam trepiaste peab algama ekraani vasakust osast. Sellele ei tohi eelneda tühikuid.
Vihjeid

Pärast tundi peaksid 

  • Teadma, mis sammud läbitakse selleks, et meie kirjutatavast lähtekoodist saaks arvuti poolt jooksutatav masinkood
  • Teadma, mis asi on #define makro ja kuidas see töötab
  • Teadma, mis asi on maagiline number ning kuidas neid likvideerida
  • Teadma probleemidest, mis kaasnevad algväärtustamata muutujatega
  • Oskama kasutada kõiki kolme tüüpi tsükleid kindla korduste arvuga.
  • Oskama luua tsüklit, mille korduste arv pole piiratud
  • Teadma, kuidas inkrementeerida ja dekrementeerida.
  • Teadma, mis vahe on eel- ja järelkontrolliga tsüklitel
  • Suutma koodiplokke korrektselt üksteise sisse panna (nt tingimuslause tsükli sees, tsükkel tsükli sees, …)
  • Oskama kasutada kontrollauseid break; ja continue;
  • Teadma, et me EI KASUTA goto lauset ning miks me seda ei tee
  • Oskama kasutada avaldist või konstanti printf argumendina
  • Oskama modelleerida tsükleid UMLis

Täiendav materjal

PR1ET1: Tere maailm

Praktikumi materjal

Esitamisele kuuluvad ülesanded

Esimeses praktikumis on kõik uus, mistõttu teeme enamiku praktikumi tööst koos läbi. Praktikumi lõpus saad aga juba sooritada ja kaitsta oma esimese ülesande. Tublimad jõuavad kindlasti ka lahendada lisaülesande.

Ülesanne 1 [W01-1]: Paarsuse kontroll (baasülesanne)

Nõuded
  • Kasutajalt küsitakse ja seejärel loetakse sisse täisarv
  • Programm väljastab sisestatud arvu
  • Programm väljastab, kas sisestatud arv oli paaris või paaritu

NB! Lisaks funktsionaalsetele nõuetele peab vastama programmikood ka stiilinõuetele. Kõige levinumad eksimiskohad stiiliga sellel programmil on treppimisvead (programmi vasakust äärest tühikute arv), tühikute puudumised operaatorite ees ja järel (nt võrdusmärk) ning tühjade ridade puudumine erinevate programmi osade vahel.

Ülesande taust

Jagatise jääke kasutatakse laialdaselt kõiksugu kontrollkoodide arvutamisel. Näiteks kontrollimaks, kas isikukood või pangakaardi number on korrektne.

Meie ülesande jaoks on vajalik jagamine kahega ehk teostame paarsuse kontrolli – kas arv on paaris või paaritu. Paarsuse kontroll on üks lihtsamatest veakontrollidest näiteks andmesides – kas väärtusega ‘1’ bittide arv andmepaketis on paaris või paaritu? Sedasi on võimalik kontrollida, kas andmete ülekandmisel ühest arvutist teise tekkis viga (ja nagu öeldud, vaid väga lihtsad juhud).

Pseudokood

Pseudokood on üks võimalus kirjeldada algoritme. Pseudokood on sarnaselt programmile struktuurne, kuid ei hõlma endas programmeerimiskeeltele omaseid reegleid, mistõttu jääb see võrdlemisi inimloetavaks.

Algoritm

Ülesande algoritm modelleeritakse tunnis koos, et näidata sobilike töövõtteid algoritmi koostamisel – kuidas vormistada tingimuslauset, kontrollvoo noolte murdmisel täisnurkade kasutamist jne. Ülesande kirjelduse terviklikkuse huvides oleme lisanud ühe kahest võimalikust vormistusest ka siia.

Kuidas ülesannet lahendada

Ülesande lahendamisel juhindu nii koostatud algoritmist kui ka slaididel etteantud koodilõikudest. See ülesanne on justkui lego, mis tuleb tükkidest õigesti kokku sobitada.

  1. Alusta sellest, et lood uue faili. Salvesta see oma P kettale, programmeerimise alamkausta, kasutades faililaiendit .c  – näiteks paarsuskontroll.c .
  2. Nüüd kirjuta maha kõige viimasel slaidil olev koodpõhi (mida näitame sulle ka projektorilt). Pane tähele, et oleme sinna sisse jätnud ka ühe vea! Peaksid seda kohe nägema, kui üritad programmi kompileerida. Paranda viga ära enne kui jätkad ülesande lahendamist. Vajadusel otsi oma tere.c  koodist üles sarnane rida (mis viga põhjustab) – sealt leiad ka lahenduse.
  3. Järgmiseks legotükiks on meil vaja tingimuslause struktuuri. Leia tingimuslausete slaidikomplektist if/else lause struktuur ning kirjuta see enda programmi ümber. Ära kopeeri – kirjutamine on oluline musklimälu tekitamiseks. Kindlasti jälgi ka treppimist ning märksõna if  järel olevat tühikut. Koledat koodi kaitsmiselt läbi ei lasta.
  4. Kolmanda puuduva tükina tuleb välja valida ning korrektselt vormistada tingimuslause tingimus (käib if  lausel sulgude sisse). Meenuta, et ülesanne lahendamiseks tuleb kontrollida kas sisestatud arv on paaris või paaritu. Tingimuslausete näited ja jagamise põhimõtted leiad samuti slaididelt. Proovi seejärel programmi kompileerida ja veendu, et vigu poleks!
  5. Viimaseks tükiks on vaja lisada if ja else lause sisu, et tulemus ekraanile trükkida. Selleks pead kirjutama kaks printf()  funktsiooni väljakutset, mis näeksid välja midagi sarnast:
    Märka, et jätsime kaks kohatäidet. Ühte neist peab tulema sisestatud arv, teise vastus kas tegu on paaris või paaritu arvuga.
Testimine

Sellel programmil on kaks võimalikku tulemust – arv on paaris või paaritu. Programmi põhjalikuks testimiseks tuleb testida mõlemat juhtu.

Test 1: Paarisarv

Test 2: Paaritu arv

Kõik töötas? Väga tubli! Sa oled peaaegu kaitsmiseks valmis.

Meenuta, et kood peab olema loetav. Loetavuse saavutamiseks on kasutusel koodimisstiili reeglid. Võrdle oma koodi varasemate programmidega ja koodinäidetega sellest tunnist. Pööra tähelepanu järgnevale

  • Tühikute kasutamine (enne ja pärast matemaatilisi operaatoreid, pärast if  märksõna
  • Treppimine ehk taane vasakult (loogeliste sulgude vahele jääv kood trepitakse täiendavalt 1 võrra ehk 4 tühiku jagu. Kasutaja sisestuse küsimine ja return  lause on seega trepitud 1 võrra, samas if / else sees olevad printf()  laused 2 võrra)
  • Tühjade ridade kasutamine koodilõikude eraldamiseks (enne main()  funktsiooni, enne if  lauset, enne return  lauset)

Kood töötav ja loetav? Nüüd anna märku, et soovid kaitsta!

Lisaülesanne [W01-2]: Kolme ja viiega jagamine

Enne kui alustad lisaülesande lahendamist, lahenda ära baasülesanne. Lisaülesande lahendamisel tuleb esmalt kaitsta ära baasülesanne, seejärel lisaülesanne.

Loe loogikaavaldiste kasutamise kohta (eng): https://blue.pri.ee/ttu/coding-guides/conditional-statements/#Logical_operators

Nõuded
  • Kasutajalt küsitakse ja seejärel loetakse sisse täisarv
  • Programm väljastab, kas arv jagus kolmega, viiega, mõlemaga neist või mitte kummagagi ning väljastab leitu.
  • Programm leiab jagatise täisosad ja jäägid sellest arvust jagades seda nii kolme kui viiega. Kõik neli tulemust väljastatakse,  olenemata sisendist.
  • Arvutustehteid (nt jagamisi) tohid teha vaid ühekordselt. Kui tulemust on vaja kasutada mitmes kohas, tuleb need eelnevalt salvestada muutujatesse.
Ülesande taust

Ülesanne põhineb klassikalisel intervjuuküsimusel, mida kasutakse tarkvaraarendajate värbamisel. Tegu on nn  FizzBuzz ülesande muudetud versiooniga.

Testimine

Lähtuvalt koostatud tingimustest peab ülesandel olema neli erinevat võimalikku tulemust.

Test 1: Arv, mis jagub nii kolme kui viiega

Test 2: Arv mis jagub ainult kolmega

Viimased kaks testi mõtle ise välja. Veendu, et lahendus töötab korrektselt kõigil juhtudel.

Pärast seda tundi peaksid

  • Mõistma ainega seotud nõudeid, sh kuidas saada aines hinne
  • Oskama sisse logida Linuxisse ülikooli arvutis
  • Teadma, mis on peamised rakendused, mida kasutame
  • Teadma, kust vajalikku materjali leiab
  • Teadma, mis on C keel ja kus seda peamiselt kasutatakse
  • Teadma, milline on programmi struktuur ning olema võimeline ka selles lihtsa programmi kirjutama ning käivitama
  • Peaksid mõistma järgmiseid programmeerimisega seotud mõisteid ja kontseptsioone
    • #include lause teekide lisamiseks programmi, kasutades eelprotsessorit (preprocessor)
    • Mis on main() funktsioon, miks ta eriline on
    • Täisarvulised muutujad ja kuidas neid deklareerida
    • Kuidas väljastada teksti kasutades printf()  funktsiooni, vahetada rida, printida välja muutuja sisu
    • Kuidas lugeda klaviatuurilt täisarve kasutades scanf()  funktsiooni
    • Elementaarsed matemaatilised operatsioonid
    • Kergemad tingimuslaused (if/else)
    • Täisarvu jagatis ja jagamise jääk (moodularvutus)
  • Teadma mis on algoritm ja selle olulisemaid omadusi
  • Teadma, mis asi on UML modelleerimiskeel ja miks seda kasutatakse
  • Oskama koostada lihtsaid UML tegevusdiagramme, kasutades elemente nagu algus, lõpp, siire, hargnemine, koondumine ja kommentaar

Täiendav materjal