Labori materjal
- Slaidid: Sissejuhatus
- Slaidid: Viidad
Meeldetuletuseks koodimisstiilist
- Su kood peaks olema lihtsasti loetav
- Stiil peab üle kõigi koodifailide olema samasugune
- Eelista lihtsust – lihtsad lühikesed funktsioonid, arusaadavad algoritmid, väldi keerukuse tekitamist koodi “uhkemaks” tegemiseks
- Kommenteeri oma koodi!
- Planeeri oma kood modulaarsena (lühikesed lihtsad funktsioonid, mis on universaalsed ja mida saad kergesti kopeerida ühest programmist teise, sh tulevikus ka eksamil või kontrolltööl).
- Kasuta kiireid algoritme ja andmestruktuure (minimaalselt seni õpitute hulgast)
- Väldi globaalmuutujaid (selles aines näeme ka olukordi kus globaalmuutujad on OK)
Ülesanded
Selles laboris on kaks ülesannet. Teine ülesanne on tükeldatud kahte ossa. Edasijõudnute ülesanne on ehitatud teise ülesande põhjal.
Ülesanne 1: viidad ja muutujad
Tegu on klassikalise muutuja väärtuse vahetamise ülesandega.
Lae alla ülesande aluskood: https://blue.pri.ee/ttu/files/iax0584/aluskoodid/t1_swap_template.c
Nõuded
- Ehita oma lahendus aluskoodile
- Aluskoodis on koodilõigud, mille lõpetamine on jäetud sinu ülesandeks. Need on märgitud koodis kommentaariga TODO .
- Loo 2 funktsiooni vastavalt aluskoodis olevatele kommentaaridele. Ühest neist tuleb väärtused sisse lugeda ja teises nende väärtused omavahel vahetada. Mõlemate puhul kasuta viitade võimalusi.
- Trüki välja muutujate mäluaadressid kolmes erinevas kohas
- Esiteks main funktsioonis, näita kus kohas väärtused asuvad mälus
- Teiseks lugemise funktsioonis – näita kuhu kohta loetavad väärtused salvestatakse
- Kolmandaks vahetamise funktsioonis – näita kus asuvad need väärtused mida parasjagu vahetad.
- Kaitsmisel selgita mis on kuvatud väärtuste puhul oluline!
Testimine
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 |
risto@risto-lt3:~/Nextcloud/work/ttu/teaching/_generic/prog2/lab/pointers$ ./t1_swap Addresses in function main x @ 0x7ffffd82f7d0 y @ 0x7ffffd82f7d4 Addresses in function ReadValues x @ 0x7ffffd82f7d0 y @ 0x7ffffd82f7d4 Enter value x: 19 Enter value y: 4 Original values in main x = 19 y = 4 Addresses in function SwapValues x @ 0x7ffffd82f7d0 y @ 0x7ffffd82f7d4 Updated values in main x = 4 y = 19 |
Ülesanne 2 osa 1: Viidad ja massiivid
Teises ülesandes vaatleme täisarvudest koosneva massiivi liikmete mäluaadresse ja kasutame viitade võimalusi, et funktsioonist mitu väärtust korraga välja saada. Samuti harjutame viidaaritmeetika kasutamist.
Nõuded
Loo programm, mis täidab järgnevad nõuded
- Selles ülesandes ei tohi sa kasutada nurksulge [] massiivi indekseerimiseks, vaid pead rakendama viida-aritmeetikat. Nurgsulge tohib kasutada vaid massiivi deklareerimiseks.
- Kogu selle ülesande vältel ei tohi sa kasutada nurksulge massiivide indekseerimiseks. Kasutada tuleb viida-aritmeetikat.
- Loo funktsioon, mis loeb sisse 10 numbrit. Salvesta need kõik massiivi.
Meeldetuletus: Massiiviga koos tuleb edastada funktsioonile ka selle pikkus.
Vihje: loe need kas failist või kasuta voo suunamist, et säästa enda aega programmi testimisel! - Loo funktsioon, kus trükid välja kõik loetud arvud ning nende asukoha mälus.
- Loo funktsioon, mis leiab korraga nii minimaalse kui maksimaalse arvu massiivist
- Seda funktsiooni tohid välja kutsuda vaid ühe korra, mõlemad tulemused tuleb leida selle käigus.
- Funktsiooni ei tohi tagastada midagi (st tagastuse tüüp on void ).
- Võid eeldada, et eksisteerib vaid üks vähim ja üks suurim arv.
- Kasuta viitade võimalusi kahe väärtuse funktsioonist kätte saamiseks.
- Ära kasuta massiive min/max väärtuse salvestamiseks!
- Ära väljasta tulemusi loodava funktsiooni sees!
- Kõik funktsioonid tuleb kutsuda välja main() funktsioonist. Minimaalne ja maksimaalne väärtus väljasta samuti main() funktsioonis.
Testimine
Esimese osa oodatav väljund
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 |
risto@risto-lt3:~/Nextcloud/work/ttu/teaching/_generic/prog2/lab/pointers$ ./t2_array Enter value for index 0 / 9: 19 Enter value for index 1 / 9: -1 Enter value for index 2 / 9: 125 Enter value for index 3 / 9: -43 Enter value for index 4 / 9: 15 Enter value for index 5 / 9: -12 Enter value for index 6 / 9: 175 Enter value for index 7 / 9: 54 Enter value for index 8 / 9: 8 Enter value for index 9 / 9: 119 Original array printout 0x7fff3ab96b50: 19 0x7fff3ab96b54: -1 0x7fff3ab96b58: 125 0x7fff3ab96b5c: -43 0x7fff3ab96b60: 15 0x7fff3ab96b64: -12 0x7fff3ab96b68: 175 0x7fff3ab96b6c: 54 0x7fff3ab96b70: 8 0x7fff3ab96b74: 119 Min: -43 Max: 175 |
Ülesanne 2 osa 2: massiiv on viit esimesele liikmele
Selle ülesande eesmärk on veenduda, et mõistad korrektselt ideed “massiiv on käsitletav kui viit esimesele massiivi liikmele”.
Nõuded
- Loo (või korduvkasuta) funktsioon, mis suudaks massiivist välja trükkida n numbrit ja mäluaadressi.
- Funktsioonil tohib olla vaid 2 parameetrit.
- Funktsioon peab olema ehitatud sedasi, et see suudaks väljastada ükskõik millise etteantud massiivi
- Näitamaks, et su funktsioon on tehtud õigesti (ning veelgi enam, tõestamaks, et mõistsid teemat õigesti), kutsu loodavat funktsiooni välja 3 korda sedasi, et
- esimene kord trükitakse välja kogu massiiv
- teine kord trükitakse välja vaid elemendid 0 – 4
- kolmas kord trükitakse välja elemendid 3- 7
Vihje: Mõtle enne hoolikalt kui hakkad funktsiooni koostama! Ülesande eesmärk on veenduda, et sa massiivi ja viida omavahelisest seosest õigesti aru. Ülesande eesmärk ei ole luua ülimalt keerulist või kavalat lahendust!
Testimine
Oodatav väljund pärast teise osa lahendamist
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 40 41 42 43 44 45 46 47 48 49 50 51 52 |
risto@risto-lt3:~/Nextcloud/work/ttu/teaching/_generic/prog2/lab/pointers$ ./t2_array Enter value for index 0 / 9: 19 Enter value for index 1 / 9: -1 Enter value for index 2 / 9: 125 Enter value for index 3 / 9: -43 Enter value for index 4 / 9: 15 Enter value for index 5 / 9: -12 Enter value for index 6 / 9: 175 Enter value for index 7 / 9: 54 Enter value for index 8 / 9: 8 Enter value for index 9 / 9: 119 Original array printout 0x7fff3ab96b50: 19 0x7fff3ab96b54: -1 0x7fff3ab96b58: 125 0x7fff3ab96b5c: -43 0x7fff3ab96b60: 15 0x7fff3ab96b64: -12 0x7fff3ab96b68: 175 0x7fff3ab96b6c: 54 0x7fff3ab96b70: 8 0x7fff3ab96b74: 119 Min: -43 Max: 175 Array print from 0 to 9 0x7fff3ab96b50: 19 0x7fff3ab96b54: -1 0x7fff3ab96b58: 125 0x7fff3ab96b5c: -43 0x7fff3ab96b60: 15 0x7fff3ab96b64: -12 0x7fff3ab96b68: 175 0x7fff3ab96b6c: 54 0x7fff3ab96b70: 8 0x7fff3ab96b74: 119 Array print from 0 to 4 0x7fff3ab96b50: 19 0x7fff3ab96b54: -1 0x7fff3ab96b58: 125 0x7fff3ab96b5c: -43 0x7fff3ab96b60: 15 Array print from 3 to 7 0x7fff3ab96b5c: -43 0x7fff3ab96b60: 15 0x7fff3ab96b64: -12 0x7fff3ab96b68: 175 0x7fff3ab96b6c: 54 |
Edasijõudnutele: minmax koos aadressidega
Selles ülesandes taasloome ül. 2 esimeses osas loodud ekstreemväärtuste leidmise funktsiooni. Teeme muudatuse mis lubab meil lisaks väärtusele saada ka asukoha, jällegi kasutades viitade omadusi
Nõuded
- Loo uus funktsioon või muuda olemasolevat sedasi, et leida minimaalse ja maksimaalse arvu asukoht. Funktsioon peab leidma mõlema asukoha ühe käivitusega.
- Funktsiooni ei tohi tagastada midagi (st tagastuse tüüp on void ).
- Funktsioonil tohib olla täpselt 4 parameetrit
- Massiiv arvudega
- Massiivi pikkus
- 2 viita või topeltviita – mõtle välja mis nendes hoida sobiks!
- Trüki välja järgnevad tulemused main funktsioonis
- Minimaalne ja maksimaalne arv
- Minimaalse ja maksimaalse arvu aadressid massiivis
- Minimaalse ja maksimaalse arvu indeksid massiivis
- NB! Aadressi ja indeksi leidmiseks ei tohi sa täiendavalt massiivi uuesti läbi käia! Tulemused saamiseks tuleb kasutada viitade omadusi ja arvutada vastused funktsioonist saadavate tulemuste põhjal!
Testimine
Edasijõudnute ülesande oodatav väljund
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 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
risto@risto-lt3:~/Nextcloud/work/ttu/teaching/_generic/prog2/lab/pointers$ ./t2_array Enter value for index 0 / 9: 19 Enter value for index 1 / 9: -1 Enter value for index 2 / 9: 125 Enter value for index 3 / 9: -43 Enter value for index 4 / 9: 15 Enter value for index 5 / 9: -12 Enter value for index 6 / 9: 175 Enter value for index 7 / 9: 54 Enter value for index 8 / 9: 8 Enter value for index 9 / 9: 119 Original array printout 0x7fff3ab96b50: 19 0x7fff3ab96b54: -1 0x7fff3ab96b58: 125 0x7fff3ab96b5c: -43 0x7fff3ab96b60: 15 0x7fff3ab96b64: -12 0x7fff3ab96b68: 175 0x7fff3ab96b6c: 54 0x7fff3ab96b70: 8 0x7fff3ab96b74: 119 Min: -43 Max: 175 Array print from 0 to 9 0x7fff3ab96b50: 19 0x7fff3ab96b54: -1 0x7fff3ab96b58: 125 0x7fff3ab96b5c: -43 0x7fff3ab96b60: 15 0x7fff3ab96b64: -12 0x7fff3ab96b68: 175 0x7fff3ab96b6c: 54 0x7fff3ab96b70: 8 0x7fff3ab96b74: 119 Array print from 0 to 4 0x7fff3ab96b50: 19 0x7fff3ab96b54: -1 0x7fff3ab96b58: 125 0x7fff3ab96b5c: -43 0x7fff3ab96b60: 15 Array print from 3 to 7 0x7fff3ab96b5c: -43 0x7fff3ab96b60: 15 0x7fff3ab96b64: -12 0x7fff3ab96b68: 175 0x7fff3ab96b6c: 54 Min -43; address 0x7fff3ab96b5c; index 3 Max 175; address 0x7fff3ab96b68; index 6 |
Pärast seda tundi peaksid
- mõistma aine nõudeid, sh kuidas hinne kujuneb
- teadma mis on viit
- oskama mõista mäluaadressi iseloomu
- tegema vahet virtuaalsel ja füüsilisel aadressil
- teadma mis mõjutab mäluaadressi suurust
- teadma täiendavast mäluvajadusest ja keerukusest mis tuleb viitade otsese kasutamisega
- oskama viitmuutujat deklareerida
- teadma kuidas viitadega koodi kirjutada lähtuvalt koodimisstiilist
- teadma mis tähtsus on viida andmetüübil
- teadma mis on NULL-viit ja kus seda kasutatakse
- teadma mõningaid valdkondi kus viitasid kasutatakse
- teadma ja oskama kasutada viida-aritmeetikat
- mõistma scanf argumente ja kuidas viidad ning aadressid siin mängu tulevad
- mõistma miks me eelmine semester ütlesime, et massiivi edastamisel manipuleerime originaalandmeid ning muutujate puhul mitte
- osksama muutujate mäluaadresse funktsioonidesse edastada
- oskama mitme muutuja väärtust ühe funktsiooni sees manipuleerida kasutades viitasid
- mõistma topeltviida ideed
- oskama kasutada tingimuslausete koostamiseks kolmikoperaatorit
Täiendavat materjali
- C pointers
https://www.geeksforgeeks.org/c-pointers - Pointers – CS50 shorts
https://www.youtube.com/watch?v=XISnO2YhnsY