Programové struktury
- způsob zápisu algoritmu pomocí VD
- událostní funkce
- obecná funkce, objektová metoda, předávání parametrů funkci, návratová hodnota
- binární větvení
- cyklus (podmíněný, s definovaným počtem opakování)
- objekt
- příklady programů ve vybraném jazyce
Obsah |
Strukturované programování (strukturovaný programovací jazyk)
- označuje v informatice programovací techniku, kdy se implementovaný algoritmus rozděluje na dílčí úlohy (tzn. na procedury či funkce, které se spojují v jeden celek). Na strukturované programování lze nahlížet jako na imperativní programování za využití vybraných řídicích. U strukturovaného programování se vyhýbáme řídicímu příkazu skoku.
- Strukturované programování definuje, že se program může skládat pouze z následujících čtyř struktur:
- sekvence: provádí posloupnost příkazů jeden po druhém
- větvení: jeden nebo více příkazů je vykonán v závislosti na stavu programu (obvykle vyjadřováno klíčovými slovy if-else)
- cyklus: příkazy jsou prováděny do té doby, dokud program nedosáhne nějakého stavu (obvykle vyjadřováno klíčovými slovy while, for)
- podprogram: příkazy jsou shromažďovány do samostatného bloku, který má své jméno a definuje vstupy a výstupy. Tento blok (funkci nebo proceduru) lze z jiné části programu volat jeho jménem (identifikátorem). Funkce s návratovou hodnotou lze zařadit do výrazu.
- Nejznámějším důsledkem těchto zásad je snaha zabránit nebo v závislosti na programovacím jazyce alespoň omezit používání příkazu skoku. Programový kód nerespektující výše uvedené zásady se často hanlivě označuje jako „špagetový kód“.
Sekvence
- Sekvence představuje posloupnost jednotlivých příkazů řazených v pořadí za sebou tak, jak mají být vykonány. Uzavřená sekvence se nazývá složený příkaz nebo blok.
Větvení
- Větvení umožňuje volit další postup řešení na základě splnění nebo nesplnění určité podmínky. Z obecného pohledu ale nemusí být vždy testována podmínka, neboť rozhodující pro větvení je až logická hodnota (true/false), která je výsledkem zmíněné podmínky. Větvit lze tedy i jen na základě hodnoty v logické proměnné. Větvení může být realizováno jako neúplný podmíněný příkaz, úplný podmíněný příkaz nebo jako přepínač.
- 1) Neúplný podmíněný příkaz
Nejprve je vyhodnocena podmínka P. Když je splněna, provede se sekvence S. Není-li podmínka splněna, nic se neprovádí a běh programu pokračuje dále.
int x; if (x > 0) MessageBox.Show("Kladné číslo");
- 2) Úplný podmíněný příkaz
Nejprve je vyhodnocena podmínka P. Když je splněna, provede se sekvence S1. Není-li podmínka splněna, provede se sekvence S2.
int x; if (x > 0) { MessageBox.Show("Je přirozené číslo"); } else { MessageBox.Show("Není přirozené číslo"); }
Cyklus
- Slouží k vyjádření opakujících se operací. Počet opakování může být předem zadán, nebo je odvozen od splnění některé dané podmínky. Existují tak tři základní druhy cyklu: cyklus s výčtem hodnot, cyklus s podmínkou na počátku a cyklus s podmínkou na konci.
- 1) Cyklus s výčtem hodnot (cyklus s předepsaným počtem opakování)
Tento druh cyklu se provádí tolikrát, kolikrát je opakování cyklu předepsáno. Předpis je dán definicí dolní hodnoty p, kroku a horní hodnoty p (případně podmínky, která musí být po celou dobu vykonávání cyklu splněna).
for (int i = 0; i < 10; i++) x[i] = nahoda.next(0, 11);
- 2) Cyklus s podmínkou na začátku
Nejprve je vyhodnocena podmínka P. Je-li podmínka splněna, provedou se příkazy sekvencí C a následuje návrat na začátek cyklu. Tato se opakuje, pokud stále platí podmínka P. Z uvedeného je zřejmé, že v sekvenci S musí být operace, která mění některou z hodnot logického výrazu podmínky P. Kdyby tomu tak nebylo, cyklus by nemohl skončit. Při dosažení neplatnosti podmínky P cyklus skončí.
Je tedy zřejmé, že cyklus s podmínkou na začátku (někdy zvaný cyklus POKUD) nemusí proběhnout vůbec (je-li podmínka P nesplněna před vstupem do cyklu), nebo jednou, či n-krát. V případě chybného naprogramování cyklu může dojít k zacyklení, což nastane, pokud podmínka P platí stále.
int i=0; while (i<10) { x[i] = nahoda.next(0, 11); i++; }
- 3) Cyklus s podmínkou na konci
Nejprve je provedena sekvence S. Poté je vyhodnocena podmínka, pokud platí, sekvence S se znovu neprovádí a běh programu pokračuje za cyklem. Není-li podmínka splněna opakuje se sekvence S a to tak dlouho, dokud podmínka stále neplatí. Z uvedeného je zřejmé, že v sekvenci S musí být operace, která mění některou z hodnot logického výrazu podmínky P. Kdyby tomu tak nebylo, cyklus by nemohl skončit.
Tento cyklus se někdy nazývá cyklus DOKUD, čímž se myslí - dokud podmínka neplatí, opakuje se sekvence S. Tento cyklus proběhne vždy alespoň jednou. Četnost výskytu potřeby tohoto typu cyklu v programech je asi desetkrát menší než cyklu s podmínkou na začátku.
int i=0; do { x[i] = nahoda.next(0, 11); i++; } while (i<10)
Podprogram
- Podprogramy představují ucelené, relativně samostatné části programu, napsané v tomto programu jenom jednou, ale s možností využít je vícekrát v různých místech tohoto programu. Podprogram musí mít své jméno (identifikátor), jehož prostřednictvím se na něj v programu odvoláváme a seznam formálních parametrů, které slouží po jejich nahrazení skutečnými parametry při odvolání se na podprogram.
- Podprogram se může vyskytovat v podobě funkce bez návratové hodnoty nebo s návratovou hodnotou. Funkci s návratovou hodnotou můžeme zahrnout do výrazu.
Parametry předávané do podprogramu
- Parametr je označení pro vstupní data příslušné funkce. Existují dva způsoby předávání parametrů funkci.
- Při předávání hodnotou (call-by-value) se těsně před zpracováním těla funkce předávaný parametr vyčíslí a výsledek se zkopíruje do lokální proměnné uvnitř volané funkce. Jakékoli změny parametru uvnitř volané funkce nemají vliv na volající funkci, neboť se pracuje s lokální kopií hodnoty původního parametru. Předávání hodnotou tedy lze používat pouze pro vstupní parametry. Tento způsob je typický např. při vytváření aritmetických funkcí.
- Při předávání odkazem (call-by-reference) se formální parametr uvnitř volané funkce bere jen jako jiné označení (alias) pro proměnnou předanou jako skutečný parametr, tzn. ve volané funkci se pracuje přímo s předávanou proměnnou, nevytváří se tedy kopie hodnoty (což zvláště u strukturovaných proměnných znamená zpravidla úsporu času i paměti). Volaná funkce změnou parametru ovlivňuje i původní volající funkci, takže předávání odkazem lze používat pro výstupní či vstupně-výstupní parametry. Nevýhodou však je, že parametrem může být jen proměnná a nikoli výsledek obecného výrazu. Předávání odkazem se obvykle implementuje pomocí ukazatele na předávanou proměnnou.
- 1) Předávání parametrů hodnotou v jazyce C#
void Zamen(int a, int b) //zameni hodnoty v promennych { int pom; pom = a; a = b; b = pom; }
Tuto funkci budeme volat z volající funkce následně:
static void Main(string[] args) { int promennaA = 10, promennaB = 20; Zamen(promennaA, promennaB); return 0; }
Při předávání parametrů funkci hodnotou zůstanou původní proměnné (promennaA a promennaB) po návratu zpět do volající funkce beze změny.
- 2) Předávání parametrů odkazem v jazyce C#
void Zamen(ref int a, ref int b) //zameni hodnoty v promennych { int pom = a; a = b; b = pom; }
Tuto funkci budeme volat z volající funkce následně:
static void Main(string[] args) { int promennaA = 10, promennaB = 20; Zamen(ref promennaA, ref promennaB); return 0; }
Po předání parametrů funkci tímto způsobem budou po návratu zpět do volající funkce v našich proměnných (promennaA a promennaB) hodnoty 20 a 10.