IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

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.

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;
}

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é 83x (3.16 MB)
Aplikácia je vrátane zdrojových kódov v jazyku C++

 

Predchádzajúci článok
Riešené úlohy k 13. lekcii C ++
Všetky články v sekcii
Základné konštrukcie jazyka C ++
Preskočiť článok
(neodporúčame)
Řešené úlohy ku 14. lekcii C ++
Článok pre vás napísal Patrik Valkovič
Avatar
Užívateľské hodnotenie:
1 hlasov
Věnuji se programování v C++ a C#. Kromě toho také programuji v PHP (Nette) a JavaScriptu (NodeJS).
Aktivity