Dneska si urobíme úvod do štruktúr, posledné kapitoly boli skôr teoretického charakteru. Ani tento diel nebude výnimkou.
Úvod do štruktúr
Už ste zistili, že nie všetky potrebné veci v poliach nespravíte efektívne. A preto existujú štruktúry. Je to vlastne množina premenných, ktoré nemajú rovnaký typ. To znamená, že môžeme mať niekoľko typov, napr. ako informácie o zamestnancovi, ktorý má istý počet rokov, dostáva istý plat, má meno, zameranie a podobne. Už z toho vidíme, že táto štruktúra má zložky typu int – vek, float – plat, char[] – reťazec a podobne. Štruktúra predstavuje univerzálnu dátovú formu, umožňuje zjednotiť dátovú reprezentáciu uložením všetkých údajov o zamestnancovi do jednej štruktúry. A keď budete chcieť mať informácie o všetkých zamestnancov, urobíte si pole štruktúr. Štruktúra je aj základ objektov v C++.
Štruktúra je užívateľsky definovaný typom, ktorého vlastnosti popisuje deklarácia štruktúry. Po definovaní môžeme vytvárať jeho premenné. Proces vytvorenia štruktúry sa skladá z dvoch častí. Najprv popíšeme štruktúru ako čo tam budeme chcieť ukladať a v akom rozsahu. Potom vytvoríme premenné štruktúry alebo dátové objekty odpovedajúce danému popisu. Tak, popis sme si už o zamestnancovi spravili, teraz prichádza na rad napísanie tejto štruktúry, ktorá bude vyzerať napr takto:
struct zamestnanec { //popis struktury
int vek; //clen typu int - vek
float plat; //clen typu float - plat
char meno[20]; //clen typu pola char - meno
};
Kľúčové slovo struct určuje popis štruktúry. Identifikátor zamestnanec určuje názov štruktúry a druhý význam má ako nový typ premennej, ktorá má v sebe vložené ďalšie premenné. Teraz môžete s premennou zamestnanec vytvárať ďalšie štruktúry takejto stavby. Medzi vloženými zátvorkami sa nachádza zoznam premenných v štruktúre. Tu môže byť ľubovoľný typ premennej vrátanie polí a iných štruktúr. Aby sme vedeli, naša štruktúra má 3 členy, s ktorými môžeme ľubovoľne pracovať. Teraz, keď máme deklaráciu, môžeme vytvárať ďalšie premenné odpovedajúceho typu:
zamestnanec uctovnik; //uctovnik je strukturna premenna typu zamestnanec
zamestnanec upratovacka; //premenna typu zamestnanec
zamestnanec manazer; //premenna typu zamestnanec
V jazyku C++ je značka štruktúry používaná ako meno základného typu. Táto zmena zdôrazňuje, že deklarácia štruktúry definuje nový typ.
Ak je premenná typu zamestnanec, zaisťuje prístup k jednotlivým členom operator „.“ (bodka), napr. uctovnik.vek odkazuje na premennú vek v štruktúre uctovnik a uctovnik.plat ukazuje na premennú plat. Obecne povedané , že mená premenných sa používajú ako indexy v poliach. Ak je člen vek typu int, tak aj premenná uctovnik.vek typu int. Teraz si ukážeme názorný príklad:
//struktura1.cc -- ukazka pouzitia struktury
#include <iostream>
using namespace std;
struct zamestnanec { //sablona struktury
int vek;
float plat;
char meno[20];
};
int main() {
zamestnanec uctovnik =
{
22, //hodnota vek
17000, //hodnota plat
"Martin Bodocky" //hodnota meno
}; // uctovnik je strukturny typ zamestnanec
// inicializuje z uvedenymi hodnotami
zamestnanec upratovacka =
{
24,
14000,
"Majak Gurunu"
};
cout << "Prijali sme do prace novych zamestnancov : "<< uctovnik.meno;
cout << " a "<< upratovacka.meno << "\n";
cout << "Ich priemerny vek je "<<(uctovnik.vek+upratovacka.vek)/2 <<"\n";
return 0;
}
Výstup:
Prijali sme do prace novych zamestnancov : Martin Bodocky a Majak Gurunu Ich priemerny vek je 22
Dôležitá vec je, kde sme deklarovali štruktúru, či vo funkcii main() alebo pred ňou. Rozdiel je v použití. Keď je štruktúra vo funkcii main(), je to vnútorná deklarácia, čiže by sme ju mohli používať iba vo funkcii. Ale ak budeme deklarovať pred funkciou, je to vonkajšia (globálna) deklarácia. V našom program to nemá váhu, ale ak by sme mali program s viacerými funkciami, mohlo by nám so popliesť. Lebo vonkajšie funkcie môžu používať všetky funkcie, vnútorné iba funkcia, v ktorej sú deklarované. Odporúča sa používať skôr vonkajšie deklarácie, šetrí sa čas aj námaha. Ale pozor, nie je to pravidlo. Ďalej si všimnite deklarácie:
zamestnanec uctovnik =
{
22, //hodnota vek
17000, //hodnota plat
"Martin Bodocky" //hodnota meno
};
Je rovnaká ako u polí, ale s tým rozdielom, že tu už sme si sami zvolili typ premenných, ktorú môžeme prepísať aj takto:
zamestnanec uctovnik = {22, 17000, "Martin Bodocky"};
Každý člen je spracovávaný ako samostatná premenná dátového typu. Ak programátor vypíše pomocou objektu cout premennú uctovnik.vek, je typom int, preto sa vypíše ako číslo, to isté ako premenná uctovnik.meno je typu char, tak to vypíše ako reťazec.
Ďalšie vlastnosti štruktúr
Jazyk C++ sa snaží vytvárať definované typy tak, aby sa podobali čo najviac vstavaným typom. Čiže štruktúru môžete predávať ako parameter funkcii a podobne. Dokonca môže priradiť jednu štruktúru druhej rovnakého typu. Jednoducho ich nastavíme, aby tie štruktúry podobali svojimi časťami. To sa nazýva členské priradenie. Ďalšie využitie štruktúr si ukážeme neskôr v ďalších dieloch. Ale urobíme si aspoň názorný príklad:
//strukruta2.cc -- clenske priradenie
#include <iostream>
using namespace std;
struct zamestnanec {
char meno[20];
int vek;
float plat;
};
int main() {
zamestnanec jozko = {
"Mrkvicka",
44,
18001f
};
zamestnanec dezko;
cout << "Meno :" << jozko.meno<< " vek ";
cout << jozko.vek<< "rokov a plat " << jozko.plat<< "\n";
dezko=jozko; //clenske priradenie
cout << "Meno :" << dezko.meno<< " vek ";
cout << dezko.vek<< "rokov a plat " << dezko.plat<< "\n";
return 0;
}
Výstup:
Meno: Mrkvicka vek 44rokov a plat 18001 Meno: Mrkvicka vek 44rokov a plat 18001
Vidíte sami, že členské priradenie funguje. Ale premenné typu štruktúry môžeme vytvoriť pomocou jednej deklarácie. Stačí ak keď na konci deklarácie pred bodkočiarkou napíšeme názvy ďalších premenných. Napr.:
struct zamestnanec {
char meno[20];
int vek;
float plat;
}jozko,dezko;
A týmto spôsobom ich môžeme aj hneď inicializovať:
struct zamestnanec {
char meno[20];
int vek;
float plat;
}jozko = {
"Mrkvicka",
44,
18001
};
Ale tento príklad sa pomenej používa, kvôli čitateľnosti kódu. A štruktúra sa dá vytvoriť aj bez názvu:
struct {
char meno[20];
int vek;
float plat;
}jozko,dezko;
Čiže sme vytvorili dve premenné tejto štruktúry, ale nemôžeme takúto štruktúru vytvoriť, lebo nemá názov.
Pole štruktúr
Ako exituje pole znakov, tak existuje aj pole štruktúr s rovnakými pravidlami ako pri obyčajných poliach. Napríklad pole štruktúr pre 100 zamestnancov:
struct zamestnanec[100] { //pole o 100 strukturach typu zamestnanec
char meno[20];
int vek;
float plat;
};
Tak to pole vzniklo a každý jeho index je samostatná štruktúra. Takto sa s nimi dá pracovať:
cin >> zamestnanec[0].meno; //pouziva clen meno prvej struktury
cout << zamestnanec[99].meno; //zobrazi meno posledneho zamestnanca
Pri inicializácii poľa štruktúr spájame pravidlo inicializácie polí s pravidlom o štruktúrach. Pretože každý prvok poľa je štruktúra a jeho hodnota je reprezentovaná inicializáciou štruktúry. Napr.:
zamestnanec firma[2] = { //inicializacia pola
{"jozko", 44, 17000}, //prva struktura v poli
{"dezko", 55, 22000} //druha struktura v poli
};
Zápis si môžete určiť podľa vlastného uváženia.
Záver
Dneska sme si prebrali štruktúry a na ďalší diel si pripravíme menšiu písomku aj s testom. Kvôli tomu som vám nezadával žiadne úlohy. Veľa šťastia…