Struktury a výčtové typy

 

Struktury

Oba jazyky (C, C++) umožňují vytvoření heterogenního datového typu jenž je složen z různých datových složek, narozdíl od pole, jehož jednotlivé složky(prvky pole) jsou typu stejného - jedná se tedy o homogenní datový typ. Typickým představitelem heterogenního datového typu je struktura .

Představme si, že potřebujeme vyrobit datový typ, jehož jednotlivé složky by představovaly základní personální údaje (jméno, věk, hmotnost, výška). Zavedení takového datového typu pomocí klíčového slova struct můžeme několika způsoby např. takto : 

struct clovek

{

char jmeno[50]; //nebo char * JMENO;

int  vek;

double hmotnost, vyska;

};

Tímto jsme definovali  pojmenovanou strukturu a nyní můžeme v programu definovat proměnné tohoto typu.

struct clovek Jenda, Bara; klíčové slovo struct je zde nutné

 

 

Poněkud elegantnější způsob pro zavedení nového datového typu založeného na struktuře lze provést pomocí klíčového slova typedef.Nejúplnější definice vypadá takto : 

 

typedef struct clovek

{

char jmeno[50]; //nebo char * JMENO;

int  vek;

double hmotnost, vyska;

}CLOVEK;

Kde clovek je název struktury a CLOVEK název nového datového typu. Jinými slovy slovní spojení struct clovek vyjadřuje totéž  co jedno slovo CLOVEK a výše definované proměnné nyní mohu zavést i takto:

CLOVEK Jenda, Bara ; 

 

Při použití typedef je třeba pojmenovat strukturu pouze v případě, že by některou z jejích složek byl pointer na ni samu. Jinak lze název struktury vynechat. Položka dané struktury nemůže být  právě vytvářeného datového typu přesněji název typu každé položky musí být různý od jména struktury, která ji obsahuje či od jména právě vytvářeného typu. Položka však může být typu pointer na strukturu ve které je obsažena (nikoli však pointer na typ, který vytváříme pomocí typedef ) viz. kapitola Seznam .

 

typedef struct clovek

{

char jmeno[50]; //nebo char * JMENO;

int  vek;

double hmotnost, vyska;

struct clovek * p_clovek; C++ stačí  clovek * p_clovek; tzn. bez klíčového slova struct

CLOVEK * p_clovek; NELZE !!!

clovek otec; NELZE !!!

struct clovek otec; NELZE !!!

CLOVEK otec;  NELZE !!!

}CLOVEK;

Podrobněji v kapitole  seznam .

 K jednotlivým položkám proměnných tohoto typu pak přistupuji takto :

strcpy(Bara.jmeno,"Bára Zvučná"); 

// nebo Bara.JMENO = "Bára Zvučná";

Bara.vek = 20;

Bara.hmotnost = 50.8;

Bara.vyska = 165.5;

printf("%d",Bara.vek); atd.

 

V případě, že mám adresu dané objektové proměnné uloženou v příslušném pointeru, mohu k jednotlivým položkám přistupovat dvěma způsoby.

 

CLOVEK * p_Bara;

p_Bara = &Bara;

strcpy((*p_Bara).jmeno, "Bára Zvučná");

//nebo (*p_Bara).JMENO = "Bára Zvučná";

(*p_Bara).vek = 20;

printf("%d",(*p_Bara).vek); atd.

Tedy nejprve explicitně dereferencujeme pointer ukazující na danou objektovou proměnnou a pak již standardně pomocí tečky přistupujeme k jednotlivým položkám. Častěji však používáme poněkud úspornější a přehlednější způsob.

strcpy(p_Bara->jmeno, "Bára Zvučná");

//nebo p_Bara->JMENO = "Bára Zvučná";

p_Bara->vek = 20;

 printf("%d",p_Bara->vek); atd.

 

 

Výčtové typy

Výčtový typ (enum)je v podstatě seznam symbolických konstant, který definuje všechny možné hodnoty, jichž proměnná tohoto typu může nabývat. Výčtový typ se definuje podobně  v případě struktury viz následující ukázka.

typedef enum    Definice výčtového typu BARVY

{

MODRA, CERVENA, ZELENA, ZLUTA  (bez středníku)

} BARVY;

Použití

BARVY x,y;

x = CERVENA;

y = MODRA;

 

 

V právě uvedeném příkladě, nebyly jednotlivé symbolické konstanty explicitně inicializovány a tudíž mají implicitní hodnoty (MODRA = 0,CERVENA = 1...) .

Explicitní inicializace je též možná :

 

typedef enum    Definice výčtového typu BARVY

{

MODRA = 10, CERVENA = 23, ZELENA = 5, ZLUTA = 7

} BARVY;

Použití

BARVY x,y;

x = CERVENA;

y = MODRA;

 

 

 

Jak strukturu tak výčtový typ definujeme na začátku souboru v němž je hodláme používat, či v hlavičkovém souboru, který pak vkládáme.

 

Příklady k nastudování

P 1 ...užití struktur