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

Z GeoWikiCZ
mBez shrnutí editace
mBez shrnutí editace
 
(Není zobrazeno 35 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ň cvičení ==
== 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>)
# podmínky (<tt>for, while</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/user/gin/git1/matlab/matlab.pdf#63]
* [http://geo.fsv.cvut.cz/vyuka/155git1/matlab/matlab.pdf#page=71 syntaxe]


<source lang=octave>
<source lang=octave>
% skalarni podminka
% skalární podmínka
a = randi(10)
a = randi(10)   % randi(n) generuje náhodné přirozené číslo z intervalu od 1 do n
b = randi(10)
b = randi(10)


if a < b
if a < b   % je-li podmínka pravdivá, proveď následující příkazy
    disp('a je mensi nez b');
    disp('a je mensi nez b');
else
else       % není-li shora uvedená podmínka pravdivá, proveď následující příkazy
    disp('a je vetsi nebo rovno b');
    disp('a je vetsi nebo rovno b');
end;
end


% vektorova podminka
% vektorová podmínka
a = [1 2];
a = [1 2];
b = [0 3];
b = [0 3];


if a < b
if a < b % vyhodnotí se jako:  if all(a < b)
    disp('a je po prvcich vzdy mensi nez b');
    disp('a je po prvcich vzdy mensi nez b');
else
else
    disp('a je po prvcich alespon jednou vetsi nez b');
    disp('a je po prvcich alespon jednou vetsi nez b');
end;
end


% test na (ne)nulove prvky promenne
% 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   % totez jako:  if all(b)
if b     % totéž jako:  if all(b)
    disp('b neobsahuje zadne nulove cleny');
    disp('b neobsahuje zadne nulove cleny');
elseif a
elseif a % totéž jako:  if all(a)
    disp('b obsahuje nulovy clen, a neobsahuje zadne nulove cleny');
    disp('b obsahuje nulovy clen, a neobsahuje zadne nulove cleny');
else
else
    disp('a i b obsahuji nulovy clen');
    disp('a i b obsahuji nulovy clen');
end;
end
      
      
if any(b)
if any(b)
    disp('b obsahuje alespon jeden nenulovy clen');
    disp('b obsahuje alespon jeden nenulovy clen');
end;
end
</source>
</source>


Řádek 61: Řá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
  case 1
                % v závislosti na konkrétní hodnotě proměnné cislo
    disp('cislo je 1')
  case 1
  case {2,3}
    disp('cislo je 1')
    disp('cislo je 2 nebo 3')
  case {2,3}   % výčet více přípustných hodnot je proveden ve složených závorkách
  case {4,6,7}
    disp('cislo je 2 nebo 3')
    disp('cislo je 4, 6 nebo 7')
  case {4,6,7}
  otherwise
    disp('cislo je 4, 6 nebo 7')
    disp('cislo je 5 nebo vetsi nez 7')
  otherwise     % pro výše neuvedené hodnoty proměnné cislo
end
    disp('cislo je 5 nebo vetsi nez 7')
end
</source>
</source>


Řádek 79: Řádek 98:
<source lang=octave>
<source lang=octave>
% tvorba vektoru
% tvorba vektoru
n = 3
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
    a(i) = i^2    % vzniklý vektor obsahuje druhé mocniny indexu prvku
end
end


% tvorba matice
% tvorba matice
m = 4  % pocet radku
m = 4  % pocet radku
n = 3  % pocet sloupcu
n = 3  % pocet sloupcu
for i = 1:m
for i = 1:m           % řádkový index
    for j = 1:n
    for j = 1:n       % sloupcový index
        A(i,j) = i+j
        A(i,j) = i+j   % vzniklá matice obsahuje součet řádkového a sloupcového indexu prvku
    end
    end
end
end


% priklad - v matici vyhledat sude radky
% 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)
A = rand(5,4)
for i=1:size(A,1)
for i=1:size(A,1)
    if rem(i,2) == 0         % rem(a,b) ... zbytek po deleni cisla a cislem b
    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,:)
        A(i,:) = -1 * A(i,:)
    end
    end
end
end
</source>
</source>


