Labori materjal
- Math.h teegi tutvustus
- Tüübiteisendused
- Murdarvu täpsus
- Slaidid: Massiivid
- Täiendav näide: distantsi teisendaja
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.
- 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.
- 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. - 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.
- 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
1 2 3 4 5 6 7 8 9 10 11 12 |
Enter number 1 / 6: 1 Enter number 2 / 6: 2 Enter number 3 / 6: 3 Enter number 4 / 6: 4 Enter number 5 / 6: 5 Enter number 6 / 6: 6 Entered numbers: 1 2 3 4 5 6 Min value is 1 Max value is 6 |
Test 2: min viimane, max esimene
1 2 3 4 5 6 7 8 9 10 11 12 |
Enter number 1 / 6: 6 Enter number 2 / 6: 5 Enter number 3 / 6: 4 Enter number 4 / 6: 3 Enter number 5 / 6: 2 Enter number 6 / 6: 1 Entered numbers: 6 5 4 3 2 1 Min value is 1 Max value is 6 |
Test 3: Negatiivne min. Min ja max on massiivi keskel.
1 2 3 4 5 6 7 8 9 10 11 12 |
Enter number 1 / 6: 1 Enter number 2 / 6: 2 Enter number 3 / 6: 3 Enter number 4 / 6: 4 Enter number 5 / 6: -933 Enter number 6 / 6: 1 Entered numbers: 1 2 3 4 -933 1 Min value is -933 Max value is 4 |
Ü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.
1 2 3 4 5 6 7 8 9 10 |
/** * Description: Prints all positions of val in the array. Shows positions * (starting from 1), instead of indexes. * * Parameters: nums - values that are checked * len - length of the array * val - value for which the positions will be printed * * Return: - */ |
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.
1 2 3 4 5 6 7 8 9 |
/** * Description: Counts the number of times val is present in the array * * Parameters: nums - values that are checked * len - length of the array * val - value to search for * * Return: number of times val occurred in array */ |
Testimine
Test 1: min ja max on ühekordsed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
Enter number 1 / 6: 10 Enter number 2 / 6: 11 Enter number 3 / 6: 12 Enter number 4 / 6: 13 Enter number 5 / 6: 14 Enter number 6 / 6: 15 Entered numbers: 10 11 12 13 14 15 Min value is 10 Min value position(s): 1 Min value occurred 1 time Max value is 15 Max value position(s): 6 Max value occurred 1 time |
Test 2: min ja max korduvad
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
Enter number 1 / 6: 10 Enter number 2 / 6: 13 Enter number 3 / 6: 12 Enter number 4 / 6: 10 Enter number 5 / 6: 13 Enter number 6 / 6: 13 Entered numbers: 10 13 12 10 13 13 Min value is 10 Min value position(s): 1 4 Min value occurred 2 times Max value is 13 Max value position(s): 2 5 6 Max value occurred 3 times |
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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
Enter number 1 / 6: 1 Enter number 2 / 6: 1 Enter number 3 / 6: 1 Enter number 4 / 6: 1 Enter number 5 / 6: 1 Enter number 6 / 6: 3 Entered numbers: 1 1 1 1 1 3 Min value is 1 Min value position(s): 1 2 3 4 5 Min value occurred 5 times Max value is 3 Max value position(s): 6 Max value occurred 1 time Sum is 8 Product is 3 Arithmetic mean is 1.333 |
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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
Enter number count (up to 50): 127 Error! Invalid number count! Enter number count (up to 50): 3 Enter number 1 / 3: 5 Enter number 2 / 3: 1 Enter number 3 / 3: 2 Entered numbers: 5 1 2 Min value is 1 Min value position(s): 2 Min value occurred 1 time Max value is 5 Max value position(s): 1 Max value occurred 1 time Sum is 8 Product is 10 Arithmetic mean is 2.667 |
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
- C math library:
http://www.cplusplus.com/reference/cmath/ - 0.1 + 0.2 in various programming languages:
https://0.30000000000000004.com - Floating Point Numbers – Computerphile
https://www.youtube.com/watch?v=PZRI1IfStY0 - Floating point and fixed point representation
https://www.tutorialspoint.com/fixed-point-and-floating-point-number-representations - Type casting (conversion)
https://www.geeksforgeeks.org/type-conversion-c/ - Arrays in C, C++
https://www.geeksforgeeks.org/arrays-in-c-cpp/