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

Z GeoWikiCZ
Holesovsky (diskuse | příspěvky)
Holesovsky (diskuse | příspěvky)
mBez shrnutí editace
 
(Není zobrazeno 10 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/vyuka/155git1/matlab/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  % 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>
<source lang=octave>
% tvorba vektoru
  fid = fopen('pr4uk1.txt','r');
n = 4
  bxy = fscanf(fid,'%f',[3 inf]);
  for i = 1:n      % cyklus for pobezi pro predem znamy pocet opakovani (tj. pro predem vyjmenovane hodnoty promenne i)
  bxy = bxy'                    % pro shodné rozměry matice jako v datovém souboru
    a(i) = i^2    % vznikly vektor obsahuje druhe mocniny indexu prvku
  fclose(fid);
end
 
% tvorba matice
  m = % 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>
% přeskakování položek
  a = 1;
  fid = fopen('pr4uk1.txt','r');
  b = 5;
  xy = fscanf(fid,'%*f %f %f',[2 inf]);
while a < b  % vypocet probiha, dokud plati podminka (tj. dokud je podminkna pravdiva)
xy = xy'
    a
  fclose(fid);
    a = a + 1;
  end
</source>
</source>


=== Příkazy break, continue ===
''(čtení z řetězce / z textové proměnné)''


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


=== Složené podmínky ===
''(čtení textových souborů s hlavičkou)''
 
''' 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('pr4uk2.txt','r');
  dx = 10;   % presnost v souradnici x - apriorni hodnota
  radek = fgetl(fid);         % evtl. fgets(fid) pro načtení řádku včetně znaku zalomení řádku
  dy = 10;   % presnost v souradnici y - apriorni hodnota
  rs = sscanf(radek,'%d')
  i = 0;    % citac iteraci
  r = rs(1);
  while dx > 0.1 & dy > 0.1  % pozadovana presnost pro obe souradnice - 0.1 (napr. mm)
s = rs(2);
    i = i+1
bxyz = fscanf(fid,'%f',[s r])' 
    dx = dx/2
  fclose(fid);
    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
  vstup = fopen('pr4uk3.txt','r');
  dx = 10;   % presnost v souradnici x - apriorni hodnota
  radek = fscanf(vstup,'%s',4)
  dy = 10;  % presnost v souradnici y - apriorni hodnota
  bxyh = fscanf(vstup,'%f',[4 inf])'
  i = 0;    % citac iteraci
  fclose(vstup);
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>


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


<source lang=octave>
<source lang=octave>
% iterativni proces skonci az po splneni vsech 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 (napr. mm)
                                                % 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
 
% 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>
</source>


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