155GIT1 / 6. cvičení: Porovnání verzí
m →Úlohy |
mBez shrnutí editace |
||
(Není zobrazeno 38 mezilehlých verzí od 2 dalších uživatelů.) | |||
Řádek 2: | Řádek 2: | ||
{{Cvičení|155GIT1|6|Algoritmizace, podmínky a cykly}} | {{Cvičení|155GIT1|6|Algoritmizace, podmínky a cykly}} | ||
== Náplň | == Náplň == | ||
# zobrazení zpráv, zadaní vstup | # zobrazení zpráv, zadaní vstup | ||
# podmínky (<tt>if, else, elseif, end, all, any</tt>) | # podmínky (<tt>if, else, elseif, end, all, any</tt>) | ||
# větvení (<tt>switch</tt>) | # větvení (<tt>switch</tt>) | ||
# | # cykly (<tt>for, while</tt>) | ||
# příkazy <tt>break, continue</tt> | # příkazy <tt>break, continue</tt> | ||
# složené podmínky | |||
== Ukázky == | == Ukázky == | ||
Řádek 15: | Řádek 16: | ||
<source lang=octave> | <source lang=octave> | ||
disp('Program vyzaduje vstup'); | disp('Program vyzaduje vstup'); | ||
a = input('Zadejte cislo a: ') | a = input('Zadejte cislo a: ') | ||
</source> | |||
=== Vyhodnocování relačních výrazů, all, any === | |||
* pravdivá relace je vyhodnocena jako 1 | |||
* nepravdivá relace je vyhodnocena jako 0 | |||
* funkce '''all()''' (uvažujme např. vícero výsledků relačních výrazů současně) | |||
<source lang=octave> | |||
all([1 1 1]) | |||
all([0 0 1]) | |||
all([0 0 0]) | |||
</source> | |||
* funkce '''any()''' (uvažujme např. vícero výsledků relačních výrazů současně) | |||
<source lang=octave> | |||
any([1 1 1]) | |||
any([0 0 1]) | |||
any([0 0 0]) | |||
</source> | </source> | ||
=== Větvení (if) === | === Větvení (if) === | ||
* [http://geo.fsv.cvut.cz/ | * [http://geo.fsv.cvut.cz/vyuka/155git1/matlab/matlab.pdf#page=71 syntaxe] | ||
<source lang=octave> | <source lang=octave> | ||
a = | % skalární podmínka | ||
b | a = randi(10) % randi(n) generuje náhodné přirozené číslo z intervalu od 1 do n | ||
b = randi(10) | |||
if a < b % je-li podmínka pravdivá, proveď následující příkazy | |||
disp('a je mensi nez b'); | |||
else % není-li shora uvedená podmínka pravdivá, proveď následující příkazy | |||
disp('a je vetsi nebo rovno b'); | |||
end | |||
% vektorová podmínka | |||
a = [1 2]; | |||
b = [0 3]; | |||
if b | if a < b % vyhodnotí se jako: if all(a < b) | ||
disp('a je po prvcich vzdy mensi nez b'); | |||
elseif a | else | ||
disp('a je po prvcich alespon jednou vetsi nez b'); | |||
end | end | ||
% test na (ne)nulové prvky proměnné (proměnné a,b jsou typicky logické proměnné, obsahují tedy výsledky relačních výrazů, tj. 0 či 1) | |||
if b % totéž jako: if all(b) | |||
disp('b neobsahuje zadne nulove cleny'); | |||
elseif a % totéž jako: if all(a) | |||
disp('b obsahuje nulovy clen, a neobsahuje zadne nulove cleny'); | |||
else | |||
disp('a i b obsahuji nulovy clen'); | |||
end | |||
if any(b) | if any(b) | ||
disp('b obsahuje alespon jeden nenulovy clen'); | |||
end | end | ||
</source> | </source> | ||
Řádek 47: | Řádek 79: | ||
<source lang=octave> | <source lang=octave> | ||
cislo = randi(10) | cislo = randi(10) | ||
switch cislo | switch cislo % pro následné vyjmenované hodonoty (v položkách case) proměnné cislo proveď uvedený příkaz | ||
% v závislosti na konkrétní hodnotě proměnné cislo | |||
case 1 | |||
disp('cislo je 1') | |||
case {2,3} % výčet více přípustných hodnot je proveden ve složených závorkách | |||
disp('cislo je 2 nebo 3') | |||
case {4,6,7} | |||
disp('cislo je 4, 6 nebo 7') | |||
otherwise % pro výše neuvedené hodnoty proměnné cislo | |||
end | disp('cislo je 5 nebo vetsi nez 7') | ||
end | |||
</source> | </source> | ||
Řádek 64: | Řádek 97: | ||
<source lang=octave> | <source lang=octave> | ||
% | % tvorba vektoru | ||
n = | n = 4 | ||
for i = 1:n | for i = 1:n % cyklus for poběží pro předem známý počet opakování (tj. pro předem vyjmenované hodnoty proměnné i) | ||
a(i) = i^2 % vzniklý vektor obsahuje druhé mocniny indexu prvku | |||
end | end | ||
% matice | |||
for i = 1: | % tvorba matice | ||
m = 4 % pocet radku | |||
n = 3 % pocet sloupcu | |||
for i = 1:m % řádkový index | |||
end | for j = 1:n % sloupcový index | ||
A(i,j) = i+j % vzniklá matice obsahuje součet řádkového a sloupcového indexu prvku | |||
end | |||
end | |||
% příklad - v matici vyhledat sudé řádky, v těchto řádcích změnit znaménko všech prvků (jedna z možných variant zápisu) | |||
A = rand(5,4) | |||
for i=1:size(A,1) | |||
if rem(i,2) == 0 % rem(a,b) ... zbytek po dělení čísla a číslem b; podle řádkového indexu i testujeme, zda jde o lichý či sudý řádek | |||
A(i,:) = -1 * A(i,:) | |||
end | |||
end | |||
</source> | </source> | ||
Řádek 80: | Řádek 124: | ||
<source lang=octave> | <source lang=octave> | ||
a = 1; | a = 1; | ||
b = 5; | b = 5; | ||
while a < b | while a < b % výpočet probíhá, dokud platí podmínka (tj. dokud je podmínka pravdivá) | ||
a | |||
a = a + 1; | |||
end | end | ||
</source> | </source> | ||
Řádek 91: | Řádek 135: | ||
<source lang=octave> | <source lang=octave> | ||
for i = 1:5 | for i = 1:5 | ||
if i == 2 | |||
continue; % od tohoto místa cyklus for pokračuje dále, ovšem již pro další hodnotu proměnné i (tj. pro i=3); | |||
% zbytek příkazů v těle cyklu for pro původní hodnotu proměnné (i=2) se již nevykoná | |||
end | |||
if i == 4 | |||
break; % na tomto místě se cyklus for okamžitě ukončí | |||
end | end | ||
fprintf('i = %d\n', i); | |||
end | |||
</source> | |||
=== Složené podmínky === | |||
''' logické AND ''' - všechny podmínky musí platit současně | |||
<source lang=octave> | |||
% iterativní proces skončí již při splnění jedné z požadovaných přesností | |||
dx = 10; % přesnost v souřadnici x - apriorní hodnota | |||
dy = 10; % přesnost v souřadnici y - apriorní hodnota | |||
i = 0; % čítač iterací | |||
while dx > 0.1 & dy > 0.1 % požadovaná přesnost pro obě souřadnice - 0.1 (např. mm) | |||
i = i+1 | |||
dx = dx/2 | |||
dy = dy/5 | |||
end | |||
% výsledkem složené podmínky AND je, ze cyklus while skončí, jakmile již jedna z podmínek přestane platit; přesnost se tedy nedosáhne v obou souřadnicích, ale jen v jedné z nich !! | |||
% totéž | |||
dx = 10; % přesnost v souřadnici x - apriorní hodnota | |||
dy = 10; % přesnost v souřadnici y - apriorní hodnota | |||
i = 0; % čítač iterací | |||
while all([dx > 0.1, dy > 0.1]) % totéž: while [dx > 0.1, dy > 0.1] | |||
i = i+1 | |||
dx = dx/2 | |||
dy = dy/5 | |||
end | |||
</source> | |||
''' logické OR ''' - musí platit alespoň jedna podmínka | |||
<source lang=octave> | |||
% iterativní proces skončí až po splnění všech požadovaných přesností | |||
dx = 10; % přesnost v souřadnici x - apriorní hodnota | |||
dy = 10; % přesnost v souřadnici y - apriorní hodnota | |||
i = 0; % čítač iterací | |||
while dx > 0.1 | dy > 0.1 % požadovaná přesnost pro obě souřadnice - 0.1 (např. mm) | |||
i = i+1 | |||
dx = dx/2 | |||
dy = dy/5 | |||
end | |||
% výsledkem složené podmínky OR je, ze cyklus while skončí, až všechny z podmínek přestanou platit; přesnost se tedy dosáhne ve všech souřadnicích !! | |||
% totěž | |||
dx = 10; % přesnost v souřadnici x - apriorní hodnota | |||
dy = 10; % přesnost v souřadnici y - apriorní hodnota | |||
i = 0; % čítač iterací | |||
while any([dx > 0.1, dy > 0.1]) | |||
i = i+1 | |||
dx = dx/2 | |||
dy = dy/5 | |||
end | |||
</source> | </source> | ||
== Úlohy == | == Úlohy == | ||
* [[155GIT1 / 6. cvičení / Příklady]] | * [[155GIT1 / 6. cvičení / Příklady|6. cvičení - příklady]] | ||
<!-- --> |
Aktuální verze z 13. 4. 2023, 03:54
Algoritmizace, podmínky a cykly
Náplň
- zobrazení zpráv, zadaní vstup
- podmínky (if, else, elseif, end, all, any)
- větvení (switch)
- cykly (for, while)
- příkazy break, continue
- složené podmínky
Ukázky
Interaktivní vstup
disp('Program vyzaduje vstup');
a = input('Zadejte cislo a: ')
Vyhodnocování relačních výrazů, all, any
- pravdivá relace je vyhodnocena jako 1
- nepravdivá relace je vyhodnocena jako 0
- funkce all() (uvažujme např. vícero výsledků relačních výrazů současně)
all([1 1 1])
all([0 0 1])
all([0 0 0])
- funkce any() (uvažujme např. vícero výsledků relačních výrazů současně)
any([1 1 1])
any([0 0 1])
any([0 0 0])
Větvení (if)
% skalární podmínka
a = randi(10) % randi(n) generuje náhodné přirozené číslo z intervalu od 1 do n
b = randi(10)
if a < b % je-li podmínka pravdivá, proveď následující příkazy
disp('a je mensi nez b');
else % není-li shora uvedená podmínka pravdivá, proveď následující příkazy
disp('a je vetsi nebo rovno b');
end
% vektorová podmínka
a = [1 2];
b = [0 3];
if a < b % vyhodnotí se jako: if all(a < b)
disp('a je po prvcich vzdy mensi nez b');
else
disp('a je po prvcich alespon jednou vetsi nez b');
end
% test na (ne)nulové prvky proměnné (proměnné a,b jsou typicky logické proměnné, obsahují tedy výsledky relačních výrazů, tj. 0 či 1)
if b % totéž jako: if all(b)
disp('b neobsahuje zadne nulove cleny');
elseif a % totéž jako: if all(a)
disp('b obsahuje nulovy clen, a neobsahuje zadne nulove cleny');
else
disp('a i b obsahuji nulovy clen');
end
if any(b)
disp('b obsahuje alespon jeden nenulovy clen');
end
Větvení (switch)
cislo = randi(10)
switch cislo % pro následné vyjmenované hodonoty (v položkách case) proměnné cislo proveď uvedený příkaz
% v závislosti na konkrétní hodnotě proměnné cislo
case 1
disp('cislo je 1')
case {2,3} % výčet více přípustných hodnot je proveden ve složených závorkách
disp('cislo je 2 nebo 3')
case {4,6,7}
disp('cislo je 4, 6 nebo 7')
otherwise % pro výše neuvedené hodnoty proměnné cislo
disp('cislo je 5 nebo vetsi nez 7')
end
Cyklus for
% tvorba vektoru
n = 4
for i = 1:n % cyklus for poběží pro předem známý počet opakování (tj. pro předem vyjmenované hodnoty proměnné i)
a(i) = i^2 % vzniklý vektor obsahuje druhé mocniny indexu prvku
end
% tvorba matice
m = 4 % pocet radku
n = 3 % pocet sloupcu
for i = 1:m % řádkový index
for j = 1:n % sloupcový index
A(i,j) = i+j % vzniklá matice obsahuje součet řádkového a sloupcového indexu prvku
end
end
% příklad - v matici vyhledat sudé řádky, v těchto řádcích změnit znaménko všech prvků (jedna z možných variant zápisu)
A = rand(5,4)
for i=1:size(A,1)
if rem(i,2) == 0 % rem(a,b) ... zbytek po dělení čísla a číslem b; podle řádkového indexu i testujeme, zda jde o lichý či sudý řádek
A(i,:) = -1 * A(i,:)
end
end
Cyklus while
a = 1;
b = 5;
while a < b % výpočet probíhá, dokud platí podmínka (tj. dokud je podmínka pravdivá)
a
a = a + 1;
end
Příkazy break, continue
for i = 1:5
if i == 2
continue; % od tohoto místa cyklus for pokračuje dále, ovšem již pro další hodnotu proměnné i (tj. pro i=3);
% zbytek příkazů v těle cyklu for pro původní hodnotu proměnné (i=2) se již nevykoná
end
if i == 4
break; % na tomto místě se cyklus for okamžitě ukončí
end
fprintf('i = %d\n', i);
end
Složené podmínky
logické AND - všechny podmínky musí platit současně
% iterativní proces skončí již při splnění jedné z požadovaných přesností
dx = 10; % přesnost v souřadnici x - apriorní hodnota
dy = 10; % přesnost v souřadnici y - apriorní hodnota
i = 0; % čítač iterací
while dx > 0.1 & dy > 0.1 % požadovaná přesnost pro obě souřadnice - 0.1 (např. mm)
i = i+1
dx = dx/2
dy = dy/5
end
% výsledkem složené podmínky AND je, ze cyklus while skončí, jakmile již jedna z podmínek přestane platit; přesnost se tedy nedosáhne v obou souřadnicích, ale jen v jedné z nich !!
% totéž
dx = 10; % přesnost v souřadnici x - apriorní hodnota
dy = 10; % přesnost v souřadnici y - apriorní hodnota
i = 0; % čítač iterací
while all([dx > 0.1, dy > 0.1]) % totéž: while [dx > 0.1, dy > 0.1]
i = i+1
dx = dx/2
dy = dy/5
end
logické OR - musí platit alespoň jedna podmínka
% iterativní proces skončí až po splnění všech požadovaných přesností
dx = 10; % přesnost v souřadnici x - apriorní hodnota
dy = 10; % přesnost v souřadnici y - apriorní hodnota
i = 0; % čítač iterací
while dx > 0.1 | dy > 0.1 % požadovaná přesnost pro obě souřadnice - 0.1 (např. mm)
i = i+1
dx = dx/2
dy = dy/5
end
% výsledkem složené podmínky OR je, ze cyklus while skončí, až všechny z podmínek přestanou platit; přesnost se tedy dosáhne ve všech souřadnicích !!
% totěž
dx = 10; % přesnost v souřadnici x - apriorní hodnota
dy = 10; % přesnost v souřadnici y - apriorní hodnota
i = 0; % čítač iterací
while any([dx > 0.1, dy > 0.1])
i = i+1
dx = dx/2
dy = dy/5
end