|
|
(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 = 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>
| | % 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]] |
| | <!-- --> |
Čtení formátovaných dat z textových souborů
Náplň
- č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