Kodutöö II raames tuleb luua programm ja koostada aruanne tehtud töö kohta. Kodutöö fookuses on dünaamilise mälu kasutamine ning suuremahulisema rakenduse kirjutamine.
NB! See kodutöö on eelnevatest mahukam ja keerukam! Planeeri oma aega vastavalt!
Kodutöö variant
Nõuded loodavale rakendusele
Loodav rakendus peab jälgima kõiki parimaid praktikaid, mida on tutvustatud Programmeerimine 1 ning Programmeerimine 2 aines.
Keerukamad lahendused ning õppeaines katmata teemade rakendamine on lubatud, kui need on korrektselt dokumenteeritud ning aruandes on põhjendatud motivatsioon nende kasutamiseks sedasi, et lugejale on ilmne töö autori kompetents nende teemade valdamises.
Nõuded koodimisstandardile ja keskkonnale
Loodav programm peab olema kirjutad C programmeerimiskeeles. Kasutada tohib C90 ja C99 koodistandardeid. Uuemate standardite (C11, C17, C23) kasutamine on lubatud, kui see pakub lisandväärtust (nt lihtsustab mingit tegevust). Põhjendus tuleb tuua välja aruandes.
Lisaks C standardteekidele tohid kasutada ka C POSIX ja GNU C teeke ja laiendusi. Kolmanda osapoole teekide kasutamine väljaspool eelmainituid tuleb eelnevalt kokku leppida õppejõuga!
Esitatud lahendus kompileeritakse ja testitakse arvutiklassis oleva Linux seadistusega võrdväärses keskkonnas (nt OpenSUSE SLED-15 SP5 ja GCC-12) või värskeima jooksva Ubuntu versiooniga (Ubuntu Linux 25.10 ja GCC 15 või värskem). Ühilduvus teiste operatsioonisüsteemidega (Windows, MacOS) ei ole vajalik.
Lahenduse üldised nõuded
- Programmi lähtekood peab olema tükeldatud enamaks kui üheks failiks. Täpne failide arv ja jaotus on autori otsustada.
- Minimaalselt peab olema rakendus tükeldatud koodi- ja päisefailiks
- Mitme koodifaili kasutamisel või koodi tükeldamisel alamkaustadesse tuleb lisada Makefile oma lahenduse kompileerimiseks
- Andmed loetakse programmi mällu kahest eraldi andmefailist
- Vaikimisi andmefailide nimed peavad olema rakendusse sisse kirjutatud. Soovi korral võib käsurea argumente kasutada, kuid see ei tohi olla eeldus programmi kasutamiseks.
- Andmed hoitakse dünaamiliselt loodud andmestruktuurides
- Andmestruktuurina võid kasutada dünaamiliselt moodustatud massiive, ahelloendeid, puid vmt
- Küsitav mälumaht peab olema sõltuv andmefaili pikkusest
- Rakendus peab küsima täpselt nii palju mälu kui andmete hoiustamiseks on vajalik
- Rakendus peab toimima ka siis, kui andmefailide pikkused muutuvad
- Ühtegi tehislikku piirangut andmekirjete arvule ei tohi rakendusse kodeerida
- Muutuva pikkusega andmeväljad (nt sõned) tuleb hõivata kasutades dünaamilist mälu, vastavalt vajaminevale mälumahule. Kindla pikkusega massiivid ja sõned jäävad staatiliseks.
- Ajutistele puhvritele piirangud ei rakendu, tohib kasutada nii staatilist kui dünaamilist mälu.
- Loodavad struktuurid peaksid olema sobilikud sinu ülesande variandile
- Minimaalselt pead hoidma struktuurides kõik andmeväljad, mis on failides
- Sa võid lisada täiendavaid liikmeid struktuuridesse
- Sa võid lisada täiendavaid struktuure toetamaks ülesande lahendust
- Kui andmed sisaldavad kuupäevasid või kellaaegu, tuleb nende hoiustamiseks luua alamstruktuur (nested structure) või kasutada sobilikku olemasolevat andmestruktuuri time.h teegist
- Kõik rakenduse toimingud on korratavad programmist väljumata!
- Loo menüü struktuur, mille abil saab käivitada alamülesandeid
- Iga ülesanne sinu variandis tekitab minimaalselt ühe menüüvaliku.
- Soovi korral võid lisada menüüvalikuid, mis ei ole ülesande variandis kirjeldatud (nt silumisvalikud)
- Iga tegevuse tulemus kuvatakse ekraanil
- Programmist peab olema võimalik väljuda menüü abil
- Kui ülesande raames tehakse muudatus andmetesse – st lisatakse, muudetakse või kustutatakse andmeid, peab muudatus jäädavalt salvestuma. St kui rakendus suletakse ja uuesti käivitatakse, peavad olema kasutusel muudetud andmed
- Rakendus peab oma tööst kirjutama logifaili
- Iga kasutaja tegevus rakenduses logitakse
- Üks logikirje rea kohta
- Iga logikirje peab sisaldama kuupäeva ja kellaaega
- Logis peavad salvestuma ka kasutajale mittenähtavad sündmused (nt programmi käivitamine, edukas sisendfaili lugemine jne)
- Varasemad kasutuslogid peavad säilima
- Programm peab pakkuma mõistlikku kasutajakogemust (UX – user experience)
- Kui kasutaja suunatakse alammenüüsse, peab tal olema võimalik sealt tagasi liikuda tegevust lõpule viimata
- Programm peab arusaadavalt teavitama kasutajat vigade esinemisel. Vea kirjeldus peab olema võimalikult täpne (abistav probleemi lahendamisel). Kõik veateated kirjutatakse stderr standardvoogu.
- Kui kasutajalt oodatakse sisendit, peab rakendus seda arusaadavalt väljendama. Kui sisend peab olema kindlalt vormindatud, tuleb kasutajale kuvada eelnevalt sobilik vorming. Võimalusel lisada ka näide oodatavast sisendist.
- Kui programm sisaldab otsingut, filtreerimist või grupeerimist, peab kriteeriumile vastavate tulemuste puudumine olema kasutajale arusaadavalt väljendatud
- Programmis puuduvad mälulekked, raisatud või vabastamata ressursid. Kõik ressursid, mida loodud rakendus töö jaoks hõivab, tuleb enne programmi sulgemist vabastada (kontrolli Valgrindiga!)
Sisendfaili nõuded
- Kokku tuleb luua ja kasutada kahte andmefaili. Andmefailides peavad olema ainult ülesande variandis kirjeldatud andmeväljad.
- Andmed on seotud PK-FK (primaarvõtme-välisvõtme paarina)
- Andmete vahel on null või enam seos (zero to many) – nt üks õpilane saab deklareerida mitu õppeainet; õpilane ei pea olema deklareerinud ühtegi õppeainet
- Töö autor loob mõlema sisendfaili andmemudeli vastavalt enda parimatele oskustele ja teadmistele. Sinna hulka kuuluvad andmeväljade eraldaja, järjekord, sisu, keerukus jne. Töö autor dokumenteerib andmemudeli ja selle loomisel tehtud otsused programmiga kaasa antavas dokumendis.
- Töö autor koostab andmefaili vastavalt kirjeldatud andmemudelile. Loodud andmefail laetakse üles koos esitatava tööga.
- Esimene fail (kus paikneb ainult primaarvõti) peab sisaldama vähemalt 10 kirjet. Teine fail (mis sisaldab ka välisvõtit) peab sisaldama vähemalt 15 kirjet.
- Kui autor esitab mitu andmefailide komplekti (nt veaolukordade demonstreerimiseks), kehtib pikkuse nõue vaid ühele komplektile.
Aruande mall
Aruande malliks kasuta Kodutöö 1 raames välja toodud malle (https://blue.pri.ee/ttu/programmeerimine-i/kodutoo-i/) ning kohanda see ise sobivaks antud kodutööle.
Aruanne
Aruande sisuline pool peaks jääma 3 – 6 A4 lehekülje vahele, lisandub jooniste maht.
Rõhk on korralikult struktureeritud dokumentatsioonil! Väldi jutustamist (erandina kokkuvõte).
- Tiitelleht
- Autorideklaratsioon
- Lühendite ja mõistete sõnastik (vajadusel)
- Sisukord
- Jooniste loetelu
- Tabelite loetelu
- Ülesande püstitus (variant)
- Lahenduse detailne kirjeldus (väldi tekstimüüre!)
- Programmi lühikirjeldus – st mida teeb?
- Programmi töövoog (mis järjekorras mida tehakse, lühidalt ja üldistatult. Väldi detailidesse minekut! Umbes pool lehekülge).
- Projekti struktuur – failide nimetused, lühike selgitus. Kui kood on jaotatud kaustadesse, selgitada tükeldust.
Soovituslik: lisada rakenduse tree väljund - Andmestruktuuride (
struct ) kirjeldus
- Struktuuri lühikirjeldus (eesmärk)
- Struktuuri detailid (välja nimi, andmetüüp, kirjeldus, näidisväärtus), vormindatud tabelina
- Loendite (
enum ) kirjeldus (kui esineb)
- Loendi nimi, kirjeldus, võimalikud väärtused
- Eriolukordade analüüs ja lahendamine
- Probleemi kirjeldus
- Probleemi seisukord (kas lahendatud, leitud alternatiivne võimalus või on see jätkuvalt aktuaalne)
- Kui probleem on lahendatud, siis kuidas selle lahendasid
- Andmefailide struktuuri kirjeldus
- Ühe kirje struktuur (andmeväljade järjekord, andmevälja ja andmekirje eraldajad, …)
- Iga andmevälja kirjeldus – nimetus, andmetüüp, näidisväärtus, kirjeldus, piirangud nende olemasolul (nt pikkus, vahemik, keelatud väärtused)
- Ühe andmerea näidis
- Lisaülesanne (kui lahendasid lisaülesande)
- Kokkuvõte
- Kirjuta mõni lause oma lähenemisest ülesandele ja tööprotsessi kohta.
- Kirjuta mõni lause ülesandest ja selle keerukusest sinu jaoks.
- Kui võimalik, hinda ülesande sooritamise ajalist mahtu.
- Kas soovitad ülesannet kasutada ka tulevikus? Kas ja mida muudaksid?
- Täiendavad kommentaarid, emotsioonid, mõtted.
- Kasutatud kirjandus (vajadusel)
- Viitamiseks kasutatakse IEEE stiili
TalTechi juhend: https://haldus.taltech.ee/sites/default/files/2024-05/IEEE_stiilis_viitamine_2024%20%281%29.pdf
Ametlik juhend: https://journals.ieeeauthorcenter.ieee.org/wp-content/uploads/sites/7/IEEE_Reference_Guide.pdf - Kõik mis ei olnud kaetud selle õppeaine raames ja mida sa ei loonud iseseisvalt.
- Ka näiteks sõbra või kursusekaaslase abi tuleks viidata: https://libraryguides.vu.edu.au/ieeereferencing/personalcommunication
- Tehisaru kasutus (nt ChatGPT) peab olema viidatud – mis ulatuses ja mille jaoks kasutasid
- Viited allikatele peavad olema täpsed. Näiteks viitena stackoverflow.com või google.com ei sobi. Viide peab olema konkreetsele leheküljele kust informatsioon pärineb.
- Viitamiseks kasutatakse IEEE stiili
- Ekraanitõmmis(ed) töötavast programmist
- Ekraanitõmmised võivad olla esitatud kas lisana või põimituna lahenduse kirjelduse sisse
- Ekraanitõmmistel peab näitama nii programmi tööd tavaolukorras kui eriolukordades
Lisaülesanne boonuspunktide teenimiseks
Kodutöö eest on võimalik saada kuni 15 boonuspunkti. Boonuspunktide saamiseks peavad lisaülesande raames tehtud täiendused olema aruandes kirjeldatud. Boonuspunkte on võimalik ka saada osaliselt, kui kõik nõuded ei ole täidetud.
Boonuspunktide saamiseks tuleb lisaks ülesande baasnõuetele täita järgmised nõuded
- Kood peab olema korrektselt struktureeritud. Kompileerimiseks tuleb kasutada Makefile’i.
- Kood on tükeldatud mitmeks koodi- ja päisefailiks
- Kood peab olema jaotatud alamkaustadesse (st kõik failid ei tohi paikneda juurkaustas)
- Makefile’is tuleb minimaalselt tuleb kasutada muutujaid CFLAGS ja CC.
- Makefile peab minimaalselt sisaldama retsepte all ja clean .
- Makefile peab olema kirjutatud selliselt, et see toetaks ainult uuendatud koodifailide ümberkompileerimist
- Ülejäänud Makefile’i keerukus on jäetud autori otsustada
- Logimise jaoks pead looma iseseisva teegi
- Teek peab olema täielikult sõltumatu. extern ’i kasutada ei tohi.
- Teek peab toetama logifaili nime seadistamist
- Teek peab toetama erinevaid logimise tasemeid. Tasemed peavad olema realiseeritud loendi tüübina.
- Teek peab toetama logitaseme määramist. Logisid mis on madalama tähtsusega kui määratud logimise tase ei väljastata.
- Iga logimise väljakutsel tuleb määrata vastava logikirje tase
- Kõik olekumuutujad (logifaili nimetus, failiviit, logimise tase jne) hoiustatakse logi teegi sisemiselt. Nende poole ei tohi otse pöörduda, vaid selleks peab kasutama logimise teegi vastavaid funktsioone.
- Programm peab olema võimeline töötama tekstiväljadega, mis koosnevad mitmest sõnast.
- Aruandesse tuleb lisada täiendav esimese astme nummerdatud pealkiri “Lisaülesanded”.
- Kirjelda lisaülesande raames lisatud funktsionaalsust
- Selgita kuidas saab sinu logimise teeki kasutada teistes projektides, kui seda sooviks teha mõni teine arendaja? Lisa spetsifikatsioon peamiste funktsioonide kohta, mida peaks teadma inimene, kes sinu teeki kasutada soovib – st milliseid funktsioone ta saab (või peaks) sinu teegist välja kutsuma. Ära loetle funktsioone, mis on loodud teegi sisemise töö jaoks.
- Selgita oma valitud andmefaili formaadi tugevusi ja nõrkusi. Kas sinu valitud formaadil on piiranguid andmetele, mida see selles hoida saab?
- Selgita oma Makefile’i koostamisel tehtud otsuseid – millised käsud, muutujad jms otsustasid lisada ning miks. Kas jätsid ka midagi teadlikult välja? Loetle kõik Makefile’is olevad retseptid, mis on mõeldud otse välja kutsumiseks (st ei ole mõeldud vaid osana teisest retseptist)
Tähtaeg ja punktid
Terviklik kodutöö tuleb esitada hiljemalt 26.04.2026
Kodutöö tähtaja ületamisel vähendatakse töö eest saadavat lõpptulemust 1 punkti võrra iga esitamistähtajast üle läinud päeva eest. Maksimaalselt vähendatakse tulemust 30 punkti võrra.
Kui kodutöö kohta tekib täiendavaid küsimusi või esineb kahtlusi autorluses, hinnatakse kodutöö tulemusega 0 punkti. Sellisel juhul tuleb punktide saamiseks kodutöö kaitsta.
Vajadusel rakendatakse [Vääritu käitumise menetlemise korda].
Viimane päev kodutöö esitamiseks ja kaitsmiseks on märgitud sissejuhatavatel slaididel. Pärast antud kuupäeva kodutöid esitada ei ole võimalik!
Esitamine
Kodutöö esitatakse Moodle kursuses Kodutöö 2 ülesande alla.
Esitada tuleb järgnevad failid
- Dokumentatsioon (PDF)
- Kõik vajalikud koodi- ja päisefailid (.c ja .h) programmi kompileerimiseks
- Andmefailid programmi jooksutamiseks
Olenevalt loodud lahendusest võib olla vajalik esitada ka Makefile (mitu koodifaili, teine koodimisstandard, lisaülesanne, ..).
Failide nimetamiskuju: HW2_<lastname>[_filename]
Märkus: Nimetamiskuju kehtib vaid Moodlesse otse laetavate failide kohta. Kui laed koodi üles zip arhiivina, siis arhiivi sees paiknevatele failidele nimekuju ei kehti. PDF peab olema üles laetud eraldi failina, olenemata kas rakenduse on esitatud kokku pakituna või mitte!
Näide (eraldi failid):
HW2_Tamm.c
HW2_Tamm.h
HW2_Tamm_report.pdf
HW2_Tamm_data_students.txt
HW2_Tamm_data_grades.txt
Näide (kokku pakituna):
HW2_Tamm_project.zip
HW2_Tamm_report.pdf
NB! Kui sa muutsid failide nimesid vahetult enne üleslaadimist, siis veendu, et su rakendus on jätkuvalt kompileeritav ja töötab!
Tulemused ja tagasiside
Pärast töö kontrollimist leiad Moodlest oma punktid ning tagasiside (nähtav vaid hinnetelehet!). Korralikult tehtud töö korral võib tagasiside puududa.
Kodutöö parandamine
Kodutöö tulemust on võimalik parandada kuni kodutööde lukustamise kuupäevani. Parandatud kodutööd kuuluvad kaitsmisele.
Kodutöö parandamiseks vaata esmalt läbi oma töö tagasiside. Seejärel võta ühendust õppejõuga, et kokku leppida parandamise protsess.
NB! Kui töö parandamise käigus osutub vajalikuks enama kui poole töö muutmine, loetakse seda uue töö esitamiseks, millelt võidakse arvestada maha miinuspunktid vastavalt esitamise ajale.