Seriál Jak na to
Toto je 4. část z 5dílné série Úvod do programování
- Úvod do programování:Začínáme
- Úvod do programování:Váš první program
- Úvod do programování:Proměnné, typy a manipulace s daty
- Úvod do programování:Řízení toku
- Úvod do programování:objektově orientované programování
Vítejte zpět, začínající programátoři!
V tomto článku se podíváme na tok řízení a na to, jak můžete pomocí podmínek, větví, smyček a dalších mechanismů určit, co se ve vašem programu stane.
Pokud jste nečetli předchozí články této série, důrazně vám doporučuji, abyste tak učinili. Ve všech těchto článcích vycházíme z předchozích znalostí, takže je důležité, abyste pochopili, co jsme již probrali.
V tomto článku toho máme hodně, takže bez dalších obřadů se pustíme do práce.
.
Zpracování výjimek
Když jsme naposledy opustili náš program, měli jsme tři řádky kódu a problém. Kód vypadá takto:
Console.WriteLine("Guess a number between 1 and 10:"); string text = Console.ReadLine(); int input = int.Parse(text);
Pokud však spustíme tento program a na výzvu zadáme cokoli kromě čísla, program se zhroutí, protože kompilátor neví, jak převést nečíselný text na celé číslo.
Pokud si pamatujete z minula, dostáváme to, čemu se říká výjimka a je to jeden ze způsobů, jak můžeme řídit tok programu ve velmi specifické situaci, konkrétně když nastane výjimečná situace.
Chtěl jsem začít zpracováním výjimek, protože je to nejsložitější a možná matoucí téma v řízení toku, takže pokud rozumíte tomu, co zde děláme, pravděpodobně shledáte zbývající koncepty mnohem srozumitelnější.
Pro zpracování výjimek v programování máme dvě důležité myšlenky, kterým musíte porozumět. První myšlenka je, že můžete požádat svůj program, aby něco zkusil. Druhá myšlenka je, že pokud počítač selže v tom, co zkouší, můžete problém zachytit a vyřešit ho.
Tyto dva nápady dohromady fungují trochu jako provazochodec s ochrannou sítí. Provazochodec (váš program) může ve většině případů fungovat jako normálně podél provazu. Pokud však dojde k něčemu neobvyklému, jako je chybné sešlápnutí z napjatého lana (výjimka), měla by existovat ochranná síť, která zabrání tomu, aby se umělec zřítil na zem (záchyt pro zvládnutí výjimky).
S pochopením zpracování výjimek můžeme nyní začít vidět řešení našeho problému. Můžeme požádat počítač, aby se pokusil analyzovat text na celé číslo, a pokud se to nepodaří – místo abychom umožnili zhroucení programu – můžeme chybu zachytit, říct to uživateli a požádat ho, aby to zkusil znovu.
Podívejme se, jak by to mohlo vypadat v našem kódu.
Console.WriteLine("Guess a number between 1 and 10:"); string text = Console.ReadLine(); int input = 0; try { input = int.Parse(text); } catch { Console.WriteLine("Whoops, you didn't enter a number"); }
Naší první změnou je, že zpočátku nastavujeme int
vstup na nulu, než se jej pokusíme nastavit na výsledek analýzy textového vstupu od uživatele. Existuje konkrétní důvod, proč jsem nejprve nastavil hodnotu na nulu a později ji nastavil na něco jiného.
Všimněte si, že po try
je kód, který chceme vyzkoušet, obklopen složenými závorkami, jako jsou tyto:
{ }
V C# a mnoha podobných jazycích používáme složené závorky k zahrnutí nebo omezení rozsahu určitých akcí, operací nebo dokonce proměnných životních cyklů. Obecně platí, že proměnné přežívají pouze uvnitř těchto závorek. Když naše provádění kódu ukončí sadu těchto závorek, všechny proměnné v ní zmizí (někdy se tomu říká překročení rozsahu).
Za catch
vidíte stejné složené závorky line, což je instrukce, že vše, co je uvnitř složených závorek, by mělo být provedeno pouze v případě, že zachytíme chybu nebo výjimku. Kód ve složených závorkách se často nazývá blok kódu .
To znamená, že kdybychom vytvořili int
vstup uvnitř try
bloku kódu, pak proměnná zmizí, jakmile projdeme try
blok kódu a už jsme k němu nemohli přistupovat, abychom zkontrolovali, zda odpovídá naší tajné hodnotě. Vypracuji příklad z našeho kódu, abych vám ukázal, co tím myslím. Všimněte si na obrázku 1 níže, jak nedefinuji int
vstup dokud se nedostaneme do složených závorek našeho try
prohlášení.
Obrázek 1:Variabilní rozsah
Jo a všimněte si, že mám jeden řádek, který začíná
//
. V C# dvojitá lomítka označují, že cokoli následuje poté a až do konce řádku je komentář, který není součástí programu. Kompilátor bude takové řádky jednoduše ignorovat.
.
Chceme-li náš program vyzkoušet, můžeme do catch
vložit bod přerušení závorky na Console.WriteLine
řádek a poté spusťte náš program. Zadejte nečíselný vstup, abyste ověřili, že místo pádu program nyní vstoupí do catch
blok kódu a nakonec uživateli zobrazí chybovou zprávu, jak můžete vidět na obrázku 2.
Obrázek 2:Výjimka zachycena!
.
Podmínky
Nyní je tento kód v současné době napsaný spíše k ničemu, protože čteme hodnotu, ale – kromě toho, že uživateli řekneme, pokud udělá chybu – hodnotu k ničemu nepoužíváme. Můžete to zkusit a uvidíte, že pokud zadáte číslo, řekněme 7, bod přerušení není dosažen.
Aby byl náš kód užitečný jako tipovací hra, musíme vyzkoušet, zda jsme uhodli správné číslo. Zde musíme zavést nový koncept řízení toku nazvaný podmínka .
Podmínka je blok kódu, který se spustí, pouze pokud je splněno určité pravidlo nebo sada pravidel. Takové podmínky začínáme slovem if
a následujte jej pomocí pravidla nebo sady pravidel, které kontrolujeme v závorkách, za nimiž následuje blok kódu, který chceme spustit.
if (condition is met) { // execute this code block }
Existují samozřejmě velmi přísná pravidla syntaxe, jak můžeme tyto podmínky formátovat, a nemusí být nutně tak intuitivní, jak by mohly být. Chcete-li například porovnat hodnoty, musíte použít dvě rovnítka v C# a někdy tři v JavaScriptu. (Nezapomeňte, že přiřazujete pomocí jednoho rovnítka hodnotu.)
if (value == other_value) // example value comparison
Můžete použít širokou škálu porovnávacích operátorů a zbytek je o něco intuitivnější. Například, jako v normální matematice, můžete použít větší než (>) a menší než (<) a zkombinovat je se znaménkem rovná se, abyste vytvořili podmínky větší nebo rovno (>=) nebo menší nebo rovné (<=).
Můžete také vytvořit negativní podmínky. V mnoha programovacích jazycích označujete záporný operátor vykřičníkem (!), kterému se také často říká „bang“. Chcete-li například vytvořit podmínku, která se provede, pokud dvě hodnoty nejsou stejné, můžete napsat:
if (value != other_value)
Můžete také vytvořit více podmínek oddělením různých podmínek pomocí &&
(dvojité ampersandy) pro podmínky „AND“ nebo ||
(dvojité potrubí) pro podmínky „NEBO“.
if (value1 == other_value && value2 == other_value) … //means both value1 and value2 must be equal to other_value if (value1 == other_value || value2 == other_value) … //means either value1 or value2 must be equal to other_value
Pomocí podmínky nyní můžeme vytvořit test, abychom zjistili, zda hráč uhodl správné číslo. Přidejte následující řádky za poslední složenou závorku catch
blok kódu:
if (input == 3) { Console.WriteLine("Congratulations! You guessed correctly!"); }
Tato podmínka testuje, zda vstup (hodnota, kterou uživatel zadal) se rovná 3. Pokud je tato podmínka splněna, hra zobrazí blahopřání, jak je znázorněno na obrázku 3.
Obrázek 3:Podmínka splněna, udělena gratulace
Pokud uživatel neuhodne číslo 3, náš program nezobrazí nic a aplikace se ukončí.
Pamatujte, že můžete umístit body přerušení kdekoli v kódu, abyste zastavili provádění a viděli výsledky toho, co děláte. Uděláme to jen proto, abychom viděli výsledky změn, které od této chvíle provedeme v našem kódu.
.
Bylo by však hezké, kdybychom mohli zobrazit další zprávu, pokud uživatel neuhodne správné číslo. Naštěstí podmínky také umožňují toto chování prostřednictvím else
klíčové slovo.
else
klíčové slovo musí následovat přímo za if
blok kódu a uvádí, co by se mělo stát, pokud je podmínka v závorkách if
prohlášení není splněno. Chcete-li to vyzkoušet, přidejte následující řádky za if
blokovat:
else { Console.WriteLine("No, sorry, that wasn't it. Better luck next time!"); }
Celé vaše bloky podmíněného kódu by nyní měly vypadat jako na obrázku 4 níže.
Obrázek 4:Hádání kódu hry s bloky podmíněného kódu
Když spustíte svůj program, v závislosti na tom, zda uhodnete 3, dostanete buď gratulaci, nebo povzbuzení, abyste to zkusili znovu. Tento typ řízení toku nazýváme podmíněné větvení protože program přechází do jedné nebo druhé větve v závislosti na podmínkách, které zadáte.
Pojďme trochu zvýšit šance pro každého, kdo neví, že magické číslo je vždy 3. Pokud hráč neuhodne správně, umožníme více pokusů o uhodnutí.
.
Jít na smyčku
Abychom dosáhli této nové funkce, musíme implementovat něco, co se nazývá smyčka . V programování je smyčka blok kódu, který se provádí opakovaně. Dva velmi běžné typy smyček jsou pro smyčky a při smyčky.
Nejlepší použití pro for
smyčky jsou, když máte konkrétní počet případů, kdy chcete, aby se něco stalo. Začněme s tím v našem kódu a uvidíme, kam nás to zavede.
V for
smyčky, potřebujete klíčové slovo for
následuje blok v závorkách, který obsahuje tři informace.
Nejprve definujeme výchozí prostředí pro naši smyčku, která obsahuje proměnné, které chceme použít ke sledování toho, kolikrát se náš blok kódu provedl. Za druhé, chceme podmínku, která určuje, zda máme ve smyčce pokračovat. Nakonec máme změny, které chceme provést v podmínkách smyčky pokaždé, když smyčku spustíme. Podívejme se na příklad.
for (int i = 0; i < 3; i++) { // This code block will execute three times. }
Důležitý je zde první řádek. Všimněte si středníků, které oddělují tři části, které jsem zmínil. Zde je návod, jak se jednotlivé části rozdělují:
int i=0; // Initialization: Creates an integer variable called "i" and sets it to 0. i<3; // Condition: Continue executing as long as "i" is less than 3. i++ // Change happening during each loop: "i" increases by one each time the loop runs.
i++
zápis je zkratka pro psaní i=i+1
, která nastavuje i na hodnotu i plus jedna – jinými slovy zvyšuje i jedním. Mohl jsi napsat i=i+1
také, ale tento konkrétní vzorec je v programování velmi, velmi běžný, takže jej ukazuji jako užitečný příklad.
Cokoli vložíte do bloku, který následuje za for
deklarace smyčky bude probíhat tak dlouho, dokud bude splněna podmínka – v tomto případě třikrát. Můžete například přidat Console.WriteLine()
uvnitř bloku kódu a bude se opakovat třikrát, jako na obrázku 5 níže.
for (int i = 0; i < 3; i++) { Console.WriteLine("I am in a loop!"); }
Obrázek 5:„Jsem ve smyčce!“
Chceme použít tento druh smyčky, abychom uživateli umožnili více pokusů uhodnout správné číslo. Takže můžeme celý program, který jsme již napsali, zabalit do for
smyčka, jak je popsáno výše. Kód by nyní měl vypadat jako na obrázku 6 níže.
Obrázek 6:Guessing Loop
Samozřejmě, pokud uhodnete správné číslo dříve, než dosáhnete tří pokusů, nemá smysl dál hádat. Jako takoví se chystáme udělat velmi špatnou věc….
Pamatujte, že podmínkou pro pokračování v provádění je i zůstává pod 3. Pokud tedy chceme smyčku zastavit, můžeme jednoduše zvýšit i na 3 nebo více pro zastavení smyčky. Pokud přidáte i = 3
uvnitř bloku, který se spustí, pokud uživatel uhodne správně, jak je znázorněno na obrázku 7 níže, se hra zastaví, jakmile uživatel uhodne 3.
Obrázek 7:Zkratování smyčky For
Možná nechápete, proč je to špatný nápad, a ve skutečnosti je to spíše filozofický než technický argument. Je to však důležitý argument, takže to pojďme udělat.
A for
smyčka je navržena tak, aby se provedla určitý počet opakování. Pokud předem nevíte, kolikrát budete cyklus provádět, pak for
smyčka je špatná volba. Existují další formy smyček, které jsou pro tento úkol vhodnější, takže použijte for
smyčka vybírá pro danou úlohu nesprávný nástroj.
Tento argument se může zdát bezvýznamný a pedantský. Program funguje dobře tak, jak je, a dělá přesně to, co očekáváte.
Mysl programátora je však ta, která by se měla snažit o srozumitelnost, a tento příklad rozhodně není jasný. Když se podíváte na první řádek našeho současného kódu, myslíte si, že se jedná o smyčku, která běží třikrát, ale pak smyčku uprostřed „ošidíme“, takže smyčka může běžet kdekoli mezi jednou až třemi časy; neexistuje způsob, jak to vědět. Narušili jsme jasno v tom, co se stane, a to je špatná věc.
I když vám nezáleží na tom, aby někdo četl váš kód, pamatujte, že jako programátoři pracujeme se stroji, které nejsou schopny pochopit záměr. Rozumí přesně jen tomu, co říkáme. Pokud nemáme jasno, zvyšuje se šance, že dostaneme neočekávané výsledky. Když se programy stanou složitějšími, riskujeme, že si vytvoříme problémy.
Proto musíme najít lepší přístup, a tím lepším přístupem je while
smyčka.
.
A While Loop
while
smyčka se provede, když je podmínka pravdivá. Nezáleží na tom, kolikrát to je:dokud je podmínka pravdivá, smyčka pokračuje.
while
smyčka je v deklaraci jednodušší než for
smyčka a obsahuje klíčové slovo while
následuje otevřená závorka, podmínky a uzavírací závorka.
while (condition) { // Code to execute }
Tato exekuce může být velmi nebezpečná, pokud nemáte jasné podmínky. Pokud uděláte chybu nebo správně nezohledníte všechny podmínky a události, váš program se může zbláznit a semelit váš stroj až k zastavení.
Nebezpečí spočívá v zajištění toho, že zrušíte platnost podmínky uvnitř bloku kódu, když chcete zastavit provádění. Jinak bude smyčka běžet navždy.
Změňme naše for
smyčka do while
smyčku a nechte ji běžet tak dlouho, dokud uživatel třikrát neuhádl. Tuto podmínku můžeme vytvořit deklarováním int i=0;
před zahájením cyklu a poté nastavení hodnoty i uvnitř smyčky. Aktualizujte svůj kód jako takový:
static void Main(string[] args) { int i=0; while(i < 3) { Console.WriteLine("Guess a number between 1 and 10:"); string text = Console.ReadLine(); int input = 0; try { input = int.Parse(text); } catch { Console.WriteLine("Whoops, you didn't enter a number"); } if (input == 3) { Console.WriteLine("Congratulations! You guessed correctly!"); i = 3; } else { Console.WriteLine("No, sorry, that wasn't it. Better luck next time!"); } } }
Všimněte si, že v tomto kódu je chyba, která ukazuje, jak snadné je vytvářet nekonečné smyčky. Nezvyšujeme i pokud nehádáme správně! Jinými slovy, hráč má nekonečné množství pokusů, ale pokud neuhodne správně, neexistuje způsob, jak přestat hádat!
Naštěstí, když spustíte tento program, víte, že odpověď je pevně daná na 3, takže to můžete hádat, ale pokud to neuděláte, můžete mít velký problém.
Říkám to proto, abych vás nevyděsil z používání while
smyčky, ale spíše pro navození pocitu respektu k jejich síle. While
smyčky jsou velmi výkonné a užitečné, ale mohou být také nebezpečné, pokud se o to nestaráte.
Chcete-li problém vyřešit, přidejte i++;
jako první řádek v bloku kódu while, bezprostředně před Console.WriteLine("Guess a number between 1 and 10:")
. Váš kód by nyní měl fungovat podle očekávání, být velmi jasný a poskytnout vám velmi základní, ale nudnou hru na hádání.
.
Náhled orientace objektu
Co tedy můžeme udělat, aby byla tato hra i vzdáleně zajímavá? Já vím, udělejme tajné číslo náhodné!
Zdržel jsem se toho, protože potřebujeme představit nějaké nové nápady na vytváření náhodných čísel. Tyto myšlenky budou objasněny v dalším článku, který se zabývá objektovou orientací. Prozatím mi dovolte, abych vám poskytl kód a v posledním článku této série vám podrobně vysvětlím, co dělá.
static void Main(string[] args) { Random random = new Random(); // Object orientation stuff int answer = random.Next(10)+1; // Give me a random number less than 10 and add one int i = 0; while (i < 3) { i++; Console.WriteLine("Guess a number between 1 and 10:"); string text = Console.ReadLine(); int input = 0; try { input = int.Parse(text); } catch { Console.WriteLine("Whoops, you didn't enter a number"); } if (input == answer) { Console.WriteLine("Congratulations! You guessed correctly!"); i = 3; } else { Console.WriteLine("No, sorry, that wasn't it. Better luck next time!"); } } }
Nyní jsou zde dvě nové linky a jedna změněná. Nové řádky vytvoří náhodné celé číslo answer
mezi 1 a 10 a ve změněném řádku porovnáváme, co uživatel uhodne, s touto náhodnou odpovědí.
Náhodného generování se zatím nebojte, vysvětlím to v dalším článku. Ale prozatím, gratulujeme, jste tímto oficiálně kromě programátoru také vývojář her! Neváhejte a zahrajte si hru hned teď a uvidíte, jak se vám daří. Hru byste měli porazit v průměru 3krát z 10.
Proč jako další cvičení pro sebe nepřidáte po skončení hry zprávu, která hráči řekne, jaké bylo tajné číslo? Nyní to však skončeme a pojďme si projít to, co jsme probrali.
.
Shrnutí
V tomto článku jste se dozvěděli o toku programu a o tom, jak můžete řídit tok vašeho programu. Dozvěděli jste se o výjimkách pro řešení chyb. Dozvěděli jste se o blocích kódu a podmíněném větvení pomocí if
a else
. Také jste se dozvěděli o smyčkách pomocí for
a while
.
V příštím článku strávíme trochu času vylepšováním hry a také se podrobněji podíváme na orientaci objektů.
Seriál Jak na to
Toto je 4. část z 5dílné série Úvod do programování
- Úvod do programování:Začínáme
- Úvod do programování:Váš první program
- Úvod do programování:Proměnné, typy a manipulace s daty
- Úvod do programování:Řízení toku
- Úvod do programování:objektově orientované programování