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.
{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] = "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;
}
{/CPP_CONSOLE}
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 90x (3.16 MB)
Aplikace je včetně zdrojových kódů v jazyce C++