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

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


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


# zobrazení zpráv, zadaní vstup
# čtení dat z textového souboru do matice (ke stažení [http://athena.fsv.cvut.cz:8000/GIT1/cv4/pr4uk1.txt pr4uk1.txt], [http://athena.fsv.cvut.cz:8000/GIT1/cv4/pr4uk2.txt pr4uk2.txt], [http://athena.fsv.cvut.cz:8000/GIT1/cv4/pr4uk3.txt pr4uk3.txt], [http://athena.fsv.cvut.cz:8000/GIT1/cv4/pr4uk4.txt pr4uk4.txt])
# 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 ==
== Ukázky ==


=== Interaktivní vstup ===
=== Formátované čtení dat ===


<source lang=octave>
''(čtení z textového souboru)''
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/user/gin/git1/matlab.pdf#page=72 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
    disp('a je mensi nez b');
else
    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>
  cislo = randi(10)
  fid = fopen('pr4uk1.txt','r');
bxy = fscanf(fid,'%f',[3 inf]);
bxy = bxy'                    % pro shodné rozměry matice jako v datovém souboru
fclose(fid);


  switch cislo
  % přeskakování položek
  case 1
fid = fopen('pr4uk1.txt','r');
    disp('cislo je 1')
xy = fscanf(fid,'%*f %f %f',[2 inf]);
  case {2,3}    % vycet vice pripustnych hodnot je proveden ve slozenych zavorkach
xy = xy'
    disp('cislo je 2 nebo 3')
fclose(fid);
  case {4,6,7}
    disp('cislo je 4, 6 nebo 7')
  otherwise
    disp('cislo je 5 nebo vetsi nez 7')
end
</source>
</source>


=== Cyklus for ===
''(čtení z řetězce / z textové proměnné)''


<source lang=octave>
<source lang=octave>
% tvorba vektoru
  s = sscanf('10.2 5.222','%f')
n = 4
  for i = 1:n
    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>
</source>


=== Cyklus while ===
''(čtení textových souborů s hlavičkou)''


<source lang=octave>
<source lang=octave>
  a = 1;
  fid = fopen('pr4uk2.txt','r');
  b = 5;
  radek = fgetl(fid);         % evtl. fgets(fid) pro načtení řádku včetně znaku zalomení řádku
  while a < b
  rs = sscanf(radek,'%d')
    a
r = rs(1);
    a = a + 1;
  s = rs(2);
  end
bxyz = fscanf(fid,'%f',[s r])' 
</source>
fclose(fid);
 
=== Příkazy break, continue ===


<source lang=octave>
  vstup = fopen('pr4uk3.txt','r');
  for i = 1:5
radek = fscanf(vstup,'%s',4)
    if i == 2
bxyh = fscanf(vstup,'%f',[4 inf])'
        continue;  % od tohoto mista cyklus for pokracuje dale, ovsem jiz pro dalsi hodnotu promenne i (tj. pro i=3);
  fclose(vstup);
                    % 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>


=== Složené podmínky ===
=== Změna polohy kurzoru v souboru ===
 
''' logické AND ''' - všechny podmínky musí platit současně


<source lang=octave>
<source lang=octave>
% iterativni proces skonci jiz pri splneni jedne z pozadovanych presnosti
  fid = fopen('pr4uk4.txt','r');
  dx = 10;   % presnost v souradnici x - apriorni hodnota
  uhel = fscanf(fid,'%*s %f %f %f',[3 inf])'     % čtení jen numerických hodnot
  dy = 10;  % presnost v souradnici y - apriorni hodnota
  uhelid = fscanf(fid,'%s %*s %*s %*s',[3 inf])' % kurzor je již na konci datového souboru
i = 0;     % citac iteraci
  fseek(fid,0,'bof');                           % přesun kurzoru na začátek souboru
  while dx > 0.1 & dy > 0.1  % pozadovana presnost pro obe souradnice - 0.1
                                                % totožné fseek(fid,0,-1)
    i = i+1
uhelid = fscanf(fid,'%s %*s %*s %*s',[3 inf])' % čtení jen (3znakových) textových identifikátorů
    dx = dx/2
  fclose all;
    dy = dy/5
end
 
% 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
    i = i+1
    dx = dx/2
    dy = dy/5
end
 
% 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>
</source>


Řádek 199: Řádek 63:


* [[155GIT1 / 4. cvičení / Příklady|4. cvičení - příklady]]
* [[155GIT1 / 4. cvičení / Příklady|4. cvičení - příklady]]
<!-- -->

Aktuální verze z 15. 3. 2023, 22:07

Čtení formátovaných dat z textových souborů

Náplň

  1. čtení dat z textového souboru do matice (ke stažení pr4uk1.txt, pr4uk2.txt, pr4uk3.txt, pr4uk4.txt)

Ukázky

Formátované čtení dat

(čtení z textového souboru)

 fid = fopen('pr4uk1.txt','r');
 bxy = fscanf(fid,'%f',[3 inf]);
 bxy = bxy'                    % pro shodné rozměry matice jako v datovém souboru
 fclose(fid);

 % přeskakování položek
 fid = fopen('pr4uk1.txt','r');
 xy = fscanf(fid,'%*f %f %f',[2 inf]);
 xy = xy'
 fclose(fid);

(čtení z řetězce / z textové proměnné)

 s = sscanf('10.2 5.222','%f')

(čtení textových souborů s hlavičkou)

 fid = fopen('pr4uk2.txt','r');
 radek = fgetl(fid);          % evtl. fgets(fid) pro načtení řádku včetně znaku zalomení řádku
 rs = sscanf(radek,'%d')
 r = rs(1);
 s = rs(2);
 bxyz = fscanf(fid,'%f',[s r])'  
 fclose(fid);

 vstup = fopen('pr4uk3.txt','r');
 radek = fscanf(vstup,'%s',4)
 bxyh = fscanf(vstup,'%f',[4 inf])'
 fclose(vstup);

Změna polohy kurzoru v souboru

 fid = fopen('pr4uk4.txt','r');
 uhel = fscanf(fid,'%*s %f %f %f',[3 inf])'     % čtení jen numerických hodnot
 uhelid = fscanf(fid,'%s %*s %*s %*s',[3 inf])' % kurzor je již na konci datového souboru
 fseek(fid,0,'bof');                            % přesun kurzoru na začátek souboru
                                                % totožné fseek(fid,0,-1)
 uhelid = fscanf(fid,'%s %*s %*s %*s',[3 inf])' % čtení jen (3znakových) textových identifikátorů
 fclose all;

Úlohy