14. diel - Štruktúry v jazyku C ++
V predchádzajúcom cvičení, Riešené úlohy k 13. lekcii C ++, sme si precvičili získané skúsenosti z predchádzajúcich lekcií.
V minulej lekcii, Riešené úlohy k 13. lekcii C ++ , bola reč o deklarovanie funkcií. V dnešnom C ++ tutoriálu sa naučíme tzv. Štruktúry. Jedná sa o medzikrok medzi procedurálnym a objektovo orientovaným programovaním (OOP). V C ++ štruktúry nahradili triedy, ale väčšina knižníc používa primárne štruktúry a tak uvediem štruktúry aj u C ++. Keďže bude vytvorený opäť len jednoduchý program, tak vo výklade funkcie použité nebudú. My už vieme, že keby bol program o chlp dlhší, tak by sme ich určite mali zaviesť.
Uloženie zložitých prvkov
Keď by sme chceli uložiť dáta jedného používateľa, ktorý sa nejako volá, má nejaký vek a býva v nejakej ulici, vytvorili by sme si s doterajšími znalosťami niekoľko premenných:
int main() { string jmeno = "Tomas Marny"; int vek = 33; string ulice = "Sikma 5"; return 0; }
Len zriedka však ukladáme len jedného používateľa a tak ich budeme
chcieť mať uložených hneď niekoľko. Už vieme, že keď chceme uložiť
viac prvkov rovnakého typu, využijeme na to pole. Keďže užívateľ v sebe
však obsahuje hodnoty troch typov, museli by sme si vytvoriť 3 rôzne polia.
Jedno pre mená, druhé pre veky a tretí pre ulice. V ďalšom motivačným
príklade si teda vytvorme niekoľko polí s veľkosťou 10
(teda
max. Pre uchovanie 10tich užívateľov). Do poľa si na skúšku uložme dáta
2 užívateľov a užívateľov v poli následne Vypíšme pomocou
for
cyklu.
{CPP_CONSOLE}
string jmena[10];
int veky[10];
string ulice[10];
jmena[0] = "Tomas Marny";
veky[0] = 33;
ulice[0] = "Sikma 5";
jmena[1] = "Josef Novy";
veky[1] = 28;
ulice[1] = "Vo svahu 8";
for (int i = 0; i < 2; i++ )
{
cout << "Uzivatel na indexe " << i << endl;
cout << "Jmeno: " << jmena[i] << endl;
cout << "Vek: " << veky[i] << endl;
cout << "Ulice: " << ulice[i] << endl << endl;
}
{/CPP_CONSOLE}
výsledok:
Konzolová aplikácia
Uzivatel na indexe 0
Jmeno: Tomas Marny
Vek: 33
Ulice: Sikma 5
Uzivatel na indexe 1
Jmeno: Josef Novy
Vek: 28
Ulice: Vo svahu 8
Program vyzerá na naše pomery celkom pôsobivo. Až sa naučíme ukladať
dáta do súborov, mohli by sme podobne naprogramovať napr. Telefónny zoznam.
Výpis cyklom by mal byť jasný, prechádzame len indexy < 2
,
pretože viac osôb v poli zatiaľ nemáme.
Štruktúry
Aby sme nemuseli tvoriť toľko zložitých polí, umožňuje jazyk C ++
definovať tzv. Štruktúru. Jedná sa o nový dátový typ, ktorý môžeme
uložiť do jednej premennej, ale ktorý vnútri zároveň obsahuje niekoľko
prvkov (niekedy sa mu hovorí záznamový typ). Vzdialene sa môže podobať
poli, jeho prvky však nemusia byť rovnakého typu a miesto číselne sú
pomenované slovami. Pre evidenciu používateľov by bolo úplne
najjednoduchšie vytvoriť si štruktúru Uzivatel
. Niekam do
globálneho priestoru, nad funkciu main()
, vložíme túto
definíciu:
struct Uzivatel { string jmeno; int vek; string ulice; };
Najdôležitejším je kľúčové slovo struct
, ktorým
povieme, že vytvárame štruktúru. Do zložených zátvoriek deklarujeme prvky
štruktúry ako obyčajné premenné. Za deklaráciou štruktúry vždy musí
byť bodkočiarka.
Telo funkcie main()
teraz prepíšeme do nasledujúcej
podoby:
#include <iostream>
using namespace std;
struct Uzivatel
{
string jmeno;
int vek;
string ulice;
};
int main()
{
Uzivatel uzivatele[10];
uzivatele[0].jmeno = "Tomas Marny";
uzivatele[0].vek = 33;
uzivatele[0].ulice = "Sikma 5";
uzivatele[1].jmeno = "Josef Novy";
uzivatele[1].vek = 28;
uzivatele[1].ulice = "Vo svahu 8";
for (int i = 0; i < 2; i++ )
{
cout << "Uzivatel na indexe " << i << endl;
cout << "Jmeno: " << uzivatele[i].jmeno << endl;
cout << "Vek: " << uzivatele[i].vek << endl;
cout << "Ulice: " << uzivatele[i].ulice << endl << endl;
}
cin.get();
return 0;
}
Celá aplikácia je oveľa čitateľnejší. Obsahuje jednoducho polia typu
Uzivatel
miesto predchádzajúcich 3 polí. K jednotlivým prvkom
štruktúr v poli pristupujeme pomocou operátora bodky. Ak sú štruktúry
používané dynamicky (čo ešte nevieme), používa sa operátor šípky
(->
). Všetko si ešte ukážeme ďalej v kurze.
Ďalšie definícia štruktúr
Niekedy sa štruktúra definuje dokonca priamo s premennou:
struct { string jmeno; int vek; string ulice; } uzivatele[10];
Tento zápis berte skôr ako odstrašujúci príklad. To, že je niečo kratšia, vôbec neznamená, že je to prehľadnejšie. Navyše štruktúru takto nemôžeme použiť na viacerých miestach programu.
Pozn .: Štruktúry samozrejme nemusíme používať len v poliach, je to
úplne normálne dátový typ ako napr. int
. Štruktúry sa v C ++
používajú len zriedka. Problémom sú knižnice, ktoré sú primárne
určené pre jazyk C, pretože všetko v C funguje aj v C ++. Nie je teda dôvod
písať ten rovnaký kód dvakrát pre C a C ++. Ovšem C triedy nemá (ktoré
by sme použili v C ++) a tak sa stretnete so štruktúrami primárne pri práci
s knižnicami.
Pozn .: Okrem štruktúr môžeme v C ++ definovať aj tzv.
union
. Tie sa tvári rovnako, ako štruktúry, avšak premenná
typu union
môže mať vyplnenú len jednu hodnotu. Každý
užívateľ by teda mohol mať vyplnené buď len meno, len vek alebo len ulici.
U užívateľov toto nedáva príliš veľký zmysel, v praxi sa nám teoreticky
môže stať, že potrebujeme ukladať prvky a každý prvok je trochu iný.
Rovnako sa union
však príliš nepoužívajú, je problém
spoznať čo je kde vyplnené (preto sa často balia do štruktúr alebo tried)
a my sa tu s nimi nebudeme zaoberať.
Dnešné aplikáciu máte nižšie k stiahnutiu so zdrojovým kódom.
Týmto ste dočítali úvodný kurz základov jazyka C ++. Gratulujem vám, ste zoznámenie s väčšinou jeho konštrukciou! Výučba samozrejme pokračuje ďalej a to nadväzujúcim kurzom Pokročilé konštrukcie v C ++, kde sa dozviete najmä ako v C ++ dynamicky pracovať s pamäťou a ako prestať byť obmedzenia dĺžkou polí a C reťazcov. Pretože je táto problematika pomerne komplikovaná a začiatočníkov často mate, bol od nej celý základný kurz odtienený a vy ste si mohli bez zádrheľov vyskúšať rôzne konštrukcie C ++. Teším sa na vás teda ďalej, kedy začneme vytvárať reálne použiteľné aplikácie.
V nasledujúcom cvičení, Řešené úlohy ku 14. lekcii C ++, si precvičíme nadobudnuté skúsenosti z predchádzajúcich lekcií.
Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.
Stiahnuť
Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami
Stiahnuté 89x (3.16 MB)
Aplikácia je vrátane zdrojových kódov v jazyku C++