Praktikumi materjal
- Slaidid: Maatriksid
Esitamisele kuuluvad ülesanded
Selles praktikumis on kaks ülesannet. Teisele ülesandele on pakutud kaks lisaülesannet.
Ülesanne 1 [W09-1]: Maatriksist tulemuste leidmine
Selle ülesande raames harjutame maatriksis nagiveerimist ja sealt tulemuste leidmist. Selleks tuleb lahendada kokku neli erinevat alamülesannet. Ü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_starter.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
- Sisestatud rea ja veeru asukohal asuv element
- Peadiagonaalil paiknevate negatiivsete arvude summa
- Kõrvaldiagonaali kohal (kõrvaldiagonaalist kõrgemal) paiknevate positiivsete arvude korrutis
- Iga rea suurim arv
- Kõik olulised andmed (maatriks, tulemused) tuleb salvestada täisarvulistesse andmetüüpidesse. Reaalarvulised andmetüübid nagu float , double ei ole lubatud.
- Kõik täisarvulised muutujad, mis sisaldavad andmeid või tulemusi, peavad olema määratud biti täpsusega. Andmetüübid nagu short , int , long ja long long ei ole lubatud.
- Lahendus peab olema ühilduv erinevatel platvormidel. Formaadid nagu %hd , %ld ja %lld ei ole lubatud
- Ülesande raames tuleb sul luua nõutud funktsioonid. Loetelu nendest on kirjeldatud järgnevas punktis.
Töö käik
- Alusta maatriksi lugemisest funktsioonis ReadMatrix() . Funktsioon on suuresti ette antud, sul tuleb vaid lõpetada scanf() lause, sisestades õige andmeformaadi. Andmeformaat peab pärinema inttypes.h formaadist, st algama tähtedega SCN
- Veendumaks, et arvud said loetud, trüki maatriks välja. Funktsiooni PrintMatrix() prototüüp on antud, realiseeri see. Ära unusta kasutada sobilikku formaati joonduseks.
- Lisa andmefaili 2 numbrit, mis tähistavad rea ja veeru numbrit (vahemikus 1 … 7)
- Küsi kasutajalt rea ja veeru number. Selleks loo üks funktsioon, mis küsib kasutajalt arvu lubatud vahemikus min … max. Nii min kui max peavad olema antud parameetritena. Korduvkasuta funktsiooni lugemaks nii rea kui veeru väärtus.
Vihje: sul on selline funktsioon juba olemas varasemast praktikumist. - Loo funktsioon, mis leiab ja tagastab peadiagonaalil olevate negatiivsete arvude summa. Funktsiooni
GetMainDiagonalNegSum() prototüüp on sulle juba antud. Tulemus trüki välja
main() funktsioonis.
NB! Ettevaatust liiasustega! Kirjuta endale üles mis indeksitel peadiagonaali arvud asuvad! Meie 7 x 7 maatriksi puhul on nendeks vaid 7 arvu – st käia läbi kõik 49 arvu ei ole sobilik. Kui see oleks nt 1000 x 1000 maatriks, oleks miljonist arvust vaid 1000 kasulik – st 99,9% tühja tööd 0,1% oluliste arvude leidmiseks. Funktsioonil puuduvad kõrvalmõjud! - Loo funktsioon, mis leiab ja tagastab kõrvaldiagonaali kohal (ülevalpool kõrvaldiagonaalist) paiknevate positiivsete arvude korrutise. Korrutis tagasta main() funktsiooni, kus selle ka väljastad. Funktsioonil puuduvad kõrvalmõjud!
- Leia rea-kaupa suurimad arvud. Disain on sinu enda otsustada. Kõrvalmõjud on lubatud, tulemused võib väljastada soovi korral funktsiooni sees. Võid lisada ka mõne täiendava abifunktsiooni.
Vihjeid
- Väljastusel saad kasutada sama tsüklite struktuuri nagu andmete lugemisel. Seal on 2 olulist nüanssi
- Täisarvudele peab olema piisavalt ruumi, et need joonduksid ka negatiivsete arvude korral
- Reavahetus peab paikenam sobilikus kohas – mõtle mis eesmärk on sisemisel ja mis välimisel tsüklil. Lähtuvalt sellest paiguta oma reavahetus.
- Peadiagonaalil liikumisel vaata nii rea kui veeruindeksi väärtust. Need on samad! Järelikult topelt-tsükleid siin vaja ei ole! Ka tingimust (i == j) pole vaja – isegi muutuja j oleks siinpuhul liiane! Massiivi indekseerimisel on vaid oluline, et muutuja väärtus oleks sobilik!
- Kui korrutis pole ootuspärane, siis alusta sellest, et trükid välja järjest korrutise väärtuse pärast igat korrutamist – st paned oma if lause sisse ka printf() lause, et näha jooksvat korrutise väärtust.
- Suurima väärtuse leidmiseks reas saad kasutada varasemas praktikumis tehtud funktsiooni. Pead seda vaid sobilikult välja kutsuma. Maatriksist ühe rea välja valimiseks saame defineerida maatriksi esimese ehk reaindeksi. Nt GetMaxValue(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 19 |
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 Sisestatud rea väärtusel (2) ning veeru väärtusel (3) on arv 9 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 [W09-2]: Kinosaal
Meile on antud kinosaali plaan, mis on kujutatud 2-mõõtmelise 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_starter.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 on hõivatud.
- 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 [W09-3]: Mitmekesi kinno
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 [W09-4]: 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 kasutada 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.

