14. Pole II
  1. Nßsledujφcφ funkce provßdφ hledßnφ zadanΘ hodnoty X v prvnφch N prvcφch pole A.

  2. int vyskyt(int N, int A[], int X)
    {
      int i;
      for (i = 0; i < N; i++) if (A[i] == X) return i;
      return -1;
    }
    Funkce vracφ index v²skytu prvku, nenφ-li hodnota v poli obsa╛ena, je vrßceno -1. Vytvo°te obdobnou funkci, kterß bude zji╣╗ovat, zda zadan² znak je obsa╛en v poli znak∙. Funkci pou╛ijte v konzolovΘ aplikaci, kterß p°eΦte v∞tu ukonΦenou teΦkou a kterß zjistφ celkov² poΦet v²skyt∙ samohlßsek v tΘto v∞t∞ (v╣echny samohlßsky ulo╛φme do pole prvk∙ typu char a k urΦenφ zda znak je samohlßska pou╛ijeme upravenou funkci).
  3. Nßsledujφcφ funkce provßdφ °azenφ pole n hodnot typu int. Pole je °azeno vzestupn∞.

  4. void razeni(int n, int a[])
    {
      int i, priznak, pom;
      do {
        priznak = 0;
        for (i = 0; i < n-1; i++)
          if (a[i] > a[i+1]) {
            pom = a[i];
            a[i] = a[i+1];
            a[i+1] = pom;
            priznak = 1;
          }
      } while (priznak);
    }
    Zm∞≥te tuto funkci tak, aby provßd∞la °azenφ pole s prvky typu double a pou╛ijte ji v programu, kde takovΘto pole p°eΦtete, nechßte je se°adit a op∞t je vypφ╣ete.
  5. C++ nepodporuje °et∞zcovΘ prom∞nnΘ (prom∞nnΘ, kterΘ obsahujφ text). ╪et∞zce v programech C++ jsou reprezentovßny poli datovΘho typu char. Nap°. znakovΘmu poli lze p°i°adit °et∞zec takto:

  6. char text[] = "Toto je °et∞zec.";
    Tφm alokujeme 17 slabik v pam∞ti a ulo╛φme °et∞zec na toto mφsto. Pokud spoΦφtßme znaky na╣eho °et∞zce, zjistφme, ╛e jich je pouze 16. Poslednφ 17 slabika je alokovßna pro ulo╛enφ ukonΦujφcφho znaku °et∞zce  (tento znak je na konec °et∞zce vlo╛en automaticky). UkonΦujφcφ znak je specißlnφ znak, kter² je reprezentovßn konstantou '\0', co╛ je ekvivalentnφ s Φφslem 0.
  7. Kdy╛ program nalezne ve znakovΘm poli znak s k≤dem 0, interpretuje jej jako konec °et∞zce. To nßm ukß╛e nßsledujφcφ konzolovß aplikace.

  8. int main(int argc, char **argv)
    {
      char ret[] = "Toto je °et∞zec.";
      cout << ret << endl;
      ret[7] = '\0';
      cout << ret << endl;
      getch();
      return 0;
    }
    P∙vodn∞ znakovΘ pole obsahovalo znaky Toto je °et∞zec. nßsledovanΘ ukonΦujφcφm znakem. Tento °et∞zec je vypsßn. Dal╣φ p°φkaz vlo╛φ ukonΦujφcφ znak za sedm² prvek pole. Kdy╛ znakovΘ pole op∞t vypφ╣eme, pak je vypsßno pouze prvnφch sedm znak∙ pole (do ukonΦujφcφho znaku pole). Zbytek pole je ji╛ za ukonΦujφcφm znakem a nenφ ji╛ souΦßstφ na╣eho °et∞zce.
    Namφsto znaku '\0' m∙╛eme jednodu╣e pou╛φvat 0. Nßsledujφcφ dva °ßdky k≤du jsou ekvivalentnφ:
      ret[7] = '\0';
      ret[7] = 0;
    Nezapom∞nte na rozdφl mezi apostrofy a uvozovkami. Kdy╛ p°i╛azujeme ukonΦujφcφ znak (nebo jinou znakovou konstantu), pak pou╛φvßme apostrofy. P°i prßci se znakov²mi °et∞zci (vφce znak∙), pak je nutno pou╛φvat uvozovky.
  9. Pro prßci s °et∞zci (porovnßvßnφ °et∞zc∙, kopφrovßnφ apod.) pou╛φvßme funkce z hlaviΦkovΘho souboru string.h. Nejd∙le╛it∞j╣φ funkce z tohoto hlaviΦkovΘho souboru jsou: strcpy (kopφrovßnφ znak∙ °et∞zce), strcat (p°ipojuje °et∞zec k jinΘmu °et∞zci), strchr (hledß znak v °et∞zci), strcmp (porovnßvßnφ °et∞zc∙), strcmpi (porovnßvßnφ °et∞zc∙ bez rozli╣enφ velikosti pφsmen), strlen (dΘlka °et∞zce), strlwr (p°evßdφ velkß pφsmena v °et∞zci na malß), strrev (obracφ °et∞zec), strstr (hledßnφ pod°et∞zce v °et∞zci) a strupr (p°evßdφ malß pφsmena v °et∞zci na velkß). ╪et∞zec m∙╛eme Φφst datov²m proudem cin. V²stup °et∞zc∙ provßdφme datov²m proudem cout.

  10. Tyto funkce byly zavedeny ji╛ v jazyku C. P°i vytvß°enφ aplikacφ GUI budemo p°i prßci s °et∞zci pou╛φvat t°φdu AnsiString (viz dßle).
    Nßsleduje n∞kolik p°φklad∙ manipulace s °et∞zci. Funkce strcpy se pou╛φvß ke kopφrovßnφ jednoho °et∞zce do jinΘho. Zdrojov² °et∞zec m∙╛e b²t prom∞nnß nebo °et∞zcovß konstanta.
    // vytvo°enφ prom∞nnΘ pro ulo╛enφ 29 znak∙
    char buff[30];
    // kopφrovßnφ °et∞zcovΘ konstanty do buff
    strcpy(buff, "Toto je test.");
    // zobrazenφ buff
    cout << buff << endl;
    // inicializace druhΘho buferu
    char buff2[] = "Druh² °et∞zec.";
    // kopφrovßnφ obsahu buff2 do buff
    strcpy(buff, buff2);
    cout << buff << endl;
    Stejn∞ jako u Φφseln²ch polφ, i u znakov²ch polφ se nesmφ p°ekroΦit konec pole. Nap°.
    char buff[10] = "╪et∞zec";
    // a n∞kdy pozd∞ji
    strcpy(buff, "Toto je test.");
    Zp∙sobφ chybu, nebo╗ do buff je mo╛no ulo╛it pouze °et∞zec o devφti znacφch (a ukonΦujφcφ znak). V tomto p°φpad∞ op∞t dojde k p°epsßnφ n∞jak²ch informacφ ulo╛en²ch za polem.
    Jinou Φasto pou╛φvanou funkcφ je sprintf. Tato funkce umo╛≥uje vytvß°et formßtovanΘ °et∞zce mφchßnφm textu a hodnot. S touto funkcφ jsme se ji╛ v na╣ich programech setkali. Nßsleduje p°φklad pou╛itφ tΘto funkce:
    char buff[30];
    int x = 20;
    int y = 5;
    sprintf(buff, "%d + %d = %d", x, y, x + y);
    cout << buff;
    Tato Φßst programu nßm na obrazovce zobrazφ:
    20 + 5 = 25
    JednoduchΘ zp∞tnΘ lomφtko v °et∞zci indikuje Escape sekvenci. Nap°. '\n' pro od°ßdkovßnφ nebo '\t' reprezentuje znak tabulßtoru. Pokud v °et∞zci pot°ebujeme pou╛φt zp∞tnΘ lomφtko musφme zapsat dv∞ zp∞tnß lomφtka. Nap°.
    strcpy(jmenoSouboru, "c:\\prac\\abc.txt");
    Nemusφme pracovat pouze se znakov²mi poli, ale m∙╛eme mφt takΘ pole znakov²ch polφ (pole °et∞zc∙). Nap°.
    char retezec [][20] = {
      "Toto je °et∞zec 1.",
      "Toto je °et∞zec 2.",
      "Toto je °et∞zec 3.",
      "Toto je °et∞zec 4."
    };
    Tento k≤d vytvß°φ pole Φty° °et∞zc∙, ka╛d² m∙╛e obsahovat a╛ 19 znak∙.
  11. Vytvo°te program, ve kterΘm p°eΦtete n∞kolik jmen (nepou╛φvejte jmΘna s diakritick²mi znamΘnky), abecedn∞ je se°a∩te a op∞t vypi╣te.
  12. Napi╣te funkci, kterß p°eΦte jmΘno a p°φjmenφ (jako dva °et∞zce - pou╛φvejte pouze pφsmena anglickΘ abecedy), u p°φjmenφ zm∞≥te v╣echny znaky na velkß pφsmena a u jmΘna v╣echny znaky na malß pφsmena. Hodnota funkce bude text vytvo°en² spojenφm p°φjmenφ, mezera, jmΘno. Tuto funkci vyzkou╣ejte v n∞jakΘm programu.
  13. Vytvo°te konzolovou aplikaci, kterß p°eΦte p°irozenß Φφsla n a m a hodnoty matice typu n * m s prvky typu double (p°edpoklßdejte, ╛e n < 10 a m < 5). V programu zjist∞te pr∙m∞rnou hodnotu ze v╣ech prvk∙ matice a prvky matice p°ehledn∞ vypi╣te.

