Kodutöö II

Selgitused võtmete kohta (PK/FK)

PK (primary key) – primaarvõti, unikaalne tunnus, millega tuvastada ära konkreetset kirjet (andmebaasi rida). Tüüpiliselt täisarvuline, kuid ei pea ilmtingimata seda olema. Ühe tabeli või faili kohta saab olla vaid üks primaarvõti. Kõigis tabelites või failides peab olema primaarvõti.

FK (foreign key) – välisvõti. Selle abil luuakse seos teises tabelis või failis oleva primaarvõtmega. Kui primaarvõti ja välisvõti ühtivad, siis need 2 kirjet on seotud. Ühes failis võib olla mitu erinevat välisvõtit ning välisvõtmed ei ole unikaalsed.

Primaarvõti ja välisvõti moodustavad omavahel relatsioonilise suhte.

Nt: ühel inimesel võib olla mitu last; ühel inimesel võib olla mitu kinnisvaraobjekti; ühe tšeki peal võib olla mitu toodet; ühel õpilasel võib olla mitu aine deklaratsiooni; 

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. Kokkuleppel tohib kasutada ka uuemaid standardeid (nt C11, C17, C23).

Lisaks C standardteekidele tohid kasutada ka C POSIX ja GNU C teeke. Teiste teekide kasutamine väljaspool eelmainituid tuleb eelnevalt kokku leppida õppejõuga!

