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

Z GeoWikiCZ
mBez shrnutí editace
(Není zobrazeno 12 mezilehlých verzí od jednoho dalšího uživatele.)
Řádek 1: Řádek 1:
{{Geoinformatika}}
{{Geoinformatika}}
{{Cvičení|155GIT1|4|Algoritmizace, podmínky a cykly}}
{{Cvičení|155GIT1|4|Matlab - Algoritmizace, podmínky a cykly}}


== Náplň cvičení ==
== Náplň cvičení ==
Řádek 39: Řádek 39:
=== Větvení (if) ===
=== Větvení (if) ===


* [http://geo.fsv.cvut.cz/user/gin/git1/matlab.pdf#page=72 přednášky]
* [http://geo.fsv.cvut.cz/vyuka/155git1/matlab/matlab.pdf#page=71 přednášky]


<source lang=octave>
<source lang=octave>
Řádek 46: Řádek 46:
  b = randi(10)
  b = randi(10)


  if a < b
  if a < b   % je-li podminka pravdiva, proved nasledujici prikazy
     disp('a je mensi nez b');
     disp('a je mensi nez b');
  else
  else       % neni-li shora uvedena podminka pravdiva, proved nasledujici prikazy
     disp('a je vetsi nebo rovno b');
     disp('a je vetsi nebo rovno b');
  end
  end
Řádek 81: Řádek 81:
  cislo = randi(10)
  cislo = randi(10)


  switch cislo
  switch cislo    % pro nasledne vyjmenovane hodonoty (v polozkach case) promenne cislo proved uvedeny prikaz
                % v zavislosti na konkretni hodnote promenne cislo  
   case 1
   case 1
     disp('cislo je 1')
     disp('cislo je 1')
   case {2,3}    % vycet pripustnych hodnot je proveden ve slozenych zavorkach  
   case {2,3}    % vycet vice pripustnych hodnot je proveden ve slozenych zavorkach  
     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
   otherwise     % pro vyse neuvedene hodnoty promenne cislo
     disp('cislo je 5 nebo vetsi nez 7')
     disp('cislo je 5 nebo vetsi nez 7')
  end
  end
Řádek 98: Řádek 99:
% tvorba vektoru
% tvorba vektoru
  n = 4
  n = 4
  for i = 1:n
  for i = 1:n       % cyklus for pobezi pro predem znamy pocet opakovani (tj. pro predem vyjmenovane hodnoty promenne i)
     a(i) = i^2
     a(i) = i^2   % vznikly vektor obsahuje druhe mocniny indexu prvku
  end
  end


Řádek 105: Řádek 106:
  m = 4  % pocet radku
  m = 4  % pocet radku
  n = 3  % pocet sloupcu
  n = 3  % pocet sloupcu
  for i = 1:m
  for i = 1:m           % radkovy index
     for j = 1:n
     for j = 1:n       % sloupcovy index
         A(i,j) = i+j
         A(i,j) = i+j   % vznikla matice obsahuje soucet radkoveho a sloupcoveho indexu prvku
     end
     end
  end
  end


% priklad - v matici vyhledat sude radky (jedna z moznych variant zapisu)
% priklad - v matici vyhledat sude radky, v techto radcich zmenit znamenko vsech prvku (jedna z moznych variant zapisu)
  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 deleni cisla a cislem b; podle radkoveho indexu i testujeme, zda jde o lichy ci sudy radek
         A(i,:) = -1 * A(i,:)
         A(i,:) = -1 * A(i,:)
     end
     end
Řádek 125: Řádek 126:
  a = 1;
  a = 1;
  b = 5;
  b = 5;
  while a < b
  while a < b   % vypocet probiha, dokud plati podminka (tj. dokud je podminkna pravdiva)
     a
     a
     a = a + 1;
     a = a + 1;
Řádek 136: Řádek 137:
  for i = 1:5
  for i = 1:5
     if i == 2
     if i == 2
         continue;
         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
     end
     if i == 4
     if i == 4
         break;
         break;     % na tomto miste se cyklus for okamzite ukonci
     end
     end
     fprintf('i = %d\n', i);
     fprintf('i = %d\n', i);
Řádek 154: Řádek 156:
  dy = 10;  % presnost v souradnici y - apriorni hodnota
  dy = 10;  % presnost v souradnici y - apriorni hodnota
  i = 0;    % citac iteraci
  i = 0;    % citac iteraci
  while dx > 0.1 & dy > 0.1  % pozadovana presnost pro obe souradnice - 0.1
  while dx > 0.1 & dy > 0.1  % pozadovana presnost pro obe souradnice - 0.1 (napr. mm)
     i = i+1
     i = i+1
     dx = dx/2
     dx = dx/2
     dy = dy/5
     dy = dy/5
  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 !!


% totez
% totez
Řádek 178: Řádek 182:
  dy = 10;  % presnost v souradnici y - apriorni hodnota
  dy = 10;  % presnost v souradnici y - apriorni hodnota
  i = 0;    % citac iteraci
  i = 0;    % citac iteraci
  while dx > 0.1 | dy > 0.1  % pozadovana presnost pro obe souradnice - 0.1
  while dx > 0.1 | dy > 0.1  % pozadovana presnost pro obe souradnice - 0.1 (napr. mm)
     i = i+1
     i = i+1
     dx = dx/2
     dx = dx/2
     dy = dy/5
     dy = dy/5
  end
  end
% vysledkem slozene podminky OR je, ze cyklus while skonci, az vsechny z podminek prestanou platit; presnost se tedy dosahne ve vsech souradnicich !!


% totez
% totez

Verze z 24. 2. 2021, 08:45

Matlab - 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)    % 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

Větvení (switch)

 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

Cyklus for

% 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

Cyklus while

 a = 1;
 b = 5;
 while a < b   % vypocet probiha, dokud plati podminka (tj. dokud je podminkna pravdiva)
     a
     a = a + 1;
 end

Příkazy break, continue

 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

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 (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

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 (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

Úlohy