IB001 – Seminární skupiny 6, 7 a 24

Týden 6

Základní (primitivní) datové typy III

Reálné datové typy jsou vždy se znaménkem a jazyk C nabízí tyto:

  • float - reálný typ s poloviční přesností
  • double - reálný typ s plnou přesností
  • long double - reálný typ se zvýšenou přesností, nemusí být podporován, často je to double

a platí pro ně sizeof(float) <= sizeof(double) <= sizeof(long double). Typy float a double jsou často implementovány podle standardu IEEE 754 - nyní už ISO (http://www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=57469). Typ float je nejčastěji veliký 32 bitů a typ double 64 bitů. Typ long double bývá implementován jako double. Konkrétní vlastnosti reálných typů popisují makra ze souboru float.h - http://www.cplusplus.com/reference/clibrary/cfloat/, např.:

  • FLT_DIG - počet číslic, které lze reprezentovat typem float bez zaookrouhlení
  • FLT_MIN
  • FLT_MAX

Výčtový typ enum

Výčtový typ je vhodný k definici celočíselných konstant. Často konstanty reprezentují námi vytvořený konečný obor hodnot, kterých pak může proměnná nabývat.
Jako příklad mějme semafor - barvy (hodnoty) mohou být červená, oranžová, zelená:

enum semaphore​
{
    RED,    // 0
    ORANGE, // 1
    GREEN   // 2
};
// definice promenne
semaphore sem = RED;

Konstanty jsou reprezentovány celočíselným typem (např. int) - jazyk C neurčuje kterým. Přesný typ je závislý na prostředí (stroj, kompilátor). Konstantám jsou přiřazovány celočíselné hodnoty od nuly po jedné v pořadí v jakém jdou za sebou, pokud není určeno jinak. Hodnoty konstant lze nastavit pomocí operátoru přiřazení (=):

enum little_number
{
    ONE = 1,
    TWO, // 2
    THREE, // 3
    FIVE = 5
};

Konstanty výčtových typů je možné přímo přiřazovat do proměnných typu int a naopak hodnoty z proměnných typu int považovat za konstanty výčtových typů.

Ukazatele (pointry)

Pointry ukazují na místo v paměti počítače. Mohou ukazovat na jednoduchou proměnnou nebo na složitější objekt, např. pole. Jazyk C je nízkoúrovňový, a proto jsou v něm pointry zapotřebí k vytváření složitějších (dynamických) datových struktur, předávání měnitelných argumentů funkcím (scanf) nebo jinému způsobu procházení polem. Definice pointru se zapíše tak, že zvolíme typ ukazatele, zapíšeme operátor dereference * - označuje, že jde o pointer - a zapíšeme identifikátor; např. takto:

// definice pointru - bez nastaveni hodnoty (adresy v pameti)
int * p;
// definice pointru - nastaveni na adresu promenne nebo pole
int x = 5;
int nums[5];
int * px = &x;
// pnums bude ukazovat na prvni prvek pole
int * pnums = nums;

Pomocí pointru můžeme měnit hodnotu na adrese v paměti, kam pointer ukazuje:

int x = 5;
int * px = &x;
// v x se zmeni hodnota na 3!
*px = 3;

Složené (agregované) datové typy I - pole

Základní datové typy je možné použít k vytváření složených datových struktur - ty mohou být buď homogenní (všechny prvky mají stejný typ) nebo nehomogenní. Pole v jazyce C je homogenním složeným typem, tj. nelze vytvářet pole, která by měla prvky různých typů. K definici (vytvoření) pole se užívají hranaté závorky [ a ] - pole typu int o velikosti 10 prvků se zapíše např. takto:

// vytvori pole celych cisel o velikosti 10 prvku
int numbers[10];
// vytvori pole z konstant podle jejich poctu
int smallPrimes[] = { 2, 3, 5, 7 };

Pole v jazyce C má v paměti uloženy všechny prvky za sebou (jeden za druhým) a k jednotlivým prvkům se přistupuje pomocí indexů od nuly:

// nastav prvni prvek pole na 5 a druhy na 7
numbers[0] = 5;
numbers[1] = 7;
// nastav posledni prvek pole na 0
numbers[9] = 0;

Samotný identifikátor pole numbers označuje adresu v paměti počítače, kde pole začíná. Adresu libovolného prvku je možné získat operátorem reference & tak, že jej umístíme před označení prvku pole:

// adresa pateho! prvku pole
int * address = &numbers[4];

Kromě indexů můžeme pole procházet také pomocí pointrů - využívat pointrovou aritmetiku:

int numbers[] = { 1, 2, 3, 4, -1 };
// definice pointru znak na zacatek pole
int * pnum = numbers;
// cyklus spocita vsechna suda cisla a skonci zapornym cislem
int count = 0;
while (*pnum >= 0)
{
    count++;
}