Veľkonočná akcia je tu a s ňou aj extra kredity ZADARMO na náš interaktívny e-learning. Dobij si teraz kredity a posuň sa vo svojej kariére vpred!
Zarábaj až 6 000 € mesačne! Akreditované rekvalifikačné kurzy od 0 €. Viac informácií.

6. diel - Cykly v C ++ (for)

V predchádzajúcom cvičení, Řešené úlohy ku 4.-5. lekciu C ++, sme si precvičili získané skúsenosti z predchádzajúcich lekcií.

V minulej lekcii, Řešené úlohy ku 4.-5. lekciu C ++ , sme si vysvetlili podmienky. Teraz prejdeme k cyklom. Po dnešnom C ++ tutoriálu už budeme mať takmer kompletnú výbavu základných konštrukcií a budeme schopní tvoriť rozumné aplikácie.

Cykly

Ako už slovo cyklus napovie, niečo sa bude opakovať. Keď chceme v programe niečo urobiť 100x, určite nebudeme písať pod seba 100x ten istý kód, ale vložíme ho do cyklu. Cyklov máme niekoľko druhov, vysvetlíme si, kedy ktorý použiť. Samozrejme si ukážeme praktické príklady.

For cyklus

Tento cyklus máva stanovený pevný počet opakovaní a hlavne obsahuje tzv. Riadiace premennú (celočíselnú), v ktorej sa postupne počas behu cyklu menia hodnoty. Syntax (zápis) cyklu for je nasledovná:

for (deklarácia; podmienka; aktualizácie)
    prikaz;
  • deklarácia - Tu deklarujeme riadiace premennú cyklu, ktoré nastavíme počiatočnú hodnotu (najčastejšie 0, pretože v programovaní všetko začína od nuly, nie od jednotky). Napríklad môžeme napísať for (int i = 0; ...). Samozrejme si môžeme premennú aj vytvoriť niekde nad tým a už nemusíme písať slovíčko int, býva ale zvykom používať práve int i.
  • podmienka - je podmienka vykonanie ďalšieho kroku cyklu. Akonáhle prestane platiť, cyklus sa ukončí. Podmienka môže byť napr i < 10.
  • aktualizácie - Tu meníme hodnotu riadiacej premennej. Táto časť prebehne na konci každého kroku. Tu využijeme špeciálnych operátorov ++ a --, tie samozrejme môžete používať aj úplne bežne mimo cyklus, slúži na zvýšenie alebo zníženie premenné o 1. Operátory ++ a -- môžeme písať ako pred premennú tak za ňou, rozdiel postrehneme keď budeme zmenenou hodnotu priraďovať do premennej. i++ (resp. i--) vracia hodnotu pred zmenou a ++i (resp. --i) vracia hodnotu po zmene.
int i = 4;
int a = i++; // vracia hodnotu pred pripočítaním
// a = 4, i = 5
int b = ++i; // vracia hodnotu po pripočítaní
// b = 5, i = 5

Pozn .: ktorúkoľvek časť v zátvorke cykle for smieme vynechať, vždy v nej ale musí byť aspoň 2 bodkočiarkami. Ak vynecháme podmienku, bude sa cyklus správať ako by vždy platila.

Poďme si urobiť jednoduchý príklad, väčšina z vás iste pozná Sheldona z The Big Bang Theory. Pre tých čo nie, budeme simulovať situáciu, kedy klope na dvere svojej susedky. Vždy 3x zaklope a potom zavolá: "Penny!". Náš kód by bez cyklov vyzeral takto:

