- struktury – deklarace, inicializace, volání
- pole struktur
- bitová pole
- uniony
- úkol č. 5
Struktury
Úvod do struktur
Předpokládejme, že chcete (a nekecejte, že ne) uložit jméno, věk a BMI index několika osob. Pole, leč může obsahovat několik položek, to neudělá, protože musí být stejného typu. Odpovědí je struktura v C++. Chcete-li si udělat přehled o všech zaměstnancích, vytvoříte pole struktur. Struktura je jistým prostředkem vedoucím do lahůdky C++ v OOP, třídy. Díky strukturám se přiblížíte OOP (Objektově orientovanému programování), srdci C++.
Struktury tvoříme nejčastěji vně f-ce main. Nazývá se externí deklarací struktury. Proč? Externí deklarace se může použít u všech f-cí, které ji následují, kdežto interní deklarace (např. hned za složenou závorkou za int main) se může použít pouze ve f-ci, ve které se nachází.
Deklarace struktury:
struct nazev_promenne
{
char jmeno[10];
int vek;
double bmi;
};
Inicializace struktury
(za nazev_promenne jsme si zvolili lide):
lide ales =
{
"Ales", //jmeno
22, // vek
11.49 // bmi index
};
Volání některé proměnné ze struktury
Chceme-li vyvolat věk alese, napíšeme:
cout << ales.vek;
To vypíše 22, tedy věk Aleše.
. je operátor příslušnosti. (ales.vek – proměnná vek ve struktuře ales)
Vytvořit struktur si můžeme, kolik chceme, klidně celý počet zaměstnanců. Tedy např.:
lide petr =
{ ... }
…atp
Nebo si můžeme vytvořit prázdné struktury:
lide martin, honza, alena;
Vytvořili jsme tři struktury, každá má svoje proměnné stejně jako ales, ale nemají žádné hodnoty. K čemu by nám ale byly struktury, které mají pevně stanovené hodnoty. Pokud chceme například zapsat vek do struktury alena, napíšeme:
alena.vek = 17;
Je to snadné, stejně jako proměnné, jen tu je navíc tečka, která nám ukazuje, kam daná proměnná patří.
Vytvořit struktury můžeme už při její deklaraci:
struct lide
{
int vek;
} milan;
Je to stejné jako:
struct lide
{
int vek;
};
lide milan;
Kdo přesně stále nechápe struktury, malé vysvětlení:
struct osoba
{
char jmeno[20];
int vek[20];
char prace[20];
} zamestnanec;
Proč nefunguje např. cout << osoba.jmeno;, ale cout << zamestnanec.jmeno;? Co značí „osoba“ a co „zamestnanec“?
Protože:
struct osoba
{
char jmeno[20];
int vek[20];
char prace[20];
};
…je jen DEFINICE, nemá žádné hodnoty.
Vysvětlím to jinak:
Jsou to šuplíky, koupil sis nábytek se třemi šuplíky a teď do nich chceš dát mrkev, hrách a petržel a nazveš to ZELENINA. Takže pokud chceš hrách, dáš zelenina.hrach
A zase: můžeš do nich dát i rýži, fazole a čočku a nazveš to LUSTENINY. Přístup bude: lusteniny.fazole
Ale všechno můžeš mít v těch šuplících. Oni dávají jen místo, je na tobě, jak si to celé pojmenuješ a pak jim dáš hodnotu.
Příklad použití:
#include <iostream>
using namespace std;
struct rostliny
{
char jmeno[20];
float vaha;
double cena;
};
int main()
{
rostliny venkovni =
{
"slunecnice",
0.20,
12.49
};
rostliny vyber;
cout << "kytice: " << venkovni.jmeno << " za ";
cout << venkovni.cena << " Kc\n";
vyber = venkovni; // přiřadí jednu strukturu druhé
cout << "vyber: " << vyber.jmeno << " za ";
cout << vyber.cena << " Kc\n";
return 0;
}
Tady jsme si ukázali i kopírování jedné struktury do druhé.
Pole struktur
Je možné vytvořit i pole, jehož prvky jsou struktury:
rostliny vnitrni[100]; // pole o 100 strukturách rostliny
vnitrni[0].cena; // pouzije promennou cena ze struktury vnitrni[0]
Bitová pole
C++ (podobně jako C) vám umožňuje specifikovat strukturní členy, které zaujímají určitý počet bitů. To můžete použít např. na vytvoření datové struktury, která odpovídá registru nějakého hardwarového zařízení.
struct vypocet
{
int key : 4; // 4 bity pro hodnotu key
bool otazka : 1; // platný vstup (1 bit)
};
Pro přístup k bitovým polím použijte stejnou syntaxi jako u struktur.
vypocet.key = ...
Bitová pole se často používají na úrovni strojově orientovaného programování.
Uniony
Union je datovým formátem, který může používat různé datové typy, ale pouze jeden typ v daném okamžiku. Zatímco struktura může používat typy int, long a float, union může buď int, nebo long, nebo float. Syntaxe je podobná jako u struktur, jen význam různý.
union zkouska
{
int hodn1;
long hodn2;
double hodn3;
};
Proměnnou zkouska můžete využít na uchování int, long, double pouze tak dlouho, dokud potřebujete:
zkouska stetec;
stetec.hodn1 = 15; // uloží int
cout << stetec.hodn1;
stetec.hodn2 = 1.25; // uloží double, hodnota int se ztratí
cout << stetec.hodn2;
Protože v jednom okamžiku proměnná obsahuje jen jednu hodnotu, musí mít dostatek prostoru na úschovu svého nevětšího členu. Z toho důvodu je velikost unionu velikostí největšího členu. Kde se používá? Úspora prostoru…
Úkol:
Vytvořte fiktivní podnik, který bude mít x struktur na seznam zaměstnanců. X je počet zaměstnanců, které určí uživatel na začátku programu. Poté bude uživatel vyzván k zadání 1. zaměstnance a tak dále, dokud se nedostane k poslednímu zaměstnanci, nebo pokud uživatel již nechce přidat dalšího zaměstnance (mezi přidáním dalšího zaměstnance bude otázka, zda si přeje založit dalšího zaměstnance). Pokud odpoví, že již ne, program vypíše všechny údaje o všech zaměstnancích v TABULCE (použití \t, \n apod.) a název firmy. Každý zaměstnanec bude mít následující udaje: jmeno, vek a druh prace. Maximální počet zaměstnanců bude 32 000 (aby to bylo int) ;)
Rada pro ty, co neví: struktury a cykly.