Příkazy cyklu v C# Kapitola vysvětluje použití tří typů cyklů for, while a do-while a doplňuje jejich použití řadou příkladů programů v jazyku C#. V jazyku C by došlo pouze k záměně funkcí pro vstup a výstup. Cyklus foreach, který C# obsahuje navíc vzhledem k jazyku C, bude rozebrán v kapitole o polích, protože je vhodný pro práci s prvky pole. Klíčové pojmy: Cyklus, řídící proměnná, inicializace, test podmínky, přerušení cyklu, vnořování cyklů.
Dělení příkazů cyklu Pro opakované provádění příkazů poskytují programovací jazyky několik příkazů cyklu: Cykly s předem daným počtem opakování (for) Cykly, řízené podmínkou podmínka na začátku cyklu (while) podmínka na konci cyklu (do-while) C# má navíc cyklus foreach, který je vhodný pro práci s prvky pole
Zápis příkazu cyklu for // hlavička cyklu for(inicializace;test podmínky;změna hodnoty řídící proměnné cyklu) { příkazy; } // tělo cyklu
inicializace – zadání počáteční hodnoty řídící proměnné test podmínky - testuje řídící proměnnou na koncovou hodnotu změna hodnoty řídící proměnné cyklu – mění hodnotu řídící proměnné s požadovaným krokem Tento příkaz je vhodný pro pevný počet opakování příkazu nebo příkazů. 1. Opakovaný výpis textu Vytvořte program, který 5x vypíše pozdrav NAZDAR.
Console.WriteLine("NAZDAR"); Console.WriteLine("NAZDAR"); Console.WriteLine("NAZDAR"); Console.WriteLine("NAZDAR"); Console.WriteLine("NAZDAR");
Lepší řešení, než opakovaný zápis stejného příkazu je použití cyklus for 2.11.11
Příkazy cyklu v C#
1/18
int i; for(i=0;i<5;i++) Console.WriteLine("NAZDAR");
Modifikace programu: Vytvořte program, který umožní zadat počet opakování výpisu NAZDAR.
int i, n; Console.WriteLine("Zadej pocet opakovani: "); n=Convert.ToInt32(Console.ReadLine()); for (i = 0; i < n; i++) Console.WriteLine("NAZDAR");
2. Vytvořte program, který vypíše čísla 0 až 9: int i; for (i = 0; i < 10; i++) { Console.Write("{0} ", i); }
++ je často používaný operátor inkrementace Můžeme ho použít za proměnnou, nebo i před proměnnou. i++ znamená zvýšení hodnoty proměnné i o 1 Uvedený příkaz bychom mohli zapsat i delším způsobem: i=i+1 Vysvětlení programu: Řídící proměnnou v uvedeném cyklu for je celočíselná proměnná i. Hlavička cyklu je ta část, která se uvádí v kulatých závorkách za klíčovým slovem for. Má 3 části, oddělené znakem ‘;‘. V části inicializace je řídící proměnná i nastavená na hodnotu0: i=0 V části test podmínky se testuje, zda řídící proměnná je menší, než 10.: i<10 V části změna hodnoty řídící proměnné se provede její inkrementace: i++ V těle cyklu se provádí vlastní příkazy cyklu. Příkazy jsou uzavřeny do složených závorek: {
Console.Write("{0} ", i); }
Pokud se v cyklu provádí pouze jeden příkaz, nemusí se uzavírat do složených závorek. Provádění cyklu: 1. Hodnota řídící proměnné se nastaví na počáteční hodnotu i=0; 2. Testuje se podmínka v prostřední části hlavičky cyklu: i<10 3. Je-li podmínka vyhodnocená jako pravdivá, provede se příkaz v těle cyklu s touto hodnotou řídící proměnné: Console.Write("{0} ", i); 4. Jestliže podmínka pravdivá není, cyklus končí.
2.11.11
Příkazy cyklu v C#
2/18
5. Změní se hodnota řídící proměnné podle příkazu ve třetí části hlavičky cyklu: i++ hodnota řídící proměnné se zvýší na 1. 6. Pokračuje se bodem 2
Řídicí proměnná cyklu Je to proměnná, uvedená v hlavičce cyklu, která řídí průběh cyklu. Může být typu int, float, char, double. Výpis všech velkých písmen abecedy: for(char c='A';c<='Z';c++)Console.Write("{0} ", c);
Inicializace Inicializace slouží k nastavení počáteční hodnoty řídící proměnné.
Test podmínky Test podmínky slouží k určení, zda se příkazy cyklu budou opakovat, nebo zda se vykonávání cyklu ukončí.
Změna hodnoty řídicí proměnné cyklu Změna řídící proměnné je nutná, aby jednou podmínka přestala platit. Doporučuje se provádět ji pouze v hlavičce cyklu. Krok změny řídící proměnné nemusí být celočíselný: double i; for(i=0;i<1;i=i+0.1){ Console.WriteLine("{0}", i); }
Hodnota řídící proměnné se může i snižovat – je nutno upravit nastavení počáteční hodnoty a podmínku tak, aby cyklus nebyl nekonečný: int i; for(i=9;i>-1;i--){ Console.WriteLine("{0}", i); }
--je operátor dekrementace a znamená snížení hodnoty proměnné o 1. Uvedený příkaz by bylo možné zapsat: i=i-1
2.11.11
Příkazy cyklu v C#
3/18
Příkazy break a continue break – strukturovaný skok, zajistí vyskočení z cyklu a pokračování za cyklem continue – zajišťuje přechod na další iteraci. Přeskočí následující příkazy v těle cyklu, ale cyklus neopouští Mohou být pouze uvnitř cyklu – break se uvádí i na konci každé větve příkazu switch. break se používá ve spojení s příkazem if – např. pro ukončení cyklu do – while po zadání nulové hodnoty: if(a==0)break;
Vynechání některé části hlavičky cyklu for Jestliže některou část hlavičky cyklu for vynecháme, použije se hodnota, která je do proměnné uložená. 1.
Ilustrace vynechání některé části hlavičky cyklu for
Uvedený program obsahuje 4 cykly for: V prvním cyklu chybí část inicializace, která je provedena před cyklem: int i=10; V druhém cyklu chybí podmínka – ukončení cyklu je provedeno příkazem break, jestliže i>=20 Třetí cyklus nemá změnu hodnoty řídící proměnné v hlavičce cyklu, ale v těle cyklu. Čtvrtý cyklus má v hlavičce pouze dva středníky (ty jsou nutné). Inicializace je provedena před cyklem, podmínka i změna hodnoty řídící proměnné je v těle cyklu. Všechny cykly vypíší čísla od 10 do 18 s krokem 2.
int i = 10; // První cyklus for (; i < 20; i += 2) Console.Write("{0} ", i); Console.WriteLine(); // Druhý cyklus for (i = 10; ; i += 2){ if (i >= 20) break; Console.Write("{0} ", i); } Console.WriteLine(); // Třetí cyklus for (i = 10; i < 20; ){ Console.Write("{0} ", i); i += 2; } i = 10; Console.WriteLine(); // Čtvrtý cyklus for (; ; ){ if (i >= 20) break; Console.Write("{0} ", i); i += 2; }
2.11.11
Příkazy cyklu v C#
4/18
2.
Čítač dolů od zadané hodnoty
Program vyzve uživatele k zadání hodnoty a pak od tohoto čísla odpočítává. Řídící proměnná cyklu je zde inicializována uživatelem mimo cyklus, takže inicializační část cyklu je prázdná:
int i; Console.WriteLine("Zadej cele cislo: "); i=Convert.ToInt32(Console.ReadLine()); for (; i > 0; i--) Console.WriteLine("{0} ", i);
3.
Opakované čtení znaku do zadání ‘q’
Vytvořte cyklus, který se opakuje, dokud není z klávesnice zadán znak ‘q‘. char c = 'a'; for (; c != 'q'; ) c = Convert.ToChar(Console.ReadLine());
Namísto testování řídící proměnné cyklu zjišťuje test podmínky v tomto cyklu for hodnotu znaku, zadanou uživatelem.
Rozsah platnosti proměnné, deklarované v hlavičce cyklu Proměnnou můžeme definovat i v hlavičce cyklu, a potom je lokální v rámci cyklu. for (int i = 10; i < 20; i += 2) Console.Write("{0} ", i);
Zápis příkazu cyklu while while (podmínka){prikazy;} Postup provádění příkazu: Nejdříve se vyhodnotí podmínka Pokud je splněna, provedou se příkazy a podmínka se vyhodnocuje znovu. Cyklus končí v okamžiku, kdy podmínka není splněna. Příkazy nemusí být provedeny ani jednou, jestliže podmínka při vstupu do cyklu je vyhodnocena jako false. Často používaná je i varianta s obráceně postavenou podmínkou. Měli byste vždy volit cyklus, který nejlépe vyhovuje dané situaci.
2.11.11
Příkazy cyklu v C#
5/18
4.
Příklad opakování cyklu, dokud není z klávesnice zadán znak q
Příklad opakování cyklu, dokud není z klávesnice zadán znak q je lépe řešit cyklem while, než cyklem for. char c='a'; while (c != 'q') c = Convert.ToChar(Console.ReadLine());
Zápis příkazu cyklu do-while Pokud cyklus ukončujeme na základě určité hodnoty, načtené v těle cyklu, je vhodné použít cyklus do – while. Cyklus while se nazývá cyklus s podmínkou na začátku a cyklus do - while se nazývá cyklus s podmínkou na konci. U cyklu while se nejprve testuje podmínka a jestliže je pravda, příkazy cyklu se provedou. U tohoto cyklu se příkazy nemusí vůbec provést. U cyklu do - while se příkazy cyklu vždy jednou provedou, a potom se testuje podmínka. Když se podmínka vyhodnotí jako pravda, příkazy se budou opakovat znovu. Zápis: do{prikazy;}while(podminka); Postup provádění příkazu:
Nejprve se příkazy provedou a teprve poté se vyhodnotí podmínka Je-li podmínka splněna, provádí se znovu příkazy Cyklus končí v případě, že podmínka není splněna.
Často používaná je i varianta s obráceně postavenou podmínkou. Tento cyklus je vhodný, když rozhodujeme o jeho ukončení podle hodnoty, načtené od uživatele. U všech cyklů platí, že pokud chceme v cyklu vykonat pouze jeden příkaz, nemusíme ho uvádět ve složených závorkách.
Příkaz goto Příkaz goto lze ve spojení s tzv. návěštím využít k vytvoření cyklu. Je to ale nestrukturovaný a nedoporučovaný příkaz.
2.11.11
Příkazy cyklu v C#
6/18
int i=0; cyk: if(i>10)goto ven; Console.WriteLine("{0} ",i); i++; goto cyk; ven: ;
Vnořování cyklů Vnořování cyklů je umístění jednoho cyklu v těle jiného cyklu. Většina překladačů umožňuje libovolně hluboké vnoření. 5.
Vnoření cyklů pro výpis tabulky velké násobilky
int i, j; Console.WriteLine("V E L K A N A S O B I L K A:"); Console.WriteLine(); for (i = 11; i < 20; i++) { for (j = 11; j < 20; j++) Console.Write("{0} ", i * j); Console.WriteLine(); }
6.
Vykreslení rovnoramenného trojúhelníku z hvězdiček
Vytvořte program, který po zadání počtu řádků vykreslí rovnoramenný trojúhelník z hvězdiček, který bude mít výšku rovnou zadanému počtu řádků. int i, j, n; Console.WriteLine("Zadej pocet radku: "); n=Convert.ToInt32(Console.ReadLine()); for (i = 0; i < n; i++) { for (j = n - i; j > -1; j--) Console.Write(" "); for (j = 0; j <= 2 * i; j++) Console.Write("*"); Console.WriteLine(); }
CVIČENÍ 1.
Co se vypíše následujícím cyklem?
for (int x = 0; x < 100; x++) Console.Write("{0} ", x);
2.
Je tento výraz pravdivý?
!(10==9)
2.11.11
Příkazy cyklu v C#
7/18
3.
Dávají tyto dva výrazy stejný výsledek?
a) 0&&1 || 1 b) 0&&(1 || 1) 4.
Napište cyklus, který vypíše čísla od 1 do 100.
for(int i=1;i<101;i++) Console.Write("{0} ", i);
5.
Napište cyklus, který vypíše čísla mezi 17 a 100, které lze dělit beze zbytku 17.
for(int i=17;i<101;i=i+17) Console.Write("{0} ", i);
6.
Co se vypíše?
int i; i = 0; i++; Console.Write("{0} ", i--);/* vypíše 1 */ Console.Write("{0} ", i); /* vypíše 0 */
7.
. Změňte všechny příslušné přiřazovací příkazy v tomto programu na příkazy inkrementace a dekrementace.
int a, b; a = 1; a = a + 1; b = a; b = b - 1; Console.Write("{0} {1}",a,b);
Řešení: int a, b; a = 1; a++; b = a; b--; Console.Write("{0} {1}",a,b);
Řešené úlohy na cykly 1.
Program pro převod zadaného desítkového čísla do dvojkové soustavy:
int a; Console.WriteLine("Zadej cislo do 255: "); a=Convert.ToInt32(Console.ReadLine()); Console.WriteLine("{0}", a % 2); a = a / 2; Console.WriteLine("{0}", a % 2); a = a / 2; Console.WriteLine("{0}", a % 2);
2.11.11
Příkazy cyklu v C#
8/18
a = a / 2; Console.WriteLine("{0}", a a = a / 2; Console.WriteLine("{0}", a a = a / 2; Console.WriteLine("{0}", a a = a / 2; Console.WriteLine("{0}", a a = a / 2; Console.WriteLine("{0}\n",
% 2); % 2); % 2); % 2); a % 2);
V tomto programu se 7-krát opakují příkazy:
Console.WriteLine("{0}", a % 2); a = a / 2;
Je proto vhodné použít cyklus: for(int i=1;i<8;i++){ Console.WriteLine("{0}", a % 2); a = a / 2; }
2.
Načtení 3 čísel a výpočet jejich součtu:
Tento způsob už lze dobře vyjádřit pomocí cyklu: Zápis programu s využitím cyklu s pevným počtem opakování: double a, S = 0; for (int i = 0; i < 3;i++ ) { a=Convert.ToInt32(Console.ReadLine()); S = S + a; } Console.WriteLine("{0}", S);
3.
Program pro výpočet průměru deseti známek s kontrolou správně zadané známky
double z,sum=0; for(int i=1;i<11;i++){ Console.WriteLine("Zadej {0}. znamku: ",i); z=Convert.ToInt32(Console.ReadLine()); if(z>5 || z<1){ Console.WriteLine("Spatne zadana znamka"); i--; } else sum=sum+z; } Console.WriteLine("Prumer je: {0}",sum/10.0);
2.11.11
Příkazy cyklu v C#
9/18
4.
Použití cyklu s pevným počtem opakování pro výpis ASCII tabulky:
for (int i = 33; i < 255; i++) { Console.Write("{0} {1}\t", (char)i, i); }
5.
Napište program, který vypíše tabulku čísel. Každý řádek v tabulce obsahuje tři položky: číslo, jeho druhou mocninu a jeho třetí mocninu.
Začněte 1 a končete 10. Pro vytváření čísel použijte cyklus for. for (int i = 1; i < 11; i++) Console.WriteLine("{0}\t{1}\t{2}", i, i*i, i*i*i);
6.
Čítač dolů a pípnutí
Napište program, který vyzve uživatele k zadání celého čísla. Pak pomocí cyklu for odpočítávejte od této hodnoty 1 až do nuly a vypisujte každé číslo na samostatný řádek. Když hod nota dosáhne 0, nechejte zaznít zvukový signál. int i; Console.WriteLine("Zadej cele cislo:"); i=Convert.ToInt32(Console.ReadLine()); for (; i > -1; i--) Console.WriteLine("{0}", i); Console.WriteLine("\a");
Třída Console obsahuje metodu Beep , kterou můžeme volat bez parametrů a se dvěma parametry: frekvence (37-32767 Hertz) a trvání v milisekundách. Příklad volání: Console.Beep(1000,100); Tím můžeme řídit výšku tónu a dobu jeho trvání. 7.
Určení počtu zadaných mezer
Napište program, který bude číst znaky z klávesnice a spočítá počet zadaných mezer. Cyklus pro zadávání znaků ukončete klávesou Esc. const char ESC = (char)ConsoleKey.Escape; char c; int mezery = 0; do { c = Console.ReadKey().KeyChar; if (c == ' ') mezery++; } while (c != ESC); Console.WriteLine("\nPocet mezer: {0}", mezery);
8.
Náhodné generování příkladů pro zkoušení z aritmetických operací.
Operandy i operátor jsou generovány náhodně funkcí rand. Operandy jsou čísla do deseti a operátory +, -, *, /. 2.11.11
Příkazy cyklu v C#
10/18
Rozsah generovaných čísel je omezen od 1 do 10. Aby byla generované pokaždé jiná posloupnost, je třeba vytvořit objekt třídy Random příkazem: Random gen=new Random(); Před cyklem for se program zeptá, kolik příkladů chcete generovat. Zadané číslo bude použito v podmínce ukončení cyklu for (i
9.
Zobrazení čísel v zadaném intervale
Program si vyžádá začátek a konec intervalu a vypíše čísla v tomto intervale.
int i,zac,kon; Console.WriteLine("Zadej zacatek intervalu:"); zac=Convert.ToInt32(Console.ReadLine()); Console.WriteLine("Zadej konec intervalu:"); kon=Convert.ToInt32(Console.ReadLine()); for(i=zac;i<=kon;i++) Console.WriteLine("{0} ",i);
10. Zobrazení sudých čísel v zadaném intervale Následující program je modifikací předchozího. Vypisuje v zadaném intervalu pouze sudá čísla.
int i,zac,kon; Console.WriteLine("Zadej zacatek intervalu:"); zac=Convert.ToInt32(Console.ReadLine()); Console.WriteLine("Zadej konec intervalu:");
2.11.11
Příkazy cyklu v C#
11/18
kon=Convert.ToInt32(Console.ReadLine()); for(i=zac;i<=kon;i++) if (i % 2 == 0) Console.WriteLine("{0} ", i);
11. Součet a průměr čísel v zadaném intervale Následující program vypíše součet a průměr čísel v zadaném intervalu, který prochází v cyklu for s krokem 1. int i,zac,kon,sum=0; Console.WriteLine("Zadej zacatek intervalu:"); zac=Convert.ToInt32(Console.ReadLine()); Console.WriteLine("Zadej konec intervalu:"); kon=Convert.ToInt32(Console.ReadLine()); for(i=zac;i<=kon;i++)sum += i; Console.WriteLine("Soucet: {0}\nPrumer: {1:N2}", sum,(double)sum/(double)(kon-zac+1));
12. Součet zadávaných čísel – zadávání ukončíte nulou Následující program vypíše součet čísel, zadávaných z klávesnice v cyklu do-while. Zadávání je ukončeno hodnotou 0.
double sum = 0, a; do { Console.WriteLine("Zadej cislo:"); a=Convert.ToInt32(Console.ReadLine()); sum += a; } while (a != 0); Console.WriteLine("Soucet: {0}",sum);
13. Průměr Následující program vypíše průměr čísel, zadávaných z klávesnice v cyklu do-while. Zadávání je ukončeno hodnotou 0. double sum = 0, a,poc=0; do { Console.WriteLine("Zadej cislo:"); a=Convert.ToDouble(Console.ReadLine()); sum += a; poc++; } while (a != 0); Console.WriteLine("Prumer: {0:N2}",sum/(poc-1));
14. Počet kladných a počet záporných čísel Následující program vypíše počet kladných a záporných čísel, zadávaných z klávesnice v cyklu do-while. Zadávání je ukončeno hodnotou 0.
2.11.11
Příkazy cyklu v C#
12/18
double a, klad = 0, zap = 0; do { Console.WriteLine("Zadej cislo:"); a=Convert.ToDouble(Console.ReadLine()); if (a == 0.0) break; if (a > 0) klad++; else zap++; } while (a != 0); Console.WriteLine("Pocet kladnych: {0}\nPocet zapornych: {1}", klad, zap);
15. Počet sudých a počet lichých čísel Následující program vypíše počet sudých a lichých čísel, zadávaných z klávesnice v cyklu do-while. Zadávání je ukončeno hodnotou 0. double a, sud = 0, lich = 0; do { Console.WriteLine("Zadej cislo:"); a=Convert.ToDouble(Console.ReadLine()); if (a == 0.0) break; if (a % 2 == 1) lich++; else sud++; } while (a != 0); Console.WriteLine("Pocet sudych: {0}\nPocet lichych: {1}", sud, lich);
16. Maximum a minimum Následující program vypíše maximum a minimum čísel, zadávaných z klávesnice v cyklu do-while. Zadávání neukončeno hodnotou 0. int a, max = int.MinValue, min = int.MaxValue; do { Console.WriteLine("Zadej cislo:"); a=Convert.ToInt32(Console.ReadLine()); if (a == 0.0) break; if (a >= max) max = a; if (a <= min) min = a; } while (a != 0); Console.WriteLine("Maximum: {0}\nMinimum: {1}\n", max, min);
17. První i druhé maximum a minimum Následující program vypíše první a druhé maximum a minimum čísel, zadávaných z klávesnice v cyklu do-while. Zadávání je ukončeno hodnotou 0. 2.11.11
Příkazy cyklu v C#
13/18
int a, max = int.MinValue, min = int.MaxValue, max2= int.MinValue, min2= int.MaxValue; do { Console.WriteLine("Zadej cislo:"); a=Convert.ToInt32(Console.ReadLine()); if (a == 0.0) break; if (a >= max) { max2 = max; max = a; } if (a <= min) { min2 = min; min = a; } } while (a != 0); Console.WriteLine("Maximum: {0}\nMinimum: {1}\n", max, min); Console.WriteLine("Druhe maximum: {0}\nDruhe minimum: {1}\n", max2, min2);
18. Četnost známek Následující program vypíše četnost známek (1,2,3,4,5), zadávaných z klávesnice v cyklu do-while. Zadávání je ukončeno hodnotou 0. int a, jedna = 0, dve = 0, tri = 0, ctyri = 0, pet = 0; do { a = Convert.ToInt32(Console.ReadLine()); if (a == 0) break; switch (a) { case 1: jedna++; break; case 2: dve++; break; case 3: tri++; break; case 4: ctyri++; break; case 5: pet++; break; default: Console.WriteLine("Spatne zadana znamka\n"); break; } } while (a != 0); Console.WriteLine("Pocet 1: {0}\nPocet 2: {1}", jedna, dve); Console.WriteLine("Pocet 3: {0}\nPocet 4: {1}", tri, ctyri); Console.WriteLine("Pocet 5: {0}\n", pet);
19. Četnost známek a histogram Následující program připojí k předchozímu histogram zadaných známek – počet jednotlivých známek se znázorní počtem hvězdiček v řádku. int a, jedna = 0, dve = 0, tri = 0, ctyri = 0, pet = 0; do { a = Convert.ToInt32(Console.ReadLine()); if (a == 0) break; switch (a) { case 1: jedna++; break; case 2: dve++; break;
2.11.11
Příkazy cyklu v C#
14/18
case 3: tri++; break; case 4: ctyri++; break; case 5: pet++; break; default: Console.WriteLine("Spatne zadana znamka\n"); break; } } while (a != 0); Console.WriteLine("Pocet 1: {0}\nPocet 2: {1}", jedna, dve); Console.WriteLine("Pocet 3: {0}\nPocet 4: {1}", tri, ctyri); Console.WriteLine("Pocet 5: {0}\n", pet); int i; Console.Write("1: "); for (i = 0; i < jedna; i++) Console.Write("*"); Console.Write("\n2: "); for (i = 0; i < dve; i++) Console.Write("*"); Console.Write("\n3: "); for (i = 0; i < tri; i++) Console.Write("*"); Console.Write("\n4: "); for (i = 0; i < ctyri; i++) Console.Write("*"); Console.Write("\n5: "); for (i = 0; i < pet; i++) Console.Write("*"); Console.WriteLine();
20. Možné kombinace hodnot dvou logických proměnných Následující program vypíše všechny možné kombinace hodnot dvou proměnných a,b typu bool. bool a, b; int i, j; a = false; b = false; Console.Write(" a \t b\n-------------\n"); for (i = 0; i < 2; i++) { for (j = 0; j < 2; j++) { Console.WriteLine("{0}\t{1}", a, b); b = !b; } a = !a; }
21. Vymáhání správné odpovědi Následující program v cyklu do-while vymáhá od uživatele správnou odpověď na otázku: "Mam programovat? (a/A): ". Cyklus do-while se ukončí pouze po zadání 'a', nebo 'A'. char a; do { Console.Write("Mam programovat? (a/A): "); a = Convert.ToChar(Console.ReadLine()); if (a == 'a' || a == 'A') Console.WriteLine("Dobra volba"); else Console.WriteLine("Spatna volba"); } while (a != 'a' && a != 'A');
2.11.11
Příkazy cyklu v C#
15/18
22. Vymáhání odpovědi, přičemž znak čteme pomocí ReadKey() Stejný program jako předchozí s tím rozdílem, že znak je čten funkcí ReadKey(). char a; do { Console.Write("Mam programovat? (a/A): "); a = Console.ReadKey().KeyChar; if (a == 'a' || a == 'A') Console.WriteLine(" Dobra volba"); else Console.WriteLine(" Spatna volba"); } while (a != 'a' && a != 'A');
Program vypíše pouze dobrou volbu za cyklem Pokud bychom nevypisovali text o špatné volbě, bylo by možné program zjednodušit a informaci o špatné volbě vypsat za cyklem do-while. char a; Console.Write("Mam programovat? (a/A): "); do { a = Console.ReadKey().KeyChar; } while (a != 'a' && a != 'A'); Console.WriteLine(" Dobra volba");
23. Čekání na vstup, nebo vypršení intervalu Čtení znaku Cyklus while se ukončí buď stisknutím klávesy, nebo vyčerpáním časového intervalu, který odpovídá výchozí hodnotě proměnné t. Za cyklem while příkazem if-else testujeme jakým způsobem byl cyklus ukončen a vypíšeme příslušný text. Pokud nechceme, aby se vypsala znaková hodnota stisknuté klávesy, voláme metodu ReadKey s parametrem true: ReadKey(true). Vlastnost KeyAvailable třídy Console slouží k určení, zda byla stisknuta libovolná klávesa. long t = 1000000; char c; while (!Console.KeyAvailable && (t != 0)) { t--; } if (Console.KeyAvailable) { c = Console.ReadKey(true).KeyChar; Console.Write("Byla stisknuta klavesa: {0}\n", c); } else { Console.Write("Nebyla stisknuta zadna klavesa\n");
2.11.11
Příkazy cyklu v C#
16/18
}
Čtení čísla Následující program čeká na zadání čísla. Pokud během nastaveného časového intervalu nedojde k stisku klávesy, vypíše se: “Nebyla stisknuta žádná klávesa”.
long t = 100000,d; while (!Console.KeyAvailable && (t != 0)) { t--; } if (Console.KeyAvailable) { d = Convert.ToInt64(Console.ReadLine()); Console.Write("Bylo zadano cislo: {0}\n", d); } else { Console.Write("Nebyla stisknuta zadna klavesa\n"); }
Vymezení času pro odpověď na otázku Uvedený program je možné využít v testovacích programech pro vymezení času pro odpověď na otázku.
long t = 1000000,d; Console.Write("Kolik je 10+14? "); while (!Console.KeyAvailable && (t != 0)) { t--; } if (Console.KeyAvailable) { d = Convert.ToInt64(Console.ReadLine()); if (d == 10 + 14) Console.WriteLine("Spravne\n"); else Console.WriteLine("Spatne\n"); } else { Console.Write("\nCas vyprsel\n"); }
24. Semafor Následující program modeluje semafor na křižovatce. Uživatel zadává znaky a program odpovídá. Komunikace probíhá v cyklu do-while, který se ukončí zadáním znaku ‘k’.
char s; Console.Write("Zadavej: c=cervena/o=oranzova/z=zelena/k=konec\n"); do {
2.11.11
Příkazy cyklu v C#
17/18
s = Console.ReadKey(true).KeyChar; if (s == 'k') break; switch (s) { case 'c': Console.Write(" stuj\n"); break; case 'o': Console.Write(" pozor\n"); break; case 'z': Console.Write(" jed\n"); break; default: Console.Write(" zadal jsi to spatne\n"); break; } } while (s != 'k'); Console.Write(" konec\n");
Shrnutí: V kapitole je ukázáno použití tří typů cyklů for, while a do-while na řadě příkladů programů v jazyku C#. Použití cyklu foreach bude uvedeno v kapitole o polích
2.11.11
Příkazy cyklu v C#
18/18