Kontrolnφ otßzky:

  1. Co C++ d∞lß k zaji╣t∞nφ nep°epsßnφ informacφ za koncem pole?
  2. Co je chybnΘ na nßsledujφcφm programu?

  3. #include <iostream.h>
    #include <conio.h>
    #pragma hdrstop
    void zobrazText();
    zobrazText()
    {
      cout << "Ahoj." << endl;
    }
  4. Kolik hodnot m∙╛e vracet funkce?
  5. Co d∞lß funkce strcpy?
  6. Kolik funkcφ m∙╛e program obsahovat?
  7. M∙╛e funkce volat jinou funkci?
  8. Co je chybnΘho na nßsledujφcφm programu?

  9. #include <iostream.h>
    #include <conio.h>
    #pragma hdrstop
    int main(int argc, char **argv)
    {
      delejNeco();
      return 0;
    }
    void delejNeco()
    {
      cout << "Nynφ nic ned∞lßm." << endl;
    }
  10. Podφvejte se na tento °ßdek k≤du

  11. char buff[20];
    Kolik znak∙ m∙╛e nejv²╣e obsahovat °et∞zec, kter² do prom∞nnΘ buff ulo╛φme?
  12. Je index prvnφho prvku pole 0 nebo 1?
╪e╣enφ


14. Pole II