Portál AbcLinuxu, 30. dubna 2025 17:54
Tento díl o Octave začíná pojednávat o řídicích strukturách, kterými jsou větvení a cykly. Určitě nebude překvapením, že se od jiných programovacích jazyků nijak zásadně neliší.
Větvení v programu používáme v případě, že některé příkazy chceme / můžeme
provést pouze za předpokladu platnosti nějaké podmínky. Jako podmínku chápeme
jakýkoliv výraz, který vrací logickou hodnotu, tj. odpovídá pravda/nepravda, v
numerické reprezentaci 1
nebo 0
. V Octave začínáme
větvení klíčovým slovem if
, za ním následuje podmínka, poté blok
příkazů, které se mají provést v případě, že tato podmínka je splněna. Celé
větvení ukončuje klíčové slovo end
(to obecně ukončuje všechny
řídící struktury v Octave) nebo slovo endif
(slouží k lepší
orientaci uživatele, co se vlastně ukončuje):
>> a=4; >> if a > 2 > disp('Číslo uložené v proměnné "a" je větší jak dva'); > end Číslo uložené v proměnné "a" je větší jak dva
Uvedený příklad demonstruje neúplné větvení programu – v případě, že
podmínka splněna nebude, neprovede se nic. U úplného větvení také uvádíme
příkazy, které se mají provést pouze v případě, kdy podmínka splněna není.
Takovéto příkazy uvádíme za klíčové slůvko else
, které odděluje
bloky
příkazů, které se mají provést při splnění a nesplnění podmínky:
>> a=-5; >> if a > 2 > disp('Číslo uložené v proměnné "a" je větší jak dva'); > else > disp('Číslo uložené v proměnné "a" NENÍ větší jak dva'); > endif Číslo uložené v proměnné "a" NENÍ větší jak dva
Všimněme si, že tyto příklady na větvení programu jsou na příkazové řádce
zapsány na více řádků – Octave pozná, že programová struktura ještě není
kompletní a jedním znakem „>“ napovídá, že očekává pokračování
příkazů, které vyhodnotí až po zadání uzavírajícího end
(resp.
endif
). Větvení samozřejmě je možné psát na jeden řádek, kvůli
přehlednosti však nevhodné – dostáváme se do situace, kdy tyto delší
programové úseky je lepší psát do externích souborů jako skripty nebo funkce
– viz díl Octave – 7 (vlastní skripty a funkce).
Uvnitř větvení – tedy jako v místě příkazů, které se za dané podmínky provedou či neprovedou – můžeme uvést další – vnořené – větvení:
--[skript]-- if a == b disp('Hodnoty v proměnných "a" i "b" jsou stejné'); else if a < b disp('Hodnota proměnné "a" je ostře menší jak hodnota v "b"'); else disp('Hodnota proměnné "a" je ostře větší jak hodnota v "b"'); end end --[konec skriptu]--
Octave stejně jako Matlab rozumí šikovnému rozšíření struktury větvení, které
umožňuje se zanořeným větvením částečně vyhnout. V okamžiku, kdy v sekci else má
následovat další, upřesňující podmínka, můžeme výhodně použít klíčové slůvko
elseif
(psáno dohromady):
--[skript]-- if a == b disp('Hodnoty v proměnných "a" i "b" jsou stejné'); elseif a < b disp('Hodnota proměnné "a" je ostře menší jak hodnota v "b"'); else disp('Hodnota proměnné "a" je ostře větší jak hodnota v "b"'); end --[konec skriptu]--
Příkazy v sekci elseif
se provedou v případě, že je splněna
upřesňující podmínka, v takovém případě již se neprovádí příkazy v sekci
else
. V případě, že ani upřesňující podmínka není splněna,
pokračuje
se testováním dalších případných sekcí elseif
– těch může být
obecně libovolný počet – a teprve v okamžiku, kdy žádná z upřesňujících
podmínek není splněna, přichází ke slovu sekce else
. Program, který
pro čísla od jedné do pěti vypíše slovně jejich hodnotu, může vypadat
následovně:
--[skript]-- if a == 1 disp('jedna'); elseif a == 2 disp('dva'); elseif a == 3 disp('tři'); elseif a == 4 disp('čtyři'); elseif a == 5 disp('pět'); else disp('neznám slovní vyjádření'); endif --[konec skriptu]--
Později si ukážeme, že pro zkoumání případů existuje v Octave pohodlnější
programová struktura switch
.
Nyní, když už známe jednoduché větvení programu, můžeme si ukázat, jak lze v Octave kontrolovat, zda nám při volání funkce zadal uživatel dostatečný počet parametrů. Mějme například triviální funkci pro výpočet aritmetického průměru dvou čísel:
--[funkce prumer.m]-- function vysledek=prumer(a,b) vysledek=(a+b)/2; --[konec funkce]--
Pokud nyní funkci spustíme, avšak pouze s jedním parametrem oproti dvěma očekávaným, dozvíme se takovéto chybové hlášení, z kterého možná úplně moudří nebudeme:
>> prumer(40) error: `b' undefined near line 2 column 13 error: evaluating binary operator `+' near line 2, column 12 error: evaluating binary operator `/' near line 2, column 15 error: evaluating assignment expression near line 2, column 9
Namísto takových chybových hlášení bychom možná raději uživateli měli sdělit,
že má zadat dvě čísla při volání funkce. Přesně k tomu slouží vestavěná funkce
nargin
(jméno funkce je zkratka z Number of ARGuments
INput), která vrací počet vstupních proměnných aktuálně volané funkce.
Upravíme tedy naši funkci takto:
--[funkce srovnani.m]-- function vysledek=prumer(a,b) if nargin ~= 2 disp('Pro použití funkce je třeba zadat právě dva parametry'); else vysledek=(a+b)/2; end --[konec funkce]--
Než se tedy pustíme do výpočtu, zkontrolujeme, zda náhodou počet vstupních proměnných není různý od dvou – pakliže ano, vypíšeme hlášku, v opačném případě můžeme provést výpočet:
>> prumer(40) Pro použití funkce je třeba zadat právě dva parametry
Vskutku dobře ošetřená funkce by potřebovala provádět ještě další testy,
například zda vstupní parametry jsou vůbec čísly, skaláry apod. – k tomu
se využívají funkce uvedené v
souvislosti s logickými operátory jako isscalar
atd.
Vzhledem k tomu, že kontrolu počtu zadaných parametrů funkce přenechává Octave
na programátorovi, lze tak snadno tvořit funkce, které mohou variabilně
upravovat svůj běh na základě toho, kolik parametrů znají – například lze
vykreslit grafický výstup pouze v případě, že byl zadán nějaký další parametr
apod. Podobně lze funkce přizpůsobovat na základě očekávaného počtu výstupních
proměnných – k tomu slouží analogická vestavěná funkce
nargout
. Více k této funkci a obecně problematice variabilního
počtu vstupních a výstupních proměnných je v nápovědě k
Octave.
O cyklech v Octave bude pojednávat následující díl.
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.