Esitatud lahendus kompileeritakse ja testitakse laboris oleva Linux seadistusega võrdväärses keskkonnas (nt OpenSUSE SLED-15 SP5 ja GCC-12) või soovitusliku koduse seadistusega (Ubuntu Linux 24.04 ja GCC-13). Ü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 .c 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 peaksid 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 või puid
    • Küsitav mälumaht peab olema sõltuv andmefaili pikkusest
    • Rakendus peab küsima täpselt nii palju mälu kui andmete hoiustamiseks on vaja
    • Rakendus peab toimima ka siis, kui andmefailide pikkused muutuvad
    • Ühtegi tehislikku piirangut andmefaili kirjete arvule ei tohi rakendusse kodeerida
    • Muutuva pikkusega andmeväljad (nt sõned) tuleb hõivata  kasutades dünaamilist mälu, vastavalt vajaminevale mälumahule. Fikseeritud pikkusega sõned jäävad staatiliseks.
    • Puhvrid võivad olla loodud kas staatiliselt või dünaamiliselt, olenevalt kuidas sa neid kasutad (fikseeritud pikkusega või dünaamiliselt laienev puhver)
  • Loodavad struktuurid peaksid olema sobilikud sinu variandile
    • Minimaalselt pead hoidma struktuurides kõik andmeväljad, mis on failides
    • Sa võid lisada täiendavaid liikmeid struktuuridesse
    • Sa võid lisada ka täiendavaid struktuure toetamaks oma ülesande lahendust
    • Kui su andmed sisaldavad kuupäevasid või kellaaegu, siis tuleb nende hoiustamiseks luua alamstruktuuri (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 neid lisada juurde
    • Iga tegevuse tulemus kuvatakse ekraanil
  • Kui ülesande raames tehakse muudatus andmetesse – st lisatakse, muudetakse või kustutatakse andmeid, siis see peab jäädavalt salvestuma. St kui rakendus suletakse ja seejärel uuesti käivitatakse, peavad olema kasutusel juba muudetud andmed
  • Rakendus peab oma tööst kirjutama logifaili
    • Iga kasutaja tegevus rakenduses logitakse
    • Logis peavad salvestuma ka kasutajale mittenähtavad sündmused (nt programmi käivitamine, edukas sisendfaili lugemine jne)
    • Logi peab sisaldama kellaaega ja kuupäeva. Varasemad logid peavad säilima. Iga logikanne paikneb eraldi real.
  • Programm peab pakkuma mõistlikku kasutajakogemust (UX – user experience)
    • Programm peab teavitama kasutajat vigade esinemisel arusaadavalt. Vea kirjeldus peab olema võimalikult täpne (abistav probleemi lahendamisel). Kõik veateated kirjutatakse stderr  standardvoogu.
    • Kui kasutajalt oodatakse täiendavat sisendit, peab selle päring olema arusaadav. 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 konkreetse teateaga.
  • Programmis puuduvad mälulekked, raisatud või vabastamata ressursid. Kõik ressursid mida su rakendus töö jaoks vajab ja hõivab tuleb enne programmi sulgemist tagastada (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 rohkem (zero to many) seos (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 on 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 tööga mitu andmefailide komplekti rakenduse erinevate võimekuste demonstreerimiseks, kehtib pikkuse piirang vaid ühele neist

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

Rõhk on korralikult struktureeritud dokumentatsioonil! Väldi jutustamist (erandina kokkuvõte).

  • Tiitelleht
  • Autorideklaratsioon
  • Lühendite ja mõistete sõnastik (vajadusel)
  • Sisukord
  • Jooniste ja tabelite loetelu (vajadusel)
  • Ü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).
    • Struktuuride kirjeldus (iga struktuuri kohta)
      • Struktuuri eesmärk
      • Iga struktuuri liikme kohta nimi, andmetüüp ja kirjeldus.
    • 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)
  • Ekraanitõmmis(ed) töötavast programmist
    • Ekraanitõmmised võivad olla pandud lisana, kuid võivad olla ka põimitud lahenduse kirjelduse sisse – ekraanitõmmiste jagu võib lahenduse kirjeldus pikeneda lubatud maksimumist.
    • Ekraanitõmmised peaksid illustreerima erinevaid situatsioone millega sinu programm toime tuleb

Lisaülesanne boonuspunktide teenimiseks

Kodutöö eest on võimalik saada kuni 2 boonuspunkti. Boonuspunktide saamiseks peavad lisafunktsioonid olema kirjeldatud aruandes. Lisaülesannete osalise lahendamise eest on samuti võimalik punkte saada.

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
    • Kõik failid ei tohiks asuda projekti juurkaustas, vaid peaks olema tehtud vähemalt lihtne jaotis alamkaustadesse.
    • Makefile’is tuleb minimaalselt tuleb kasutada muutujaid CFLAGS ja CC. Kompilaatoriks määra gcc, gcc-12 või gcc-13
    • 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 ka konkreetse 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.
  • Andmefailide eraldajaks peab kasutama kas koma või semikoolonit (lihtsustatud CSV formaat on aktsepteeritud, https://en.wikipedia.org/wiki/Comma-separated_values).
  • Hea struktuur, optimaalne koodikasutus, kiired algoritmid, veakindlus (mõistuse piires).
  • Ühtegi mälukaotust ei tohi eksisteerida (http://valgrind.org/). Lisa tõestus aruandesse!
  • Aruandesse tuleb lisada täiendav esimese astme nummerdatud pealkiri “Lisaülesanded”, mis kirjeldab lisaülesande raames lisatud funktsionaalsus.

Tähtaeg ja punktid

Terviklik kodutöö tuleb esitada hiljemalt 27.04.2025

Kodutöö tähtaja ületamisel vähendatakse lõpptulemust 1 punkti võrra igal hilinetud nädala kohta. Maksimaalselt vähendatakse tulemust 5 punkti võrra, st esitades töö 7 nädalat hiljem kaotad ikkagi 5 punkti töö tulemusest.

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 koodifailid (.c ja .h)
  • Andmefailid programmi jooksutamiseks
  • Kui sul on rohkem kui üks koodifail (.c), lisa Makefile oma programmi kompileerimiseks.
  • Rakenduse võid üles laadida kokku pakitult .zip arhiivina.
    • Ära lae üles ajutisi või arvutist sõltuvaid faile (nt objektfailid, kompileeritud rakendus, …)
    • NB! Dokumentatsioon (pdf) tuleb laadida eraldiseisvalt üles ja ei tohi olla arhiivi sees!

Nimetamisreegel: HW2_<firstname>_<lastname>_<studentcode>

Näide (eraldi failid):

HW2_Heli_Kopter_123456IASB.c
HW2_Heli_Kopter_123456IASB.h
HW2_Heli_Kopter_123456IASB_documentation.pdf
HW2_Heli_Kopter_123456IASB_data_students.txt
HW2_Heli_Kopter_123456IASB_data_grades.txt

Näide (kokku pakituna):

HW2_Heli_Kopter_123456IASB_solution.zip
HW2_Heli_Kopter_123456IASB_documentation.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 protsessis.

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.