Datové typy 6 A1PRG - Programování – Seminář Verze 2009.01 Datové typy 6 A1PRG - Programování – Seminář Ing. Michal Heczko heczko@fai.utb.cz
Agenda Co je to „Datový typ“ Celočíselné datové typy Racionální datové typy Prázdný typ (void) Typ definovaný uživatelem (typedef) Výčtový typ (enum) Struktury
Datové typy Pro uchovávání uživatelských hodnot, výsledků výpočtů a dalších hodnot používáme proměnné. Pro každou proměnnou je nutné definovat datový typ: Definuje jaká hodnota bude uložena v dané proměnné Definuje velikost paměti, která je proměnné vyhrazena.
Celočíselné datové typy Rozdělení Znaménkové (klíčové slovo signed) Kladná a záporná čísla Neznaménkové (klíčové slovo unsigned) Pouze kladná čísla a 0
Celočíselné datové typy Způsob uložení neznaménkových čísel v paměti: Př. Uložení čísla 131 bit 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 hodnota bit 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 hodnota
Celočíselné datové typy Způsob uložení znaménkových čísel v paměti Př. Uložení čísla 131 Př. Uložení čísla -131 bit Z 14 13 12 11 10 9 8 7 6 5 4 3 2 1 hodnota bit Z 14 13 12 11 10 9 8 7 6 5 4 3 2 1 hodnota bit Z 14 13 12 11 10 9 8 7 6 5 4 3 2 1 hodnota
Celočíselné datové typy Název typu Popis Vel. [b] Dolní mez Horní mez signed int Celé číslo se znaménkem 32 -2 147 483 648 2 147 483 647 signed short int Krátké celé číslo se znaménkem 16 - 32 768 32 767 signed long int Dlouhé celé číslo se znaménkem signed long long int Velmi dlouhé celé číslo se znaménkem 64 -9 223 372 036 854 775 808 9 223 372 036 854 775 807 signed char Znak se znaménkem 8 -128 127 Long long obsaženo od normy C99. Pro načítání používáme scanf(„%lld“,&x); Pozn.: Datový typ long long int zavádí až norma C99
Celočíselné datové typy Název typu Popis Vel. [b] Dolní mez Horní mez unsigned int Celé číslo bez znaménka 32 4 294 967 295 unsigned short int Krátké celé číslo bez znaménka 16 65 536 unsigned long int Dlouhé celé číslo bez znaménka unsigned long long int Velmi dlouhé celé číslo bez znaménka 64 18 446 744 073 709 551 616 unsigned char Znak bez znaménka 8 255 Long long obsaženo od normy C99. Pro načítání používáme scanf(„%lld“,&x); Pozn.: Datový typ long long int zavádí až norma C99
Celočíselné datové typy Klíčové slovo unsigned značí použití čísla bez znaménka, signed se znaménkem. Pokud není uvedeno, je číslo definované jako číslo se znaménkem. Velikosti v bitech a rozsahy jsou pouze orientační. U některých překladačů se mohou tyto hodnoty lišit.
Celočíselné datové typy Datový typ long long: Specifikován v normě C99 Pro vstup a výstup na terminál – %LLd (nebo %lld): long long x; scanf(“%LLd”,&x); printf (“%LLd”,x);
Celočíselné datové typy Ukázka 1 Rozsahy datových typů
Racionální datové typy Název typu Popis Vel. [b] Dolní mez Horní mez float Reálné číslo s jednoduchou přesností 32 3.4e-38 3.4e38 double Reálné číslo s dvojitou přesností 64 1.7e-308 1.7e308 long double Reálné číslo se zvýšenou přesností 80 3.4e-493 1.1e493 Long long obsaženo od normy C99. Pro načítání používáme scanf(„%lld“,&x);
Racionální datové typy Někdy označovány i názvem „Reálné datové typy“, ten však není zcela přesný. Velikosti v bitech a rozsahy jsou pouze orientační. U některých překladačů se mohou tyto hodnoty lišit.
Racionální datové typy V paměti uloženy v souladu s normou IEEE 754. Float (racionální číslo v jednoduché přesnosti): Nejvyšší bit – znaménko (0 = kladné; 1 = záporné číslo) Exponent – 8 bitů – exponent (pro 2e) posunutý o hodnotu 127 (tak, aby mohl být v rozsahu od -126 do 127). Mantisa – 23 bitů – od nejvyššího bitu (2-1, 2-2, 2-3, … 2-22. 2-23) Bit 31 30 29 … 24 23 22 21 … 1 0 Význam Znaménko Exponent (8 bitů) Mantisa (23 bitů)
Racionální datové typy Double (racionální číslo s dvojitou přesnosti): Nejvyšší bit – znaménko (0 = kladné; 1 = záporné číslo) Exponent – 11 bitů – exponent (pro 2e) posunutý o hodnotu 1023 (tak, aby mohl být v rozsahu od -1022 do 1023). Mantisa – 52 bitů – od nejvyššího bitu (2-1, 2-2, 2-3, … 2-52. 2-53) Bit 63 62 61 … 53 52 51 50 … 1 0 Význam Znaménko Exponent (11 bitů) Mantisa (52 bitů)
Prázdný typ Klíčové slovo void Nenabývá žádných hodnot Použití: Pokud funkce nemá žádné vstupní parametry: int soucet(void) { int a, b; scanf("%d %d",&a,&b); return (a+b); }
Prázdný typ Pokud funkce nemá žádnou návratovou hodnotu: void pozdrav(void) { printf(„AHOJ!\n"); }
Typ definovaný uživatelem Klíčové slovo typedef Umožňuje vytvářet vlastní datové typy – vytvoří nové jméno pro již existující datový typ. Př. typedef unsigned int delka; delka a, b; a = 5;
Výčtový typ Klíčové slovo enum Použití v případě, že existuje předem definovaná konečná množina hodnot, kterých může údaj nabývat. Při definici výčtového typu je nutné uvést všechny hodnoty.
Výčtový typ Obecná syntaxe: typedef enum {HODNOTA1, HODNOTA2, … , HODNOTAN} JMENO; Příklad: typedef enum {PONDELI, UTERY, STREDA, CTVRTEK, PATEK, SOBOTA, NEDELE} DNY;
Výčtový typ Použití: typedef enum {PONDELI, UTERY, STREDA, CTVRTEK, PATEK, SOBOTA, NEDELE} DNY; DNY d1; d1 = UTERY; if (d1 == UTERY) printf("Dnes je utery!");
Celočíselné datové typy Ukázka 2 Výčtový typ
Struktury Struktura Skupina proměnných, které mohou být různého datového typu. Tyto proměnné jsou seskupeny pod jeden identifikátor. Příklad použití: Definice bodu v rovině. Bod tvoří 2 souřadnice – x, y Údaje o zaměstnanci Každý zaměstnanec je popsán množinou atributů (jméno, adresa, rodné číslo, …)
Struktury Definice struktury: struct <nazev> { <promenna1>; <promenna2>; …; <promennaN>; }; Příklad: struct bod{ int x; int y; };
Struktury Inicializace struktury: struct <nazevstruktury> <identifikator> = { <hodnota1>, <hodnota2>, …, <hodnotaN>}; Příklad: struct bod A = {3, 2};
Struktury Přístup k jednotlivým prvkům struktur: <nazevstruktury>.<promenna> = <hodnota>; Příklad: struct bod A = { 3, 2}; A.x = 5; A.y = 6;
Definice struktury pomocí typedef Druhá možnost definice struktury: typedef struct { int x; int y; } bod; Umožní definovat proměnnou bez klíčového slova struct: bod A; Nebo s inicializací: bod A = {0,0};
Celočíselné datové typy Ukázka 3 Struktury
A1PRG-s 06. Datové typy Děkuji za pozornost Ing. Michal Heczko heczko@fai.utb.cz 218/U3 Prezentace k dispozici na http://vyuka.fai.utb.cz