Co je struktura?
V této lekci se naučíte držet pohromadě hodnoty, které k sobě patří. Zatím měla každá proměnná jednu hodnotu a pole několik hodnot stejného datového typu. Vezměte si ale třeba produkt v obchodě: má název (text), cenu (desetinné číslo) a počet kusů, které kupujete (celé číslo). S tím, co zatím znáte, byste potřebovali tři proměnné:
char chleba_nazev[20] = "Chléb";
double chleba_cena = 32.5;
int chleba_pocet = 2;Pro jeden produkt to stačí. Pro deset produktů byste ale potřebovali třicet proměnných a jen podle jejich názvů byste poznali, které k sobě patří. Funkce, která vypíše jeden produkt, by potřebovala tři parametry. Nepomůže ani pole: všechny jeho prvky musí mít stejný datový typ, jenže název, cena a počet stejný typ nemají.
Řešením je struktura. Spojí několik hodnot, klidně různých datových typů, do jednoho celku. Nejdřív popíšete, co bude struktura obsahovat:
struct produkt {
char nazev[20];
double cena;
int pocet;
};Tomu se říká definice struktury. Klíčové slovo struct (zkratka anglického structure, struktura) říká, že následuje struktura, a produkt je její název. Uvnitř složených závorek jsou její členy (říká se jim také položky): hodnoty, které má každý produkt. Každý člen se píše jako deklarace proměnné, tedy datový typ a název, jen bez hodnoty. Definici napište nad main, stejně jako funkce, aby ji překladač znal dřív, než ji použijete.
Samotná definice nevytvoří žádnou proměnnou a nejsou v ní žádné hodnoty. Je jako prázdný formulář s kolonkami Název, Cena a Počet: jen říká, co se bude vyplňovat. Vznikne tím nový datový typ struct produkt a můžete vytvářet proměnné tohoto typu, stejně jako vytváříte proměnné typu int:
struct produkt chleba = {"Chléb", 32.5, 2};Hodnoty ve složených závorkách se přiřadí členům v tom pořadí, v jakém jsou v definici: "Chléb" do nazev, 32.5 do cena a 2 do pocet. Vypadá to jako inicializace pole, jen hodnoty mohou mít různé datové typy.
K jednomu členu se dostanete tak, že za název proměnné napíšete tečku a název členu: chleba.cena je cena chleba. S členem pracujete jako s obyčejnou proměnnou jeho datového typu. chleba.nazev je řetězec, a proto ho vypíšete pomocí %s. chleba.cena je typu double, a tak použijete %.2f:
#include <stdio.h>
struct produkt {
char nazev[20];
double cena;
int pocet;
};
int main(void) {
struct produkt chleba = {"Chléb", 32.5, 2};
printf("%s: %.2f, %d ks\n", chleba.nazev, chleba.cena, chleba.pocet);
return 0;
}Program vypíše:
Chléb: 32.50, 2 ksCelou strukturu najednou printf vypsat neumí, stejně jako celé pole. Vypište její členy jeden po druhém.
Nejčastější chybou je zapomenutý středník za zavírací složenou závorkou. Funkce ho tam nemá, struktura ho tam mít musí. Když ho v programu výše vynecháte, překladač ohlásí:
main.c:7:2: error: expected ';' after struct
7 | }
| ^
| ;
1 error generated.První řádek říká, kde je problém: na řádku 7, ve sloupci 2, hned za } překladač čekal středník za strukturou. Znak ^ ukazuje na to místo a ; pod ním ukazuje, co chybí.
Jak psát:
Pokyny
Nad main definujte strukturu struct mazlicek pro domácího mazlíčka se třemi členy: jmeno (pole 20 znaků typu char), vek (celé číslo typu int) a vaha (desetinné číslo typu double). Nezapomeňte na středník za }.
V main místo komentáře vytvořte proměnnou rex typu struct mazlicek se jménem "Rex", věkem 3 a váhou 12.5.
Pod ni vypište o Rexovi jeden řádek: Rex má 3 roky a váží 12.5 kg. Všechny tři hodnoty přečtěte ze členů proměnné rex a váhu vypište pomocí %.1f.
Začněte programovat zdarma
1/9