{{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?