Praktikumi materjal
- Slaidid: Valiklaused
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?
Ü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
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Available products 1 - Banana 2 - Orange 3 - Lemon 4 - Tomato 5 - Cucumber 6 - Potato 7 - Apple 8 - Pear 9 - Plum Enter weight (kg): 1.65 Enter product code: 1 Selected product 1 - Banana Entered weight: 1.65 kg Price per kilo: 1.39 EUR Total: 2.29 EUR |
Test 2: Vigase tootekoodi puhul antakse veateade
1 2 3 4 5 6 7 8 9 |
Available products 1 - Banana 2 - Orange 3 - Lemon 4 - Tomato 5 - Cucumber 6 - Potato 7 - Apple 8 - Pear 9 - Plum Enter weight (kg): 8.2 Enter product code: 54 ERROR: Unknown product code! Exiting .. |
Test 3: Vigase kaalu puhul antakse veateade
1 2 3 4 5 6 7 8 |
Available products 1 - Banana 2 - Orange 3 - Lemon 4 - Tomato 5 - Cucumber 6 - Potato 7 - Apple 8 - Pear 9 - Plum Enter weight (kg): -5 ERROR: Invalid weight! Exiting .. |
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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
Enter purchase total: 125 Did client present loyalty card? 1 - yes 0 - no 1 Apply extra discount? 1 - yes 0 - no 0 10% discount applied Invoice total: 112.50 You currently have 10000 bonus points For this purchase, you can use up to 10000 points Do you wish to use bonus points? 1 - yes 0 - no 1 Enter the number of bonus points to use: 3500 Points used for this purchase: 3500 Amount to be paid after points: 77.50 EUR Please enter your PIN code:1234 PIN code accepted! Purchase completed! Final card balance is 22.50 EUR Final amount of bonus points left: 6500 |
Teises testnäites on kasutaja, kes ei soovi oma boonuspunkte kasutada.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
Enter purchase total: 9.69 Did client present loyalty card? 1 - yes 0 - no 1 Apply extra discount? 1 - yes 0 - no 1 20% discount applied Invoice total: 7.75 You currently have 7500 bonus points For this purchase, you can use up to 697 points Do you wish to use bonus points? 1 - yes 0 - no 0 Please enter your PIN code:1234 PIN code accepted! Purchase completed! Final card balance is 92.25 EUR Final amount of bonus points left: 7500 |
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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
Enter purchase total: 139.99 Did client present loyalty card? 1 - yes 0 - no 1 Apply extra discount? 1 - yes 0 - no 1 20% discount applied Invoice total: 111.99 You currently have 350 bonus points For this purchase, you can use up to 350 points Do you wish to use bonus points? 1 - yes 0 - no 1 Enter the number of bonus points to use: 2000 Error! This exceeds the maximum allowed! Using maximum amount of 350 points Points used for this purchase: 350 Amount to be paid after points: 108.49 EUR Please enter your PIN code:1234 PIN code accepted! Error! Not enough balance on the card! Final card balance is 100.00 EUR Final amount of bonus points left: 350 |
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
- De Morgan’s Laws
https://brilliant.org/wiki/de-morgans-laws/ - C/C++ if else if ladder with Examples
https://www.geeksforgeeks.org/c-c-if-else-if-ladder-with-examples/ - Decision Making in C / C++ (if , if..else, Nested if, if-else-if )
https://www.geeksforgeeks.org/decision-making-c-c-else-nested-else/ - Exit codes in C/C++ with Examples
https://www.geeksforgeeks.org/exit-codes-in-c-c-with-examples/ - Beej’s guide: switch statement
https://beej.us/guide/bgc/html/split/variables-and-statements.html#switch-statement - Switch Statement in C/C++
https://www.geeksforgeeks.org/switch-statement-cc/