9. labor: maatriksid

Labori materjal

Esitamisele kuuluvad ülesanded

Selles laboris on kaks ülesannet. Teisele üelsandele on pakutud kaks lisaülesannet.

Ülesanne 1: Maatriksist tulemuste leidmine

Selle ülesande raames harjutame maatriksis nagiveerimist ja sealt tulemuste leidmist.

Ülesannet hinnatakse kolmes eraldi osas! Loe lähemalt peatükist “Hinnatavad osad” . Ülesanne tuleb ette näidata kasutades voo suunamist etteantud sisendandmete failiga.

Ülesandega alustamiseks lae alla järgnevad lähtefailid

Nõuded
  • Ülesande jaoks on sulle antud aluskood ja tekstifail sisendiga
  • Programmi jooksuta kasutades voo suunamist.
  • Lisa programmi algse maatriksi väljatrükk. Väljatrükk peab olema joondatud samamoodi nagu näidisel.
  • Leia järgnevad tulemused
    • Peadiagonaalil olevate negatiivsete arvude summa
    • Kõrvaldiagonaali kohal (kõrvaldiagonaalist kõrgemal) olevate positiivsete arvude korrutis
    • Iga rea suurim arv
  • Kõik väärtused tuleb salvestada täisarvulistesse andmetüüpidesse.  Andmetüübid nagu float, double jne ei ole lubatud.
  • Kui soovid kasutada väiksemaid või suuremaid andmetüüpe kui 32-bitised, peavad need olema määratud täpselt (nt inttypes.h  teegi abil). Tüübid nagu long  ja long long  ei ole lubatud
  • Lahendus peab olema ühilduv erinevatel platvormidel. Formaadid nagu %ld  ja %lld  ei ole lubatud
  • Ülesande raames tuleb sul luua nõutud funktsioonid. Loetelu nendest on kirjeldatud järgnevas punktis.
Nõutud funktsioonid

Programmi tuleb lisada kokku 5 funktsiooni. Vajadusel võid neid lisada täiendavalt juurde.

  • Maatriksi lugemine. Funktsiooni töö käigus loetakse maatriks mällu. Tagastust ei ole. Funktsioon on lahendatud sinu eest aluskoodis.
  • Maatriksi väljatrükk. Funktsiooni käigus trükitakse maatriks ekraanile samamoodi nagu näidisel. Tagastust ei ole. Funktsiooni prototüüp antud aluskoodis.
  • Peadiagonaalil olevate negatiivsete arvude summa. Funktsioon tagastab summa main()  funktsiooni, kus see välja trükitakse. Kõrvalmõjud on keelatud! Funktsiooni prototüüp antud aluskoodis.
    NB! Ettevaatust liiasusega! Vaata millistel indeksitel arvud asuvad ning sea tsükliloendurid täpselt nendele positsioonidele. Käia läbi 49-kohaline maatriks ainult 7 arvu leidmiseks ei ole okei. Kujuta ette kui nt tegu oleks 1000 x 1000 maatriksiga – sellisel juhul käiksid läbi miljon arvu selleks, et leida vaid nendest tuhat. Kogu tööst oleks kasulik sellisel juhul vaid 0.1% (väheneb eksponentsiaalselt)
  • Kõrvaldiagonaali kohal (kõrvaldiagonaalist kõrgemal) paiknevate positiivsete arvude korrutis. Funktsioon tagastab korrutise main() funktsiooni, kus see välja trükitakse. Kõrvalmõju ei ole.
  • Rea-kaupa suurimate arvude leidmine. Disain on sinu enda otsustada. Kõrvalmõjud on lubatud, tulemused võib printida soovi korral funktsiooni sees. Võid lisada ka mõne täiendava abifunktsiooni.
Hinnatavad osad

Sellel ülesandel on 3 hindamiskohta, vastavalt pärast iga tulemuse edukat leidmist.

