ifwhile i for% rozpoczyna komentarz. Komentarz umieszczony na początku skryptu wyświetlany jest przez polecenie helpPrzykład: skrypt pole_kola.m
type pole_kola
pole_kola is the user-defined function defined from: /home/marek/work/zajecia/2020.zimowy/pp2/github/pole_kola.m % Skrypt wyznacza pole koła o promieniu 5 % wartość promienia r = 5 % wzór na pole koła pole = pi * r^2
help pole_kola
'pole_kola' is a script from the file /home/marek/work/zajecia/2020.zimowy/pp2/github/pole_kola.m Skrypt wyznacza pole koła o promieniu 5 Additional help for built-in functions and operators is available in the online version of the manual. Use the command 'doc <topic>' to search the manual index. Help and information about Octave is also available on the WWW at https://www.octave.org and via the help@octave.org mailing list.
pole_kola
r = 5 pole = 78.540
whos
Variables in the current scope:
Attr Name Size Bytes Class
==== ==== ==== ===== =====
ans 1x1 8 double
pole 1x1 8 double
r 1x1 8 double
Total is 3 elements using 24 bytes
function argumenty_wyjściowe = nazwa_funkcji ( argumenty_wejściowe )
% Komentarz stanowiący pomoc funkcji
instrukcje skryptu
end
Przykład: pole_kola2.m
function pole = pole_kola2(r) % Skrypt wyznacza pole koła o promieniu r pole = pi * r^2; end
pole_kola2(5)
ans = 78.540
podstawienie wyniku z funkcji
pole = pole_kola2( 3 );
printf('Pole koła o promieniu 3 wynosi %f\n', pole);
Pole koła o promieniu 3 wynosi 28.274334
Skrypt lub funkcja mogą byc uruchamiane wewnątrz innych skryptów i funkcji
Przykład: funkcja objetosc_stozka.m wyznacza wartość: $$ V = \frac{1}{3} \pi r^2 h $$ gdzie argumentami skryptu są wartości: $r$ promień podstawy, $h$ wysokość stożka.
function objetosc = objetosc_stozka(r, h) % Skrypt wyznacza objętość ztozka. % ArgumentyL % r - promień podstawy % h - wysokość stożka objetosc = pole_kola2(r) * h / 3; end
objetosc_stozka(1, 3)
ans = 3.1416
Napisz funkcję o nazwie rzut_poziomy.m, która wyznacza zasięg rzutu poziomego zgodnie ze wzorem $$ Z = v_0 \sqrt{\frac{2h}{g}}$$ Argumenty wejściowe funkcji:
Stała przyśpieszenia ziemskiego $g \approx 9.80665$
Umieść w pliku komentarz, który spowoduje wypisanie stosownego opisu za pomocą polecenia help.
if warunek
instrukcje
end
x = -1
if x < 0
printf('Wartość %f jest mniejsza od zera\n', x);
end
x = -1 Wartość -1.000000 jest mniejsza od zera
Podobnie jak w języku C liczby całkowite występują w roli wartości logicznych: 0 to fałsz, 1 to prawda
| Operator | Znaczenie |
|---|---|
| < | mniejsze niż |
| ⇐ | mniejsze lub równe |
| > | większe niż |
| >= | większe lub równe |
| == | równe |
| ~= | różne |
Uwaga: = to operator przypisania a == to operator porównania
5 < 3 % porównywanie liczb 4 == 3 + 1 'z' < 'a' % porównywanie znaków 3 ~= 4 x = 1 == 2
ans = 0 ans = 1 ans = 0 ans = 1 x = 0
| Operator | Znaczenie | x=true y=true | x=true y=false | x=false y=false |
|---|---|---|---|---|
| x || y | lub (OR) | true | true | false |
| x && y | i (AND) | true | false | false |
| ~x | nie (NOT) | false | false | true |
| xor(x, y) | exclusive OR | false | true | false |
x = 42; y = 3; x < y && y > 5 x > y || y - 1 == x xor(x > y, 'b' < 'a') ~x xor(1, true)
ans = 0 ans = 1 ans = 1 ans = 0 ans = 0
if warunek
instrukcje wykonane, gdy warunek jest prawdziwy
else
instrukcje wykonane, gdy warunek nie jest prawdziwy
end
x = 42
if mod(x, 2) == 0
printf('Liczba %d jest parzysta', x);
else
printf('Liczba %d jest nieparzysta', x);
end
x = 42 Liczba 42 jest parzysta
Ćwiczenie:
Napisz skrypt o nazwie rzut_moneta.m, który po uruchomieniu wypisze komunikat “Orzeł” lub “Reszka”. Każdy z wyników może się pojawić z szansą 50%. Do wylosowania wyniku wykorzystaj funkcję rand.
if warunek 1
instrukcje wykonane, gry warunek 1 jest prawdziwy
elseif warunek 2
instrukcje wykonane, gdy warunek 2 jest prawdziwy a warunek 1 jest nieprawdziwy
…
else
instrukcje wykonane w gdy warunek 1 i warunek 2 nie są prawdziwe
end
x = 42
if x < 0
printf('Liczba jest mniejsza od zera', x);
elseif x < 10
printf('Liczba %d jest dodatnia i mniejsza od 10', x);
else
printf('Liczba %d jest większa lub równa 10', x);
end
x = 42 Liczba 42 jest większa lub równa 10
while warunek
instrukcje wykonywane dopóki warunek jest prawdziwy
end
x = 1
while x < 10
printf('%d ', x);
x = x + 1;
end
x = 1 1 2 3 4 5 6 7 8 9
Napisz funkcję nwd.m, która wyznacza największy wspólny dzielnik dwóch liczb naturalnych za pomocą algorytmu Euklidesa.
Algorytm Euklidesa: dla danych $a$ i $b$
Program wypisuje stosowny komunikat pomocy po wywołaniu help nwd.
W przypadku, gdy jeden z argumentów jest mniejszy od 1 to wypisywany jest komunikat Niepoprawne dane a funkcja nwd zwraca wartość 0.
for zmienna = [ lista elementów ]
instrukcje
end
for i=[3 5 7]
printf('Pole koła o promieniu %f wynosi %f\n', i, pole_kola2(i));
end
Pole koła o promieniu 3.000000 wynosi 28.274334 Pole koła o promieniu 5.000000 wynosi 78.539816 Pole koła o promieniu 7.000000 wynosi 153.938040
Przykład: tabliczka mnożenia
% tabliczka mnożenia
n = 10
for i=1:n
for j=1:n
printf('%3d ', i*j);
end
printf('\n');
end
n = 10 1 2 3 4 5 6 7 8 9 10 2 4 6 8 10 12 14 16 18 20 3 6 9 12 15 18 21 24 27 30 4 8 12 16 20 24 28 32 36 40 5 10 15 20 25 30 35 40 45 50 6 12 18 24 30 36 42 48 54 60 7 14 21 28 35 42 49 56 63 70 8 16 24 32 40 48 56 64 72 80 9 18 27 36 45 54 63 72 81 90 10 20 30 40 50 60 70 80 90 100
Wewnątrz pętli while i for można użyć instrukcji break oraz continue
break przerywa działanie pętli continue przechodzi do następnej iteracjin = 11;
czy_pierwsza = true;
for i = 2:n-1
if mod(n, i) == 0
czy_pierwsza = false;
break
end
end
if czy_pierwsza
printf('Liczba %d jest liczbą pierwszą\n', n)
else
printf('Liczba %d nie jest liczbą pierwszą\n', n)
printf('Znalazłem dzielnik %d\n', i)
end
Liczba 11 jest liczbą pierwszą
for n=1:20
if n == 13
continue
end
printf('%d ', n)
end
1 2 3 4 5 6 7 8 9 10 11 12 14 15 16 17 18 19 20
switch wyrażenie
case wartość1
instrukcje wykonane, gry wyrażenie == wartość1
case wartość2
instrukcje wykonane, gry wyrażenie == wartość2
…`
otherwise
instrukcje wykonane, gry nie zaszedł żaden z powyższych przypadków
end
Uwaga: w przeciwieństwie do języka C wykonywany jest zawsze tylko pasujący przypadek (brak instrukcji break)
Zmienna nargin zawiera liczbę argumentów podaną przy uruchomieniu funkcji. Można to wykorzystać do wstawienia domyślnych wartości argumentów.
Przykład: skrypt argumenty.m
function argumenty(x)
switch nargin
case 0
x = 42; % wartość domyślna
case 1
printf('Jeden argument\n')
otherwise
printf('Podałeś więcej niż 1 argument\n')
end
disp(x)
end
argumenty argumenty() argumenty(13) argumenty(13, 44)
42 42 Jeden argument 13 Podałeś więcej niż 1 argument 13
Ćwiczenie
Skrypt rzut_moneta przepisz do postaci funkcji, która może przyjąć 2 argumenty.
Argumenty:
W przypadku braku podania argumentów funkcja zachowuje się identyczne jak pierwotny skrypt, tj. z prawdopodobieństwem $p=0.5$ wylosuje orła lub reszkę. Podanie pierwszego argumentu definiuje prawdopodobieństwo wypadnięcia orła, zaź podanie drugiego argumentu pozwala ustwaić liczbę rzutów monetą (wynik wypisywany jest $n$ razy).