Labori materjal
- Slaidid: funktsioonid
- Täiendav funktsioonide näide: dist_converter.c
Esitamisele kuuluvad ülesanded
Esitamisele kuuluvad 2 ülesannet. Lisaks on 1 edasijõudnute ülesanne, mis on teise tunnitöö laienduseks.
Esimeses ülesandes on sinu rolliks olemasolevas programmis vaid funktsioonide sisud kirjutada. Selle programmi raames töötame vaid üksikute muutujatega.
Teises ülesandes tuleb kirjutada kogu programm juhendi põhjal
Ülesanne 1: Elektri hinna kalkulaator
Antud ülesandes on sinu eest juba kogu programmi loogika valmis tehtud. St kogu main() funktsiooni sisu on juba valmis ja seda muuta ei ole põhjust.
Tegemata on jäetud aga enda loodavate (user-defined) funktsioonide sisud ning need on vastavalt asendatud kõik tagastama 0 väärtust (selleks, et programm kompileeruks). Sinu ülesandeks täita kõigi funktsioonide deklaratiivne osa (keha) vastavalt funktsioonile eelnevale kommentaarile.
Lae alla ülesande aluskood siit: 6_1_electricity_basecode.c
Nõuded
- Ülesande lahendamist alusta baaskoodiga tutvumisest. Sinu lahendus peab olema ehitatud ette antud baaskoodile.
- Sinu ülesandeks on kirjutada funktsioonide kehad seitsmele funktsioonile. Funktsiooni eesmärk on kirjeldatud selle ees kommentaarina.
- main() funktsiooni sisu ja koodi struktuuri muuta ei tohi. Soovitav on vältida ka funktsioonide ja muutujate ümbernimetamist.
Vihjeid ja soovitusi
- Alusta tutvumist koodi ülesehitusest. Vaata kus on makrod, kus prototüübid, kus main() ja kus funktsioonid. Vaata kuidas main() funktsioonist teisi funktsioone välja kutsutakse, mis kaasa antakse jne. Ära muuda midagi alguses!
- Üldine pilt selge, hakka järjest funktsioonide sisusid täitma. Lahenda 1 funktsioon korraga, kompileeri ja testi enne kui järgmise juurde lähed!
- Sisestuse funktsioonides on soovitatav struktuur do while tsükkel, mille sees on if lause veateate väljastamiseks.
- Kõik ülejäänud funktsioonid on lahendatavad ühe reaga, asendades olemasoleva return 0 asemel õige valemi
- Ettevaatust ühikutega. Erinevates kohtades on kord kasutusel vatt-tunnid, kord kilovatt-tunnid, kord megavatt-tunnid! Juhindu funktsiooni kommentaaridest.
- VAT – value added tax tähendab käibemaksu (Eestis 20%)
- Jooksev börsihind MWh kohta (enne makse) on leitav https://dashboard.elering.ee/et
- Jooksvat börsihinda kWh kohta sentides koos maksudega näitab https://www.elektrikell.ee
Testimine
Test 1: veavaba sisend
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
Enter the market price for electricity in MWh: 412.65 Market cost of electcity is 412.65 EUR / MWh. This is 0.4126 EUR per kWh before and 0.4952 EUR per kWh after taxes. Lets do a rough savings estimate when switching from incandescent bulbs to LEDs Number of E27 lightbulbs in use: 9 Average hours per day the bulbs are turned on for: 6 Results are calculated for a 30-day month. Using 60 W incandescent bulbs consumes 97200 W, costing 48.13 EUR Using 9 W LED bulbs consumes 14580 W, costing 7.22 EUR That's a saving of 40.91 EUR. At the price of 0.69, you could buy 59 packs of instant noodles with that money! |
Test 2: Vigane sisend
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
Enter the market price for electricity in MWh: -250 Retry! Must be > 0 > -5 Retry! Must be > 0 > 125 Market cost of electcity is 125.00 EUR / MWh. This is 0.1250 EUR per kWh before and 0.1500 EUR per kWh after taxes. Lets do a rough savings estimate when switching from incandescent bulbs to LEDs Number of E27 lightbulbs in use: -1 Retry! Must be > 0 > -3 Retry! Must be > 0 > 8 Average hours per day the bulbs are turned on for: 7 Results are calculated for a 30-day month. Using 60 W incandescent bulbs consumes 100800 W, costing 15.12 EUR Using 9 W LED bulbs consumes 15120 W, costing 2.27 EUR That's a saving of 12.85 EUR. At the price of 0.69, you could buy 18 packs of instant noodles with that money! |
Ülesanne 2: massiivist tulemuste leidmine
Teise ülesande eesmärk on massiivist erinevate tulemuste leidmine vastavalt senistele teadmistele. Loodavad funktsioonid peavad olema universaalsed (ei sõltu massiivi pikkusest). Need on muuhulgas ka esimesed sageli kasutatavad funktsioonid sinu varasalve mida saad tulevikus kiirelt kasutusse võtta!
Nõuded
- Loo programm, mis loeb kasutajalt 5 täisarvu. Arvud jäävad vahemikku -100 … 100
- Trüki loetud massiiv enesekontrolliks välja.
- Leia aritmeetiline keskmine ja kuva see kahe komakohaga
- Leia ning kuva väikseim arv massiivis
- Luba kasutajal sisestada otsitava numbri ning leiab ja kuvab kas see paikneb varasemalt sisestatud massiivis või mitte.
- Funktsioonid (sh nende parameetrid ja tagastus) peavad vastama täpselt käesoleval leheküljel antud nõuetele (ptk “Ülesande samm-sammuline lahendusjuhend”)
Kondikava
Järgnevalt on soovitus ülesande lahenduse kondikavaks.
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 37 38 39 |
#include <stdio.h> // Konstandid min ja max väärtusele #define VALUE_MIN -100 #define VALUE_MAX 100 // Konstant arvude hulgale millega programm töötab #define NUM_CNT 5 // Funktsioonide prototüübid int main(void) { // Kutsu välja funktsioon "Massiivi täitmine" // Kutsu välja funktsioon "Massiivi väljatrükk" // Kutsu välja funktsioon "Aritmeetiline keskmine", // seejärel trüki vastus siin samas välja // Kutsu välja funktsioon "Vähim arv", // seejärel trüki vastus siin samas välja // Kutsu välja "Ühe täisarvu sisestus". Tagastatud väärtus edasta // järgnevalt välja kutsutavasse arvu olemasolu kontrolli // Kutsu välja "Arvu olemasolu kontroll massiivis", // seejärel trüki siin samas välja järeldus kas arv oli või ei olnud massiivis return 0; } |
Ülesande samm-sammuline lahendusjuhend
Ülesande loomisel on täiendavad reeglid lisaks varasemalt õpitule.
- Makrotena defineeritud konstandid mis võivad ülesandest ülesandesse erineda (nt massiivi pikkus, min ja max väärtused, maksude suurus) tuleb edastada funktsiooni parameetrina. See ei kehti maagilistele numbritele, mis kunagi e muutu (nt elektroni mass, universaalne gaasikonstant, pi).
12345678910// Näide on toodud tunnitöö 1 pealt// Maagiline arv on defineeritud makrona#define VAT_PERCENTAGE 20.0f// Funktsiooni väljakutses anname kaasa makroCalculateVat(pricePerKwh, VAT_PERCENTAGE);// Funktsioonis endas on ta juba parameeter (lokaalmuutuja)float CalculateVat(float price, float vatPcnt): - Tulemusi leidvatel funktsioonidel ei tohi olla kõrvalmõjusid (nt aritmeetiline keskmine, vähim arv, kas arv on funktsioonis). Tulemus tuleb tagastada main funktsiooni ja seal välja trükkida. Leitud tulemuse väljatrükk funktsioonis endas on keelatud!
- Kõrvalmõjud on lubatud ainult sisestuse ja väljastusega tegelevates funktsioonides (nt “ühe arvu sisestus” ja “massiivi väljastus”)
- Globaalmuutujaid ei kasuta! Kõik muutujad peavad olema lokaalmuutujad, andmevahetus käib parameetrite ja tagastuse abil.
Lahenda programmi samm-sammu haaval. Testi igat funktsiooni pärast selle loomist enne edasi minemist. Funktsioonid on toodud selles järjekorras nagu soovitame neid luua antud ülesande tarbeks.
Luua tuleb kõik all kirjeldatud funktsioonid. Funktsioone võib olla enam kui see tundub otstarbekas. Meeldetuletuseks – funktsioonid on lühikesed ja lihtsad, millel reeglina puuduvad kõrvalmõjud ja mis teevad vaid ühte asja (ja teevad seda hästi).
➡ Funktsioon: ühe täisarvu sisestus
Kirjeldus: Loeb kasutajalt ühe täisarvu, mis peab asuma ettemääratud vahemikus. Vahemik antakse funktsiooni parameetritega seda välja kutsudes. Funktsioon ei tohi enne tagastada tulemust, kui kasutaja on sisestanud sobiliku väärtuse. Ebasobiliku numbri korral küsitakse sisestust uuesti.
Parameetrid:
- Täisarv, millest väiksem ei tohi sisestus olla.
- Täisarv, millest suurem ei tohi sisestus olla.
Tagastus: Täisarv, mis jääb vahemikku min ja max.
Kasutus: Programmi raames tuleb sul kahes kohas kasutajalt sisestusi küsida. Kasuta seda funktsiooni mõlemas neist kohtadest!
➡ Funktsioon: massiivi täitmine
Kirjeldus: Funktsiooni abil loetakse sisse n arvu ning salvestatakse need massiivi. Funktsioonis endas ühtegi scanf() lauset olla ei tohi! Arvu lugemiseks kutsutakse välja eelnevalt tehtud funktsioon “ühe täisarvu sisestus”, tagastatav tulemus salvestatakse massiivi. Seda tehakse korduvalt tsüklis iga liikme lugemiseks.
Parameetrid:
- Täisarvude massiiv – täidetav massiiv.
- Täisarv – massiivi liikmete arv.
Soovi korral võid lisada funktsiooni täiendavalt 2 parameetrit min ja max (loetavate väärtuste alam- ja ülempiir)
Tagastus: puudub.
➡ Funktsioon: massiivi väljatrükk
Kirjeldus: Funktsiooni abil trükitakse ekraanile selles sisalduvad väärtused.
Parameetrid:
- Täisarvude massiiv – väljastatav massiiv.
- Täisarv – massiivi liikmete arv.
Tagastus: puudub.
➡ Funktsioon: aritmeetiline keskmine
Kirjeldus: Funktsiooni abil leitakse massiivi liikmete aritmeetiline keskmine ning tagastatakse see.
Parameetrid:
- Täisarvude massiiv – massiiv, mille väärtuste keskmist leitakse.
- Täisarv – massiivi liikmete arv.
Tagastus: reaalarv – aritmeetiline keskmine.
➡ Funktsioon: vähim arv
Kirjeldus: Funktsiooni abil leitakse massiivi liikmete hulgast vähim väärtus ning tagastatakse see.
Parameetrid:
- Täisarvude massiiv – massiiv, mille väärtuste hulgast vähimat leitakse.
- Täisarv – massiivi liikmete arv.
Tagastus: täisarv – väikseim väärtus massiivis.
Testimine
Test 1: vigu ei esine
1 2 3 4 5 6 7 8 9 10 |
Sisesta arv 1 / 5: 5 Sisesta arv 2 / 5: 9 Sisesta arv 3 / 5: -2 Sisesta arv 4 / 5: 16 Sisesta arv 5 / 5: 3 Arvud massiivis on: 5 9 -2 16 3 Massiivi v2him arv on -2 Massiivi keskmine on 6.20 |
Test 2: vead sisendis
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
Sisesta arv 1 / 5: 15 Sisesta arv 2 / 5: -234 Viga! Arv peab olema vahemikus -100 .. 100 > 999 Viga! Arv peab olema vahemikus -100 .. 100 > -5 Sisesta arv 3 / 5: 19 Sisesta arv 4 / 5: 25 Sisesta arv 5 / 5: 55 Arvud massiivis on: 15 -5 19 25 55 Massiivi v2him arv on -5 Massiivi keskmine on 21.80 |
Edasijõudnute ülesanne 1: Massiivist väärtuse leidmine
Selle ülesande käigus tuleb luua täiendav funktsioon, mille raames kontrollitakse kas otsitav arv on massiivis või mitte.
Ülesande raames on lubatud kasutada kodeeritud täisarvu asemel tõeväärtust (boolean), kuid teemana jõuame selle juurde alles mõne nädala pärast.
Meeldetuletuseks:
- Tagastades kodeeritud täisarvu hoidu maagilistest arvudest.
- Funktsioonil ei tohi olla kõrvalmõjusid.
Funktsiooni kirjeldus
Kirjeldus: Funktsiooni abil kontrollitakse kas massiivis eksisteerib otsitav väärtus või mitte ning tagastatakse vastav täisarvuna kodeeritud väärtus.
Parameetrid:
- Täisarvude massiiv – massiiv, mille väärtuste hulgast otsitavat leida tuleb.
- Täisarv – massiivi liikmete arv.
- Täisarv – massiivist otsitav väärtus.
Tagastus: täisarv – kas otsitav väärtus leiti või ei leitud.
Testimine
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
Sisesta arv 1 / 5: 15 Sisesta arv 2 / 5: -234 Viga! Arv peab olema vahemikus -100 .. 100 > 999 Viga! Arv peab olema vahemikus -100 .. 100 > -5 Sisesta arv 3 / 5: 19 Sisesta arv 4 / 5: 25 Sisesta arv 5 / 5: 55 Arvud massiivis on: 15 -5 19 25 55 Massiivi v2him arv on -5 Massiivi keskmine on 21.80 Sisesta arv mida otsida: 12345 Viga! Arv peab olema vahemikus -100 .. 100 > 55 Arv 55 on massiivis! |
Edasijõudnute ülesanne 2: n-kordsed uude massiivi.
- Kasutaja sisestab kordaja (positiivne täisarv). Korduvkasuta juba eksisteerivat funktsiooni!
- Loo funktsioon, mille käigus koostatakse uus massiiv
- Liikmeteks lisatakse algsest massiivist vaid sellised arvud, mille absoluutväärtus on n-kordne sisestatud kordajast. Uude massiivi lisatakse absoluutväärtused algsetest arvudest.
- Funktsioonil ei tohi olla kõrvalmõju – st ta ei tohi väljastada ümberpaigutatud arve. Samuti ei tohi see ise välja kutsuda funktsiooni, mis seda teeks.
- Trüki välja uue massiivi liikmed. Kasuta mõnda olemasolevat funktsiooni selleks.
E.g.: Input array (-5, 3, -12, 9, 22), multiplier (3), formed array(3, 12, 9)
Testimine
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
Sisesta arv 1 / 5: -5 Sisesta arv 2 / 5: 3 Sisesta arv 3 / 5: -12 Sisesta arv 4 / 5: 9 Sisesta arv 5 / 5: 22 Arvud massiivis on: -5 3 -12 9 22 Massiivi v2him arv on -12 Massiivi keskmine on 3.40 Sisesta arv mida otsida: 22 Arv 22 on massiivis! Sisesta kordaja: 3 Uus n-kordsete massiiv on: 3 12 9 |
Pärast seda tundi
- Tead mis vahet on lokaal- ja globaalmuutujal.
- Mõistad mis asi on funktsioon ja miks nende loomine oluline on
- Mõistad, et oleme funktsioone kasutanud juba esimesest nädalast peale. Oleme kasutanud nii funktsioone, mis tagastavad väärtusi, kui ka neid, mis ei tagasta.
- Mõistad, et me saame täpselt samasuguseid funktsioone ise luua ja oskad seda teha.
- Mõistad järgmisi termineid:
- Funktsiooni prototüüp
- Funktsioon tagastuse tüüp
- Funktsiooni argumendid
- Funktsiooni parameetrid
- Funktsiooni päis
- Funktsiooni keha
- Suudad luua korrektseid funktsioone
- Suudad anda funktsioonidesse nii üksikuid väärtusi kui massiive
- Suudad tagastada funktsioonist väärtusi
- Suudad salvestada funktsiooni poolt tagastatud väärtuse
- Suudad funktsioone korduvalt kasutada erinevate argumentidega
- Suudad oma koodi tükeldada funktsioonideks
- Omad lühikest loetelu universaalsetest funktsioonidest, mida sa saad tulevikus kasutada! See loetelu täieneb iga nädal!