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

Z GeoWikiCZ
mBez shrnutí editace
mBez shrnutí editace
 
(Není zobrazeno 23 mezilehlých verzí od 2 dalších uživatelů.)
Řádek 2: Řádek 2:
{{Cvičení|155GIT1|7|Uživatelské funkce}}
{{Cvičení|155GIT1|7|Uživatelské funkce}}


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


# uživatelské funkce
# uživatelské funkce
# chybová hlášení, nápověda k funkci
# chybová hlášení, nápověda k funkci
# drobné smíšené úlohy
# drobné úlohy


== Ukázky ==
== Ukázky ==
Řádek 12: Řádek 12:
=== Uživatelské funkce ===
=== Uživatelské funkce ===


Syntax:
'''Syntax'''
   
   
  function [vystup1,vystup2,...,vystupn] = nazev(vstup1,vstup2,...,vstupn)
  function [vystup1,vystup2,...,vystupn] = nazev(vstup1,vstup2,...,vstupn)
Řádek 18: Řádek 18:
  end  % end neni povinne
  end  % end neni povinne


Každá funkce musí být uložena ve vlastním souboru s příponou <tt>.m</tt>. Název souboru musí odpovídat názvu funkce! Klíčové slovo <code> function </code> musí být na prvním řádku souboru.
Každá funkce musí být uložena ve vlastním souboru s příponou <tt>.m</tt>. Název souboru musí odpovídat názvu funkce! Klíčové slovo <tt>function</tt> musí být na prvním řádku souboru.


<source lang=octave>
<source lang=octave>
function [min_x, max_x, mean_x] = stat(x)
function [min_x, max_x, mean_x] = stat(x)


     min_x = min(x);
     min_x = min(min(x));
     max_x = max(x);
     max_x = max(max(x));
     mean_x = mean(x);
     mean_x = mean(x(:));   % stejný výsledek jako mean_x = mean(mean(x))


end
end
</source>
</source>


Příklad volání:
'''Příklad volání'''


<source lang=octave>
<source lang=octave>
data = rand(10,1)
data = rand(5)
[mi, ma, mn] = stat(data)
[mi, ma, mn] = stat(data);
fprintf('min  = %.3f\nmax  = %.3f\nmean = %.3f\n', mi, ma, mn)
fprintf('min  = %.3f\nmax  = %.3f\nmean = %.3f\n', mi, ma, mn)
</source>
</source>


=== Chybová hlášení ===
=== Chybová hlášení, nápověda ===


<source lang=octave>
<source lang=octave>
function [min_x, max_x, mean_x] = stat(x)
function [min_x, max_x, mean_x] = stat(x)
% vypocet minimalni, maximalni a prumerne hodnoty vektoru
% vypocet minimalni, maximalni a prumerne hodnoty matice


    if any(imag(x)) > 0
    if any(any( imag(x)~=0 ))
        error('stat: Vstupni vektor obsahuje imaginarni cisla.')
        error('stat: Vstupni matice obsahuje komplexni cisla.')
    end
    end
    min_x = min(x);
    min_x = min(min(x));
    max_x = max(x);
    max_x = max(max(x));
    mean_x = mean(x);
    mean_x = mean(x(:));


end
end
</source>
</source>


Vyvolání nápovědy k funkci:
Vyvolání nápovědy k uživatelské funkci:
 
                         
<source lang=octave>
<source lang=octave>
help stat
help stat
</source>
</source>


Volání funkce:
Volání funkce (chybná vstupní data):
 
<source lang=octave>
<source lang=octave>
data1 = [data; 5+2i; 4-3i]
data1 = [data, 5+2i * ones(5,1)]
[mi, ma, mn] = stat(data1)
[mi, ma, mn] = stat(data1)
</source>
</source>
=== Příkaz return ===
* je-li v běhu funkce vykonán příkaz <tt>return</tt>, je okamžitě činnost funkce ukončena (bez vykonání evtl.dalších příkazů) a na pozici jejího volání jsou vráceny aktuálně vypočtené hodnoty výstupních parametrů funkce


=== Drobné úlohy ===
=== Drobné úlohy ===


'''Funkce pro výpočet nekonečné řady do zadané přesnosti'''
'''Funkce pro načtení neformátovaných dat po řádcích'''


např. výpočet funkce arctg():
např. záměna čárky za tečku:


<source lang=octave>
<source lang=octave>
function [arctgx] = arctg(x,mez)
function teckazacarku(file)
% vypocet funkce arctg rozvojem v radu do zadane presnosti
% vyhleda vsechny carky v souboru a zameni je za tecku
% IN: x      ... vektor argumentu funkce
% IN: file ... jmeno vstupniho souboru (textovy retezec)
%      mez    ... zadana presnost vypoctu
% OUT: arctgx ... vektor vypoctenych uhlu z intervalu <-pi/2,pi/2>
 
if any(x > 1) | any(x < -1)
    error('arctg: Vstupni hodnoty musi byt z intervalu <-1,1>.')
end
 
% vypocet pro kazdy prvek daneho vektoru samostatne
for i=1:length(x)
    % start iterace pro i-ty vstupni prvek
    y0 = 100; % vkladam fiktivni hodnotu, kterou x na vstupu nikdy nemuze nabyt
    % 1.iterace
    n = 1;
    y = x(i);
    while  abs( y-y0 ) > mez
        % n-ta iterace
        n = n+1;
        y0 = y;
        y = y0 + (-1)^(n+1) *  x(i)^(2*n-1)  / (2*n-1);
    end
    % ulozeni vypoctene hodnoty do vystupni promenne
    arctgx(i) = y;
    fprintf('Pocet iteraci vypoctu: %d\n',n)
end
</source>


