16. Struktury II
  1. Slo╛kou struktury m∙╛e b²t i bitovΘ pole. BitovΘ pole je celoΦφselnß slo╛ka o dΘlce 1 a╛ 32 bit∙. DΘlku bitovΘho pole a voliteln² identifikßtor specifikujeme nßsledovn∞:

  2. specifikßtor_typu ident_bitovΘho_pole:╣φ°ka;
    kde specifikßtor_pole je char nebo int (nebo jejich bezznamΘnkovΘ verze). JednotlivΘ bity jsou v danΘm slov∞ p°id∞lovßny od nejni╛╣φho po nejvy╣╣φ bit. V²raz ╣φ°ka nelze vynechat a musφ vΘst na celoΦφselnou konstantu v rozsahu 1 a╛ 32. Pokud v deklaraci bitovΘho pole nenφ uveden identifikßtor, je dan² poΦet bit∙ blokovßn a toto pole je dßle nep°φstupnΘ. Tφmto zp∙sobem je mo╛nΘ vytvß°et nejr∙zn∞j╣φ masky (nap°. pro hardwarovΘ registry), v nich╛ n∞kterΘ bity nemajφ v²znam.
    Bitovß pole je mo╛no deklarovat pouze ve strukturßch, svazech a t°φdßch. Struktury mohou obsahovat jakoukoli kombinaci bitov²ch polφ a "nebitov²ch" typ∙. K jejich zp°φstup≥ovßnφ se pou╛φvajφ tytΘ╛ selektory jako pro jinΘ slo╛ky struktury.
  3. Svazy odpovφdajφ zßznam∙m s variantnφ Φßstφ. Svaz je odvozen² typ, kter² mß mnoho syntaktick²ch a funkΦnφch vlastnostφ struktur. Hlavnφm rozdφlem mezi strukturou a svazem je to, ╛e ve svazu m∙╛e b²t v dan² Φasov² okam╛ik "aktivnφ" pouze jedna jeho slo╛ka. DΘlka svazu je tedy dßna dΘlkou jeho nejv∞t╣φ slo╛ky. V kter²koli okam╛ik je mo╛nΘ uchovat hodnotu pouze jednΘ jeho slo╛ky.

  4. union TSvaz {
      ing i;
      double d;
      char ch;
    } mu, *muptr = μ
    Prom∞nnß mu typu TSvaz m∙╛e b²t pou╛ita pro uchovßnφ 4 slabikovΘho celΘho Φφsla, 8 slabikovΘho reßlnΘho Φφsla nebo jednoslabikovΘho znaku, ale v dan² okam╛ik v╛dy pouze jednoho z nich.
  5. Barva zobrazovan²ch znak∙ a barva pozadφ znak∙ (v konzolovΘ aplikaci) se m∙╛e takΘ zadßvat funkcφ textattr (hlaviΦkov² soubor conio.h). Parametr tΘto funkce je mo╛no vyjßd°it jako bitovΘ pole (4 bity barva znaku, 3 bity barva pozadφ a 1 bit blikßnφ; blikßnφ je mo╛no pou╛φvat pouze v DOSu - v okn∞ konzolovΘ aplikace je po╛adavek na blikßnφ znak∙ ignorovßn). Na tyto bity se v n∞kter²ch p°φpadech m∙╛eme takΘ dφvat jako na jedinou hodnotu, kterΘ °φkßme atribut znaku. Pro spojenφ obou typ∙ pou╛ijeme svaz. Je to ukßzßno v nßsledujφcφm programu.

  6. union barva {
      unsigned char atribut;
      struct {
        unsigned popredi : 4;
        unsigned pozadi : 3;
        unsigned blikani : 1;
      } slozky;
    };
    int main(int argc, char **argv)
    {
      barva b;
      b.slozky.blikani = 1;
      b.slozky.pozadi = BLUE;
      b.slozky.popredi = GREEN;
      textattr(b.atribut);
      cprintf("Zkou╣ka barvy\n\r");
      return 0;
    }
    Vidφme, ╛e s prom∞nnou b zpoΦßtku pracujeme tak, ╛e se odkazujeme na jejφ slo╛ky a potom ji pou╛φvßme celou najednou jako atribut. Pro p°elo╛enφ tohoto programu musφme vlo╛it hlaviΦkov² soubor conio.h.
    Podobn²m zp∙sobem m∙╛eme p°istupovat k r∙zn²m informacφm, kterΘ jsou ulo╛eny na n∞kolika bitech ve slovu.
  7. V²Φtov² datov² typ se pou╛φvß pro p°i°azenφ mnemonick²ch identifikßtor∙ mno╛in∞ celoΦφseln²ch hodnot. Nap°. deklarace

  8. enum dny { ne, po, ut, st, ct, pa, so } den;
    definuje v²Φtov² typ dny, prom∞nnou den tohoto typu a mno╛inu v²Φtov²ch konstant ne, po, ...
    V C++ je mo╛nΘ prom∞nnΘ v²ΦtovΘho typu p°i°adit pouze hodnotu tohoto typu nebo n∞kterou v²Φtovou konstantu tohoto typu. Nap°.
    den = po;
  9. Nßsledujφcφ strukturu m∙╛eme pou╛φt pro ulo╛enφ informacφ o n∞jakΘ osob∞:

  10. enum pohlavi {muz, zena};
    struct osoba {
      char jmeno[25];
      pohlavi pohl;
      union {
        float plat;
        double vaha;
      };
    };
    Struktura umo╛≥uje sledovat jmΘno, pohlavφ a u mu╛∙ plat, zatφmco u ╛en vßhu (nebo obrßcen∞). V p°edchozφ kapitole jsme vytvß°eli konzolovou aplikaci udr╛ujφcφ informace o na╣ich znßm²ch. Do definice struktury v tΘto aplikaci p°idejte svaz (ve smyslu p°edchozφ ukßzky) a prove∩te dal╣φ pot°ebnΘ zm∞ny. Hodnoty v²ΦtovΘho typu nenφ mo╛no Φφst p°φmo datov²m proudem cin.
  11. Roz╣i°te p°edchozφ zadßnφ tak, aby kartotΘka va╣ich znßm²ch byla ulo╛ena v binßrnφm souboru. Po spu╣t∞nφ programu zjist∞te, zda soubor s kartotΘkou existuje. Pokud neexistuje, zadßvejte data z klßvesnice, pokud existuje naΦt∞te je ze souboru. Hodnoty z kartotΘky vypi╣te na obrazovku. Zajist∞te takΘ mo╛nost zadßvßnφ ·daj∙ o dal╣φ osob∞. P°i ukonΦenφ programu v╛dy data zapi╣te do souboru.
  12. Mo╛nosti pou╛φvßnφ v²Φtov²ch typ∙ si ukß╛eme na nßsledujφcφ aplikaci GUI. ZaΦneme s v²vojem novΘ aplikace. Nejprve na formulß° (na levou stranu) vlo╛φme GroupBox (jeho Caption zm∞nφme na ?Zajφmß m∞?), na GroupBox vlo╛φme pod sebe 4x komponentu RadioButton (p°i jejich vklßdßnφ musφ b²t vybrßna komponenta GroupBox; jinak jsou RadioButtony vlo╛eny p°φmo na formulß°) a zm∞nφme jejich vlastnosti Caption na Historie, Literatura, Biologie a Psychologie. Dßle na formulß° vlo╛φme tlaΦφtko s textem Co m∞ zajφmß a komponentu Label (zde zobrazen² text vyprßzdnφme). Nastavenφ voliΦ∙ je vhodnΘ urΦovat pomocφ v²ΦtovΘho typu. Nadefinujeme tedy v²Φtov² typ TZajem a prom∞nnou Zajem tohoto typu. Dßle vytvo°φme obsluhy kliknutφ na jednotliv²ch voliΦφch a obsluhu stisknutφ tlaΦφtka. Pokud jsme nem∞nili nßzvy komponent potom dostaneme (pozor nßsleduje v²pis celΘho programu):

  13. #include <vcl.h>
    #pragma hdrstop
    #include "Unit1.h"
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    enum TZajem {Nic, Historie, Literatura, Biologie, Psychologie};
    TZajem Zajem = Nic;
    __fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::RadioButton1Click(TObject *Sender)
    {
      Zajem = Historie;
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::RadioButton2Click(TObject *Sender)
    {
      Zajem = Literatura;
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::RadioButton3Click(TObject *Sender)
    {
      Zajem = Biologie;
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::RadioButton4Click(TObject *Sender)
    {
      Zajem = Psychologie;
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
      switch (Zajem) {
        case Historie: Label1->Caption = "Zajφmßm se o historii"; break;
        case Literatura: Label1->Caption = "Zajφmßm se o literaturu"; break;
        case Biologie: Label1->Caption = "Zajφmßm se o biologii"; break;
        case Psychologie: Label1->Caption ="Zajφmßm se o psychologii";
                          break;
        default: Label1->Caption = "Nezajφmßm se o nic";
      }
    }
    Vyzkou╣ejte tuto aplikaci a zjist∞te jak pracuje.
  14. V kapitole "P°φkazy °φdφcφ b∞h programu I" jsme vytvß°eli jednoduch² textov² editor. Dopl≥te tuto aplikaci tak, ╛e na formulß° vlo╛φme t°i voliΦe : Vlevo, Doprost°ed a Vpravo, kter²mi budete ovliv≥ovat zarovnßvßnφ zobrazenΘho textu (vlastnost Alignment). Na formulß° p°idejte dal╣φ tlaΦφtko, kter²m (prost°ednictvφm komponenty ColorDialog) budete m∞nit barvu textu v komponent∞ Memo (vlastnost Font.Color).

Kontrolnφ otßzky:

  1. M∙╛e b²t vφce prom∞nn²ch stejnΘho jmΘna?
  2. M∙╛eme pou╛φvat samotnou strukturu bez vytvo°enφ jejφ instance?
  3. Co je to globßlnφ prom∞nnß?
  4. M∙╛e struktura obsahovat r∙znΘ typy dat (char, int, float, atd.)?
  5. Jak p°istupujeme ke slo╛kßm struktury?
  6. Je dovoleno mφt pole struktur?


╪e╣enφ


16. Struktury II