Řádek 105: Řá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 = a + 1;
    a = a + 1;
end
end
</source>
</source>


Řádek 116: Řádek 135:


<source lang=octave>
<source lang=octave>
for i = 1:5
for i = 1:5
    if i == 1
    if i == 2
        continue;
        continue;  % od tohoto místa cyklus for pokračuje dále, ovšem již pro další hodnotu proměnné i (tj. pro i=3);
    elseif i == 3
                    % zbytek příkazů v těle cyklu for pro původní hodnotu proměnné (i=2) se již nevykoná
        break;
    end
    end
    if i == 4
    fprintf('i=%d\n', i);
        break;     % na tomto místě se cyklus for okamžitě ukončí
end
    end
    fprintf('i = %d\n', i);
end
</source>
</source>


=== Složené podmínky ===
=== Složené podmínky ===
''' logické AND ''' - všechny podmínky musí platit současně


<source lang=octave>
<source lang=octave>
% logicke AND - musi platit vsechny podminky soucasne
% iterativní proces skončí již při splnění jedné z požadovaných přesností
% iterativni proces proto skonci jiz pri splneni jedne z podminek
dx = 10;   % přesnost v souřadnici x - apriorní hodnota
dx = 10;
dy = 10;   % přesnost v souřadnici y - apriorní hodnota
dy = 10;
i = 0;    % čítač iterací
i = 0;    % citac iteraci
while dx > 0.1 & dy > 0.1   % požadovaná přesnost pro obě souřadnice - 0.1 (např. mm)
while dx > 0.1 & dy > 0.1
    i = i+1
    i = i+1
    dx = dx/2
    dx = dx/2
    dy = dy/5
    dy = dy/5
end
end


% totez
% 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 !!
dx = 10;
dy = 10;
i = 0;    % citac iteraci
while [dx > 0.1, dy > 0.1]
    i = i+1
    dx = dx/2
    dy = dy/5
end


% totez
% totéž
dx = 10;
dx = 10;   % přesnost v souřadnici x - apriorní hodnota
dy = 10;
dy = 10;   % přesnost v souřadnici y - apriorní hodnota
i = 0;    % citac iteraci
i = 0;    % čítač iterací
while all([dx > 0.1, dy > 0.1])
while all([dx > 0.1, dy > 0.1])   % totéž:  while [dx > 0.1, dy > 0.1]
    i = i+1
    i = i+1
    dx = dx/2
    dx = dx/2
    dy = dy/5
    dy = dy/5
end
end
</source>


''' logické OR ''' - musí platit alespoň jedna podmínka


% logicke OR - musi platit alespon jedna podminka
<source lang=octave>
% iterativni proces proto skonci az po splneni vsech podminek
% iterativní proces skončí až po splnění všech požadovaných přesností
dx = 10;
dx = 10;   % přesnost v souřadnici x - apriorní hodnota
dy = 10;
dy = 10;   % přesnost v souřadnici y - apriorní hodnota
i = 0;    % citac iteraci
i = 0;    % čítač iterací
while dx > 0.1 | dy > 0.1
while dx > 0.1 | dy > 0.1   % požadovaná přesnost pro obě souřadnice - 0.1 (např. mm)
    i = i+1
    i = i+1
    dx = dx/2
    dx = dx/2
    dy = dy/5
    dy = dy/5
end
end


% totez
% 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 !!
dx = 10;
 
dy = 10;
% totěž
i = 0;    % citac iteraci
dx = 10;   % přesnost v souřadnici x - apriorní hodnota
while any([dx > 0.1, dy > 0.1])
dy = 10;   % přesnost v souřadnici y - apriorní hodnota
    i = i+1
i = 0;    % čítač iterací
    dx = dx/2
while any([dx > 0.1, dy > 0.1])
    dy = dy/5
    i = i+1
end
    dx = dx/2
    dy = dy/5
end
</source>
</source>


== Úlohy ==
== Úlohy ==


* [[155GIT1 / 6. cvičení / Příklady|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ň

  1. zobrazení zpráv, zadaní vstup
  2. podmínky (if, else, elseif, end, all, any)
  3. větvení (switch)
  4. cykly (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)

% 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

Úlohy