9. cvičení
Všechny datové typy, se kterými jsme doposud pracovali, byly tzv. jednoduché datové typy, které reprezentovaly jednu hodnotu (např. číslo nebo znak). Pro definici komplikovanějších, tzv. složených datových typů slouží v jazyce C struktury. Existuje asi 5 různých způsobů definice struktury, my si (zatím) ukážeme jeden:
typedef struct
{
float x;
float y;
}
point2d;
Definice obsahuje dvě nová klíčová slova, typedef
a struct
, která říkají, že
definujeme strukturu a chceme s ní pracovat jako s typem. Následuje seznam
deklarací složek struktury ve složených závorkách (to můžou být jednoduché
datové typy, ale i dříve definované struktury) a nakonec název struktury.
Poznámky:
- Struktury ve zdrojovém kódu definujeme mimo těla funkcí.
- Každá struktura musí být definovaná před všemi funkcemi, které danou strukturu používají.
Práce se strukturami
Proměnnou typu point2d
můžeme deklarovat stejným způsobem, jako dříve:
point2d a;
Ke složkám x
a y
můžeme přistupovat pomocí operátoru .
(tečka):
a.x = 1;
a.y = 2;
Pro přístup ke složkám struktury pomocí ukazatele slouží operátor ->
(šipka):
point2d* ukazatel = &a;
ukazatel->x = ukazatel->y;
ukazatel->y = 3;
Novou proměnnou také můžeme inicializovat pomocí existující proměnné stejného
typu, přičemž se odpovídajícím způsobem překopírují všechny složky (x
do x
,
y
do y
atd.):
point2d b = a;
Další způsob inicializace struktury spočívá v zadání konkrétních hodnot ve složených závorkách:
point2d c = {2, 3};
Zde jsou jednotlivé složky inicializovány popořadě, tedy v našem případě složka
x
bude mít hodnotu 2 a složka y
hodnotu 3.
Přiřazení je však jediná operace se strukturami, kterou lze v jazyce C provést
automaticky (viz b = a
výše). Ostatní běžné operace jako např. sčítání (+
),
odčítání (-
) a porovnávání (==
, !=
) pro struktury nejsou definovány a
místo nich je potřeba definovat vlastní funkce. Např. funkce pro porovnávání
dvou proměnných typu point2d
lze definovat tyto funkce:
#include <stdbool.h>
bool point2d_eq(point2d p1, point2d p2)
{
return p1.x == p2.x && p1.y == p2.y;
}
bool point2d_ne(point2d p1, point2d p2)
{
return ! point2d_eq(p1, p2);
}
Připomínám, že #include <stdbool.h>
je potřeba pro zpřístupnění klíčového
slova bool
. Názvy funkcí obsahují prefix point2d
, aby bylo jasné, se kterým
typem pracuje (kdybychom měli např. typ point3d
pro reprezentaci bodů v
prostoru, tak by bylo potřeba definovat jiné funkce). Suffixy eq
(zkráceně
equal) a ne
(not equal) pak označují, co daná funkce dělá.
Probrané příklady
- Funkce pro výpočet vzdálenosti bodu od počátku.
- Funkce pro výpočet vzdálenosti dvou bodů.
- Funkce pro výpočet obvodu a obsahu obecného trojúhelníka daného souřadnicemi trojice vrcholů. Pro výpočet obsahu lze použít např. Heronův vzorec.