9. Preprocesor I
  1. Vzhlednější řešení předchozího zadání můžeme získat pomocí komponenty StringGrid. S používáním této komponenty se seznámíme v nové aplikaci. Na formulář umístíme tuto komponentu a tlačítko ?Spusť. Formulář zvětší?. Formulář zvětšíme. StringGrid změníme dále tyto vlastnosti: ColCount (počet sloupců) nastavíme na 6, RowCount (počet řádků) na 5, DefaultColWidth (implicitní šířka sloupce) na 100 a ScrollBars na ssNone (zákaz použití posuvníků). Komponentu zvětšíme tak, aby všechny sloupce a řádky byly zobrazeny. Obsluha stisku tlačítka bude tvořena příkazy:

  2. char pom[20];
    int Sloupec, Radek;
    for (Sloupec = 1; Sloupec <= 5; Sloupec++) {
      sprintf(pom, "Sl. %d", Sloupec);
      StringGrid1->Cells[Sloupec][0] = pom;
    }
    for (Radek = 1; Radek <= 4; Radek++) {
      sprintf(pom, "Rad. %d", Radek);
      StringGrid1->Cells[0][Radek] = pom;
    }
    for (Sloupec = 1; Sloupec <= 5; Sloupec++)
      for (Radek = 1; Radek <= 4; Radek++) {
        sprintf(pom, "Sl. %d Rad. %d", Sloupec, Radek);
        StringGrid1->Cells[Sloupec][Radek] = pom;
    }
    Prostudujte si výstup a zjistěte, jak se používá vlastnost Cells komponenty StringGrid. Zjistěte k čemu se dají použít vlastnosti FixedColor, FixedCols a FixedRows.
  3. Aplikaci vypisující hodnoty funkce sinus nebo kosinus vyřešte pomocí komponenty StringGrid. Vytvořte tabulku o 2 sloupcích a 11 řádcích. Hodnoty prvního sloupce jsou stále stejné. Můžeme je tedy zobrazit v obsluze události OnCreate formuláře.
  4. Preprocesor před zahájením překladu projde zdrojový text programu a provede rozvinutí maker, vložení vkládaných souborů a zpracuje direktivy podmíněného překladu. Každý řádek zdrojového textu programu, který začíná znakem # je považován za direktivu preprocesoru.

  5. V našich programech jsme se již seznámili s direktivou #include, která vkládá do zdrojového textu programu jiný soubor (těmto souborům říkáme hlavičkové nebo vkládané soubory). Za include následuje specifikace vkládaného souboru. Tato specifikace může být zapsána ve špičatých závorkách (pro systémové hlavičkové soubory) nebo v uvozovkách (pro naše hlavičkové soubory). Rozdíl mezi těmito tvary direktivy include spočívá v algoritmu, který se používá k vyhledání vkládaného souboru. Při použití špičatých závorek se vkládaný soubor hledá v adresářích vkládaných souborů, zatímco v případě uvozovek je nejprve prohledán aktuální adresář (obvykle adresář obsahující překládaný zdrojový soubor) a není-li zde soubor nalezen jsou prohledány i adresáře vkládaných souborů.
    Prohlédněte si některou již vytvořenou aplikaci a zjistěte, jaký tvar direktivy include je zde použit.
  6. Direktiva #define definuje makroinstrukci (běžně používáme název makro). Makra mohou být bez parametrů nebo s parametry. Pokud makro nemá žádné parametry, pak jej zapisujeme takto:

  7. #define identifikátor_makra posloupnost_znaků
    Každý výskyt identifikátoru_makra ve zdrojovém textu programu, který následuje za touto direktivou, bude nahrazen posloupností_znaků. Tato nahrazení se nazývají rozvoj maker. Posloupnost_znaků se někdy nazývá tělo makra. Např. definujeme-li makro
    #define PI 3.14159
    pak v dalším textu zdrojového programu je každý výskyt identifikátoru PI nahrazen znaky 3.14159.
    Definici makra je možno zrušit pomocí direktivy #undef. Např.
    #undef PI
    Po zrušení makra je definice makra zapomenuta.
    Několik maker je definováno přímo překladačem. Některá z těchto maker jsou popsána v další tabulce:
    __cplusplus        Je definováno pro programy v C++
    __DATE__        Datum zahájení překladu.
    __FILE__          Jméno překládaného souboru.
    __TIME__        Čas zahájení překladu.
    Makra s parametry mají tento tvar:
    #define identifikátor_makra(seznam_parametrů) posloupnost_znaků
    Tato makra lze pak ve zdrojovém textu programu rozvíjet zápisem
    identifikátor_makra(seznam_skutečných_parametrů)
    Např. v následující části programu je definováno makro počítající třetí mocninu a je zde také toto makro použito:
    #define TRETIMOCNINA(x) ((x)*(x)*(x))
    ...
    int n, y;
    n = TRETIMOCNINA(y);
    Poslední řádek po rozvoji makra vypadá takto:
    n = ((y)*(y)*(y));
    Asi se vám zdá, že je zde použito mnoho závorek. Musíme ale předpokládat, že parametry makra mohou být i trochu složitější a pak jsou zde závorky nezbytné. Např. v případě
    n = TRETIMOCNINA(y+1);
    Pokud bychom v definici makra neměli uvedeny vnitřní závorky, pak makro by nepočítalo třetí mocninu parametru.
  8. Vytvořte konzolovou aplikaci, která vypíše tabulku druhých a třetích mocnin hodnot ze zadaného intervalu. Mimo intervalu zadávejte z klávesnice i krok. K výpočtu mocnin používejte makra, která si sami vytvoříte.
  9. Následující konzolová aplikace provádí hledání maximální hodnoty z N celých čísel čtených z klávesnice. Upravte tento program tak, aby prováděl současně hledání maximální i minimální hodnoty.

  10. int i, n, cislo, max;
    cout << "Zadej počet čísel: ";
    cin >> n;
    cout << "Zadávej celá čísla:" << endl;
    cin >> max;
    for (i = 2; i <= n; i++) {
      cin >> cislo;
      if (cislo > max) max = cislo;
    }
    cout << "Maximální číslo = " << max << endl;
  11. Následující makro nám umožní nalézt menší hodnotu ze dvou hodnot stejného typu

  12. #define MIN(a,b) (((a)<(b)) ? (a) : (b))
    Napište definici obdobného makra pro určení větší hodnoty. Obě makra použijte v předchozí konzolové aplikaci.

  13. Dále se budeme zabývat Editorem kódu. Editor kódu C++ Builderu umožňuje volit ze čtyř konfigurací mapování klávesnice: Default, IDE Classic, BRIEF a Epsilon. Editor kódu C++ Builderu je obvyklý editor. Základní činnosti se zde provádějí běžným způsobem. V tomto popisu se budeme zabývat pouze speciálními činnostmi. Editor kódu je okno se záložkami. Pokud máme otevřeno více souborů, pak každý soubor je otevřen na samostatné stránce. Na záložkách stránek v horní části okna jsou uvedena jména těch souborů, které jsou na stránkách otevřeny. Přepnutí na jinou stránku provedeme kliknutím na příslušnou záložku. Stavový řádek (u spodního okraje okna) poskytuje obvyklé informace. Je zde uvedena současná pozice kurzoru. Pokud jsme soubor od posledního uložení modifikovali, pak je zde uvedeno slovo Modified. Mohou zde být i další informace (např. otevření souboru pouze pro čtení). Okno editoru má šedý levý okraj. Na tomto okraji se v různých stavech vývoje zobrazují ikony (např. body přerušení a záložky).

  14. Editor kódu také podporuje operaci přetažení vybraného textu. Vybereme text a myší jej můžeme přetáhnout do nové pozice. Pokud jej chceme překopírovat, pak je nutno při tažení držet stisknutou klávesu Ctrl. Je také možno zrušit naposled provedené operace. Počet úrovní rušení je implicitně 32767 (je možno rušit provedené změny od posledního uložení souboru).
    Operace hledání a nahrazování textu usnadňují programování. Můžeme např. hledat ve svém kódu výskyt jisté proměnné. Někdy také potřebujeme změnit jméno proměnné nebo funkce. Tyto činnosti provádíme volbami Search | Find a Search | Replace. Provádějí se běžným způsobem. Pokud potřebujeme nalézt nějaký text v několika souborech, pak můžeme použít volbu Search | Find in Files. Zadáme hledaný text, volby hledání a souborovou masku (včetně adresářové cesty).
    Jednou z velmi užitečných služeb Editoru kódu je jeho interakce s nápovědným systémem. Umístíme kurzor editoru na klíčové slovo C++, vlastnost nebo metodu VCL nebo jiný specifický text C++ Builderu a stiskneme klávesu F1. Pokud existuje nápověda pro textový prvek pod kurzorem, je zobrazena.
  15. Editor kódu má také několik dalších specializovaných služeb. Jednou z nich jsou šablony kódu. Šablony kódu umožňují vkládat předdefinovaný kód do zdrojových jednotek. K použití šablony kódu během editace v Editoru kódu stiskneme Ctrl+J. Je zobrazen seznam šablon, ve kterém můžeme vybírat. Vybereme požadovanou šablonu, stiskneme klávesu Enter a text odpovídající šablony (tj. kód šablony) je vložen do zdrojového kódu na místě kurzoru.

  16. Přidávat nové šablony a editovat existující můžeme na stránce Code Insight dialogového okna zobrazeného po volbě Tools | Environment Options. Pro editaci šablon kódu lze použít i jiný editor. Šablony jsou uloženy v souboru CBULIDER\BIN\BCB.DCI. Znak | v kódu šablony určuje, kde bude umístěn po vložení šablony kurzor.
  17. Další užitečnou službou jsou záložky. Záložky v našem kódu můžeme použít k dočasnému označení nějakého místa. Najednou lze mít nastaveno až 10 záložek. K nastavení záložky na jistém místě stiskneme Ctrl+Shift a číslo nastavované záložky (záložky jsou číslovány 0 až 9). K návratu na definovanou záložku stiskneme Ctrl a číslo záložky. Každý otevřený soubor má své vlastní záložky (nelze přejít na záložku do jiného souboru). K odstranění záložky opět stiskneme Ctrl+Shift a číslo odstraňované záložky (kurzor musí stát na řádku se záložkou, jinak záložku pouze přemístíme).
  18. Další užitečnou službou Editoru kódu je inkrementální hledání. Toto hledání zahájíme volbou Search | Incremental Search. Po zahájení tohoto hledání, na klávesnici zapisujeme hledaný text a tento text je hledán od místa kurzoru v textu zobrazeném v editačním okně. Editor kódu také umožňuje hledání párů závorek. Pokud kurzor stojí na otevírací nebo zavírací závorce, pak stiskem Alt+[ přejdeme na závorku, která s touto závorkou tvoří pár.
  19. Editor kódu má také místní nabídku. Volby v této nabídce je možno rozdělit do dvou skupin: volby editoru a volby ladícího prostředku. Nyní se budeme zabývat pouze volbami editoru (volby ladícího prostředku budou popsány později). Volby editoru jsou popsány v následující tabulce.

  20.  
    Volba Popis
    Open Source/Header File Pokud hlavičkový soubor odpovídající současnému zdrojovému souboru není otevřen, pak touto volbou jej otevřeme na nové stránce v editoru. Pokud tyto oba soubory jsou otevřeny, pak touto volbou se mezi nimi přepínáme.
    Close Page Uzavírá aktivní stránku editačního okna.
    Open File At Cursor Otevírá soubor pod kurzorem (má vliv pouze na zdrojové a hlavičkové soubory).
    New Edit Window Otevírá novou kopii Editoru kódu (vhodné např. když potřebujeme porovnat dva soubory).
    Topis Search Zobrazí nápovědu pro text pod kurzorem.
    View As Form Pokud aktivní soubor v editoru je formulář zobrazený jako text, pak touto volbou jej převedeme opět do zobrazení v Návrhovém formuláři.
    Read Only Přepíná u aktivního souboru režim Read only a Read/write.
    Message View Zobrazuje nebo skrývá okno zpráv.
    Properties Zobrazuje dialogové okno voleb prostředí.
  21. Volbou Tools | Environment Options zobrazíme dialogové okno voleb prostředí. Toto okno má tři stránky. Stránka Editor obsahuje různé volby ovlivňující práci editoru. Stránka Display obsahuje volby týkající se zobrazení textu v okně Editoru kódu. Stránka Colors umožňuje plně přizpůsobit volby barevného označování syntaxe. Podrobněji se tímto dialogovým oknem nebudeme zabývat. Jeho použití je velmi snadné.

Nové pojmy:

9. Preprocesor I