Kohustuslik, olenemata millist alamosa näitad:

  1. Programmi tuleb jooksutada kasutades voo suunamist
  2. Sisestatud maatriksi väljatrükk

Eraldi hinnatavad alamosad:

  • Osa 1: Peadiagonaalil olevate negatiivsete arvude summa.
  • Osa 2: Kõrvaldiagonaali kohal (kõrvaldiagonaalist kõrgemal) olevate positiivsete arvude korrutis.
  • Osa 3: Iga rea suurim arv.
Vihjeid
  • Vaata kuidas ReadMatrix()  funktsioon on kirjutatud. Sedasi saad ka oma ülejäänud funktsioonide parameetrid kujundada.
  • Väljatrükk: Jällegi, vaata funktsiooni ReadMatrix(). Tsüklite struktuur on juba tehtud selliselt, et see käib läbi kõik maatriksi positsioonis. Peaksid lugemise asendama väljastusega. Reavahetuseks mõtle mis eesmärki omab sisemine tsükkel ja mis eesmärki välimine (ning kus paikned maatriksi suhtes enne ja pärast välimist tsükli töötamist ning kus asud enne ja pärast sisemise tsükli töötamist).
  • Osa 1: Kirjuta endale välja maatriksi liikmete indeksid, mida sul on vaja summeerida. Vaadates nende indeksite väärtusi mõtle mitut erinevat muutujat nende jaoks on vaja (ning samaaegselt ka tsüklit).
  • Osa 2: Meenuta mis juhtus täisarvu ületäitumisel.
  • Osa 3: Maatriksi ühte rida on võimalik edastada funktsiooni. Selleks määrame ära soovitud reaindeksi ning anname kaasa ka rea pikkuse. Nii saad korduvkasutada juba varasemas laboris valmis tehtud funktsiooni. Nt FindMaxValue(matrix[rowIndex], rowLength)
Testimine

Võrdle oma tulemust allolevaga nende õigsuses veendumiseks!

Ülesanne 2: Kinosaal

Meile on antud kinosaali plaan, mis on kujutatud 2-dimensioonilise maatriksina. Sinu peamiseks ülesandeks on väärtuste tõlgendamine antud maatriksist.

Kõik istekohad on kodeeritud järgnevate täisarvuliste numbritega:

  • 0 – istekoht puudub
  • 1 – istekoht on vaba
  • 2 – istekoht on hõivatud

Maatriksis positsioonil (0, 0) asub saali ülemine vasak istekoht.

Lae alla kinosaali algväärtustatud maatriks: https://blue.pri.ee/ttu/files/iax0583/aluskoodid/9_2_cinema_init.c

Nõuded
  • Kuva saali plaan. Programmi väljund peab olema samasugune nagu etteantud näidistel, sh
    • Vasakul ääres on rea numbrid.
    • Kõik read algavad esimesest istekohast, kuid arvestada tuleb, et saal on eest kitsenev (vt näide)
    • Ekraani asukoht on näidatud
    • Vabad istekohad kuvatakse numbritena
    • Hõivatud istekohad kuvatakse suure X tähena
    • Puuduvaid istekohti ei kuvata
  • Küsi kasutajalt soovitud istekoht ning väljasta kas koht eksisteerib, on vaba või mitte.
  • Minimaalselt loo 2 funktsiooni peale main funktsiooni. Üks saaliplaani kuvamiseks, teine istekoha saadavuse kontrolliks. Võid julgelt ka rohkem funktsioone luua.
