PR2ET7: Dünaamiline mälu 1

Praktikumi materjal

Praktikumi ülesanded

Selle praktikumi ülesandeks on luua juhuandmete generaator. Ülesannet laiendab kaks lisaülesannet.

Ülesanne [W07-1]: Juhuandmete generaator

Praktikumiülesandeks on koostada juhuandmetega andmefaili generaator. Selliseid generaatoreid kasutatakse sageli rakenduste testimiseks enne, kui saadakse ligipääs reaalsetele andmetele. Päris mitmetes selle kursuse praktikumiülesandes on testandmed genereeritud sarnasel viisil.

NB! Kuigi üks soovituslikest juhuandmete genereerimise viisidest on kasutada tehisaru, siis alati ei tööta see just kuigi hästi või osutub absurdselt kalliks – nt kui soovid genereerida miljoneid ridu keerukaid andmeid.

Lae alla aluskood: https://blue.pri.ee/ttu/files/iax0584/aluskoodid/7_generator_starter.zip

Nõuded
  • Ehita oma rakendus ette antud aluskoodi põhjale
  • Küsi kasutajalt, mitu kirjet ta soovib genereerida. Ülempiiri luua ei tohi!
  • Kõik kirjed salvestatakse genereerimise käigus struktuurimassiivi, mis luuakse kasutades dünaamilist mälu
  • Vali juhuslikult etteantud valimitest välja eesnimi, perenimi ja  õppekava kood
  • Genereeri juhuslikult sisseastumispunktid (nt 24,7)
    • Punktid on vahemikus 10,0 – 30,0 punkti. Otspunktid on kaasatud.
    • Täpsus on 0,1 punkti
  • Sorteeri genereeritud andmed perenime järgi. Kui perenimed ühtivad, sorteeri eesnime järgi.
  • Väljund kirjuta faili järgnevas vormingus:
    <indeks> <perenimi> <eesnimi> <õppekava kood> <sisseastumispunktid>
    • Indeks on unikaalne täisarv. Esimese kirje indeks on 0, igal järgneval suureneb see 1 võrra.
  • Veendu, et kogu mälu on programmi lõppedes vabastatud kasutades Valgrind’i
Töövoog
  • Loo vajalik struktuuri kirjeldus, salvesta see päisefaili
  • Küsi kasutajalt mitu kirjet tuleks genereerida
  • Küsi mälu vajalike kirjete hoidmiseks. Kontrolli, et mälu saadi!
  • Genereeri vajalikud kirjed
    • Iga isiku jaoks pead genereerima kõik väljad juhuslikult
    • Eesnimi, perenimi ja õppekavakood tuleb juhuslikult valida olemasolevatest valimitest. Selleks pead genereerima täisarvu (nt mitmes eesnimi valimist)
      Vihje: Sa võid nime kas kopeerida enda struktuuri või hoiustada vaid viita nimele
    • Genereeri vastuvõtupunktid (10,0 <= punktid <= 30,0 täpsusega 0,1)
      Vihje: Mõtle matemaatilistele omadustele – nt mis vahe on 30 ja 300!? rand() funktsioon tagastab alati täisarvu ning seda muuta ei saa.
  • Sorteeri massiiv
    • Mõtle ka miks on siin halb idee kasutada eksponentsiaalse keerukuse kasvuga meetodeid (bubble/insertion/selection)
  • Kirjuta andmed väljundfaili
  • Vabasta mälu

Kontrolli oma rakendust kasutades valgrindi! Seda mitte ainult lõpus, vaid ka siis, kui rakendus käitub imelikult või jookseb kokku!

Qsordi võrdlusfunktsioon

Pakun välja kaks erinevat võrdlusfunktsiooni võimalust. Vali see millest saad paremini aru, või kirjuta enda lahendus.

Esimene näide kasutab tüübiteisendusi jooksvalt, vältides lisamuutujate loomise vajadust.

Teine näide sisaldab lisaviitasid, mis võtavad täiendavalt mälu, kuid lihtsustavad koodi loetavust.

Testimine

Rakenduse väljund on võrdlemisi lihtne ja lühike

