150 likes | 330 Views
Tüüpvigad. Stiilivead. Muud vead. DEBUGIMISE OSKUS Programmivoo loogika vale system („pause“) Ekraanitõmmised Tiitelleht Arvude tüübid Vähem massiivi kohti X-idele kui Y- idtele. KOMMENTAARID! Faili päis puudu Deklad pole funktsiooni päises Treppimine Globaalmuutujad
E N D
Tüüpvigad Stiilivead Muud vead DEBUGIMISE OSKUS Programmivoo loogika vale system(„pause“) Ekraanitõmmised Tiitelleht Arvude tüübid Vähem massiivi kohti X-idele kui Y-idtele • KOMMENTAARID! • Faili päis puudu • Deklad pole funktsiooni päises • Treppimine • Globaalmuutujad • Tühjad else’d
Mis asi on funktsioon? • Funktsioon on eraldatud jupp koodi, mida on võimalik korduvalt kasutada (välja kutsuda) • Funktsioone kasutades: • Peame kirjutama vähem koodi • Saame koodi korduvalt kasutada, sh teistes programmides • Muudame koodi loetavamaks • Saame koodi jaotada erinevate failide vahel • Alus koodi jagamiseks ja projektideks, kus on mitu arendajat • jne
Funktsiooni kuju tagastusfunktsiooniNimi(parameetrid) { laused; } • Funktsioonide kasutamisel lisandub ka selle prototüüp tagastusfunktsiooniNimi(parameetrid);
main() funktsioon intmain(void) { printf("Helloworld\n"); return 0; }
Funktsioonidele on omased • Funktsiooni prototüüp • Tagastatav andmetüüp • void(tagastuseta funktsioon) • int(funktsioon peabtagastama täisarvu) • double(funktsioon peabtagastama murdarvu) • char (funktsioon peabtagastama tähemärgi) • jne • Funktsiooni päis (koos parameetritega) • Funktsiooni väljakutse (koos argumentidega)
Näide (1) #include <stdio.h> void trykiMiskit(intnumber); //funktsiooniprototüüp intmain(void) //main()funktsioonipäis koostagastustüübiga { intarv; printf("Tere, ytlemingiarv?\n"); scanf("%d", &arv); trykiMiskit(arv);//funktsiooni trykiMiskit() väljakutse koos argumentidega return 0; //main funktsioonitagastus } void trykiMiskit(intnumber) //trykiMiskit()funktsiooni päis, koostagastustüübi japarameetriga { printf("Ytlesidarvu %d", number); }
Näide (2) #include <stdio.h> void greet(intnumber, char nimi[]); //funktsiooniprototüüp intmain(void) { intarv; char nimi[15]; printf("Tere, misTeienimi on?\n"); scanf("%s", nimi); printf(".. jakuivanaolete?\n"); scanf("%d", &arv); greet(arv, nimi); //funktsioonigreet() väljakutse return 0; } void greet(intnumber, char nimi[]) //funktsiooni greet() päis { printf("Tere, %s. Oled %d aastane.", nimi, number); }
Muutujate kasutamine funktsioonidega • Kõigil muutujatel ja nende väärtustel on eluiga ja nähtavusskoop! • Alamfunktsioonis deklareeritud muutujat ja selle väärtust saab kasutada vaid selle konkreetse funktsiooni raames • Funktsioonis deklareeritud muutujate väärtused „unustatakse“ funktsioonist lahkudes • Erinevates funktsioonides võivad olla samanimelised muutujad – aga see ei tee neid samaks. • Funktsiooni saame edastada mitu väärtust, vastu võtta vaid ühe
Näide (3) #include <stdio.h> void printArray(intnumArray[], intarrayLength); intmain(void) { intfirstNumArray[] = {5, 8, -2, 65, 1, 36}; intsecondNumArray[] = {7, 97, -24, -74}; printArray(firstNumArray, sizeof(firstNumArray) / 4); printArray(secondNumArray, sizeof(secondNumArray) / 4); return 0; } void printArray(intnumArray[], intarrayLength) { inti; for(i= 0; i< arrayLenght; i++) { printf("%d\n", numArray[i]); } }
Näide (4) #include <stdio.h> #include <stdlib.h> #include <time.h> intgiveRandomNum(intnumMin, intnumMax); intmain(void) { intnum; srand(time(NULL)); num= giveRandomNum(5, 25); //väljakutsekoostagastusevastuvõtuga printf("Got num %d\n", num); num= giveRandomNum(75, 100); //väljakutsekoostagastusevastuvõtuga printf("Got num %d\n", num); return 0; } intgiveRandomNum(intnumMin, intnumMax) //täisarvu tagastusegafunktsioon { return (rand() % (numMax- numMin + 1)) + numMin;//tagastus }
Tunnitöö 1 • Võtke ette eelmise tunni ladude kood • Teeme oma pikast ja lohisevast main() funktsioonist mitu funktsiooni • Väljastus • Sorteerimine • Ladude ümbertõstmine
Edasijõudnutele • Tunnitöö 1 • Ladude sisestusel küsi lao suurust vahemikus TYHI_LADU … LAO_MAHUTAVUSKusjuures, mõlema lao jaoks korduvkasuta sama funktsiooni, vali tagastustüüp • Mõlema lao täitmiseks kasuta sama alamfunktsiooni sobivate parameetritega • Valitud täitmise alamfunktsioon kutsub omakorda alamfunktsiooni kaalu genereerimiseksSt main kutsub välja täitmise, täitmine kutsub välja random arvu genereerimise • Tekita kolmandast laost väljuvatele kaupadele kaalupiirang. Nt kaubik suudab peale laadida korraga 1500kg kaupa. Mahuta suuremad enne, kuid siiski võimalikult palju kaupu.
Tunnitöö 2 • Loo programm, mis: • Küsib kasutajalt 3 arvu, mis oleksid nullist suuremad • Leiab arvude summa • Leiab arvude aritmeetilise keskmise • Leiab suurima arvu • Leiab vähima arvu • Kõik funktsioonid peavad tulemuse tagastama main() funktsiooni, kus need välja trükitakse.Väljatrükki alamfunktsioonides endis ei tohi olla
Edasijõudnutele • Tunnitöö 2 • Samad programmi ülesanded, kuid funktsioonid peavad töötama N arvugaNB! Massiivid edastatakse byreference (pointerina), üksikmuutujad byvalue (väärtuse koopiana) • Loo menüülahendus, kus kasutaja saab ise valida sobiva toimingu või uue arvude genereerimise • Kasuta täitmiseks juhuarve (random) (korduvkasuta eelmises tunnitöös olevaid koodilõike)Mõtlemiseks: Kuidas teha seda ilma kopeerimata, vaid läbi teegi- ja koodifaili include’imise • Leia ekstreemumid (min ja max) väärtus ühes funktsioonis. Meenuta, et tagastada sai vaid ühe väärtuse (abiks byreference)