Týždeň 3

štruktúrované údajové typy, používateľom definované údajové typy, zoznamy údajov, vyhľadávanie v zozname údajov

Oznamy

Štruktúrovaný údajový typ

Motivácia

  • Na predmete Základy algoritmizácie a programovania ste sa venovali najmä tzv. jednoduchým alebo ináč nazývaným aj primitívnym údajovým typom (slide). Výlučne s nimi si však do konca života nevystačíme, pretože svet a problémy, ktoré budete riešiť, nebudú vždy také jednoduché. A dnes si ukážeme prečo.

  • Predstavte si napríklad, že vo svojom programe potrebujete opísať vlastnosti nejakého auta alebo osoby. Čo všetko by vás zaujímalo? (nechať študentov menovať jednotlivé vlastnosti a zapisovať si ich do súboru)

  • Ak by sme tieto vlastnosti mali reprezentovať v jazyku C, aké údajové typy by mali? (k vymenovaným vlastnostiam začať písať údajové typy)

  • Máme k dispozícii niekoľko vlastností, pomocou ktorých vieme opísať nejakú osobu. Čo ak by sme však potrebovali opísať viac ako jednu osobu? Čo ak by sme potrebovali vytvoriť informačný systém, ktorý bude pracovať s tisíckami takýchto osôb? Čo ak budeme potrebovať funkciu, ktorá spracuje informácie o konkrétnej osobe?

  • Jazyk C umožňuje pracovať s tzv. štruktúrovanými typmi údajov, resp. štruktúrami (slide). Význam je podobný ako tomu bolo v jazyku Pascal, kde sa na tento účel používal údajový typ record.

  • Podobný prístup je možné vidieť napr. aj v relačných databázach, kde entita (tabuľka) reprezentuje štruktúrovaný údajový typ a konkrétny riadok v tabuľke hovorí o konkrétnom objekte, resp. zázname.

Vytvorenie štruktúrovaného údajového typu

  • Na vytvorenie štruktúrovaného údajového typu (štruktúry) sa používa kľúčové slovo struct nasledovne:

  • Zamyslime sa však nad reprezentáciou veku osoby. Je dobré vek udržiavať ako celé číslo? Ak ho totiž budeme udržiavať v takejto forme, musíme ho v pravidelných intervaloch aktualizovať. A otázkou je, že kedy? Znie celkom logicky, že by to mohlo byť 1. januára, ale človek, ktorý má narodeniny až 31. decembra, bude o rok starší už podstatne skôr. Ak chceme mať teda presnú informáciu o veku, toto nie je správne riešenie, ako sa popasovať s týmto problémom. Keď budete mať v druhom ročníku databázové systémy, takéto riešenie pre reprezentáciu údajov budete považovať za porušnie tzv. 3. normálnej formy, pretože sa jedná o tzv. dopočítavaný údaj.

  • Ako teda reprezentovať v počítači dátum a čas?

  • Tento problém zatiaľ odložme bokom a uvažujme nad štruktúrou Person bez položky age:

  • Tým sme vytvorili štruktúru s názvom Person. Ak chceme vytvoriť premennú, ktorá bude daného údajového typu, zadeklarujeme ju v tvare:

typedef

  • V jazyku C sa môžete stretnúť s kľúčovým slovom typedef (slide), pomocou ktorého je možné zadefinovať nové meno pre niektorý už existujúci údajový typ. Jeho použitie si môžeme ilustrovať na nasledujúcom príklade:

  • Následne v kóde viem zadeklarovať premennú byte tak, že bude typu BYTE:

  • Tento zápis je ekvivalentný so zápisom:

  • Ak by sme teda chceli vytvoriť nový údajový typ na základe práve vytvorenej štruktúry Person, mohol by vyzerať nasledovne:

  • Následne je možné zadeklarovať novú premennú, ktorá bude typu PERSON:

  • Aj keď jazyk C tento spôsob podporuje, môžete sa stretnúť s rozličnými odporúčaniami ohľadom používania tohto spôsobu. Napríklad vývojári linuxového jadra to majú vyslovene zakázané a pokiaľ vytvárajú vlastné štruktúrované údajové typy, nepoužívajú kľúčové slovo typedef. Rovnako sa budeme správať aj my - v našich projektoch nebudeme používať kľúčové slovo typedef.

size_t

  • S niektorými údajovými typmi, ktoré boli vytvorené pomocou kľúčového slova typedef, sa je možné stretnúť bežne v knižniciach jazyka. Ak sa pozriete napr. na typ návratovej hodnoty funkcie strlen() z knižnice string.h (napr. pomocou man strlen), tak zistíte, že sa jedná o typ size_t a nie o typ int, ako sme si doteraz mysleli a aj používali. Čo za typ je teda size_t?

  • Tento údajový typ je zadefinovaný v hlavičkovom súbore stddef.h (man stddef.h). A je pri ňom uvedené, že:

    Unsigned integer type of the result of the sizeof operator.

  • Takže sa jedná o kladné celé číslo a jeho použitie je vhodné všade tam, kde sa pracuje s dĺžkou alebo indexom, napr. pri iterovaní pomocou cyklu for.

  • Použitie tohto údajového typu si ilustrujeme v rámci dnešných príkladov.

Size of Structured Type

Structure Initialization

Prístup ku položkám štruktúry

List of People

Searching

Conclusion

  • Dnes sme sa teda pozreli na štruktúry a štruktúrované údajové typy v jazyku C. Ukázali sme si ich základné použitie a realizovali sme operáciu vyhľadávania nad poľom štruktúr.

  • Nabudúce budeme v téme pokračovať a pozrieme sa, ako triediť takéto údaje a ukladať ich do súboru.

Additional Resources