3. Proměnné a datové typy
  1. Proměnné jsou prvky (hodnoty nebo data), se kterými pracujeme. Deklarace proměnné se vždy skládá ze dvou částí: z typu proměnné a jejího jména. Umístění deklarace proměnné, tj. místo kde se deklarace vyskytuje v kódu programu, určuje oblast platnosti proměnné.

  2. Všechny proměnné musí mít datový typ. Datový typ proměnné určuje hodnoty, které proměnná může obsahovat a operace, které s ní mohou být prováděny. Např. deklarace proměnné int citac určuje, že citac je celočíselný (int). Tento typ může obsahovat pouze celočíselné hodnoty (kladné i záporné) a můžeme s tímto typem používat standardní aritmetické operátory (+, -, * a /) k provádění standardních aritmetických operací (sčítání, odečítání, násobení a dělení). Potřebujeme-li deklarovat několik proměnných stejného typu, pak je můžeme deklarovat najednou. Např.
    float polomer, obvod, obsah;
    deklaruje tři proměnné, které jsou všechny typu float.
    Specifikátory základních datových typů jsou vytvářeny z následujících klíčových slov:
    char int signed
    double long unsigned
    float short
    Z těchto klíčových slov je možné vytvářet celočíselné a reálné typy. Modifikátory short (krátké), signed (se znaménkem) a unsigned (bez znaménka) mohou být aplikovány pouze na celočíselné typy. Nejčastěji používané datové typy jsou uvedeny v následující tabulce:
    Typ Velikost / Formát Popis
    short int nebo short -32768 až 32767 celá čísla
    int, long nebo long int -2147483648 až 2147483647 celá čísla
    unsigned short  0 až 65535 celá čísla bez znaménka
    unsigned int nebo unsigned long 0 až 4294967295 celá čísla bez znaménka
    char 0 až 255 nebo -128 až 127 znak
    float 32-bitové IEEE 754 číslo v pohyblivé řádové čárce s jednoduchou přesností
    double 64-bitové IEEE 754 číslo v pohyblivé řádové čárce s dvojnásobnou přesností
    long double 80-bitové IEEE 754 číslo v pohyblivé řádové čárce se zvýšenou přesností
    bool hodnoty true a false logické hodnoty (pouze v nových verzích překladače)
    Velikost a formát některých základních datových typů může záviset na typu počítače, na kterém je program spuštěn. O těchto datových typech říkáme, že jsou systémově závislé.
    Proměnné základních datových typů mohou obsahovat jednu hodnotu příslušné velikosti a formátu pro svůj typ: číslo, znak nebo logickou hodnotu. Např. hodnota int je celé číslo z intervalu -2147483648 až 2147483647, hodnota char je znak atd.
    Pouze datové typy float, double a long double umožňují pracovat s reálnými čísly. Všechny ostatní datové typy pracují pouze s celými čísly. I když je možné přiřadit hodnotu obsahující zlomkovou část celočíselnému datovému typu, zlomková část je zrušena a celočíselné proměnné je přiřazena pouze celá část čísla. Např.
    int x = 3.75;
    způsobí přiřazení hodnoty 3 do proměnné x (hodnota není zaokrouhlena, ale desetinná část je odříznuta).
    Existují ještě další datové typy. Jsou to pole, struktury, svazy, ukazatele apod. Těmito datovými typy se budeme zabývat později.
  3. Program se odkazuje na hodnotu proměnné pomocí jména proměnné. Např. když jsme se v jednom z předchozích programů odkazovali na hodnotu proměnné obvod, pak jsme jednoduše použili jméno obvod. Jméno proměnné musí splňovat následující pravidla. Musí to být identifikátor. Identifikátor je posloupnost znaků písmen (přípustná jsou pouze písmena anglické abecedy), číslic a znaků podtržení, která nezačíná číslicí. Identifikátory jsou libovolná jména různé délky z nichž se implicitně rozlišuje pouze prvních 32 znaků. Jazyky C a C++ rozlišují v identifikátorech velikost písmen. Identifikátor proměnné se nesmí shodovat se žádným klíčovým slovem (slova, která jsou v editoru kódu zobrazována tučně). Nesmíme mít v jedné oblasti platnosti dvě proměnné stejného jména.

  4. Při vytváření identifikátorů je vhodné dodržovat nějaké konvence. Např. identifikátor pro datový typ bude začínat písmenem T, identifikátor proměnné malým písmenem apod. Je také vhodné používat smysluplná jména, aby na první pohled bylo jasné o co se jedná. Jestliže jméno se skládá z více slov, jako např. jeViditelne, pak v dalších slovech je první písmeno velké. Dodržování těchto pravidel zvyšuje čitelnost programů.
  5. Umístění deklarace proměnné v kódu programu určuje rozsah platnosti proměnné. Proměnné jejichž deklarace jsou zapsány mimo definice funkcí, jsou globální proměnné a je možno je používat kdekoli v programu (od místa deklarace až do konce programu). Deklarace umístěné v definici funkce jsou lokální proměnné a je možno je používat pouze ve funkci ve které jsou deklarovány (od místa deklarace). Po opuštění funkce, lokální proměnné této funkce zanikají.
  6. Proměnné mohou být inicializovány pomocí přiřazovacího příkazu při jejich deklarování. Např.

  7. int pocet = 10;
    deklaruje proměnnou pocet a současně je nastavena počáteční hodnota této proměnné na 10.
    Proměnné, které jsou deklarovány, ale nejsou inicializovány obsahují náhodnou hodnotu. Výjimkou z tohoto pravidla jsou globální proměnné a proměnné deklarované s modifikátorem static. Tyto proměnné jsou inicializovány nulou. Všechny ostatní proměnné obsahují náhodná data, pokud nejsou inicializovány nebo jim není přiřazena hodnota.
  8. Proměnné lze také deklarovat jako konstanty (jejich hodnotu nelze měnit). K deklarování konstanty uvedeme na začátku deklarace klíčové slovo const. Např.

  9. const int hodnota = 125;
    Během deklarace konstanty musí být provedena i její inicializace. S konstantou dále můžeme pracovat stejně jako s proměnnými, až na to, že její hodnotu nelze změnit.
  10. Konstanty jsou symboly reprezentující pevné číselné nebo znakové hodnoty. C++ podporuje čtyři typy konstant: celočíselné, reálné, výčtové a znakové (včetně řetězců). Datový typ konstanty je odvozen z tvaru zápisu.

  11. Celočíselné konstanty mohou být zapsané v desítkové, osmičkové nebo šestnáctkové soustavě. Pokud daná konstanta nemá žádnou modifikační příponu, je její datový typ odvozen z její hodnoty. Desítková konstanta nesmí začínat číslicí nula. Všechny celočíselné konstanty začínající nulou jsou chápány jako osmičkové konstanty. Šestnáctkové konstanty začínají 0X nebo 0x. Např. 10, 010 a 0x10. Přípona L (nebo l) připojená k libovolné celočíselné konstantě definuje tuto konstantu jako typu long. Podobně přípona U (nebo u) označuje konstantu jako typu unsigned (bez znaménka). Tyto přípony mohou být kombinovány a mohou být uvedeny v libovolném pořadí. Např. 100Lu nebo 100UL. Pokud celočíselná konstanta nemá žádnou příponu, pak její datový typ je určen podle její hodnoty.
    Reálné konstanty sestávají z těchto částí: desítkové číslo, desetinná tečka, desítková zlomková část, e (nebo E) s celočíselným exponentem (volitelně) a přípona (volitelně - f nebo F (float) nebo l nebo L (long)). Příklady reálných konstant (v závorkách je uvedena hodnota konstanty): 34.567e15 (34.567x1015), 12.345 a 3E-5 (3x10-5).
  12. Znaková konstanta je jeden nebo několik znaků uzavřených v apostrofech (znaková konstanta reprezentuje jeden znak). Např. 'A', '=' nebo '\n'. Poslední příklad je použití řídící posloupnosti (Escape sekvence). Řídící posloupnosti slouží k vizuální reprezentaci netisknutelných znaků. Začínají obráceným lomítkem za nímž následuje určující znak nebo kód reprezentovaného znaku. Nejdůležitější řídící posloupnosti jsou uvedeny v následující tabulce:
  13. Posloupnost Hodnota Znak
    \b 0x08 Backspace (návrat o znak zpět)
    \f 0x0C Nová stránka
    \n 0x0A Nový řádek
    \r 0x0D Návrat vozíku
    \\ 0x5C Zpětné lomítko
    \' 0x27 Apostrof
    \" 0x22 Uvozovky
    \nnn 0nnn kód znaku v osmičkové soustavě.
    \Xnn 0Xnn kód znaku v šestnáctkové soustavě
    Řetězcové konstanty (říkáme jim také řetězce) se zapisují jako řada znaků ohraničená uvozovkami. Mezi znaky uvnitř uvozovek se mohou nacházet i řídící posloupnosti. Např.
    "\t\t\"Jméno\"\\\tAdresa\n\n"
    Pokud tento řetězec vložíme do výstupního datového proudu cout, pak bude vypsáno:
                "Jméno"\    Adresa
    Před slovem "Jméno" se nacházejí dva znaky tabulátorů, před Adresa jeden a na konci jsou dva znaky odřádkování.
  14. Konstanty výčtových typů, neboli výčtové konstanty jsou identifikátory definované při deklaraci výčtového typu. Identifikátory se většinou volí jako mnemonická označení. Např. deklarace výčtového typu

  15. enum Tden {Pondeli, Utery, Streda, Ctvrtek, Patek, Sobota, Nedele}
    definuje konstanty Pondelí, Utery, ... výčtového typu Tden. Hodnoty těchto konstant jsou tyto: Pondeli = 0, Utery = 1, Streda = 2, .... Nedele = 6. Dalším příkladem konstant výčtových typů je vlastnost Color (viz kapitola Seznámení s C++ Builderem).
  16. Při používání aritmetických výrazů typu a + b, kde a a b jsou různých číselných typů, jsou před zpracováním tohoto výrazu provedeny automaticky některé standardní konverze. Je snaha, aby oba operátory byly stejných typů. "Nižší" typ je převeden na "vyšší" typ. Např. typ short na int nebo typ int na double. Předpokládáme při tom toto "pořadí" typů: char, short, int, long int, float, double a long double.
  17. Při provádění standardních konverzí mezi různými datovými typy mohou vznikat problémy. Např. následující příkazy

  18. short vysledek;
    int x1 = 200;
    int x2 = 200;
    vysledek = x1 * x2;
    přiřadí výsledek násobení dvou proměných typu int do proměnné typu short. I když jsou zde míchány dva datové typy, C++ může provést příslušné konverze. Pokuste se ale zjistit hodnotu proměnné vysledek po provedení těchto příkazů. Pokud vypíšeme hodnotu této proměnné, pak vidíme, že má hodnotu -25536 a to rozhodně není to, co bychom očekávali. Je to dáno tím, že datový typ short má maximální možnou hodnotu 32767. Pokud tuto hodnotu překročíme, pak dojde ke ztrátě významných číslic. Když k hodnotě 32767 přičteme jednotku, pak dostaneme -32768. Je to podobné, jako když na tachometru auta vidíme, že máme ujeto 99999 km a po ujetí dalšího kilometru získáme 00000.
    V některých případech C++ nemůže provést konverzi. V tomto případě překladač generuje chybovou zprávu typu "Cannot convert from X to Y" (typ X nelze převést na typ Y). Překladač také může generovat varování "Conversion might lose significant digits" (konverze může způsobit ztrátu významných číslic). Varování nemusí nutně znamenat chybu, pouze nás upozorňuje na to, že se o chybu může jednat.
  19. Některé výpisy konzolových aplikací uvedené v následujících lekcích neobsahují direktivu:

  20. #include <condefs.h>
    Tato direktiva je automaticky přidávána při vytváření nové konzolové aplikace. Není ale zapotřebí vždy a tak většina programů bude pracovat stejně i když tato direktiva nebude vložena.
  21. Teorie již bylo dost. Přejdeme opět k vytváření programu. Kapacita rovinného kondenzátoru závisí na ploše elektrod S, vzdálenosti l mezi nimi a na druhu izolantu mezi deskami.

  22. C = ere0(S/l)
    kde e0 = 8.85x10-12  F/m. Vytvořte konsolovou aplikaci pro výpočet kapacity slídového kondensátoru (er = 6.5). Hodnoty S a l zadávejte z klávesnice. Např. pro S = 45 cm2 a l = 0,15 mm je kapacita 172.7 pF.

Nové pojmy:

 3. Proměnné a datové typy