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