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

Z GeoWikiCZ
mBez shrnutí editace
mBez shrnutí editace
(Není zobrazeno 25 mezilehlých verzí od 2 dalších uživatelů.)
Řá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|Matlab - Algoritmizace, podmínky a cykly}}


; Zadání testu
== Náplň cvičení ==


* http://ocw.cvut.cz/moodle/course/view.php?id=701
# zobrazení zpráv, zadaní vstup
# podmínky (<tt>if, else, elseif, end, all, any</tt>)
# větvení (<tt>switch</tt>)
# podmínky (<tt>for, while</tt>)
# příkazy <tt>break, continue</tt>
# složené podmínky


== Ukázky ==


; Výsledky
=== Interaktivní vstup ===
* [https://docs.google.com/spreadsheets/d/155h5xajDWFbfm_8Rwggaox-wBF7Cn_5vHFNI-W-SVbs/edit?usp=sharingsouhrnné výsledky]
 
* Cvičení středa: [http://geo102.fsv.cvut.cz/vyuka/155GIT1/2017/test1/cv1/report-test1.html Report]
<source lang=octave>
-->
disp('Program vyzaduje vstup');
<!--
a = input('Zadejte cislo a: ')
[http://geo102.fsv.cvut.cz/vyuka/155GIT1/2016/test1/cv1/zadani.pdf Zadání]
</source>
* Druhé cvičení (14h): [ftp://athena.fsv.cvut.cz/ZFG/GIT1/test12/zadani12.pdf Zadání]
 
* Třetí cvičení (16h): [ftp://athena.fsv.cvut.cz/ZFG/GIT1/test13/zadani13.pdf Zadání]
=== 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/vyuka/155git1/matlab/matlab.pdf#page=71 přednášky]
 
<source lang=octave>
% 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
</source>
 
=== Větvení (switch) ===
 
<source lang=octave>
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
</source>
 
=== Cyklus for ===
 
<source lang=octave>
% 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
</source>
 
=== Cyklus while ===
 
<source lang=octave>
a = 1;
b = 5;
while a < b  % vypocet probiha, dokud plati podminka (tj. dokud je podminkna pravdiva)
    a
    a = a + 1;
end
</source>
 
=== Příkazy break, continue ===
 
<source lang=octave>
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
</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 (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
</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 (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
</source>
 
== Úlohy ==
 
* [[155GIT1 / 4. cvičení / Příklady|4. cvičení - příklady]]

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