6. labor: Funktsioonid

Labori materjal

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
Test 2: Vigane sisend

Ü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.

Ü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).
  • 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
Test 2: vead sisendis

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

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

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!

Täiendav materjali