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

Z GeoWikiCZ
Bez shrnutí editace
mBez shrnutí editace
Řádek 1: Řádek 1:
{{Geoinformatika}}
{{Geoinformatika}}
{{Cvičení|155GIT1|4|1. test - elementární operace s maticemi a vektory, čtení a formátovaný zápis matic z/do souboru}}
{{Cvičení|155GIT1|4|Algoritmizace, podmínky a cykly}}


; Zadání testu
== Náplň cvičení ==
* http://moodle-vyuka.cvut.cz/course/view.php?id=183
 
<!--
# zobrazení zpráv, zadaní vstup
; Výsledky
# podmínky (<tt>if, else, elseif, end, all, any</tt>)
* [https://docs.google.com/spreadsheets/d/11YUf5nufMhaF97yEnjm9C0dGSEeArLmEbG99ngSA-jc/edit?usp=sharing Souhrnné výsledky]
# větvení (<tt>switch</tt>)
-->
# podmínky (<tt>for, while</tt>)
# příkazy <tt>break, continue</tt>
# složené podmínky
 
== 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/user/gin/git1/matlab.pdf#page=71 přednášky]
 
<source lang=octave>
% skalarni podminka
a = randi(10)
b = randi(10)
 
if a < b
    disp('a je mensi nez b');
else
    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 (promenna obvykle obsahuje 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
  case 1
    disp('cislo je 1')
  case {2,3}
    disp('cislo je 2 nebo 3')
  case {4,6,7}
    disp('cislo je 4, 6 nebo 7')
  otherwise
    disp('cislo je 5 nebo vetsi nez 7')
end
</source>
 
=== Cyklus for ===
 
<source lang=octave>
% tvorba vektoru
n = 4
for i = 1:n
    a(i) = i^2
end
 
% tvorba matice
m = 4  % pocet radku
n = 3  % pocet sloupcu
for i = 1:m
    for j = 1:n
        A(i,j) = i+j
    end
end
 
% priklad - v matici vyhledat sude radky (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
        A(i,:) = -1 * A(i,:)
    end
end
</source>
 
=== Cyklus while ===
 
<source lang=octave>
a = 1;
b = 5;
while a < b
    a
    a = a + 1;
end
</source>
 
=== Příkazy break, continue ===
 
<source lang=octave>
for i = 1:5
    if i == 2
        continue;
    end
    if i == 4
        break;
    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
    i = i+1
    dx = dx/2
    dy = dy/5
end
 
% 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
    i = i+1
    dx = dx/2
    dy = dy/5
end
 
% 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 ==
 
* [[155GIT1 / 5. cvičení / Příklady|5. cvičení - příklady]]

Verze z 26. 2. 2020, 17:30

Algoritmizace, podmínky a cykly

Náplň cvičení

  1. zobrazení zpráv, zadaní vstup
  2. podmínky (if, else, elseif, end, all, any)
  3. větvení (switch)
  4. podmínky (for, while)
  5. příkazy break, continue
  6. 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)
 b = randi(10)

 if a < b
     disp('a je mensi nez b');
 else
     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 (promenna obvykle obsahuje 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
   case 1
     disp('cislo je 1')
   case {2,3}
     disp('cislo je 2 nebo 3')
   case {4,6,7}
     disp('cislo je 4, 6 nebo 7')
   otherwise
     disp('cislo je 5 nebo vetsi nez 7')
 end

Cyklus for

% tvorba vektoru
 n = 4
 for i = 1:n
     a(i) = i^2
 end

% tvorba matice
 m = 4  % pocet radku
 n = 3  % pocet sloupcu
 for i = 1:m
     for j = 1:n
         A(i,j) = i+j
     end
 end

% priklad - v matici vyhledat sude radky (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
         A(i,:) = -1 * A(i,:)
     end
 end

Cyklus while

 a = 1;
 b = 5;
 while a < b
     a
     a = a + 1;
 end

Příkazy break, continue

 for i = 1:5
     if i == 2
         continue;
     end
     if i == 4
         break;
     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
     i = i+1
     dx = dx/2
     dy = dy/5
 end

% 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
     i = i+1
     dx = dx/2
     dy = dy/5
 end

% 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

Úlohy