Seminární skupina IB001 Úvod do programování skrze C (skupiny 27 a 28)

Týden 6

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

Další dvě kategorie typů v jazyce C jsou znakové a reálné typy.

Typ pro znaky se v C označuje klíčovým slovem char. Typ char je celočíselný, znaménkový/neznaménkový, jeho velikost je závislá na architektuře stroje, pro který je program kompilován, a běžně reprezentuje jeden znak v ASCII kódování (http://www.asciitable.com/). Nejnižší a nejvyšší reprezentovatelnou hodnotu udávají makra CHAR_MIN a CHAR_MAX z limits.h.
Stejně jako číselné konstanty, existují i znakové konstanty a zapisují se mezi apostrofy, např. 'a':

char c = '!';

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
};

Řídící příkaz switch

Řídící příkaz switch je možné využít, když se chceme v programu "rozhodnout" na základě hodnoty výrazu mezi několika předem danými možnostmi. Představme si např., že chceme napsat program, který načte dvě celá čísla a jeden znak, který bude vyjadřovat, jaká matematická operace se má na číslech provést. Program bychom mohli napsat pomocí if - else, můžeme ale využít také příkazu switch:

int a, b, result;
char op;
// cast programu, kde se nactou a, b a op
switch (op)
{
    case '+':
        printf("Soucet je: %d", a + b);
        break;
    case '-':
        printf("Rozdil je: %d", a - b);
        break;
    case '*':
        printf("Soucin je: %d", a * b);
        break;
    case '/':
        printf("Podil je: %d", a / b);
        break;
    default:
        // provede se, pokud se nenajde pasujici "case"
        printf("Neznama operace");
}

Ve skutečnosti se ale příkaz switch chová podobně jako příkaz goto, což může způsobit nemalé problémy při hledání chyb v programu. Za klíčovým slovem switch se provede porovnání proměnné s konstantami v příkazech case. Pokud je vhodný case nalezen, program pokračuje tam. Pokud vhodný case nalezen není, pokračuje program příkazy ve větvi default (pokud je v programu) nebo opustí switch.
Ukončovací příkaz break je za case nejčastěji nutný - pokud chybí, pak program pokračuje dalším řádkem (dalším case). Této vlastnosti je také možné využít ke spojení několika možností do jedné větve:

// cast programu, kde se nacte promenna num
switch (num)
{
    case 1:
    case 2:
    case 3:
        printf("Jedna, dve nebo tri");
        break;
    case 5:
        printf("Pet");
        break;
    default:
        printf("Jine cislo");
}