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

Z GeoWikiCZ
mBez shrnutí editace
mBez shrnutí editace
 
(Nejsou zobrazeny 2 mezilehlé verze od stejného uživatele.)
Řádek 7: Řádek 7:
# 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
Řádek 39: Řádek 39:
=== 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 62:
  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 81:
  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 99:
% 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 106:
  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 126:
  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 137:
  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 152: Řádek 152:


<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 162:
  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, 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 !!


% 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 178: Řádek 178:


<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 188:
  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, 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 !!


% 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
Řádek 202: Řádek 202:


== Ú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