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ě.
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).
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.
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.