{{indexmenu_n>2}} ====== 2 - Cykly a vnořené cykly ====== * Operátory a řídicí struktury - ''if'', ''for'', ''while'', ''do-while'' * Cykly a vnořené cykly * Pro vyučující: [[courses:b3b36prg:internal:tutorialinstruction:02|]] ===== Procvičovaná témata ===== * [[https://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B|operátory]] * řídicí struktury - ''if'' === === if( podmínka ){ příkaz1 } else { příkaz2 } ===== ===== * řídicí struktury - '' for '' === === for( inicializace ; podmínka ; změna){ příkaz } Používáme standard [[https://en.wikipedia.org/wiki/C99|C99]], a proto je možné deklarovat proměnnou přímo při inicializaci. for (int i = 0; ...) { ... } ===== ===== * řídicí struktury - '' while '' === === while(podmínka) { tělo cyklu } ===== ===== * řídicí struktury - '' do-while '' === === do { tělo cyklu } while (podmínka); ===== ===== * příkazy pro ovládání běhu cyklů - ''break, continue'' * funkce === === ===== Úkoly ===== * Vypište čísla od 1 do 10 pomocí všech uvedených cyklů (''for, while, do-while''). * Nahraďte terminační podmínku pomocí příkazu break. * Vypište všechna sudá čísla od 1 do $n$, kde $n$ zadá uživatel na standardním vstupu * Vypište součin všech čísel vypsaných v předchozím kroku * Vypište řadu $n$ čísel ve tvaru: === === 1, -1, 1, -1, 1, -1, ... ===== ===== * Napiště program který umožní výpočet Ludolfova čísla pomocí Leibnizovy řady $$ \qquad\pi = 4 \sum_{k=0}^\infty\dfrac{(-1)^k}{2k+1} = \dfrac{4}{1}-\dfrac{4}{3}+\dfrac{4}{5}-\dfrac{4}{7}+\dfrac{4}{9}-\dfrac{4}{11}+\cdots $$ * Vytvořte funkci pro výpočet Ludolfova čísla pomocí $n$ prvků Leibnizovy řady * Zjistěte kolik členů řady je potřeba zahrnout, abychom dostali Ludolfovo číslo s přesností na $10^{-6}$. * Vypište v dekadické, hexadecimální a binární reprezentaci znak zapsaný na standardním vstupu uživatelem (hint: pro výpis v binárním tvaru použijte bitové operátory) === === Standardní vstup: a Standardní výstup: 97 0x61 b01100001 ===== ===== /* ===== Vnořené podmínky ===== návratova_hodnota jméno_funkce(parametry){ tělo funkce } - Zopakování if a doplnění ... TBD příklad (možná přesunout do lab02) ===== Cykly - syntaxe ===== ==== For cyklus ==== for (inicializace; podmínka; změna) { tělo cyklu } * //Inicializace// u ''for'' cyklu se provede pouze před prvním provedením těla cyklu. * //Podmínka// je ověřována před každým provedením těla cyklu. * //Tělo cyklu// se provede pouze, pokud je podmínka splněna. * //Změna// se provede vždy až po provedení těla cyklu. Použití preinkrementu či postinkrementu tuto vlastnost neovlivní. * U for cyklu lze vynechat libovolnou část příkazu for. Cyklus for(;;) bude nekonečný. === Příklad === Výpis čísel od 1 do 10. for (int i = 1; i <= 10; i = i + 1) { printf("%d, ", i); } ==== While cyklus ==== while(podmínka) { tělo cyklu } Nejprve se otestuje platnost podmínky. Je-li splněna, provede se tělo cyklu a poté se opět otestuje platnost podmínky. V případě nesplnění podmínky při prvním testování, neproběhne tělo cyklu ani jednou. === while cyklus - příklad === Výpis čísel od 1 do 10. int i = 1; while (i <= 10) { printf("%d, ", i); i = i + 1; // nebo i++; } ==== Do - while cyklus ==== do { tělo cyklu } while (podmínka); * Nejprve se provede //tělo cyklu// a teprve po jeho prvním provedení se otestuje podmínka. Znovu se tělo cyklu provede pouze v případě platnosti podmínky. * Narozdíl od while cyklu se tělo do - while cyklu provede alespoň jednou. === do - while cyklus - příklad === Jaký je rozdíl mezi while a do-while? int i = 1;; do { printf("%d, ", i); i++; } while ( i <= 10 ); */ /* ==== Speciální příkazy pro cykly ==== * Příkaz **''break''** ukončí provádění cyklu a pokračuje zpracováním kódu za tělem cyklu. * Příkaz **''continue''** ukončí provádění těla cyklu a v případě splnění podmínky znovu zahájí zpracování těla cyklu. * ** *** **** ***** */ * Vypište: ***** **** *** ** * * Vypište následující tabulku: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 * Jak to naprogramujete pomocí jednoho cyklu? Jak pomocí dvou vnořených cyklů? Co se vám zdá lepší a proč? * Nyní zkuste vypsat pouze diagonálu: 0 11 22 33 44 55 66 77 88 99 * Nyní tu druhou: 9 18 27 36 45 54 63 72 81 90 * A co obě zároveň? 0 9 11 18 22 27 33 36 44 45 54 55 63 66 72 77 81 88 90 99 * Parametrizujte svuj kód. Dokážete pouhou změnou parametru vypsat totéž pro tabulku 5x5?