Töövoo soovitus
  1. Prindi saaliplaan tavalise maatriksina. Ära veel väljundit kohandama hakka.  Veendu, et saad numbrid kätte ja vormindatud.
  2. Nüüd hakka väljundit kohandama (tõlgendama maatriksis olevaid väärtusi korrektselt). Loo tingimuslause, mille abiga tuvastada kui koht maatriksis puudub ja väljasta “tühjus” seal oleva numbri asemel.
  3. Seejärel jätka teiste kodeeritud väärtuste tõlgendamist ja visuaali loomist.
  4. Kui saaliplaan on valmis, prindi saaliplaani kõrvale rea numbrid.
  5. Küsi kasutajalt tema soovitud istekoha asukoht.  Kontrolli, et väärtused oleksid “mõistusepärased” (nn sanity check).
  6. Rea numbri maatriksis saad välja arvutada koheselt. Tulba numbri leidmiseks pead arvestama ka puuduvate istekohtadega.
  7. Väljasta maatriksis leitud indeksid veendumaks, et leidsid õige asukoha!
  8. Nüüd lõpeta ülejäänud programm.
Vihjeid
  • Saali plaan on peegeldatud kujul võrreldes massiivi tegelike indeksitega. Abiks võib olla kui joonistad endale välja ja märgid ära esimese ja viimase rea asukohad.
    • Rida 14 asub massiivis indeksiga 0
    • Rida 1 asub massiivis indeksiga 13
    • Istekoha kontrollis trüki välja massiivi indeksite väärtused (pildil rida algusega DEBUG)
  • Kasuta istekohtade loendamiseks eraldi loendurit.
  • Sellist kodeeritud täisarvu on hea lahendada kasutades switch()  lauset.
Programmi testimine ja näide

NB! Näidistel on kasutatud ka värve, seda sinu lahenduses olema ei pea (kuid võib 🙂 )

Näidises on samuti lisatud silumiseks DEBUG rida, kus kuvatakse massiivi asukoht kust istekohta otsiti. Sedasi on lihtsam oma programmi õigsust kontrollida.

Ava mind pildi nägemiseks

Lisaülesanne 1: mitu piletit

Lisame võimaluse kasutajal osta mitu piletit korraga.

  • Kasutaja saab sisestada soovitud piletite arvu
  • Kõik istekohad peavad paiknema kõrvuti, samas reas
  • Lähtepunktiks on kasutaja sisestatud istekoht. Täiendavad kohad võivad paikneda sellest nii vasakul kui paremal pool (sh mõlemal pool korraga).
  • Kuva kasutajale pakutavad istekohad.

Lisaülesanne 2: ostukinnitus

Lisame kasutajale võimaluse ümber mõelda oma piletiostu soovi.

  • Selle ülesande eelduseks on esimese lisaülesande lahendus.
  • Pärast istekohtade pakkumist tuleb kasutajalt küsida kinnitust kas ta soovib pakutavaid istekohti.
  • Kui kasutaja keeldub pakutavatest kohtadest või ei olnud võimalik soovitud asukohas istekohti pakkuda kuvatakse kasutajale uuesti saali plaan ning pakutakse talle võimalust uuesti istekohti valida

Vihje: Algses maatriksis on pakutud välja 3 kodeeritud väärtust. Võid neid soovi korral lisada. Alternatiivina saad teha algsest maatriksist koopia.

Programmi näide

Näide on koostatud pärast mõlema lisaülesande lahendamist.

Ava mind pildi nägemiseks

Pärast tundi peaksid oskama järgmist

  • Peaksid oskama erineva pikkusega arve kasutama koodis, sh 64-bitist täisarvu.
  • Mõistma mis hetkel täisarvu ületäitumised juhtuvad koodis
  • Olema suuteline visualiseerima kahedimensioonilist massiivi (maatriksit)
  • Suutma deklareerida ja indekseerida kahedimensioonilist massiivi
  • Suutma indekseerida kindlaid osi kahedimensioonilisest massiivist (nt esimene või viimane rida, kolm esimest rida, teine element kolmandast reast jne)
  • Mõistma ja olema suuteline kasutama maatriksi diagonaalide omadusi
  • Suutma käia maatriksit läbi nii rida-rea haaval kui ka veerg-veeru haaval.

Täiendavat materjali