'''Funkce pro načtení neformátovaných dat po řádcích'''
if ischar(file) == 0
    error('Jmeno vstupniho souboru musi byt textovy retezec.');
end


např: záměna čárky za tečku:
vstup = fopen(file,'r');


<source lang=octave>
filenew = [file(1:end-4), '_upr', file(end-3:end)];  % jméno nového souboru
function teckazacarku(file)
vystup = fopen(filenew,'w');


    vstup = fopen(file,'r');
  konec = 0;  % indentifikátor konce souboru
    filenew = [file(1:end-4), '_upr', file(end-3:end)]; % jmeno noveho souboru
while konec==0
    vystup = fopen(filenew,'w');
    radek = fgets(vstup);  % fgets() načte 1 řádek souboru (se znakem \n)
   
    for i=1:length(radek)
    konec = 0;  % indentifikator konce souboru
        if radek(i) == ','
    while konec==0
            radek(i) = '.';
        radek = fgets(vstup);  % fgets() nacte 1 radek souboru (se znakem \n)
        end
        for i=1:length(radek)
    end
            if radek(i) == ','
    fprintf(vystup,'%s',radek);
                radek(i) = '.';
    konec = feof(vstup);  % feof() vrátí pro konec souboru hodnotu 1, jinak vrací hodnotu 0
            end
end
        end
        fprintf(vystup,'%s',radek);
        konec = feof(vstup);  % feof() vrati pro konec souboru hodnotu 1
    end
   
    fclose all;
    fprintf('Data ulozena do souboru %s\n',filenew);


end
fclose all;
fprintf('Data ulozena do souboru %s\n',filenew);
</source>
</source>
datový soubor [http://athena.fsv.cvut.cz:8000/GIT1/cv7/carky.txt carky.txt] ke stažení


Volání funkce:
Volání funkce:
datový soubor [ftp://athena.fsv.cvut.cz/ZFG/GIT1/carky.txt carky.txt] ke stažení


<source lang=octave>
<source lang=octave>
teckazacarku('carky.txt')
teckazacarku('carky.txt')
</source>
</source>


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


* budou doplněny záhy
* [[155GIT1 / 7. cvičení / Příklady|7. cvičení - příklady]]
<!--
 
 
 
 
{{Cvičení|155GIT1|7|Test Matlab/Octave}}
; Zadání testu
* https://moodle-vyuka.cvut.cz/course/view.php?id=5130
; Výsledky testu
* [https://docs.google.com/spreadsheets/d/1We6CEro7T5q766HukoxxTLYYTlvEdsV0i1B1VcHUD6s/edit?usp=sharing souhrnné výsledky]
-->
<!-- -->

Aktuální verze z 13. 4. 2023, 03:59

Uživatelské funkce

Náplň

  1. uživatelské funkce
  2. chybová hlášení, nápověda k funkci
  3. drobné úlohy

Ukázky

Uživatelské funkce

Syntax

function [vystup1,vystup2,...,vystupn] = nazev(vstup1,vstup2,...,vstupn)

end  % end neni povinne

Každá funkce musí být uložena ve vlastním souboru s příponou .m. Název souboru musí odpovídat názvu funkce! Klíčové slovo function musí být na prvním řádku souboru.

 function [min_x, max_x, mean_x] = stat(x)

    min_x = min(min(x));
    max_x = max(max(x));
    mean_x = mean(x(:));    % stejný výsledek jako mean_x = mean(mean(x))

 end

Příklad volání

 data = rand(5)
 [mi, ma, mn] = stat(data);
 fprintf('min  = %.3f\nmax  = %.3f\nmean = %.3f\n', mi, ma, mn)

Chybová hlášení, nápověda

 function [min_x, max_x, mean_x] = stat(x)
 % vypocet minimalni, maximalni a prumerne hodnoty matice

     if any(any( imag(x)~=0 ))
         error('stat: Vstupni matice obsahuje komplexni cisla.')
     end
     min_x = min(min(x));
     max_x = max(max(x));
     mean_x = mean(x(:));

 end

Vyvolání nápovědy k uživatelské funkci:

 help stat

Volání funkce (chybná vstupní data):

 data1 = [data, 5+2i * ones(5,1)]
 [mi, ma, mn] = stat(data1)

Příkaz return

  • je-li v běhu funkce vykonán příkaz return, je okamžitě činnost funkce ukončena (bez vykonání evtl.dalších příkazů) a na pozici jejího volání jsou vráceny aktuálně vypočtené hodnoty výstupních parametrů funkce

Drobné úlohy

Funkce pro načtení neformátovaných dat po řádcích

např. záměna čárky za tečku:

 function teckazacarku(file)
 % vyhleda vsechny carky v souboru a zameni je za tecku
 % IN: file ... jmeno vstupniho souboru (textovy retezec)

 if ischar(file) == 0
     error('Jmeno vstupniho souboru musi byt textovy retezec.');
 end

 vstup = fopen(file,'r');

 filenew = [file(1:end-4), '_upr', file(end-3:end)];  % jméno nového souboru
 vystup = fopen(filenew,'w');

 konec = 0;  % indentifikátor konce souboru
 while konec==0
     radek = fgets(vstup);  % fgets() načte 1 řádek souboru (se znakem \n)
     for i=1:length(radek)
         if radek(i) == ','
             radek(i) = '.';
         end
     end
     fprintf(vystup,'%s',radek);
     konec = feof(vstup);   % feof() vrátí pro konec souboru hodnotu 1, jinak vrací hodnotu 0 
 end

 fclose all;
 fprintf('Data ulozena do souboru %s\n',filenew);

datový soubor carky.txt ke stažení

Volání funkce:

 teckazacarku('carky.txt')

Úlohy