PR2ET3: Struktuurid

Praktikumi materjal

Praktikumis lahendatakse kommenteeritult koos läbi failist struktuuridesse lugemise näide. Neile, kes praktikumis ei osalenud, on see avaldatud koodinäitena: Failist struktuurimassiivi lugemise näide

Praktikumi ülesanded

Selles praktikumis on üks ülesanne, mida laiendab kolm lisaülesannet.

Ülesanne [W03-1]: Töötajate otsing

Ülesande eesmärgiks on õppida struktuure kasutama. Ülesanne ise matkib töötajate andmebaasi, kust on võimalik filtreerida töötajate andmeid vastavalt etteantud otsinguparameetrile.

Andmefail

Lae alla testandmed järgnevalt lingilt: https://blue.pri.ee/ttu/files/iax0584/andmefailid/3_data_short.zip

Andmefail koosneb juhugeneraatoriga loodud andmetest.

Nõuded

  • Loe failist ettevõtte töötajate andmed
    • Korduv faili lugemine programmi sees ei ole lubatud.
    • Failis on iga rea kohta üks kirje
    • Iga andmeväli on eraldatud tühikuga. Andmeväljad on ühesõnalised.
    • Andmete struktuur failis
      <eID> <first_name> <last_name> <city>
  • Programmis tuleb andmeid hoida struktuuridest koosnevas massiivis.
  • Programm peab töötama olukorras, kus andmete täpne arv pole teada ning see võib ajas muutuda (näiteks värvatakse uus töötaja, senine töötaja lahkub).
    • Loo programmile mõistlik limiit ning veendu, et sellest üle ei mindaks!
    • Kui andmefailis on rohkem andmeid kui mahub, väljasta vastav hoiatus.
  • Programm peab lubama käskude ja otsingute korduvat tegemist ilma taaskäivitamata
  • Luba programmi kasutajal teostada otsingut linna nime järgi
    • Programm väljastab kõik töötajad, kes sisestatud linnas elavad
    • Näita mitu vastet mitmest leiti (nt [0 / 91])
    • Otsingut peab saama sooritada korduvalt ilma programmist väljumata
    • Baasülesandes väljasta kõik andmed – isikukood, perenimi, eesnimi, linn
  • Programm peab toetama käskude töötlemist
    • Käsud algavad kooloniga – sedasi tuleb eristada kas sisestati käsk või otsisõna
    • Käsuga “:all” väljastatakse kõigi isikute loetelu
    • Käsuga “:exit” sulgetakse programm

Vihjed

Käskude töötlemine võib kõlada hirmutavalt, kuid tegelikult on lahendus väga primitiivne. Kõike seda õppisid juba Programmeerimine 1 sõnede tunnis. Kokku on vaja teha 3 sammu:

  1. Tuvasta, kas kasutaja sisestas käsu – kontrolli kas 0-nda indeksi peal on kooloni sümbol. See oli ka üks näidetest sügisel.
  2. Loo viit, mis näitab teise tähemärgi aadressile ( char *command = input + 1; ) – see on viidaaritmeetika esimesest nädalast, mida kasutasid ka eelmine nädal faili laiendi asukoha määramiseks.
  3. Võrdle sisestatud käsku toetatud käskudega.

Programmi näidisväljund

Esimeses näites vaatame käsu töötlemist. Kui käsku ei tuvastata, antakse vastav veateade. Kui käsk sisestatakse ilma eelneva koolonita, teostatakse hoopis linna nime järgi otsing (vaikimisi käitumine).

Teises näites vaatame, kuidas toimub otsimine.

Pane tähele, et “:list” käsu näite jätsime vahele – see läheks liialt pikaks.

Viimases näites näed programmi väljundit, kui kõik lisaülesanded on tehtud. Väljud on pikk, seega pead selle käsitsi lahti klikkima.

Kliki mind, et näha väljundit

Lisaülesanne 1 [W03-2]: Linnade nimistu

