Jazyk C - štruktúry
Štruktúry sú ako kontajnery pre rôzne premenné. Rovnako ako pole zhromažďuje hodnoty rovnakého typu, štruktúry zhromažďujú premenné rôznych typov. typickým príkladom použitia štruktúry je uchovanie dát zamestnanca (meno, vek a plat).[1]
Učebné texty
Štruktúry
Syntax
Syntax štruktúry je nasledovný:
struct /*názov*/ {
/*výpis premenných*/;
} /*deklarácia*/;
Do časti názov sa napíše názov typu novej štruktúry. Časť výpis premenných obsahuje deklaráciu všetkých premenných, ktoré sú v danej štruktúre uložené. Dané premenné môžu obsahovať prednastavenú hodnotu. Časť deklarácia je nepovinná a zapisuje sa sem názov novej štruktúry, ktorá sa priamo vytvorí. Len pri inicializácii štruktúry môžeme priamo nastaviť hodnoty, rovnako ako pri poliach tak, že ich v poradí rovnakom ako je vo výpise premenných zapíšeme do zložených zátvoriek {}. Tieto hodnoty oddelíme čiarkou.
Prístup k hodnotám štruktúry
S hodnotami v štruktúre sa pracuje rovnako ako s danými typmi premenných, t. j. sú dostupné aj rovnaké operátory. Nedá sa však pristupovať naraz ku všetkým hodnotám, ale vždy len ku jednej. Syntax:
názov_štruktúry.názov_premennej
Príklady deklarácie
- Príklad nižšie zobrazuje ako sa dá deklarovať a následne inicializovať štruktúru:
struct zamestnanci { //zadefinovali sme štruktúru, ktorej typový názov je "zamestnanci"
char meno[50];
int vek = 0;
float plat;
};
//Inicializácia štruktúry:
struct zamestnanci Ferko = {"Ferko Mrkvicka", 36, 1100.00}; //Vytvorili sme štruktúru typu zamestnanci s názvom Ferko
struct zamestnanci Mirko = {"Mirko Javorovy", 25}; //Vytvorili sme štruktúru typu zamestnanci s názvom Mirko
struct zamestnanci Nikto; //Vytvorili sme štruktúru typu zamestnanci s názvom Nikto a nezadali sme jej žiadne predvolené hodnoty
//Prístup do štruktúry:
Ferko.plat = 1200.00; //zmenili sme v štruktúre Ferko premennú plat na číslo 1200.00
printf("Mirkov vek: %d", Mirko.vek); //Vypíše zo štruktúry Mirko premennú vek
- Príklad nižšie zobrazuje ako priamo deklarovať aj inicializovať štruktúru:
struct zamestnanci { //zadefinovali sme štruktúru, ktorej typový názov je "zamestnanci"
char meno[50];
int vek = 0;
float plat;
} Ferko; //vytvorili sme štruktúru typu zamestnanci s názvom Ferko
Kopírovanie hodnôt štruktúry
Vieme, že polia sa nedajú kopírovať priradením (napr. pole1 = pole2;), ale musia sa kopírovať jednotlivé hodnoty napríklad v cykle for. Štruktúry však majú jednu výhodu, pretože štruktúry rovnakého typu sa dajú jednoducho okopírovať obyčajným priradením (dokonca aj s poliami) a to nasledovne:
struct zamestnanci { //zadefinovali sme štruktúru, ktorej typový názov je "zamestnanci"
char meno[50];
int vek = 0;
float plat;
};
//Inicializácia štruktúry:
struct zamestnanci Ferko = {"Ferko Mrkvicka", 36, 1100.00}; //Vytvorili sme štruktúru typu zamestnanci s názvom Ferko
struct zamestnanci Ferko_kopia = {}; //Vytvorili sme prázdnu štruktúru typu zamestnanci s názvom Ferko_kopia
Ferko_kopia = Ferko; //hodnoty všetkých premenných v štruktúre Ferko sa okopírovali do štruktúry Ferko_kopia
Porovnávanie štruktúr
Porovnávanie štruktúr už nie je tak jednoduché ako kopírovanie. Musí sa porovnávať každá jedna premenná z oboch štruktúr. Nie je však možné porovnať štruktúru ako takú.
struct zamestnanci { //zadefinovali sme štruktúru, ktorej typový názov je "zamestnanci"
char meno[50];
int vek = 0;
float plat;
};
//Inicializácia štruktúry:
struct zamestnanci Ferko = {"Ferko Mrkvicka", 36, 1100.00}; //Vytvorili sme štruktúru typu zamestnanci s názvom Ferko
struct zamestnanci Mirko = {"Mirko Javorovy", 25, 970.00}; //Vytvorili sme štruktúru typu zamestnanci s názvom Mirko
if(strcmp(Ferko.meno,Mirko.meno) == 0 && Ferko.vek == Mirko.vek && Ferko.plat == Mirko.plat){
//Kód ktorý sa vykoná ak sú obe štruktúry rovnaké
}
/*CHYBA
if(Ferko == Mirko){
//Kód ktorý sa vykoná ak sú obe štruktúry rovnaké
}
CHYBA*/
Používanie štruktúr vo funkciách
Štruktúry môžu byť rovnako ako ostatné premenné vložené ako parameter do funkcie, alebo môžu byť v návratovej hodnote funkcie. Nasledujúci príklad zobrazuje ako na to.
1 #include <stdio.h>
2
3 struct zamestnanci { //zadefinovali sme štruktúru, ktorej typový názov je "zamestnanci"
4 char meno[50];
5 int vek = 0;
6 float plat;
7 };
8
9 void vypis (struct zamestnanci z){ //vypíše dáta zo štruktúry
10 printf("meno: %s, vek: %d, plat: %f", z.meno, z.vek, t.plat);
11 }
12
13 struct zamestnanci nulovaStruktura(){ //vráti nulovú štruktúru
14 struct zamestnanci r = {"", 0, 0.00};
15 return r;
16 }
17
18
19 int main() {
20 //Inicializácia štruktúry:
21 struct zamestnanci Ferko = {"Ferko Mrkvicka", 36, 1100.00}; //Vytvorili sme štruktúru typu zamestnanci s názvom Ferko
22
23 vypis(Ferko);
24 Ferko = nulovaStruktura();
25 vypis(Ferko);
26
27 return 0;
28 }
Smerníky a štruktúry
Smerníky sa pri štruktúrach používajú takmer rovnako ako pri ostatných typoch premenných. Jediný rozdiel je v tom, že ak chceme pristúpiť k dátam štruktúry označenej smerníkom musíme použiť operátor -> namiesto operátoru . a to nasledovne:
struct zamestnanci { //zadefinovali sme štruktúru, ktorej typový názov je "zamestnanci"
char meno[50];
int vek = 0;
float plat;
};
//Inicializácia štruktúry:
struct zamestnanci Ferko = {"Ferko Mrkvicka", 36, 1100.00}; //Vytvorili sme štruktúru typu zamestnanci s názvom Ferko
struct zamestnanci *Ferko_ = &Ferko; //okopírovanie adresy štruktúry Ferko do smerníka Ferko_
//Vstup do hodnôt štruktúry
Ferko_->vek = 25; //zapísanie hodnoty 25 do štruktúry Ferko pomocou smerníka a dereferencie
(*Ferko_).vek = 25; //zapísanie hodnoty 25 do štruktúry Ferko pomocou smerníka a dereferencie (ekvivalent)
Príkaz typedef a štruktúry
Klúčové slovo typedef umožnuje pomenovať nový typ premennej, ktorý sa skladá z už existujúcich typov. Napríklad je možné vytvoriť typ mojInt, ktorý bude v skutočnosti ukazovateľom na premennú typu int. [2] Toto je možné použiť aj na štruktúry nasledovne:
typedef char retazec_mena[50]; //Vytvorili sme si novú premennú retazec_mena, ktorá je vlastne pole char-ov s fixnou veľkosťou 50
typedef int age; //Vytvorili sme si nový typ premennej age, ktorý je v podstate int
typedef struct zamestnanci { //zadefinovali sme štruktúru, ktorej typový názov je "zamestnanci" pod menom "zamestnanec"
retazec_mena meno;
age vek = 0;
float plat;
} zamestnanec;
//Inicializácia štruktúry:
zamestnanec Ferko = {"Ferko Mrkvicka", 36, 1100.00}; //Vytvorili sme štruktúru typu zamestnanci s názvom Ferko
//Jednoduché vytvorenie poľa štruktúr (na toto nepotrebujeme typedef, je to však pohodlnejšie a prehľadnejšie)
zamestnanec partia[3]; //Vytvorili sme pole štruktúr s veľkosťou 3, ktorých typový názov je: "zamestnanci"
partia[0].vek = 30; //Prístup do prvej položky pola štruktúr a zmena hodnoty premennej vek na hodnotu 30