Podmíněné vykonávání a rozvětvení
Co je to? Podmíněné vykonávání = nechceme provést všechny příkazy, chceme určité části kódu něčím podmínit Rozvětvení = někdy se vykoná jedna část kódu (jedna větev), někdy druhá část kódu (druhá větev)
Podmíněné vykonávání Příklad: program kreslí obrazec, jenž se může sestávat z kříže, čtverce a kružnice. To, jestli se příslušná část obrazce na monitoru objeví, řídí uživatel pomocí tří zaškrtávacích políček
Postup řešení: Jádro bude určitě v obsluze události Paint panelu Budou zde všechny kreslící příkazy Jejich vykonávání však bude podmíněno stavem zaškrtávacích políček
Z Získej kreslící plochu a stanov rozměry obrazce Je políčkoČtverec zaškrtnuto? Je políčkoKříž zaškrtnuto? Je políčkoKružnice zaškrtnuto? K Nakresli kříž Nakresli čtverec Nakresli kružnici ano ne
Postup: Obrazec v panelu musí reagovat na zaškrtávací políčka Když uživatel „ofajfkuje“ čtverec, musí se objevit čtverec, když „fajfku“ zruší, obrazec zmizí To znamená, že kdykoli se stav zaškrtnutého políčka změní, je třeba obrazec překreslit Budou se tedy obsluhovat události CheckedChanged políček Obsluha bude společná pro všechna políčka a jediné, co se v ní povede, bude překreslení panelu
Uživatelské rozhraní programu Ovládací prvky: políčkoKříž políčkoČtverec políčkoKružnice panel
namespace Podmíněné_kreslení { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void panel_Paint(object sender, PaintEventArgs e) { //Kreslící plocha panelu a rozměry obrazce Graphics kp = e.Graphics; int šířka = panel.ClientSize.Width - 1; int výška = panel.ClientSize.Width - 1; //Je-li zaškrtnuto políčkoKříž, proveď příkazy: //kp.DrawLine(Pens.CornflowerBlue, 0, 0, šířka, výška); //kp.DrawLine(Pens.CornflowerBlue, 0, výška, šířka, 0); // Je-li zaškrtnuto políčkoČtverec, proveď příkaz: //kp.DrawRectangle(Pens.CornflowerBlue, 0, 0, šířka, výška); // Je-li zaškrtnuto políčkoKružnice, proveď příkaz: // kp.DrawEllipse(Pens.CornflowerBlue, 0, 0, šířka, výška); } private void všechnaPolíčka_CheckedChanged(object sender, EventArgs e) { panel.Refresh(); }
Řídící konstrukce IF if (podmínka) příkaz;NEBO if (podmínka) { příkaz1; příkaz2; } Jako podmínka se v konstrukci if používá proměnná, vlastnost nebo výraz typu bool. Podmínka se považuje za splněnou, má-li proměnná/vlastnost/výraz hodnotu true.
Dokončení příkladu private void panel_Paint(object sender, PaintEventArgs e) { //Kreslící plocha panelu a rozměry obrazce Graphics kp = e.Graphics; int šířka = panel.ClientSize.Width - 1; int výška = panel.ClientSize.Width - 1; //Je-li zaškrtnuto políčkoKříž, proveď příkazy: if (políčkoKříž.Checked) { kp.DrawLine(Pens.CornflowerBlue, 0, 0, šířka, výška); kp.DrawLine(Pens.CornflowerBlue, 0, výška, šířka, 0); } // Je-li zaškrtnuto políčkoČtverec, proveď příkaz: if (políčkoČtverec.Checked) kp.DrawRectangle(Pens.CornflowerBlue, 0, 0, šířka, výška); // Je-li zaškrtnuto políčkoKružnice, proveď příkaz: if (políčkoKružnice.Checked) kp.DrawEllipse(Pens.CornflowerBlue, 0, 0, šířka, výška);
Rozvětvení programu Program: Vytvoříme jednoduchou hru hádání čísla Po stisku tlačítka „Mysli si (nová hra)“ si počítač „bude myslet“ nějaké číslo v rozmezí 1 až 5. Úkolem uživatele poté bude číslo hádat Svůj odhad zapíše do textového pole a stiskne tlačítko „Hádám“ Počítač poté vyhodnotí, jestli uživatel myšlené číslo uhodl či nikoli tlačítkoMysliSi, tlačítkoHádám, poleHádám
Teorie k příkladu Při rozvětvení se vykoná vždy buď jedna nebo druhá alternativa V reakci na stisk tlačítka „Mysli si“ se vygeneruje číslo a to číslo se někam uloží (do členské proměnné – číslo zde musí vydržet po celou dobu hry) Poté je bude možno porovnávat s odhadem uživatele
public partial class HadaniCisla : Form { int myšlenéČíslo; Random náhoda = new Random(); public HadaniCisla() { InitializeComponent(); } private void tlačítkoMyslisi_Click(object sender, EventArgs e) { myšlenéČíslo = náhoda.Next(1, 5 + 1); } private void tlačítkoHádám_Click(object sender, EventArgs e) { //pokud se číslo zapsané v textovém poli shoduje s číslem //v proměnné myšlenéČíslo, proveď příkaz: //MessageBox.Show("UHODL(A) JSTE!"); //V opačném případě proveď příkaz: //MessageBox.Show("Neuhodl(a) jste, zkuste znovu."); }
Řídící konstrukce if-else K zápisu rozvětvení programu slouží konstrukce IF-ELSE: if (podmínka) akce1 //jsou to buď samostatné příkazy ukončené středníkem, nebo bloky příkazů ve složených závorkách// else akce2//jsou to buď samostatné příkazy ukončené středníkem, nebo bloky příkazů ve složených závorkách//
Dokončení příkladu private void tlačítkoHádám_Click(object sender, EventArgs e) { int hádanéČíslo; try { hádanéČíslo = Convert.ToInt32(poleHádám.Text); } catch { MessageBox.Show("Zadán nekorektní údaj."); return; } if (hádanéČíslo == myšlenéČíslo) MessageBox.Show ("UHODL(A) JSTE!"); else MessageBox.Show("Neuhodl(a) jste, zkuste znovu."); }
Relační operátory if (hádanéČíslo == myšlenéČíslo) celý výraz typu bool - výpočet, jehož hodnota typu bool – buď true nebo false v tomto případě se hodnota proměnné hádanéČíslo porovnává s hodnotou proměnné myšlenéČíslo pokud se obě hodnoty rovnají, je výsledkem výrazu hodnota true, jestliže se nerovnají, je výsledkem false
Relační operátor V matematiceV C# a = ba == b a = ba != b a < b a <= b a > b a >= b