155GIT1 / 4. cvičení: Porovnání verzí
mBez shrnutí editace |
|||
(Není zobrazeno 11 mezilehlých verzí od jednoho dalšího uživatele.) | |||
Řádek 1: | Řádek 1: | ||
{{Geoinformatika}} | {{Geoinformatika}} | ||
{{Cvičení|155GIT1|4|Algoritmizace, podmínky a cykly}} | {{Cvičení|155GIT1|4|Matlab - Algoritmizace, podmínky a cykly}} | ||
== Náplň cvičení == | == Náplň cvičení == | ||
Řádek 39: | Řádek 39: | ||
=== Větvení (if) === | === Větvení (if) === | ||
* [http://geo.fsv.cvut.cz/ | * [http://geo.fsv.cvut.cz/vyuka/155git1/matlab/matlab.pdf#page=71 přednášky] | ||
<source lang=octave> | <source lang=octave> | ||
Řádek 46: | Řádek 46: | ||
b = randi(10) | b = randi(10) | ||
if a < b | if a < b % je-li podminka pravdiva, proved nasledujici prikazy | ||
disp('a je mensi nez b'); | disp('a je mensi nez b'); | ||
else | else % neni-li shora uvedena podminka pravdiva, proved nasledujici prikazy | ||
disp('a je vetsi nebo rovno b'); | disp('a je vetsi nebo rovno b'); | ||
end | end | ||
Řádek 81: | Řádek 81: | ||
cislo = randi(10) | cislo = randi(10) | ||
switch cislo | switch cislo % pro nasledne vyjmenovane hodonoty (v polozkach case) promenne cislo proved uvedeny prikaz | ||
% v zavislosti na konkretni hodnote promenne cislo | |||
case 1 | case 1 | ||
disp('cislo je 1') | disp('cislo je 1') | ||
Řádek 88: | Řádek 89: | ||
case {4,6,7} | case {4,6,7} | ||
disp('cislo je 4, 6 nebo 7') | disp('cislo je 4, 6 nebo 7') | ||
otherwise | otherwise % pro vyse neuvedene hodnoty promenne cislo | ||
disp('cislo je 5 nebo vetsi nez 7') | disp('cislo je 5 nebo vetsi nez 7') | ||
end | end | ||
Řádek 98: | Řádek 99: | ||
% tvorba vektoru | % tvorba vektoru | ||
n = 4 | n = 4 | ||
for i = 1:n | for i = 1:n % cyklus for pobezi pro predem znamy pocet opakovani (tj. pro predem vyjmenovane hodnoty promenne i) | ||
a(i) = i^2 | a(i) = i^2 % vznikly vektor obsahuje druhe mocniny indexu prvku | ||
end | end | ||
Řádek 105: | Řádek 106: | ||
m = 4 % pocet radku | m = 4 % pocet radku | ||
n = 3 % pocet sloupcu | n = 3 % pocet sloupcu | ||
for i = 1:m | for i = 1:m % radkovy index | ||
for j = 1:n | for j = 1:n % sloupcovy index | ||
A(i,j) = i+j | A(i,j) = i+j % vznikla matice obsahuje soucet radkoveho a sloupcoveho indexu prvku | ||
end | end | ||
end | end | ||
% priklad - v matici vyhledat sude radky (jedna z moznych variant zapisu) | % priklad - v matici vyhledat sude radky, v techto radcich zmenit znamenko vsech prvku (jedna z moznych variant zapisu) | ||
A = rand(5,4) | A = rand(5,4) | ||
for i=1:size(A,1) | for i=1:size(A,1) | ||
if rem(i,2) == 0 | if rem(i,2) == 0 % rem(a,b) ... zbytek po deleni cisla a cislem b; podle radkoveho indexu i testujeme, zda jde o lichy ci sudy radek | ||
A(i,:) = -1 * A(i,:) | A(i,:) = -1 * A(i,:) | ||
end | end | ||
Řádek 125: | Řádek 126: | ||
a = 1; | a = 1; | ||
b = 5; | b = 5; | ||
while a < b | while a < b % vypocet probiha, dokud plati podminka (tj. dokud je podminkna pravdiva) | ||
a | a | ||
a = a + 1; | a = a + 1; | ||
Řádek 136: | Řádek 137: | ||
for i = 1:5 | for i = 1:5 | ||
if i == 2 | if i == 2 | ||
continue; | continue; % od tohoto mista cyklus for pokracuje dale, ovsem jiz pro dalsi hodnotu promenne i (tj. pro i=3); | ||
% zbytek prikazu v tele cyklu for pro puvodni hodnotu promenne (i=2) se jiz nevykona | |||
end | end | ||
if i == 4 | if i == 4 | ||
break; | break; % na tomto miste se cyklus for okamzite ukonci | ||
end | end | ||
fprintf('i = %d\n', i); | fprintf('i = %d\n', i); | ||
Řádek 154: | Řádek 156: | ||
dy = 10; % presnost v souradnici y - apriorni hodnota | dy = 10; % presnost v souradnici y - apriorni hodnota | ||
i = 0; % citac iteraci | i = 0; % citac iteraci | ||
while dx > 0.1 & dy > 0.1 % pozadovana presnost pro obe souradnice - 0.1 | while dx > 0.1 & dy > 0.1 % pozadovana presnost pro obe souradnice - 0.1 (napr. mm) | ||
i = i+1 | i = i+1 | ||
dx = dx/2 | dx = dx/2 | ||
dy = dy/5 | dy = dy/5 | ||
end | end | ||
% vysledkem slozene podminky AND je, ze cyklus while skonci, jakmile jiz jedna z podminek prestane platit; presnost se tedy nedosahne v obou souradnicich, ale jen v jedne z nich !! | |||
% totez | % totez | ||
Řádek 178: | Řádek 182: | ||
dy = 10; % presnost v souradnici y - apriorni hodnota | dy = 10; % presnost v souradnici y - apriorni hodnota | ||
i = 0; % citac iteraci | i = 0; % citac iteraci | ||
while dx > 0.1 | dy > 0.1 % pozadovana presnost pro obe souradnice - 0.1 | while dx > 0.1 | dy > 0.1 % pozadovana presnost pro obe souradnice - 0.1 (napr. mm) | ||
i = i+1 | i = i+1 | ||
dx = dx/2 | dx = dx/2 | ||
dy = dy/5 | dy = dy/5 | ||
end | end | ||
% vysledkem slozene podminky OR je, ze cyklus while skonci, az vsechny z podminek prestanou platit; presnost se tedy dosahne ve vsech souradnicich !! | |||
% totez | % totez |
Verze z 24. 2. 2021, 08:45
Matlab - Algoritmizace, podmínky a cykly
Náplň cvičení
- zobrazení zpráv, zadaní vstup
- podmínky (if, else, elseif, end, all, any)
- větvení (switch)
- podmínky (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)
% skalarni podminka
a = randi(10) % randi(n) generuje nahodne prirozene cislo z intervalu od 1 do n
b = randi(10)
if a < b % je-li podminka pravdiva, proved nasledujici prikazy
disp('a je mensi nez b');
else % neni-li shora uvedena podminka pravdiva, proved nasledujici prikazy
disp('a je vetsi nebo rovno b');
end
% vektorova podminka
a = [1 2];
b = [0 3];
if a < b % vyhodnoti 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)nulove prvky promenne (promenne a,b jsou typicky logicke promenne, obsahuji tedy vysledky relacnich vyrazu, tj. 0 ci 1)
if b % totez jako: if all(b)
disp('b neobsahuje zadne nulove cleny');
elseif a % totez 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 nasledne vyjmenovane hodonoty (v polozkach case) promenne cislo proved uvedeny prikaz
% v zavislosti na konkretni hodnote promenne cislo
case 1
disp('cislo je 1')
case {2,3} % vycet vice pripustnych hodnot je proveden ve slozenych zavorkach
disp('cislo je 2 nebo 3')
case {4,6,7}
disp('cislo je 4, 6 nebo 7')
otherwise % pro vyse neuvedene hodnoty promenne cislo
disp('cislo je 5 nebo vetsi nez 7')
end
Cyklus for
% tvorba vektoru
n = 4
for i = 1:n % cyklus for pobezi pro predem znamy pocet opakovani (tj. pro predem vyjmenovane hodnoty promenne i)
a(i) = i^2 % vznikly vektor obsahuje druhe mocniny indexu prvku
end
% tvorba matice
m = 4 % pocet radku
n = 3 % pocet sloupcu
for i = 1:m % radkovy index
for j = 1:n % sloupcovy index
A(i,j) = i+j % vznikla matice obsahuje soucet radkoveho a sloupcoveho indexu prvku
end
end
% priklad - v matici vyhledat sude radky, v techto radcich zmenit znamenko vsech prvku (jedna z moznych variant zapisu)
A = rand(5,4)
for i=1:size(A,1)
if rem(i,2) == 0 % rem(a,b) ... zbytek po deleni cisla a cislem b; podle radkoveho indexu i testujeme, zda jde o lichy ci sudy radek
A(i,:) = -1 * A(i,:)
end
end
Cyklus while
a = 1;
b = 5;
while a < b % vypocet probiha, dokud plati podminka (tj. dokud je podminkna pravdiva)
a
a = a + 1;
end
Příkazy break, continue
for i = 1:5
if i == 2
continue; % od tohoto mista cyklus for pokracuje dale, ovsem jiz pro dalsi hodnotu promenne i (tj. pro i=3);
% zbytek prikazu v tele cyklu for pro puvodni hodnotu promenne (i=2) se jiz nevykona
end
if i == 4
break; % na tomto miste se cyklus for okamzite ukonci
end
fprintf('i = %d\n', i);
end
Složené podmínky
logické AND - všechny podmínky musí platit současně
% iterativni proces skonci jiz pri splneni jedne z pozadovanych presnosti
dx = 10; % presnost v souradnici x - apriorni hodnota
dy = 10; % presnost v souradnici y - apriorni hodnota
i = 0; % citac iteraci
while dx > 0.1 & dy > 0.1 % pozadovana presnost pro obe souradnice - 0.1 (napr. mm)
i = i+1
dx = dx/2
dy = dy/5
end
% vysledkem slozene podminky AND je, ze cyklus while skonci, jakmile jiz jedna z podminek prestane platit; presnost se tedy nedosahne v obou souradnicich, ale jen v jedne z nich !!
% totez
dx = 10; % presnost v souradnici x - apriorni hodnota
dy = 10; % presnost v souradnici y - apriorni hodnota
i = 0; % citac iteraci
while all([dx > 0.1, dy > 0.1]) % totez: 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
% iterativni proces skonci az po splneni vsech pozadovanych presnosti
dx = 10; % presnost v souradnici x - apriorni hodnota
dy = 10; % presnost v souradnici y - apriorni hodnota
i = 0; % citac iteraci
while dx > 0.1 | dy > 0.1 % pozadovana presnost pro obe souradnice - 0.1 (napr. mm)
i = i+1
dx = dx/2
dy = dy/5
end
% vysledkem slozene podminky OR je, ze cyklus while skonci, az vsechny z podminek prestanou platit; presnost se tedy dosahne ve vsech souradnicich !!
% totez
dx = 10; % presnost v souradnici x - apriorni hodnota
dy = 10; % presnost v souradnici y - apriorni hodnota
i = 0; % citac iteraci
while any([dx > 0.1, dy > 0.1])
i = i+1
dx = dx/2
dy = dy/5
end