Nõuded

  • Linnade nimistu kuvamiseks lisa menüüsse käsk “:list”
  • Kuva kasutajale kõik failis olevad linnad
  • Linnade nimistu peab olema järjestatud tähestiku alusel
  • Linnade nimekiri koostatakse programmi poolt töö ajal, vastavalt sisendfailis esinevatele linna nimedele
  • Linnade nimekirja peab saama kuvada korduvalt
  • Linnade nimekirja tohib koostada programmi töö vältel vaid ühe korra.

Lisaülesanne 2 [W03-3]:  Mugavam otsing

Nõuded

  • Otsing ei tohi olla tõstutundlik. Näiteks otsides linna TALLINN  või tallinn , tuleb kuvada kõik töötajad, kes elavad Tallinnas.
  • Otsing peab toetama osalist vastet. Näiteks otsides all  leitakse nii need, kes elavad Kallastel, kui ka need, kes elavad Tallinnas.
  • Mõlemad peavad töötama ka korraga. St eelnev tulemus peab olema leitav ka otsides ALL  või  aLL.
    NB! Märka, et :all  on käsklus kõigi töötajate kuvamiseks ning ALL  on otsing, mille tulemusena leitakse andmefailist töötajad Tallinnas ja Kallastel.

Lisaülesanne 3 [W03-4]: Töödeldud isikukood

Nõuded

  • Ära kuva vastuste hulgas enam isikukoodi
  • Kuva töötaja sünniaeg formaadiga d. MMMM yyyy

Isikukoodi formaadi kohta saad lugeda: https://www.riigiteataja.ee/akt/114022017005

Vajuta mind, et näha selgitusi kuupäeva ja kellaaja vormingu kohta

m – Minutid vahemikus 0 – 59.
mm – Minutid vahemikus 00 – 59. Minutitele 0 – 9 lisatakse ette number null.

h – Tunnid vahemikus 1 – 12.
hh – Tunnid vahemikus 01 to 12. Tundidele 1 – 9 lisatakse ette number null.
H – Tunnid vahemikus 0 – 23
HH – Tunnid vahemikus 00 – 23. Tundidele 0 – 9 lisatakse ette number null.

d – Päevad vahemikus 1 – 31
dd – Päevad vahemikus 01 – 31. Päevadele 1 – 9 lisatakse ette number null.
ddd – Päevad lühinimega ( E / Mon; T / Tue; K / Wed; …)
dddd – Päevad täispika nimega (esmaspäev / Monday; teisipäev / Tuesday; kolmapäev / Wednesday; …)

M – Kuud vahemikus 1 – 12
MM – Kuud vahemikus 01 – 12. Kuudele 1 – 9 lisatakse ette number null.
MMM – Kuu lühinimi (jaan / Jan; veebr / Feb; märts / Mar; apr / Apr; …)
MMMM – Kuu täispika nimega (jaanuar / January; veebruar / February; Märts / March; …)

y – Aasta vahemikus 0 – 99
yy – Aasta vahemikus 00 – 99
yyy – Aasta, minimaalselt kolme numbriga (1 -> 001; 15 -> 015; 145 -> 145; 1949 -> 1949)
yyyy – Aasta nelja numbriga

Pärast seda tundi peaksid

  • Teadma, kuidas deklareerida uusi struktuure – st uus andmetüüp, milleks on struktuur
  • Oskama valida struktuuri liikmeid
  • Teadma, mis on struktuuri polsterdamine ja joondamine ning kuidas see mõjutab struktuuri suurust mälus
  • Teadma, mis mõjutab struktuuri suurust
  • Teadma, millised operaatorid on kasutusel struktuuri liikmete poole pöördumiseks ja oskama kasutada punkt-operaatorit
  • Teadma, kuidas luua struktuuridest koosnevat massiivi ja lugeda andmeid failist struktuurimassiivi
  • Teadma, kuidas omistada terviklikku struktuuri
  • Teadma, kuidas defineerida andmetüüpe ümber, andes neile uue nime (typedef)

Täiendav materjal