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:

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

  1. Funkce pro výpočet vzdálenosti bodu od počátku.
  2. Funkce pro výpočet vzdálenosti dvou bodů.
  3. 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.