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öö I raames tuleb luua programm ja koostada aruanne tehtud töö kohta.

Kodutöö fookuses on dünaamilise mälu kasutamine ning suuremahulisema rakenduse kirjutamine.

Kodutöö variant

Nõuded koodimisstandardile ja keskkonnale

Loodav programm peab olema kirjutad C programmeerimiskeeles. Kasutada tohib C90, C99 koodistandardeid. Kokkuleppel tohib kasutada ka uuemaid standardeid (nt C11, C17).

Lisaks C standardteekidele tohid kasutada ka C POSIX, GNU C ja ncurses teeke. Teiste teekide kasutamine väljaspool eelnimetatut ainult kokkuleppel!

Esitatud lahendus kompileeritakse ja testitakse laboris oleva Linux seadistusega võrdväärses keskkonnas (nt OpenSUSE SLED-15 SP5 või Ubuntu Linux 22.04 koos GCC-12 kompilaatoriga). Ühilduvus teiste operatsioonisüsteemidega (Windows, MacOS) pole vajalik.

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 (mõtle relatsiooniliste andmebaaside peale).
    • Andmete vahel on üks-mitmele (one to many) suhe (nt üks õpilane saab deklareerida mitu õppeainet).
    • On võimalik, et ühtegi vastet ei ole (õpilane ei ole deklareerinud ühtegi õppeainet).
  • Töö autor loob 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. Kui autor esitab tööga mitu andmefaili erinevate olukordade näitamiseks, kehtib pikkuse piirang vaid ühele neist.
  • Esimeses failis (kus on ainult primaarvõti) peab olema vähemalt 10 kirjet. Teises failis (mis sisaldab ka välisvõtit) peab olema vähemalt 15 kirjet.

Nõuded loodavale rakendusele

Loodav rakendus peab jälgima kõiki parimaid praktikaid, mida on tutvustatud Programmeerimine 1 ja 2 õppeainetes.

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.

Üldnõuete loetelu

  • Programmi lähtekood peab olema tükeldatud enamaks kui üheks failiks. Täpne failide arv ja jaotus on autori otsustada.
    • Mitme .c koodifaili puhul tuleb lisada Makefile oma lahenduse kompileerimiseks
  • Viimaste õpitud teemade korrektne rakendamine oma programmis.
  • Andmed loetakse programmi mällu kahest eraldi andmefailist.
  • Vaikimisi andmefailide nimed peaksid olema rakendusse sisse kirjutatud. Sa võid soovi korral käsurea argumente kasutada, kuid see ei tohi olla eeldus programmi kasutamiseks.
  • Andmed hoitakse dünaamiliselt loodud andmestruktuurides (kasuta dünaamilist mälujaotust!)
    • 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 sisse kodeerida.
    • Muutuva pikkusega andmeväljad (nt sõned) tuleb hõivata dünaamilist mälu kasutades (char [] asemel char *). Fikseeritud (alati sama) pikkusega sõned ja massiivid peaksid olemastruktuuri sees  staatilised.
    • Puhvrid võivad olla loodud kas staatiliselt või dünaamiliselt, olenevalt kuidas sa neid kasutad (fikseeritud pikkusega või dünaamiliselt laienev puhver).
  • Andmestruktuurina võid kasutada dünaamiliselt moodustatud massiive, ahelloendeid või puid.
  • 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 sa pead looma nende hoiustamiseks alamstruktuuri (nested structure) või kasutama sobilikku andmestruktuuri time.h  teegist.
  • Kõik 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 tegevus rakenduses logitakse
    • Logis peavad olema ka kasutajale mittenähtavad tegevused (nt programmi käivitamine, edukas sisendfaili lugemine jne).
  • Programm peab pakkuma mõistlikku kasutajakogemust (UX)
    • Kui midagi läheb valesti või katki, anna sellest kasutajale teada
    • Kui ootad sisendit, siis kirjuta mida sisestama peaks. Võimalusel kirjuta ka näide (näiteks oodates kuupäeva kirjuta kuidas see tuleks sisestada)
    • Kui programm sisaldab otsingut, siis tulemuste puudumisel tuleks samuti teavitada kasutajat.
  • 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!)

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

  • Tiitelleht
  • Autorideklaratsioon
  • Lühendite ja mõistete sõnastik (vajadusel)
  • Sisukord
  • Jooniste ja tabelite loetelu (vajadusel)
  • Ülesande püstitus (variant)
  • Sisendfailide struktuuri kirjeldus
    • Ühe kirje struktuur (andmeväljade järjekord, eraldajad, …)
    • Andmeväljad – andmetüüp, näidisväärtus, andmete kirjeldus, piirangud nende olemasolul (nt pikkus, vahemik, keelatud väärtused)
    • Ühe andmerea näidis
  • 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! Maksimaalselt 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
  •  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.
    • Täiendavad kommentaarid, emotsioonid, mõtted.
  • Kasutatud kirjandus (vajadusel)
    • 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
    • Kui kasutasid tehisintellekti (nt ChatGPT), peab selle kasutus 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.
  • 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. Lisaülesannete osalise lahendamise eest on samuti võimalik punkte saada, kuniks see on dokumenteeritud nõuetekohaselt.

Boonuspunktide saamiseks tuleb lisaks ülesande baasnõuetele täita järgmised nõuded

  • Kood peab olema hästi struktureeritud – jaota oma kood mitme koodi- ja päisefaili vahel. Kompileerimiseks tuleb kasutada Makefile’i.
    • Minimaalselt tuleb kasutada muutujaid CFLAGS ja CC.
    • Kompilaatoriks määra gcc, gcc-12 või gcc-13
    • Ülejäänud Makefile’i keerukus on 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. Nimi hoiustatakse teegis sisemiselt.
    • Teek peab toetama erinevaid logimise tasemeid. Parasjagu kasutusel olev tase peab olema hoiustatud teegis sisemiselt.
    • Iga kord logi välja kutsudes peab andma sellele juurde ka logi taseme
    • Kõik olekumuutujad (logifaili nimetus, failiviit, logimise tase jne) võivad olla loodid globaalmuutujatena teegis sees, kuid nad ei tohi logi koodifailist välja paista – kasuta static  muutujaid.
    • Iga logirida peab sisaldama endas ajatemplit.
  • 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 21.04.2024 23:59:59 (kohalik aeg)

Tähtaja ületamisel iga hilinetud nädal võtab 1p maksimumist alla kuni 10p piirini. Miinuspunktid lukustuvad vaid juhul, kui töö on esitatud täismahus.

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 (arhiiviga):

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.