Řídící struktury

Snad všechny procedurální jazyky obsahují podmíněný příkaz (if...else) a různé druhy cyklu (for, while, do...while). Některé (například C a C++) mají konstrukt goto, která se ale nikdy nedoporučuje používat, protože je kód výrazně znepřehledňuje. Do instrukční sady procesoru (čili assembleru) se to všechno přeloží vhodným použitím instrukce podmíněného skoku: pokud je splněna nějaká podmínka, přejdi na zadané místo v programu, pokud splněna není, pokračuj obyčejně.

Uveďte příklady cyklů a jejich formu v některých programovacích jazycích. Rozveďte, v čem se liší při použití a za jakých okolností jsou navzájem záměnné.

Původně na tomhle místě byla otázka ohledně cyklu s pevným a s neurčitým počtem opakování. Cykly s opravdu pevným počtem opakování, dle mého dojmu, používáme jenom dost zřídka (většinou se objeví přinejmenším nějaký break), ale stojí za to zmínit; význam je asi jasný.

Další dělení nabízí cykly s podmínkou na začátku a s podmínkou na konci. Prakticky vzato to má jediný rozdíl, totiž že cyklus s podmínkou na konci vždycky proběhne aspoň jednou. V jazyce C a podobných (Java, Javascript, C#, Pascal) se píše do příkazy while (podmínka), Ruby ani Python ho myslím neumožňují (musíte to obejít pomocí break).

Taky se v téhle souvislosti dá zmínit, že rekurze může sloužit jako cyklus. Žádnou ze zmíněných řídících struktur k tomu nepotřebujeme, a jde tak přepsat každý cyklus (jen to asi nepřináší žádné výhody).

Ruby má řídících struktur nespočet, takže se tahle otázka dá snadno nafukovat. Na druhou stranu, měli byste mít přehled o tom, jak se obdobná věc zapíše v Pascalu (pokud se nepletu, má ho kvinta pořád v osnovách).

Uveďte příklady podmíněných příkazů pro větvení programu a jejich formu v některých programovacích jazycích.

Všechny normální programovací jazyky obsahují podmíněný příkaz if (podmínka) příkazy else příkazy. Liší se v té prostřední variantě, tedy "pokud platí tahle podmínka a žádná předchozí": v C je to prostě else if, v Pascalu elseif, v Ruby elsif, v Pythonu elif.

Některé jazyky umožňují větvení konstruktem switch či case. Obvykle se ale používá trochu jinak než v Ruby: za každý blok je ve většině jazyků napsat break, jinak by se vykonaly i všechny následující. Podle mého názoru proto to lidé používají jen ve velmi výjimečných případech.

Větvení programu vzniká i díky línému vyhodnocování ternárního ?: operátoru, protože na levé i pravé straně dvojtečky můžou být funkce a zavolá se jen jedna z nich.

Program se taky může větvit kvůli ošetření výjimek (try...catch bloky, v Ruby begin...rescue). Mají sloužit sice trochu vyššímu účelu, ale na druhou stranu se jistě týkají tématu.

Zapište ve zvoleném programovacím jazyce funkci, která jako vstup dostane pole celých čísel reprezentujících platy zaměstnanců podniku. Funkce navrátí počet zaměstnanců, kteří vydělávají méně než podnikový průměr.

V Pythonu stručně a trochu neprocedurálně:

def pocet_nadprumernych(platy):
	prumer = sum(platy)/len(platy)
	return len([p for p in platy if p > prumer])

Cvičení: přepište to čistě procedurálně (oba řádky rozepsat na cykly) a v nějakém jiném jazyce.