14. díl - Struktury v jazyce C++

C++ Základní konstrukce C++ Struktury v jazyce C++

V minulém tutoriálu byla řeč o programování funkcí v jazyce C++. V dnešním dílu se naučíme tzv. struktury. Jedná se o mezikrok mezi funkcionálním a ojektově orientovaným programováním (OOP). V C++ struktury nahradily třídy, ale většina knihoven používá primárně struktury a tak uvedu struktury i u C++. Jelikož bude vytvořen opět jen jednoduchý program, tak ve výkladu funkce použity nebudou. My již víme, že kdyby byl program o chlup delší, tak bychom je určitě měli zavést.

Uložení složitých prvků

Když bychom chtěli uložit data jednoho uživatele, který se nějak jmenuje, má nějaký věk a bydlí v nějaké ulici, vytvořili bychom si s dosavadními znalostmi několik proměnných:

int main()
{
    string jmeno = "Tomáš Marný";
    int vek = 33;
    string ulice = "Šikmá 5";
    return 0;
}

Jen zřídka ovšem ukládáme jen jednoho uživatele a tak jich budeme chtít mít uložených hned několik. Již víme, že když chceme uložit více prvků stejného typu, využijeme k tomu pole. Jelikož uživatel v sobě ovšem obsahuje hodnoty třech typů, museli bychom si vytvořit 3 různá pole. Jedno pro jména, druhé pro věky a třetí pro ulice. V dalším motivačním příkladu si tedy vytvořme několik polí o velikosti 10 (tedy max. pro uchování 10ti uživatelů). Do pole si na zkoušku uložme data 2 uživatelů a uživatele v poli následně vypišme pomocí 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] = "Ve Svahu 8";

int i;
for( i = 0; i < 2; i++ )
{
        cout << "Uzivatel na indexu " << i << endl;
        cout << "Jmeno: " << jmena[i] << endl;
        cout << "Vek: " << veky[i] << endl;
        cout << "Ulice: " << ulice[i] << endl;
}

Výsledek:

Použití pole místo strktur

Program vypadá na naše poměry docela působivě. Až se naučíme ukládat data do souborů, mohli bychom podobně naprogramovat např. telefonní seznam. Výpis cyklem by měl být jasný, projíždíme jen indexy < 2, protože více osob v poli zatím nemáme.

Struktury

Abychom nemuseli tvořit tolik složitých polí, umožňuje jazyk C++ definovat tzv. strukturu. Jedná se o nový datový typ, který můžeme uložit do jedné proměnné, ale který uvnitř zároveň obsahuje několik prvků. Vzdáleně se může podobat poli, jeho prvky ovšem nemusejí být stejného typu a místo číselně jsou pojmenované slovy. Pro evidenci uživatelů by bylo úplně nejjednodušší vytvořit si strukturu UZIVATEL. Někam do globálního prostoru, nad funkci main(), vložíme tuto definici:

struct Uzivatel {
        string jmeno;
        int vek;
        string ulice;
};

Nejdůležitějším je klíčové slovo struct, kterým řekneme, že vytváříme strukturu. Do složených závorek deklarujeme prvky struktury jako obyčejné proměnné. Za deklarací struktury vždy usí být středník.

Tělo funkce main() nyní přepíšeme do následující podoby:

int main() {
        Uzivatel uzivatele[10];

        uzivatele[0].jmeno = "Tomáš Marný";
        uzivatele[0].vek = 33;
        uzivatele[0].ulice = "Šikmá 5";

        uzivatele[1].jmeno = "Josef Nový";
        uzivatele[1].vek = 28;
        uzivatele[1].ulice = "Ve Svahu 8";

        int i;
        for( i = 0; i < 2; i++ )
        {
                cout << "Uzivatel na indexu " << i << endl;
                cout << "Jmeno: " << uzivatele[i].jmeno << endl;
                cout << "Vek: " << uzivatele[i].vek << endl;
                cout << "Ulice: " << uzivatele[i].ulice << endl;
        }
        cin.get();
        return 0;
}

Celá aplikace je mnohem čitelnější. Obsahuje jednoduše pole typu UZIVATEL místo předchozích 3 polí. K jednotlivým prvkům struktur v poli přistupujeme pomocí operátoru tečky. Pokud jsou struktury používány dynamicky (což ještě neumíme), používá se operátor šipky (->). Vše si ještě ukážeme dále v seriálu.

Další definice struktur

Někdy se struktura definuje dokoce přímo s proměnnou:

struct {
        char jmeno[51];
        int vek;
        char ulice[51];
}  uzivatele[10];

Tento zápis berte spíše jako odstrašující příklad. To, že je něco kratší, vůbec neznamená, že je to přehlednější. Navíc strukturu takto nemůžeme použít na více místech programu.

Pozn.: Struktury samozřejmě nemusíme používat jen v polích, je to úplně normální datový typ jako např. int. Struktury se v C++ používají jen zřídka. Problémem jsou knihovny, které jsou primárně určeny pro jazyk C, protože vše v C funguje i v C++. Není tedy důvod psát ten stejný kód dvakrát pro C a C++. Ovšem C třídy nemá (které bychom použili v C++) a tak se setkáte se strukturami primárně při práci s knihovnama.

Pozn.: Kromě struktur můžeme v C++ definovat i tzv. uniony. Ty se tváří stejně, jako struktury, ovšem proměnná typu union může mít vyplněnou jen jednu hodnotu. Každý uživatel by tedy mohl mít vyplněné buď jen jméno, jen věk nebo jen ulici. U uživatelů toto nedává příliš velký smysl, v praxi se nám teoreticky může stát, že potřebujeme ukládat prvky a každý prvek je trochu jiný. Stejně se uniony však příliš nepoužívají, je problém poznat co je kde vyplněné (proto se často balí do struktur nebo tříd) a my se tu s nimi nebudeme zabývat.

Dnešní aplikaci máte níže ke stažení se zdrojovým kódem.

Tímto jste dočetli úvodní sekci seriálu do základů jazyka C++. Gratuluji vám, jste seznámení s většinou jeho konstrukcí! :) Seriál samozřejmě pokračuje dále a to v sekci Pokročilé konstrukce v C++, kde se dozvíte zejména jak v C++ dynamicky pracovat s pamětí a jak přestat být omezení délkou polí a řetězců. Protože je tato problematika poměrně komplikovaná a začátečníky často mate, byla od ni celá základní sekce odstíněná a vy jste si mohli bez zádrhelů vyzkoušet různé konstrukce C++. Těším se na vás tedy dále, kdy začneme vytvářet reálně použitelné aplikace.


 

Stáhnout

Staženo 1x (3.16 MB)
Aplikace je včetně zdrojových kódů v jazyce C++

 

  Aktivity (2)

Článek pro vás napsal patrik.valkovic
Avatar
Věnuji se programování v C++ a C#. Kromě toho také programuji v PHP (Nette) a JavaScriptu.

Jak se ti líbí článek?
Ještě nikdo nehodnotil, buď první!


 


Miniatura
Předchozí článek
Cvičení k 13. lekci C++
Miniatura
Všechny články v sekci
Základy C++
Miniatura
Následující článek
Cvičení ke 14. lekci C++

 

 

Komentáře

Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zatím nikdo nevložil komentář - buď první!