Labori materjal
- Slaidid: Maatriksid
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
- Aluskood: https://blue.pri.ee/ttu/files/iax0583/aluskoodid/9_1_matrix.c
- Sisendfail voo suunamisega kasutamiseks: https://blue.pri.ee/ttu/files/iax0583/aluskoodid/9_1_matrix.txt
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:
- Programmi tuleb jooksutada kasutades voo suunamist
- 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!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
Sisestatud maatriks: 10 9 8 0 -10 8 5 7 6 9 1 -7 -9 4 -5 5 -5 5 -5 5 -5 8 7 6 5 4 3 2 1 2 3 4 5 6 7 -1 -2 -3 -4 -3 -2 -1 0 0 0 0 0 0 0 Peadiagonaali negatiivsete elementide summa on -7 Korvaldiagonaali kohal olevate positiivsete arvude korrutis on 36578304000 1 rea suurim oli 10 2 rea suurim oli 9 3 rea suurim oli 5 4 rea suurim oli 8 5 rea suurim oli 7 6 rea suurim oli -1 7 rea suurim oli 0 |
Ü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
- Prindi saaliplaan tavalise maatriksina. Ära veel väljundit kohandama hakka. Veendu, et saad numbrid kätte ja vormindatud.
- 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.
- Seejärel jätka teiste kodeeritud väärtuste tõlgendamist ja visuaali loomist.
- Kui saaliplaan on valmis, prindi saaliplaani kõrvale rea numbrid.
- Küsi kasutajalt tema soovitud istekoha asukoht. Kontrolli, et väärtused oleksid “mõistusepärased” (nn sanity check).
- Rea numbri maatriksis saad välja arvutada koheselt. Tulba numbri leidmiseks pead arvestama ka puuduvate istekohtadega.
- Väljasta maatriksis leitud indeksid veendumaks, et leidsid õige asukoha!
- 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.
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.
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.