Kontrolli oma väljundfaili ning veendu tulemuste korrektsuses. Sinu väljundfail saab olema erinev, andmed on juhuslikult genereeritud.

Lisaülesanne 1 [W07-2]: Väljundfaili formaat

Esimese lisaülesande käigus lisad oma lahendusele CSV formaadi toe. Kasutaja saab valida sobiva väljundformaadi – kas tühikutega või komadega eraldatud väljundfail.

Nõuded
  • Lisa oma programmile võimekus genereerida andmeid CSV formaadis
    • Esimene rida CSV failis peab olema päis, mis sisaldab genereeritud andmeväljade nimetusi
    • Sellele järgnevad genereeritud andmeread. Iga andmeväli peab olema eraldatud komaga. NB! CSV failis koma järele tühik ei käi!
  • Küsi kasutajalt kummas formaadis ta soovib faili genereerida (tühikutega eraldatud või CSV) ning genereeri sobilik väljundfail.
  • Tühikutega eraldatud faili laiendiks peab olema .txt , komadega eraldatud faili laiendiks peab olema .csv .
  • Veendu, et CSV fail on korrektselt genereeritud – proovi avada või importida genereeritud faili kasutades Libreoffice Calc’i või Microsoft Office’it ja kontrolli kas väljad tuvastati korrektselt.

Lisaülesanne 2 [W07-3]: Seadistused

Selles lisaülesandes muudame oma generaatori paindlikumaks ja lisame seadistuste võimekuse.

Nõuded
  • Kõik seaded tuleb hoida struktuuri liikmetena – loo uus struktuuri kirjeldus seadistuste hoidmiseks
  • Kõigil seadistustel peavad olema vaikeväärtused
  • Kui kasutaja ei soovi seadistusi muuta, peab programm kasutama vaikeväärtusi. Kuidas kasutaja muutmissoovist teada peab andma, võid ise otsustada.
    Näiteks võib programm seda esimese asjana käivitudes küsida või saab kasutaja käivitada programmi kindla käsureaargumendiga, mis seadistuse avab.
  • Kasutajal peab soovi korral olema võimalik muuta järgnevaid seadistusi
    • Millised andmeväljad genereeritakse (iga andmevälja peab olema võimalik sisse-välja lülitada)
    • Väljundfaili nimi (ainult nimeosa, faililaiend valitakse automaatselt lähtuvalt valitud väljundformaadist!)
    • Väljundformaadi valik (lisaülesande 1 osa, tõsta struktuuri sisse)
    • Genereeritavate kirjete arv (baasülesande osa, tõsta struktuuri sisse)
    • Sisseastumispunktide vahemik (alam- ja ülempiir)
  • NB! Genereeritavate kirjete arvu tuleb küsida olenemata sellest, kas kasutaja soovis seadeid muuta või mitte. Eesmärk on hoida kõik seadistused vastavas struktuuris koos.
  • Kasutajale tuleb kuvada ülevaade genereerimisel kasutavatest seadetest. Seda olenemata kas ta soovis neid muuta või mitte.

Märkus: Soovi korral võid seadistuste väärtusi hoida eraldi failis, kuid see pole vajalik. Kasutaja tehtud muudatusi seadetesse ei ole vaja meeles pidada järgmisel programmi käivitamisel. Küll aga kui sa soovid seadefaili kasutada, siis veendu, et kasutaja saab seadistusi muuta läbi programmi (ilma, et ta peaks seadefaili käsitsi muutma).

Vihje: Siin saab kolmikoperaatorit hõlpsasti ära kasutada
printf("First name: %10s\n", settings.genFirstName ? "Yes": "No");

Pärast seda tundi peaksid

  • Oskama kasutada dünaamilist mälu
  • Oskama kontrollida, kas programmis on mälulekkeid
  • Teadma, mis olukorras on dünaamilist mälu mõistlik kasutada ja millal mitte
  • Teadma dünaamilise mälu võludest ja valudest
  • Tegema vahet pinumälul ja kuhjal ning mis muutujad kuhu lähevad.

Täiendav materjal