Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
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í.

Lekce 16 - Struktury v jazyce C++

V předešlém cvičení, Řešené úlohy k 15. lekci C++, jsme si procvičili nabyté zkušenosti z předchozích lekcí.

V dnešním C++ tutoriálu se naučíme tzv. struktury. Jedná se o mezikrok mezi procedurálním a objektově 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 = "Tomas Marny";
    int vek = 33;
    string ulice = "Sikma 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";

for (int 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 << endl;
}

Výsledek:

Konzolová aplikace
Uzivatel na indexu 0
Jmeno: Tomas Marny
Vek: 33
Ulice: Sikma 5

Uzivatel na indexu 1
Jmeno: Josef Novy
Vek: 28
Ulice: Ve Svahu 8

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ů (někdy se mu říká záznamový typ). 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 musí být středník.

Tělo funkce main() nyní přepíšeme do následující 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 = "Ve Svahu 8";

    for (int 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 << 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 kurzu.

Další definice struktur

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

struct
{
    string jmeno;
    int vek;
    string ulice;
}  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 knihovnami.

Pozn.: Kromě struktur můžeme v C++ definovat i tzv. union. 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 union 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í kurz základů jazyka C++. Gratuluji vám, jste seznámení s většinou jeho konstrukcí! :) Výuka samozřejmě pokračuje dále a to navazujícím kurzem 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 C řetězců. Protože je tato problematika poměrně komplikovaná a začátečníky často mate, byl od ní celý základní kurz 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.

V následujícím cvičení, Řešené úlohy ke 16. lekci C++, si procvičíme nabyté zkušenosti z předchozích lekcí.


 

Měl jsi s čímkoli problém? Stáhni si vzorovou aplikaci níže a porovnej ji se svým projektem, chybu tak snadno najdeš.

Stáhnout

Stažením následujícího souboru souhlasíš s licenčními podmínkami

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

 

Předchozí článek
Řešené úlohy k 15. lekci C++
Všechny články v sekci
Základní konstrukce jazyka C++
Přeskočit článek
(nedoporučujeme)
Řešené úlohy ke 16. lekci C++
Článek pro vás napsal Patrik Valkovič
Avatar
Uživatelské hodnocení:
52 hlasů
Věnuji se programování v C++ a C#. Kromě toho také programuji v PHP (Nette) a JavaScriptu (NodeJS).
Aktivity