155GIT1 / 4. cvičení: Porovnání verzí

Z GeoWikiCZ
mBez shrnutí editace
m (Obsah stránky nahrazen textem „{{Geoinformatika}} {{Cvičení|155GIT1|4|}} == Náplň == == Ukázky == == Úlohy == * 4. cvičení - příklady…“)
značka: nahrazeno
Řádek 1: Řádek 1:
{{Geoinformatika}}
{{Geoinformatika}}
{{Cvičení|155GIT1|4|Matlab - Algoritmizace, podmínky a cykly}}
{{Cvičení|155GIT1|4|}}


== Náplň cvičení ==
== Náplň ==


# zobrazení zpráv, zadaní vstup
# podmínky (<tt>if, else, elseif, end, all, any</tt>)
# větvení (<tt>switch</tt>)
# podmínky (<tt>for, while</tt>)
# příkazy <tt>break, continue</tt>
# složené podmínky


== Ukázky ==
== Ukázky ==


=== Interaktivní vstup ===


<source lang=octave>
disp('Program vyzaduje vstup');
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>
=== Větvení (if) ===
* [http://geo.fsv.cvut.cz/vyuka/155git1/matlab/matlab.pdf#page=71 přednášky]
<source lang=octave>
% 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
</source>
=== Větvení (switch) ===
<source lang=octave>
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
</source>
=== Cyklus for ===
<source lang=octave>
% 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
</source>
=== Cyklus while ===
<source lang=octave>
a = 1;
b = 5;
while a < b  % vypocet probiha, dokud plati podminka (tj. dokud je podminkna pravdiva)
    a
    a = a + 1;
end
</source>
=== Příkazy break, continue ===
<source lang=octave>
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
</source>
=== Složené podmínky ===
''' logické AND ''' - všechny podmínky musí platit současně
<source lang=octave>
% 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
</source>
''' logické OR ''' - musí platit alespoň jedna podmínka
<source lang=octave>
% 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
</source>


== Úlohy ==
== Úlohy ==
* [[155GIT1 / 4. cvičení / Příklady|4. cvičení - příklady]]
* [[155GIT1 / 4. cvičení / Příklady|4. cvičení - příklady]]
<!-- -->

Verze z 9. 2. 2022, 21:53