Jazyk C - štruktúry

Z Kiwiki
Verzia z 15:35, 26. máj 2020, ktorú vytvoril Lukas.p (diskusia | príspevky)
(rozdiel) ← Staršia verzia | Aktuálna úprava (rozdiel) | Novšia verzia → (rozdiel)
Skočit na navigaci Skočit na vyhledávání

Š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]

Š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

Referencie