Klikni pre editáciu
  • cout << "Knock" << endl;
    cout << "Knock" << endl;
    cout << "Knock" << endl;
    cout << "Penny!" << endl;
    cin.get();
    
    • Skontroluj, či výstupy programu zodpovedajú predlohe. S inými textami testy neprejdú.

    My ale nemusíme už nič otrocky opisovať:

    Klikni pre editáciu
    • for (int i = 0; i < 3; i++)
          cout << "Knock" << endl;
      cout << "Penny!" << endl;
      cin.get();
      
      • Skontroluj, či výstupy programu zodpovedajú predlohe. S inými textami testy neprejdú.

      výsledok:

      Konzolová aplikácia
      Knock
      Knock
      Knock
      Penny!

      Cyklus prebehne 3x, spočiatku je v premennej i nula, cyklus vypíše "Knock" a zvýši premennú i o jedna. Potom beží rovnako s jednotkou a dvojkou. Akonáhle je v i trojka, už nesúhlasí podmienka i < 3 a cyklus končí. O písaní zložených zátvoriek platí to isté, čo u podmienok. V tomto prípade tam nemusí byť, pretože cyklus spúšťa iba jediný príkaz. Teraz môžeme miesto trojky napísať do deklarácie cyklu desiatku. Príkaz sa vypíše 10x bez toho aby sme písali niečo navyše. Určite vidíte, že cykly sú mocným nástrojom.

      Skúsme si teraz využiť to, že sa nám premenná inkrementuje (zvyšuje o 1). Vypíšme si čísla od jednej do desať. Pretože nebudeme chcieť, aby sa nám v konzole text vždy odřádkoval, nezakončíme riadok s výpisom << endl, ale iba medzerou:

      Klikni pre editáciu
      • for (int i = 1; i <= 10; i++)
            cout << i << ' ';
        cin.get();
        
        • Skontroluj, či výstupy programu zodpovedajú predlohe. S inými textami testy neprejdú.

        Vidíme, že riadiaci premenná má naozaj v každej iterácii (priebehu) inú hodnotu. Všimnite si, že v cykle tentoraz nezačíname na nule, ale môžeme nastaviť počiatočnú hodnotu na 1 a koncovú na 10.

        Teraz si vypíšeme malú násobilku (násobky čísel 110, vždy do desať). Stačí nám urobiť cyklus od 1 do 10 a premennú vždy násobiť daným číslom. Mohlo by to vyzerať asi takto:

        Klikni pre editáciu
        • cout << "Malička nasobilka pomôcť cyklu:" << endl;
          for (int i = 1; i <= 10; i++)
              cout << i << ' ';
          cout << endl;
          for (int i = 1; i <= 10; i++)
              cout << i * 2 << ' ';
          cout << endl;
          for (int i = 1; i <= 10; i++)
              cout << i * 3 << ' ';
          cout << endl;
          for (int i = 1; i <= 10; i++)
              cout << i * 4 << ' ';
          cout << endl;
          for (int i = 1; i <= 10; i++)
              cout << i * 5 << ' ';
          cout << endl;
          for (int i = 1; i <= 10; i++)
              cout << i * 6 << ' ';
          cout << endl;
          for (int i = 1; i <= 10; i++)
              cout << i * 7 << ' ';
          cout << endl;
          for (int i = 1; i <= 10; i++)
              cout << i * 8 << ' ';
          cout << endl;
          for (int i = 1; i <= 10; i++)
              cout << i * 9 << ' ';
          cout << endl;
          for (int i = 1; i <= 10; i++)
              cout << i * 10 << ' ';
          cout << endl;
          cin.get();
          
          • Skontroluj, či výstupy programu zodpovedajú predlohe. S inými textami testy neprejdú.

          výsledok:

          Konzolová aplikácia
          Malička nasobilka pomôcť cyklu:
          1 2 3 4 5 6 7 8 9 10
          2 4 6 8 10 12 14 16 18 20
          3 6 9 12 15 18 21 24 27 30
          4 8 12 16 20 24 28 32 36 40
          5 10 15 20 25 30 35 40 45 50
          6 12 18 24 30 36 42 48 54 60
          7 14 21 28 35 42 49 56 63 70
          8 16 24 32 40 48 56 64 72 80
          9 18 27 36 45 54 63 72 81 90
          10 20 30 40 50 60 70 80 90 100

          Program funguje pekne, ale stále sme toho dosť napísali. Ak vás napadlo, že v podstate robíme 10x to isté a len zvyšujeme číslo, ktorým násobíme, máte pravdu. Nič nám nebráni vložiť 2 cykly do seba:

          Klikni pre editáciu
          • cout << "Malička nasobilka pomôcť dvoch cyklu:" << endl;
            for (int j = 1; j <= 10; j++)
            {
                for (int i = 1; i <= 10; i++)
                    cout << i * j << ' ';
                cout << endl;
            }
            cin.get();
            
            • Skontroluj, či výstupy programu zodpovedajú predlohe. S inými textami testy neprejdú.

            Pomerne zásadný rozdiel, že? Pochopiteľne nemôžeme použiť u oboch cyklov i, pretože sú vložené do seba. Premenná j nadobúda vo vonkajšom cykle hodnoty 110. V každej iterácii (rozumejte priebehu) cyklu je potom spustený ďalší cyklus s premennou i. Ten je nám už známy, vypíše násobky, v tomto prípade násobíme premennú j. Po každom behu vnútorného cyklu treba odřádkovat, to vykoná cout << endl.

            Urobme si ešte jeden program, na ktorom si ukážeme prácu s vonkajšou premennou. Aplikácia bude vedieť spočítať ľubovoľnú mocninu ľubovoľného čísla:

            Klikni pre editáciu
            • cout << "Mocninator" << endl;
              cout << "==========" << endl;
              cout << "Zadajte zaklad mocniny: " << endl;
              int a, n; // vytvoríme 2 premenné naraz
              cin >> a;
              cout << "Zadajte exponent: " << endl;
              cin >> n;
              
              int vysledek = a;
              for (int i = 0; i < (n - 1); i++)
                  vysledek = vysledek * a;
              
              cout << "Vysledok: " << vysledek << endl;
              cout << "Dekuji za pouziti mocninatoru" << endl;
              cin.get();cin.get();
              
              • Skontroluj, či výstupy programu zodpovedajú predlohe. S inými textami testy neprejdú.

              Asi všetci tušíme, ako funguje mocnina. Pre istotu pripomeniem, že napríklad 2^3 = 2 * 2 * 2. Teda a^n spočítame tak, že n-1 krát vynásobíme číslo a číslom a. Výsledok si samozrejme musíme ukladať do premennej. Spočiatku bude mať hodnotu a a postupne sa bude v cykle pronásobovat. Ak ste to nestihli, máme tu samozrejme článok s algoritmom výpočtu ľubovoľnej mocniny. Vidíme, že naša premenná vysledek je v tele cyklu normálne prístupná. Ak si však nejakú premennú založíme v tele cyklu, po skončení cyklu zanikne a už nebude prístupná.

              Konzolová aplikácia
              Mocninator
              ==========
              Zadajte zaklad mocniny:
              2
              Zadajte exponent:
              10
              Vysledok: 1024
              Dekuji za pouziti mocninatoru

              Už tušíme, na čo sa for cyklus využíva. Zapamätajme si, že je počet opakovaní pevne daný, aj keď ho možno teoreticky napísať aj aby toto nespĺňal. Do premennej cyklu by sme nemali nijako zasahovať ani dosadzovať, program by sa mohol tzv. Zacykliť, skúsme si ešte posledný, odstrašujúci príklad:

              Klikni pre editáciu
              • // tento kód je zle
                for (int i = 1; i <= 10; i++)
                    i = 1;
                cin.get();
                
                • Skontroluj, či výstupy programu zodpovedajú predlohe. S inými textami testy neprejdú.

                Au, vidíme, že program sa zasekol. Cyklus stále inkrementuje premennú i, ale tá sa vždy zníži na 1. Nikdy teda nedosiahne hodnoty > 10, cyklus nikdy neskončí. Okno programu zatvoríme alebo použijeme tlačidlo "Stop" v lište Visual Studia.

                Vo for cyklu môžeme samozrejme mať viac premenných (oddelených čiarkou), ak ich ale chceme vytvoriť (deklarovať), musia byť rovnakého typu.

                Rovnako tak miesto i++ môžeme použiť iný príkaz a pokojne aj viac príkazov oddelených čiarkami.

                Tento kód je teda správne a po jeho skončení bude v premennej f 10. mocnina 2 (2^10).

                int i;
                float f;
                for (i = 0, f = 1; i < 10; f *= 2, i++) ;

                Ak by sme chceli premenné vytvoriť "v cykle", musia byť rovnakého typu:

                for (int i = 0, f = 1; i < 10; f *= 2, i++) ;

                Ďalšie typy cyklov si vysvetlíme v nasledujúcej lekcii, Cykly v C ++ (while, do while) .


                 

                Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.

                Stiahnuť

                Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami

                Stiahnuté 272x (7.1 kB)
                Aplikácia je vrátane zdrojových kódov v jazyku C++

                 

                Ako sa ti páči článok?
                Pred uložením hodnotenia, popíš prosím autorovi, čo je zleZnakov 0 z 50-500
                Predchádzajúci článok
                Řešené úlohy ku 4.-5. lekciu C ++
                Všetky články v sekcii
                Základné konštrukcie jazyka C ++
                Preskočiť článok
                (neodporúčame)
                Cykly v C ++ (while, do while)
                Článok pre vás napísal Zdeněk Pavlátka
                Avatar
                Užívateľské hodnotenie:
                Ešte nikto nehodnotil, buď prvý!
                Autor se věnuje spoustě zajímavých věcí ze světa informatiky a grafiky
                Aktivity