Praktikumi materjal
- Slaidid: Sissejuhatus
- Slaidid: Viidad
Meeldetuletuseks koodimisstiilist
- Koodimisstiil peab olema ühtne kõigis koodifailides
- Kood peaks olema lihtsasti loetav ja hallatav
- Väldi põhjendamatult keeruka koodi kirjutamist
- Tükelda oma kood funktsioonideks
- Funktsioonid peaksid olema lihtsad, lühikesed ja tegema vaid ühte asja ning tegema seda hästi.
- Hoia arvutamine ja väljastus erinevates funktsioonides. Tulemusi leidvad funktsioonid peaksid olema eelistatult kõrvalmõjudeta.
- Funktsioonid peaksid olema kergelt korduvkasutatavad (sh tulevikus kontrolltöös, eksamil)
- main() funktsioon on kõige esimene funktsioon failis. Enda loodud funktsioonid paiknevad pärast main funktsiooni.
- Kasuta kiireid algoritme ja andmestruktuure (minimaalselt seni õpitute hulgast)
- Väldi globaalmuutujaid (selles aines näeme ka olukordi kus globaalmuutujad on OK)
Ülesanded
Selles praktikumis on kaks ülesannet. Teine ülesanne on tükeldatud kahte ossa. Lisaülesanne on ehitatud teise ülesande põhjal.
Ülesanne 1 [W01-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 kaks funktsiooni vastavalt aluskoodis olevatele kommentaaridele. Ühes neist tuleb väärtused kasutajalt küsida ja salvestada ning teises funktsioonis tuleb need väärtused omavahel vahetada. Mõlemad funktsioonid toetuvad viitade kasutamisele.
- Trüki välja muutujate mäluaadressid kolmes erinevas kohas
- main() funktsioonis – näita kus muutujate väärtused hoiustatud on
- Lugemise funktsioonis – näita kuhu kohta loetavad väärtused salvestatakse
- 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 |
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 [W01-2]: Viidad ja massiivid
Teise ülesande eesmärgiks on tutvuda viitade ja massiivide koos kasutamist. Lisaks harjutame ka viidaaritmeetikat.
Nõuded
Loo programm, mis täidab järgnevad nõuded
- Selle ülesande vältel ei tohi massiivi indekseerimiseks kasutada kantsulge []. Rakenda kõigis funktsionides indekseerimiseks viida-aritmeetikat.
- Kõik ülesannete nõuetes olevad funktsioonid tuleb välja kutsuda main() funktsioonist
- Ülesande tulemusena leitavad minimaalne ja maksimaalne väärtus väljastatakse main() funktsioonis.
Loo järgnevad funktsioonid
- Funktsioon, mis loeb kasutajalt 8 arvu ning salvestab need 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! - Funktsioon, mis väljastab kõik loetud arvud ning nende asukoha mälus.
- Funktsioon, mis leiab korraga nii minimaalse kui maksimaalse arvu massiivist
- Seda funktsiooni tohid välja kutsuda vaid ühe korra, mõlemad tulemused tuleb leida korraga
- Funktsioon ei tohi tagastada midagi (st tagastuse tüüp on void ).
- Võid eeldada, et eksisteerib vaid üks vähim ja üks suurim arv.
- Kasuta eelnevas ülesandes tutvutud viitade omadustega minimaalse ja maksimaalse väärtuse main() funkitsiooni saamiseks
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 [W01-3]: Massiivi tõlgendamine
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 saad 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 |
Lisaülesanne [W01-4]: MinMax koos aadressidega
Selles ülesandes taasloome teise ülesande 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.
- Funktsioon 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! Tulemuste saamiseks tuleb kasutada viitade omadusi ja arvutada vastused funktsioonist saadavate tulemuste põhjal!
Testimine
Lisaülesande lahendusena 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
- Beej’s Guide to C Programming: Pointers—Cower In Fear!
https://beej.us/guide/bgc/html/split/pointers.html#pointers - Beej’s Guide to C Programming: Pointers II: Arithmetic
https://beej.us/guide/bgc/html/split/pointers2.html#pointers2 - C pointers
https://www.geeksforgeeks.org/c-pointers - Pointers – CS50 shorts
https://www.youtube.com/watch?v=XISnO2YhnsY