PR2ET1: Viidad

Praktikumi materjal

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
    1. main()  funktsioonis – näita kus muutujate väärtused hoiustatud on
    2. Lugemise funktsioonis – näita kuhu kohta loetavad väärtused salvestatakse
    3. Vahetamise funktsioonis – näita kus asuvad need väärtused mida parasjagu vahetad.
  • Kaitsmisel selgita mis on kuvatud väärtuste puhul oluline!
Testimine

Ü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

Ü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

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

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