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

Z GeoWikiCZ
mBez shrnutí editace
(Není zobrazeno 28 mezilehlých verzí od 2 dalších uživatelů.)
Řádek 1: Řádek 1:
{{Geoinformatika}}
{{Geoinformatika}}
{{Cvičení|155GIT1|4|Čtení a zápis textových souborů}}
{{Cvičení|155GIT1|4|Matlab - Algoritmizace, podmínky a cykly}}


== Náplň cvičení ==
== Náplň cvičení ==


# opakování - workspace
# zobrazení zpráv, zadaní vstup
# zápis matice do textového souboru
# podmínky (<tt>if, else, elseif, end, all, any</tt>)
# formátování výstupu
# větvení (<tt>switch</tt>)
# čtení matice z textového souboru
# podmínky (<tt>for, while</tt>)
# příkazy <tt>break, continue</tt>
# složené podmínky


== Ukázky ==
== Ukázky ==


=== Formátovaný zápis matice ===
=== Interaktivní vstup ===


* [http://geo.fsv.cvut.cz/user/gin/git1/matlab/matlab.pdf#38 fopen()]
<source lang=octave>
disp('Program vyzaduje vstup');
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>
 
=== 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>
<source lang=octave>
A = rand(3,4) * 10;
cislo = randi(10)
f = fopen('a.txt', 'w');
 
fprintf(f, '%f %f %f %f\n', A);
switch cislo    % pro nasledne vyjmenovane hodonoty (v polozkach case) promenne cislo proved uvedeny prikaz
fclose(f); # zápis je proveden až při uzavření souboru
                % v zavislosti na konkretni hodnote promenne cislo
type a.txt
  case 1
5.272319 6.032164 4.710683 3.489846
    disp('cislo je 1')
3.702292 9.547577 9.105915 4.923848
  case {2,3}    % vycet vice pripustnych hodnot je proveden ve slozenych zavorkach
6.948680 8.851383 7.628851 6.733618
    disp('cislo je 2 nebo 3')
#
  case {4,6,7}
# změna dimenze matice při zápisu
    disp('cislo je 4, 6 nebo 7')
f = fopen('a1.txt', 'w');
  otherwise    % pro vyse neuvedene hodnoty promenne cislo
fprintf(f, '%f %f %f\n', A);
    disp('cislo je 5 nebo vetsi nez 7')
fclose(f);
end
type a1.txt
5.272319 6.032164 4.710683
3.489846 3.702292 9.547577
9.105915 4.923848 6.948680
8.851383 7.628851 6.733618
#
# změna formátování
f = fopen('a2.txt', 'w');
fprintf(f, '%.1f %.1f %.1f %.1f\n', A);
fclose(f);
type a2.txt
5.3 6.0 4.7 3.5
3.7 9.5 9.1 4.9
6.9 8.9 7.6 6.7
#
# zápis dat do již existujícího souboru
f = fopen('a.txt', 'a');
fprintf(f, '%f %f %f %f\n', A(1,:));
fclose(f);
type a.txt
5.272319 6.032164 4.710683 3.489846
3.702292 9.547577 9.105915 4.923848
6.948680 8.851383 7.628851 6.733618
5.272319 3.489846 9.105915 8.851383
</source>
</source>


=== Formátování dat obecně ===
=== 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>


* viz [http://geo.fsv.cvut.cz/user/gin/git1/matlab/matlab.pdf#41 formátovací položky]
=== Cyklus while ===


<source lang=octave>
<source lang=octave>
fprintf('%s: %i\n', 'moje nahodne cislo (1 az 100)', randi(100))
a = 1;
moje nahodne cislo (1 az 100): 31
b = 5;
#
while a < b  % vypocet probiha, dokud plati podminka (tj. dokud je podminkna pravdiva)
# uložení do řetězce
    a
r = sprintf('%s: %i\n', 'moje nahodne cislo (1 az 100)', randi(100))
    a = a + 1;
class(r)
  end
ans = char
</source>
#
 
# příklad formátování dvou řádkových vektorů
=== Příkazy break, continue ===
a = 1:10
fprintf('a: %.2d -> a^2: %.3d\n', [a; a.^2])
a: 01 -> a^2: 001
a: 02 -> a^2: 004
a: 03 -> a^2: 009
a: 04 -> a^2: 016
a: 05 -> a^2: 025
a: 06 -> a^2: 036
a: 07 -> a^2: 049
a: 08 -> a^2: 064
a: 09 -> a^2: 081
a: 10 -> a^2: 100
#
fprintf('a: %2d -> a^2: %3d\n', [a; a.^2])
a: 1 -> a^2:  1
a:  2 -> a^2:  4
a:  3 -> a^2:  9
a:  4 -> a^2:  16
a:  5 -> a^2:  25
a:  6 -> a^2:  36
a:  7 -> a^2:  49
a:  8 -> a^2:  64
a:  9 -> a^2:  81
a: 10 -> a^2: 100


<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>
</source>


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


<source lang=octave>
<source lang=octave>
A = magic(5)
% iterativni proces skonci jiz pri splneni jedne z pozadovanych presnosti
f = fopen('m.txt', 'w');
dx = 10;  % presnost v souradnici x - apriorni hodnota
# uložení jako sloupcový vektor
dy = 10;  % presnost v souradnici y - apriorni hodnota
fprintf(f, '%f\n', A);
i = 0;    % citac iteraci
fclose(f);
while dx > 0.1 & dy > 0.1  % pozadovana presnost pro obe souradnice - 0.1 (napr. mm)
type m.txt
    i = i+1
# znovunačtení do dimenze [5x5]
    dx = dx/2
f = fopen('m.txt', 'r');
    dy = dy/5
B = fscanf(f, '%f', [5, inf])
end
#
 
# čtení z řetězce
% 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 !!
s = sscanf('10.2 5.222', '%f %f')
 
#
% totez
# přeskakování položek
dx = 10;  % presnost v souradnici x - apriorni hodnota
s = sscanf('10.2 5.222 4.2', '%f %*f %f')
dy = 10;   % presnost v souradnici y - apriorni hodnota
fclose(f);
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>
</source>


=== Změna polohy kurzoru v souboru ===
''' logické OR ''' - musí platit alespoň jedna podmínka


<source lang=octave>
<source lang=octave>
f = fopen('s.txt', 'w+')
% iterativni proces skonci az po splneni vsech pozadovanych presnosti
fprintf(f, '%f\n', [1 2; 3 4])
dx = 10;  % presnost v souradnici x - apriorni hodnota
fclose(f)
dy = 10;  % presnost v souradnici y - apriorni hodnota
type s.txt
i = 0;     % citac iteraci
1.000000
while dx > 0.1 | dy > 0.1  % pozadovana presnost pro obe souradnice - 0.1 (napr. mm)
3.000000
    i = i+1
2.000000
    dx = dx/2
4.000000
    dy = dy/5
#
end
f = fopen('s.txt')
 
a = fscanf(f, '%f', [1, inf])
% vysledkem slozene podminky OR je, ze cyklus while skonci, az vsechny z podminek prestanou platit; presnost se tedy dosahne ve vsech souradnicich !!
b = fscanf(f, '%f', [2, inf])
 
fseek(f, 0, 'bof');
% totez
b = fscanf(f, '%f', [2, inf])
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>
</source>


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


* http://peso.fsv.cvut.cz/vyuka/git1/4.html
* [[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