Štruktúra, definícia
Štruktúry sa používajú pri riešení databázových úloh. Štruktúra je odvodený údajový typ podobne ako pole. Spoločným názvom nazývame pole a štruktúry – agregate typy. Definícia štruktúry – štruktúra je skupina objektov ľubovolného údajového typu s výnimkou typu void a typu funkcie. Objekty majú v rámci štruktúry svoje platné názvy. Zvykneme nazývať údajový člen alebo prvok štruktúry.
Deklarácie premennej typu štruktúra sa vykoná v dvoch krokoch: V prvom kroku musíme deklarovať samotný údajový typ štruktúry a v druhom kroku môžeme deklarovať premenné takéhoto údajového typu. Všeobecný tvar deklarácie údajového typu je nasledovný: Struct ident. štruktúry{typ 1 člen 1; typ 2 člen 2; typ N člen N; struct ident. štruktúry premenná 1, premenná2;
Príklad: pri písaní programu na obsluhu knižnice je vhodné použiť takúto štruktúru struct book{char autor[20]; char nazov[40]; int rok; int cena;}; struct book kniha 1, kniha 2, kniha 3.
Typedef struct book{char autor[20]; char nazov[40]; int rok; int cena; } book; struck book kniha1, kniha2, kniha3. Book kniha1, kniha2, kniha3.
Bez ohľadu na to či použijeme 1 alebo 2 možnosť vytvorili sme nový odvodený údajový typ. Prekladač údajové členy premenné typu štruktúra ukladá v pamäti v poradí ich deklarácie a názvy jednotlivých údajových členov štruktúry predstavujú vzdialenosť od počiatku premennej typu štruktúra a pomocou operátora sizeof vieme zistiť veľkosť údajového typu štruktúra.
Prístupové operátory
Deklarujeme 3 premenné typu štruktúra. Struct book k1, k2, *ps; Pre premenné k1 a k2 potrebnú pamäť obsadí prekladač – alokuje pamäť. Pointer ps je len deklarovaný. Na inicializáciu pointera máme 2 možnosti: Adresovaním PS: 1.) ps = & k1; Druhá možnosť spočíva v dynamickom alokovaní pamäte 2.) ps = (struct book*)malloc(sizeof(struct book)); robíme kontrolu: if(!ps) {printf(“\n Nedostatok pamäte”); exit(-1) }
free(ps) strcpy (k1.autor;” Kerpighan”); strcpy (k1.meno;”C – Jazyk”); k1.rok = 1968; k1.cena = 100;
Na sprístupnenie prvkov priamoadresovanej štruktúry sa používa operátor bodka. strcpy (ps-> autor;” Kerpighan”); strcpy (ps-> autor;” Kerpighan”); ps-> rok = 1968; ps-> cena = 100;
Operátor šípka sa používa na sprístupnenie prvkov nepriamo adresovanej štruktúry použitím pointera. Jazyk C umožňuje priradiť štruktúru štruktúre nasledovným spôsobom. k2 = k1; k2 = *ps; takéto priradenie znamená prekopírovanie bajt po bajt z jednej štruktúry do druhej.
Úloha
Napíšte program ktorý s klávesnice naplní dynamicky realizovanú štruktúru typu structbook a potom zobrazte údaj zo štruktúry na obrazovke. Keď už štruktúru nepotrebujete uvolnite dynamicky alokovanú pamäť. #include #include #include
struct book { char udaje[40]; char autor[20]; char nazov[40]; int rok; int cena; }; main() { struct book *ps; clrscr(); ps=(struct book*)malloc(sizeof(struct book)); if(!ps){ printf("\n Nedostatok pamete! "); return-1; }
printf("\n Zadaj udaje o knihe: "); gets(ps->udaje); printf("\n Meno autora: "); gets(ps->autor);
printf("\n Nazov diela: ");gets(ps->nazov); printf("\n Rok vydania: ");scanf("%d",&ps- >rok); printf("\n Cena knihy: ");scanf("%ld",&ps ->cena); printf("\n Udaje o knihe: %s" ,ps->udaje); printf("\n Autor: %s" ,ps->autor); printf("\n Nazov knihz: %s" ,ps->nazov); printf("\n Rok vydania: %d" ,ps->rok); printf("\n Cena knihy: %d" ,ps->cena); printf("\n Press any key.."); getch(); free(ps); }
Inicializácia štruktúry
Podobne ako pri poliach aj pri deklarácii štruktúrach môžeme pri premenných typu štruktúra inicializovať údajové členy štruktúry konštantnými hodnotami oddelenými čiarkami v zložených zátvorkách. struct book KS = {“ Kerpighan”,”C – jazyk”,1968,100}; Vnorené štruktúry: štruktúra môže obsahovať ľubovolné údajové typy teda aj typy štruktúra potom hovoríme o vnorených štruktúrach Pri riešení 2D geometrických objektov môžeme použiť štruktúru bod ktorá určí X a Y súradnicu bodu. struct book { int x; int y; };
a potom deklarujeme štruktúra kružnica struct kružnica { struct bod stred; int r; };
Deklarujeme 2 kružnice K1 a K2. Struct kružnica k1 = {{10,20},5};k2; . k2.stred.x = 15; k2.stred.y = 25; k2.r = 10;
Pole štruktúr - statická a dynamická reprezentácia štruktúr
Definícia – pole štruktúr definujeme rovnako ako pole iného typu. Deklarujeme kružnicu obsahujúcu 10 kníh. struct book[10]; . lib[2].cena = 50;
tretiemu prvku pola lib priradíme hodnotu 50; toto je statická reprezentácia. Struct book lib[] = {{“1autor”,”1názov”,”1900”,”100”}; Otvorené pole {“2autor”;”2názov”,”1901”,”100”}};
Dynamická realizácia štruktúr: Pri dynamickej reprezentácii štruktúr pole pointerov a pre jednotlivé štruktúry dynamicky alokujeme pamäť pomocou cyklu for keď pamäť nepotrebujeme, tak pomocou cyklu for uvoľníme pole. struck book {*plib[10]; . for(i = 0; icena = 100; for(i=0;i