Autori risto postitused

2. labor: tingimuslaused

Labori materjal

Esitamisele kuuluvad ülesanded

Ülesanne 1: poekassa

Selle ülesande raames simuleerime läbi lihtsa kassasüsteemi rakenduse, 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 UMList.
  • Ä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 murdaru kasutamist.

Test 2: Klient kelle 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: 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 4 erinevat tootevalikut.
  • Tootevalikud on esindatud numbri (tootekood) ja nime kombinatsioonidega (nt 1 – banaan).
  • Kasutaja sisestab klaviatuurilt täisarvulise tootekoodi ja murdarvulise koguse (kilogrammides).
  • Valitud tootekoodi ja toote kilohinna vaste leidmine tuleb realiseerida kasutades switch  lauset.
  • Korrektse kaalu ja koodi korral väljastatakse kasutajale hind, mis tuleb kauba eest maksta.
  • Väljastatav hind peab olema esitatud kahe komakohaga.
  • Vigase tootekoodi või kaalu korral tuleb väljastada veateade. Kumma veaga tegu oli tuvastama ei pea. Vea tekkimisel hinda kuvada ei tohi.

Lae alla ülesande 2 aluskood: 2_2_scale_base.c

Testimine

Test 1: Korrektse sisestuse korral antakse tulemuseks hind

Test 2: Vigase tootekoodi puhul antakse veateade
Test 3: Vigase kaalu puhul antakse veateade

Pärast tundi peaksid

  • Mõistma mis asi on tõeväärtustabel ja kuidas neid 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 panna tingimuslausete näitel
  • Oskama kasutada sama muutujat mõlemal pool võrdlusmärki tehetes
  • Oskama kasutada ja väljastada murdarvu (väga lihtsad juhud)
  • Oskama kasutada switch lauset koodis
  • Oskama modelleerida switch lauset UMLis
  • Oskama kasutada ujumisradu (eraldisi, swim lane)
  • Oskama luua mitme erineva lõpuga programme

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 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 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. Valikud pakun välja neli.

  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äsk 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 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!

14. labor: 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

9. labor: 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 positsioonis. 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 mitte.
  • 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 kasutama 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

7. labor: 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 funktsioo! 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 tehtud 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 asi arvu alus on
  • 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

Labori materjal

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 see mida varem 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 sul vähem keerukust funktsioonis ja funktsioon jääb kergemini korduvkasutatavaks.

Teise valikuna pakun välja alternatiivi, 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 meie ka meie lahenduseks – me saame väljastatava teksti 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 on vaja väljastuse ette panna 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. Igal tähemärgil on kusjuures oma indeks.
  2. Erinevalt numbrimassiividest 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 edastamine funktsiooni. Oluline oli

  1. Massiiv edastatakse alati viitena originaal asukohale
  2. Massiivi sisu saime muuta ka alamfunktsioonides, kehtis kõikjal
  3. Massiiviga tuleks 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. Täiendavalt on pakutud välja lisaülesanded täiendavate punktide teenimiseks.

Ülesanne 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 numbrid 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, positiivsetest 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. Kopeerides funktsioone ära unusta ka nendele eelnevat kommentaari kopeerida!

Nüüd lähme ümberjärjestamise juurde. Loo uus massiiv (lisaks olemasolevale), kuhu koostame ü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 positiivsetest arvudest massiivi koostama. Struktuurilt on koostamine on üsna sarnane eelnevalt tehtud ümberjärjestusele, kuid mõned erinevused siiski eksisteerivad. Kui ümberjärjestatud massiiv oli liikmete arvult samapikk algse massiiviga, siis positiivsete 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()  funktsioonist välja massiivi väljatrükk, et ka kolmas massiiv ekraanile väljastada.

Testimine

Esimese testina proovime tavapärast juhtu, kui arvude hulgas on nii positiivseid kui negatiivseid numbreid.

Arvesta, et antud olukorras võivad ka positiivsed numbrid puududa. Väljastus peaks jääma jätkuvalt arusaadavaks.

Ülesanne 2: kahe arvu võrdlus

  • Loe 5 täisarvu klaviatuurilt
  • Küsi kasutajalt kaks indeksit / järjekorranumbrit.
    • Kontrolli, et need oleksid sobilikus vahemikus enne jätkamist! Vajadusel küsi uuesti.
    • Numeratsioon peab olema sama nagu sisendit küsides.
    • Soovitus: Kontrollimaks et leidsid õiged numbrid, 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 funktsioonis 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.

Näide lahendusest

NB! Näites on nähtavale jäetud silumiseks kasutatavad read (algusega DEBUG), mida soovitan ka sinul alguses teha. Kui oled indeksite põhjal arvude valimises kindel ja kõik töötab, soovitan need välja kommenteerida.

Testid

Järgnevalt pakun välja osalise loetelu testidest:

  • 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: ühekordsed numbrid

Ülesanne on tunnitöö #1 laiendus.

Nõuded
  • Ülesanne peab olema tehtud laiendusena baasülesandele. Baasülesande funktsionaalsus peab säilima täies ulatuses.
  • Lahenduses võivad korraga esineda mõlema edasijõudnute ülesande tulemused.
  • 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: paarid

Ülesanne on tunnitöö #1 laiendus.

Nõuded
  • Ülesanne peab olema tehtud laiendusena baasülesandele. Baasülesande funktsionaalsus peab säilima täies ulatuses.
  • Lahenduses võivad korraga esineda mõlema edasijõudnute ülesande tulemused.
  • 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 edastada nii terviklikku massiivi kui üksikut massiivi liiget funktsiooni
  • Teadma ja oskama koostada ning kasutada massiive, kus massiivi kõik liikmed (kohad) ei ole kasutusel.
  • tundma end mugavamalt massiivi käsitledes ka juhtudel, kus läbikäik pole esimesest viimase elemendini.
  • 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

