5. V²razy
  1. V²razy provßd∞jφ v programu prßci. Mimo jinΘ, v²razy jsou pou╛φvßny k v²poΦtu a p°i°azovßnφ hodnot prom∞nn²m a pomßhajφ °φdit provßd∞nφ programu. V²razy majφ dv∞ ·lohy: provedenφ v²poΦt∙ urΦen²ch prvky v²razu a vracejφ n∞jakou hodnotu, kterß je v²sledkem v²poΦtu. M∙╛eme pou╛φt tuto definici: V²raz je °ada prom∞nn²ch, operßtor∙ a volßnφ funkcφ, kterß vypoΦφtß jednu hodnotu.

  2. Jak ji╛ bylo uvedeno v p°edchozφ kapitole, operßtory vracφ hodnotu. Operßtory pou╛φvßme ve v²razech. Nap°. nßsledujφcφ p°φkaz je v²raz (p°edpoklßdejme, ╛e pocet je typu int):
    pocet++;
    Tento v²raz mß hodnotu pocet p°ed provedenφm operace.
    Datov² typ vrßcenΘ hodnoty zßvisφ na prvcφch pou╛it²ch ve v²razu. P°edchozφ v²raz vracφ typ int, proto╛e ++ vracφ hodnotu stejnΘho datovΘho typu jako je jeho operand a pocet je typu int. JinΘ v²razy mohou vracet reßlnß Φφsla, °et∞zce apod.
    V jednom z na╣ich p°edchozφch program∙ byl pou╛it v²raz:
    (c = getchar()) != '\n'
    Tento v²raz je zajφmav², nebo╗ se sklßdß ze t°φ v²raz∙. Prvnφm v²razem je volßnφ funkce getchar. Volßnφ funkce vracφ hodnotu p°eΦtenΘho znaku a tato hodnota je dal╣φm v²razem p°i°azena do prom∞nnΘ c. Hodnotou tohoto v²razu je p°i°azovanß hodnota (tj. p°eΦten² znak) a tato hodnota je porovnßna v poslednφm v²razu se znakem od°ßdkovßnφ. Nenφ-li hodnota p°eΦtenΘho znaku znak od°ßdkovßnφ, pak tento v²raz je pravdiv². Jak vidφme m∙╛eme vytvß°et slo╛enΘ v²razy z r∙zn²ch men╣φch v²raz∙ a to tak, aby datovΘ typy Φßsti v²razu byly ve shod∞. V p°edchozφm p°φklad∞ takΘ vidφme postup p°i vyhodnocovßnφ v²razu.
    P°edpoklßdejme nßsledujφcφ slo╛en² v²raz
    x * y * z
    V tomto p°φpad∞ po°adφ, ve kterΘm je v²raz vyhodnocovßn, nenφ podstatnΘ nebo╗ v²sledek nßsobenφ nezßle╛φ na po°adφ nßsoben²ch hodnot. Toto, ale neplatφ ve v╣ech v²razech. Nap°. nßsledujφcφ v²raz dßvß r∙zn² v²sledek v zßvislosti na tom, zda je d°φve provedena operace sΦφtßnφ nebo operace d∞lenφ.
    x + y / 100
    Prioritu operacφ m∙╛eme zm∞nit pou╛itφm zßvorek. Nap°. m∙╛eme zapsat (x + y) / 100. Jestli╛e zßvorky nepou╛ijeme, pak po°adφ provßd∞nφ operacφ je urΦeno prioritou jednotliv²ch operßtor∙. Operßtory s vy╣╣φ prioritou jsou provßd∞ny d°φve. D∞lenφ mß vy╣╣φ prioritu ne╛ sΦφtßnφ a nß╣ slo╛en² v²raz je ekvivalentnφ s v²razem
    x + (y / 100)
    V nßsledujφcφ tabulce je uvedena priorita jednotliv²ch operßtor∙ a to od nejvy╣╣φ k nejni╛╣φ priorit∞. Operßtory na stejnΘm °ßdku majφ stejnou prioritu.
    Operßtory Po°adφ vyhodnocovßnφ
    () [] -> >> . zleva doprava
    ! ~ + - ++ -- & *(zm∞na typu) - unßrnφ operace  zprava doleva
    sizeof new delete typeid zprava doleva
    .* ->* zleva doprava
    * / %  zleva doprava
    + - zleva doprava
    << >> zleva doprava
    < <= > >= zleva doprava
    == != zleva doprava
    & zleva doprava
    ^ zleva doprava
    | zleva doprava
    && zleva doprava
    || zleva doprava
    ?: zprava doleva
    = *= /= %= += -= |= &= ^= <<= >>= zprava doleva
    , zleva doprava
    Kdy╛ v jednom v²razu jsou operßtory se stejnou prioritou, pak n∞jakΘ pravidlo musφ rozhodnout, kter² z nich bude pou╛it prvnφ. V╣echny binßrnφ operßtory mimo operßtoru p°i°azenφ jsou provßd∞ny odleva doprava. Operßtory p°i°azenφ jsou provßd∞ny zprava doleva.
  3. V p°edchozφ kapitole jsme se zab²vali vytvß°enφm konzolovΘ aplikace p°evßd∞jφcφ sekundy na minuty a sekundy. Nynφ totΘ╛ vy°e╣φme jako aplikaci GUI (a zopakujeme si, co jsme pou╛φvali v prvnφ kapitole). Na formulß° umφstφme editaΦnφ komponentu (vyprßzdnφme jejφ obsah), nad nφ umφstφme komponentu Label s textem ?Zadej poΦet sekund:, vedle editaΦnφ komponenty p°idßme tlaΦφtko ?,VypoΦti a pod editaΦnφ komponentu vlo╛φme dal╣φ ? Label, ve kterΘ budeme zobrazovat v²sledek (tuto komponentu vyprßzdnφme). Zßkladnφ rozdφl mezi touto a konzolovou aplikacφ je ten, ╛e zde zadßvßme informace v editaΦnφ komponent∞ (zadanß hodnota je brßna jako °et∞zec znak∙). Obdobn∞ to lze °φci i o v²stupu (nap°. p°i zßpisu do komponenty Label). Musφme se tedy zab²vat p°evodem °et∞zec - Φφslo a takΘ opaΦn²m p°evodem. Pro p°evod °et∞zce znak∙ na celΘ Φφslo pou╛φvßme metodu ToInt a pro opaΦn² p°evod konstruktor AnsiString (vlastnosti Text a Caption jsou typu AnsiString). Obsluhu stisku na╣eho tlaΦφtka bude tvo°it p°φkaz (operßtory + zde spojujφ textovΘ °et∞zce v jeden °et∞zec, tj. je vytvo°en jeden °et∞zec tvaru: V²sledek: XX:XX):

  4.  Label2->Caption = "V²sledek: " + AnsiString(Edit1->Text.ToInt() / 60)
                                      + ":" + AnsiString(Edit1->Text.ToInt() % 60);
    V na╣em programu nenφ o╣et°eno p°φpadnΘ zadßnφ neΦφselnΘ hodnoty (je pouze generovßna standardnφ v²jimka popisujφcφ chybu). Program vyzkou╣ejte, pokuste se takΘ zadat neΦφselnou hodnotu a seznamte se se standardnφm zp∙sobem signalizace chyb.
  5. Pokud nepoΦφtßme konsolovΘ aplikace, pak  jsme v na╣ich programech zatφm nepot°ebovali ╛ßdnΘ prom∞nnΘ (nap°. pro ulo╛enφ meziv²sledk∙). V p°edchozφm p°φklad∞ dvakrßt p°evßdφme text zapsan² v editaΦnφm ovladaΦi na Φφslo. Toto nynφ zm∞nφme, p°evod provedeme pouze jednou a p°evedenou hodnotu ulo╛φme do prom∞nnΘ. Do prom∞nn²ch m∙╛eme takΘ umφstit v²sledky. Deklarujeme prom∞nnΘ Sekundy a Minuty, kterΘ budou typu int. Obsluha stisku tlaΦφtka bude nynφ tvo°ena p°φkazy:

  6. int Sekundy, Minuty;
    Sekundy = Edit1->Text.ToInt();
    Minuty = Sekundy / 60;
    Sekundy %= 60;
    Label2->Caption = "V²sledek: " + AnsiString(Minuty)+ ":" + AnsiString(Sekundy);
    Vidφme, ╛e p°φkazy provßd∞jφcφ v²poΦty jsou stejnΘ jako v konzolovΘ aplikaci, p°φkazy vstup∙ a v²stup∙ se li╣φ. Vyzkou╣ejte provΘst tyto zm∞ny.
  7. Upravte p°edchozφ program tak, aby se poΦet sekund rozlo╛il na poΦet hodin, minut a sekund (obdoba dal╣φ konsolovΘ aplikace).
  8. Vytvo°te program, kter² bude provßd∞t v²poΦet obvodu a obsahu kruhu o zadanΘm polom∞ru (ka╛d² v²sledek ulo╛te do jinΘ komponenty Label). Pro ulo╛enφ reßln²ch Φφsel pou╛φvßme datov² typ double. Pro p°evod °et∞zce na typ double pou╛φvßme metodu ToDouble a pro opaΦn² p°evod op∞t konstruktor AnsiString.
  9. Kdy╛ se podφvßme na n∞kterou obsluhu udßlosti (nap°. obsluhu udßlosti stisku tlaΦφtka), pak zjistφme, ╛e jmΘno obsluhy je tvo°eno jmΘnem formulß°e, dv∞mi dvojteΦkami a jmΘnem tvo°en²m z nßzvu komponenty a nßzvu udßlosti (nap°. Form1::Button1Click). Zatφm jsme pou╛φvali p°evß╛n∞ obsluhy stisknutφ tlaΦφtka. Udßlosti je ale mnohem vφce. Jestli╛e chceme vytvo°it obsluhu pro n∞jakou udßlost (stisknutφ tlaΦφtka je implicitnφ udßlostφ tlaΦφtka a obsluhu implicitnφ udßlosti vytvo°φme dvojit²m kliknutφm na komponent∞) provedeme to dvojit²m kliknutφm na udßlosti v Inspektoru objekt∙. ZaΦneme vytvß°et novou aplikaci, kde do st°edu formulß°e vlo╛φme tlaΦφtko a vytvo°φme obsluhu udßlosti OnResize formulß°e (zm∞na velikosti formulß°e) tak, aby p°i zm∞n∞ rozm∞r∙ formulß°e my╣φ, bylo tlaΦφtko v╛dy uprost°ed. Rozm∞ry vnit°nφ oblasti formulß°e urΦujφ vlastnosti ClientWidth a ClientHeight. Vytvo°te tuto aplikaci sami.
5. V²razy