Jazyk C - štruktúry: Rozdiel medzi revíziami
(Vytvorená stránka „Kategória:Študijné materiály Kategória:Informatika Štruktúry sú ako kontajnery pre rôzne premenné. Rovnako ako pole zhromažďuje hodnoty rovnakého ty…“) |
d |
||
Riadok 16: | Riadok 16: | ||
===Príklady deklarácie=== | ===Príklady deklarácie=== | ||
− | |||
* Príklad nižšie zobrazuje ako sa dá deklarovať a následne inicializovať štruktúru: | * Príklad nižšie zobrazuje ako sa dá deklarovať a následne inicializovať štruktúru: | ||
<source lang="c"> | <source lang="c"> | ||
Riadok 46: | Riadok 45: | ||
===Kopírovanie hodnôt štruktúry=== | ===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: | 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: | ||
<source lang="c"> | <source lang="c"> | ||
Riadok 63: | Riadok 61: | ||
===Porovnávanie štruktúr=== | ===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 | Porovnávanie štruktúr už nie je tak jednoduché ako kopírovanie. Musí sa porovnávať každá jedna premenná z oboch štruktúr | ||
<source lang="c"> | <source lang="c"> |
Verzia zo dňa a času 00:08, 3. marec 2020
Š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í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
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é
}
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