Praktikumi materjal
- Slaidid: Struktuurid
- Täiendav koodinäidis: Struktuurimassiivi näide
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:
- Tuvasta, kas kasutaja sisestas käsu – kontrolli kas 0-nda indeksi peal on kooloni sümbol. See oli ka üks näidetest sügisel.
- 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.
- 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).
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
risto@risto-lt:~/pr2/wk3_struct1$ ./task_basic 03_data_short.txt Available commands :exit | close the program :all | print everyone in the database Enter a city name to search or a command > :add Error! Unknown command! Available commands :exit | close the program :all | print everyone in the database Enter a city name to search or a command > exit Searching for: exit Employees listed [0/150] Available commands :exit | close the program :all | print everyone in the database Enter a city name to search or a command > :exit risto@risto-lt:~/pr2/wk3_struct1$ ./task_basic 03_data_short.txt |
Teises näites vaatame, kuidas toimub otsimine.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
risto@risto-lt:~/pr2/wk3_struct1$ ./task_basic 03_data_short.txt Available commands :exit | close the program :all | print everyone in the database Enter a city name to search or a command > Sindi Searching for: Sindi Saar, Anne City: Sindi eID: 49112012007 Mitt, Keit City: Sindi eID: 48012281578 Kallas, Ivari City: Sindi eID: 50107042125 Employees listed [3/150] Available commands :exit | close the program :all | print everyone in the database Enter a city name to search or a command > :exit |
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.
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
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
- Structures in C
https://www.geeksforgeeks.org/structures-c/ - Structure Member Alignment, Padding and Data Packing
https://www.geeksforgeeks.org/structure-member-alignment-padding-and-data-packing/ - Typedef in C
https://www.geeksforgeeks.org/typedef-in-c/ - Why to avoid typedefs with structs (by Linus Torvalds, author of Linux Kernel and Git)
https://yarchive.net/comp/linux/typedefs.html - Structure padding in C
https://www.scaler.com/topics/structure-padding-in-c/ - C structures
https://www.tutorialspoint.com/cprogramming/c_structures.htm - Comprehensive list of date and time formats used in .Net.
https://learn.microsoft.com/en-us/dotnet/standard/base-types/custom-date-and-time-format-strings