Programovani v Maplu Procedura Priklad: procedura, ktera scita 2 cisla: a + 2*b soucet := proc (a, b) local c; # lokalni promenna - existuje a meni se jenom uvnitr procedury c:=a+b; # globalni promenna - existuje a meni se v celem worksheetu - zmeny c uvnitr procedury je "vidno" i vne procedury # vystup - nastaveni navratove hodnoty + okamzite "vyskoceni" z procedury return c # bez return procedura vrati vysledek posledniho prikazu (1.1) soucet(1, 2); 5 (1.2) c; (1.3) c soucet([1, 2, 3], [2, 1, 3]); # procedura soucet bude fungovat pro vsechny argumenty, pro ktere jsou definovany operace uvnitr procedury (1.4) Podminene prikazy if <podminka then <prikazy elif <podminka then <prikazy <prikazy % elif se da pouzit opakovane v jednom if - kodu Priklad 1: Urcete, zda je cele cislo x liche nebo sude. testls := proc (x) local a; a := modp(x, 2); if a = 0 then printf("%d je sude cislo", x) printf("%d je liche cislo", x) (2.1)
testls(-4); -4 je sude cislo testls(-7); -7 je liche cislo testls(2.1); Error, (in testls) invalid argument for modp or mods floor(1.6); 1 (2.2) Priklad 1 (bez predpokladu: x je cele cislo): Urcete, zda je cislo x liche nebo sude. testls2 := proc (x) local a; a := x-2*floor((1/2)*x); if a = 0 then printf(" %d je sude cislo ", x) elif a = 1 then printf("%d je liche cislo", x) printf("%1.10f neni cele cislo, tudiz neni sude ani liche", x) ; (2.3) testls2(7); 7 je liche cislo testls2(4); 4 je sude cislo testls2(2.35); 2.3500000000 neni cele cislo, tudiz neni sude ani liche floor(1.4); 1 (2.4) Jine reseni Prikladu 1: TEST := proc (a)
if a < floor(a) then printf("%1.10f neni cele cislo, tudiz neni sude ani liche", a) elif (1/2)*a-floor((1/2)*a) = 0 then printf(" %d je sude cislo ", a) printf("%d je liche cislo", a) (2.5) TEST(1.1); 1.1000000000 neni cele cislo, tudiz neni sude ani liche TEST(2); 2 je sude cislo TEST(-3); -3 je liche cislo Priklad 2: Necht a,b 2Z. Pokud b deli a, tak spoctete a/b. Jinak napiste "b nedeli a". delitelnost := proc (a, b) if modp(a, b) = 0 then printf(" %d deli %d, podil je %d", b, a, a/b) printf("%d nedeli %d", b, a) (2.6) delitelnost(10, 5); 5 deli 10, podil je 2 delitelnost(9, 5); 5 nedeli 9 Priklad 3: Necht x 2=. Rozhodnete, zda je x 1) delitelne 3 nebo 2) delitelne 3 a 5 nebo 3) delitelne 3 a 5 a 7 nebo 4) neni delitelne cisly 3, 5, 7 zaroven. delitelnost := proc (x) if modp(x, 3) = 0 then
if modp(x, 5) = 0 then if modp(x, 7) = 0 then printf(" %d je delitelne cisly %d, %d, %d ", x, 3, 5, 7) printf(" %d je delitelne cisly %d, %d", x, 3, 5) printf(" %d je delitelne cislem %d ", x, 3) printf("%d neni delitelne cisly %d, %d, %d zaroven", x, 3, 5, 7) (2.7)
delitelnost(22); 22 neni delitelne cisly 3, 5, 7 zaroven delitelnost(15); 15 je delitelne cisly 3, 5 delitelnost(105); 105 je delitelne cisly 3, 5, 7 delitelnost(21); 21 je delitelne cislem 3 For cyklus for <promenna from <minimalni hodnota to <maximalni hodnota by <velikost kroku do <prikazy end do Priklad 1: Vypoctete n!, kde n 2 ; faktorial := proc (n) local a, i; a := 1; for i to n do a := a*i end do (3.1) faktorial(2); faktorial(4); 2 24 (3.2) (3.3) Priklad 2: Urcete soucet celych cisel mezi cisly a, b, kde a= -20, b= 40 soucet:=proc(a,b) local i,c; c:=0; for i from a to b do c:=c+i; return(c) (3.4) soucet(1, 3); 6 (3.5) Priklad 3: Sectete kazde ctvrte cele cislo mezi cisly a, b (kde a= -27, b= 403)
soucet2 := proc (a, b) local i, c; c := -a+1; for i from a-1 by 4 to b do c := c+i return c (3.6) soucet2(1, 5); 4 (3.7) While cyklus while <podminka do <prikazy end do Priklad 1: a) Jake je nejvetsi prirozene cislo, pro ktere plati x^3 <= a, kde a si muzete volit libovolne? test1 := proc(a) local i; i := 0; while i^3 <= a do i := i+1 return i-1 (4.1) test1(8); 2 (4.2) b) to same jako a) + delitelne 4 test2 := proc(a) local i; i := 0; while i^3 <= a do i := i+4 return i-4
(4.3) test2(1200); 8 (4.4) Priklad 2: Kolik prvnich prirozenych cisel lze secist tak, aby soucet nebyl vetsi nez a? test3 := proc(a) local i, s; i := 0; s := 0; while s <= a do i := i+1; s := s+i return i-1 (4.5) test3(10); test3(1200); 4 48 (4.6) (4.7) Priklad 3: Vypoctete n!, kde n 2 ;, pomoci while cyklu (viz Priklad 1 v sekci For cyklus pro porovnani ruznych reseni) faktorial1 := proc(n) local a, i; a := 1; i := 1; while i <= n do i := i+1; a := a*i return a/i (4.8) faktorial1(4); 24 (4.9) nebo trochu jinak:
faktorial2 := proc(n) local a, i; a := 1; i := 1; while i <= n do a := a*i; i := i+1 return a (4.10) faktorial(4); 24 (4.11) Poznamky return Priklad: Pocitejte postupne pro 1/(x-5) je pro 1 rovno -0.250000 1/(x-5) je pro 2 rovno -0.333333 1/(x-5) je pro 3 rovno -0.500000 1/(x-5) je pro 4 rovno -1.000000 Pro x = 5 delime nulou. break Priklad: Pocitejte postupne pro
1/(x-5) je pro 1 rovno -0.250000 1/(x-5) je pro 2 rovno -0.333333 1/(x-5) je pro 3 rovno -0.500000 1/(x-5) je pro 4 rovno -1.000000 Pro x = 5 delime nulou. Nepresli jsme vsechny hodnoty od 1 do 10.