Labori 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: 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 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 kokku kasutajalt oodatakse.
  • Massiivist leitakse ja väljastatakse suurim sisestatud arv. Vähim arv tuleb leida funktsioonis, mis tagastab tulemuse. Tulemuse väljastus toimub main() funktsioonis.
  • Massiivist leitakse ja väljastatakse vähim sisestatud arv. Suurim arv tuleb leida funktsioonis, mis tagastab tulemuse. Tulemuse väljastus toimub main() funktsioonis.
  • Väljastatakse algselt sisestatud massiivi kõik liikmed. Väljastus loo eraldi funktsioonis.
Ü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. Sul tuleb kirjutada tsükkel, mille igal kordusel küsitakse kasutajalt väärtus ning seejärel loetakse see massiivi.
  2. Testimaks kas see töötab, pead selle funktsiooni välja kutsuma. Selleks pead esmalt massiivi deklareerima 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! Tulemust tohid väljastada vaid main() funktsioonis. Min ja max väärtuste leidmiste funktsioonides väljastada tulemust ei tohi! Selleks pead tulemuse nendest funktsioonidest esmalt tagastama. 
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: 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 suurem väärtus. Tulemus tuleb leida ja väljastada eraldi funktsioonis
  • Kuva kõik positsioonid, kus asus massiivi väikseim väärtus. Tulemus tuleb leida ja väljastada eraldi funktsioonis
  • Kuva mitu korda suurim ja suurim väärtus massiivis eksisteeris. Tulemus tuleb leida eraldi funktsioonis, tagastada ning seejärel väljastada main()  funktsioonis.
  • Kuvatavad positsioonid peavad olema vastavuses sisestusega.
Ü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.

Kui funktsioon valmis, kontrolli, et see töötab enne kui lähed järgmist funktsiooni lahendama!

Teine funktsioon saab olema vägagi sarnane eelmisele. Sel korral aga peame loendama (st ühte täisarvulist muutujat suurendama sobilikul hetkel) väljastamise asemel. Väljastust selles funktsioonis teha ei tohi! 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: 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: 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 sisaldav 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 piirangute seadistamiseks.
    • Funktsioon mille lood peaks olema korduvkasutatav teistes sarnastes situatsioonides (kuid teiste piirangutega)
  • 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

  • Tutvuma kodutöö 1 nõuete ja tutvustavate videotega
  • 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

3. labor: tsüklid

Labori materjal

Esitamisele kuuluvad ülesanded

Selles laboris on 2 baasülesannet, mille raames lood kokku 5 programmi. Täiendavalt on laboris 2 lisaülesannet, mis tohib olla kirjutatud ühe programmina.

Ülesanne 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äidis oodatavast tulemusest
Nõuded
  • Programm küsib kasutajalt 5 arvu.
  • Pärast arvu sisestamist kasutaja poolt tuleb väljastada praegune summa.
  • Pärast viimase arvu sisestamist kuvatakse lõppsumma. Vahesummat enam ei kuvata.
  • Programm peab andma kasutajale arusaadava väljundi mida temast 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.

Ülesanne 2: kassasüsteem tsüklitega

Selle ülesande juures 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: [ kassaregister ]

Näidis oodatavast tulemusest

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.

Lisaülesanded

Lisaülesanne 1: 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: 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

1. labor: Tere maailm

Labori materjal

Esitamisele kuuluvad ülesanded

Selles laboris kuulub enamik tööd koos läbi tegemisele. Laboris kuulub esitamisele üks baasülesanne ja üks lisaülesanne.

Ülesanne 1: Paarsuse kontroll (baasülesanne)

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

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

Ülesande taust

Mooduljagamine on laialdaselt kasutusel kõiksugu kontrollkoodide arvutamisel. Näiteks kontrollimaks kas isikukood või pangakaardi number on korrektne.

Meie ülesande jaoks rakendame mooduljagamist 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 näiteks kontrollida kas andmete ülekandmisel ühest arvutist teise tekkis viga (ja nagu öeldud, vaid väga lihtsad juhud).

Testimine

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

Test 1: paarisarv

Test 2: Paaritu arv

Ära unusta oma tunnitööd ette näitamast!

Lisaülesanne: Kolme ja viiega jagamine

Enne edasijõudnute ülesande tegemist lahenda ära tavaü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 läheb 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 4 erinevat võimalikku tulemust.

Test 1: Arv, mis jagub nii kolme kui viiega

Test 2: Arv mis jagub ainult kolmega

Viimased 2 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 preprotsessori käsklus
    • Mis on main() funktsioon, miks ta eriline on
    • Kuidas deklareerida muutujat, mis on andmetüüp
    • Kuidas trükkida teksti kasutades printf funktsiooni, vahetada rida, printida välja ühe või mitme muutuja sisu.
    • Klaviatuurilt väärtuste lugemine ja salvestamine (printf funktsioon)
    • Elementaarsed matemaatika operatsioonid
    • Kergemad tingimuslaused (if/else)
    • Täisarvu jagatis, moodularvutus
  • Mõistma mis asi on algoritm
  • Mõistma, mis asi on UML ja miks seda kasutatakse. Saama aru selle algsetest elementidest (algus, lõpp, tegevus, hargnemine, koondumine). Pead olema võimeline lihtsama UML diagrammi kokku panna.

Täiendav materjal