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

Z GeoWikiCZ
Holesovsky (diskuse | příspěvky)
mBez shrnutí editace
Holesovsky (diskuse | příspěvky)
 
(Není zobrazeno 6 mezilehlých verzí od stejného uživatele.)
Řádek 4: Řádek 4:
== 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>)
# 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
# složené podmínky


== Ukázky ==
== Ukázky ==
 
<!--
=== Interaktivní vstup ===
=== Interaktivní vstup ===


Řádek 19: Řádek 21:
  a = input('Zadejte cislo a: ')
  a = input('Zadejte cislo a: ')
</source>
</source>
-->


=== Vyhodnocování relačních výrazů, all, any ===
=== Vyhodnocování relačních výrazů, all, any ===
Řádek 39: Řádek 42:
=== Větvení (if) ===
=== Větvení (if) ===


* [http://geo.fsv.cvut.cz/vyuka/155git1/matlab/matlab.pdf#page=71 přednášky]
* [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)    % randi(n) generuje nahodne prirozene cislo z intervalu od 1 do n
  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  % je-li podminka pravdiva, proved nasledujici prikazy
  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      % neni-li shora uvedena podminka pravdiva, proved nasledujici prikazy
  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  % vyhodnoti se jako:  if all(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
Řádek 62: Řádek 65:
  end
  end


% test na (ne)nulove prvky promenne (promenne a,b jsou typicky logicke promenne, obsahuji tedy vysledky relacnich vyrazu, tj. 0 ci 1)
% 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  % totez jako:  if all(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
Řádek 81: Řádek 84:
  cislo = randi(10)
  cislo = randi(10)


  switch cislo    % pro nasledne vyjmenovane hodonoty (v polozkach case) promenne cislo proved uvedeny prikaz
  switch cislo    % pro následné vyjmenované hodonoty (v položkách case) proměnné cislo proveď uvedený příkaz
                 % v zavislosti na konkretni hodnote promenne cislo  
                 % v závislosti na konkrétní hodnotě proměnné cislo  
   case 1
   case 1
     disp('cislo je 1')
     disp('cislo je 1')
   case {2,3}    % vycet vice pripustnych hodnot je proveden ve slozenych zavorkach
   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')
     disp('cislo je 2 nebo 3')
   case {4,6,7}
   case {4,6,7}
     disp('cislo je 4, 6 nebo 7')
     disp('cislo je 4, 6 nebo 7')
   otherwise    % pro vyse neuvedene hodnoty promenne cislo
   otherwise    % pro výše neuvedené hodnoty proměnné cislo
     disp('cislo je 5 nebo vetsi nez 7')
     disp('cislo je 5 nebo vetsi nez 7')
  end
  end
Řádek 99: Řádek 102:
% tvorba vektoru
% tvorba vektoru
  n = 4
  n = 4
  for i = 1:n      % cyklus for pobezi pro predem znamy pocet opakovani (tj. pro predem vyjmenovane hodnoty promenne i)
  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    % vznikly vektor obsahuje druhe mocniny indexu prvku
     a(i) = i^2    % vzniklý vektor obsahuje druhé mocniny indexu prvku
  end
  end


Řádek 106: Řádek 109:
  m = 4  % pocet radku
  m = 4  % pocet radku
  n = 3  % pocet sloupcu
  n = 3  % pocet sloupcu
  for i = 1:m            % radkovy index
  for i = 1:m            % řádkový index
     for j = 1:n        % sloupcovy index
     for j = 1:n        % sloupcový index
         A(i,j) = i+j  % vznikla matice obsahuje soucet radkoveho a sloupcoveho indexu prvku
         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, v techto radcich zmenit znamenko vsech prvku (jedna z moznych variant zapisu)
% 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; podle radkoveho indexu i testujeme, zda jde o lichy ci sudy radek
     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
Řádek 126: Řádek 129:
  a = 1;
  a = 1;
  b = 5;
  b = 5;
  while a < b  % vypocet probiha, dokud plati podminka (tj. dokud je podminkna pravdiva)
  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;
Řádek 137: Řádek 140:
  for i = 1:5
  for i = 1:5
     if i == 2
     if i == 2
         continue;  % od tohoto mista cyklus for pokracuje dale, ovsem jiz pro dalsi hodnotu promenne i (tj. pro i=3);
         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 prikazu v tele cyklu for pro puvodni hodnotu promenne (i=2) se jiz nevykona
                     % zbytek příkazů v těle cyklu for pro původní hodnotu proměnné (i=2) se již nevykoná
     end
     end
     if i == 4
     if i == 4
         break;    % na tomto miste se cyklus for okamzite ukonci
         break;    % na tomto místě se cyklus for okamžitě ukončí
     end
     end
     fprintf('i = %d\n', i);
     fprintf('i = %d\n', i);
Řádek 149: Řádek 152:
=== Složené podmínky ===
=== Složené podmínky ===


''' logické AND ''' - všechny podmínky musí platit současně
''' logické AND ''' - '''"a zároveň"''' - všechny podmínky musí platit současně
 
<source lang=octave>
% souvislý interval omezený z obou stran
a = rand(1,4)
relace1 = a > 0.2 & a < 0.7          % interval od 0.2 do 0.7
relace2 = all( a > 0.2 & a < 0.7 )  % relace platí ve všech složkách
                                      % relace1 a relace2 jsou totožné
                                      % (all je defaultní logická funkce)
</source>


<source lang=octave>
<source lang=octave>
% iterativni proces skonci jiz pri splneni jedne z pozadovanych presnosti
% iterativní proces skončí již při splnění jedné z požadovaných přesností
  dx = 10;  % presnost v souradnici x - apriorni hodnota
  dx = 10;  % přesnost v souřadnici x - apriorní hodnota
  dy = 10;  % presnost v souradnici y - apriorni hodnota
  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  % pozadovana presnost pro obe souradnice - 0.1 (napr. mm)
  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
Řádek 162: Řádek 174:
  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 !!
% výsledkem složené podmínky AND je, že 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 !!


% totez
% totéž
  dx = 10;  % presnost v souradnici x - apriorni hodnota
  dx = 10;  % přesnost v souřadnici x - apriorní hodnota
  dy = 10;  % presnost v souradnici y - apriorni hodnota
  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])  % totez:  while [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
Řádek 175: Řádek 187:
</source>
</source>


''' logické OR ''' - musí platit alespoň jedna podmínka  
''' logické OR ''' - '''"nebo"''' - musí platit alespoň jedna podmínka  
 
<source lang=octave>
% interval složený ze dvou částí
a = rand(1,4)
relace3 = a < 0.2 | a > 0.7          % interval do 0.2 a od 0.7
relace4 = all( a < 0.2 | a > 0.7 )  % relace platí ve všech složkách
                                      % relace3 a relace4 jsou totožné
relace5 = any( a < 0.2 | a > 0.7 )  % relace platí alespoň v jedné složce
</source>


<source lang=octave>
<source lang=octave>
% iterativni proces skonci az po splneni vsech pozadovanych presnosti
% iterativní proces skončí až po splnění všech požadovaných přesností
  dx = 10;  % presnost v souradnici x - apriorni hodnota
  dx = 10;  % přesnost v souřadnici x - apriorní hodnota
  dy = 10;  % presnost v souradnici y - apriorni hodnota
  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  % pozadovana presnost pro obe souradnice - 0.1 (napr. mm)
  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
Řádek 188: Řádek 209:
  end
  end


% vysledkem slozene podminky OR je, ze cyklus while skonci, az vsechny z podminek prestanou platit; presnost se tedy dosahne ve vsech souradnicich !!
% výsledkem složené podmínky OR je, že cyklus while skončí, až všechny z podmínek přestanou platit; přesnost se tedy dosáhne ve všech souřadnicích !!


% totez
% totěž
  dx = 10;  % presnost v souradnici x - apriorni hodnota
  dx = 10;  % přesnost v souřadnici x - apriorní hodnota
  dy = 10;  % presnost v souradnici y - apriorni hodnota
  dy = 10;  % přesnost v souřadnici y - apriorní hodnota
  i = 0;    % citac iteraci
  i = 0;    % čítač iterací
  while any([dx > 0.1, dy > 0.1])
  while any([dx > 0.1, dy > 0.1])
     i = i+1
     i = i+1

Aktuální verze z 28. 3. 2025, 16:47

Algoritmizace, podmínky a cykly

Náplň

  1. podmínky (if, else, elseif, end, all, any)
  2. větvení (switch)
  3. cykly (for, while)
  4. příkazy break, continue
  5. složené podmínky

Ukázky

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 - "a zároveň" - všechny podmínky musí platit současně

% souvislý interval omezený z obou stran
 a = rand(1,4)
 relace1 = a > 0.2 & a < 0.7          % interval od 0.2 do 0.7
 relace2 = all( a > 0.2 & a < 0.7 )   % relace platí ve všech složkách
                                      % relace1 a relace2 jsou totožné
                                      % (all je defaultní logická funkce)
% 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, že 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 - "nebo" - musí platit alespoň jedna podmínka

% interval složený ze dvou částí
 a = rand(1,4)
 relace3 = a < 0.2 | a > 0.7          % interval do 0.2 a od 0.7
 relace4 = all( a < 0.2 | a > 0.7 )   % relace platí ve všech složkách
                                      % relace3 a relace4 jsou totožné
 relace5 = any( a < 0.2 | a > 0.7 )   % relace platí alespoň v jedné složce
% 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, že 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