15. Funkcie: FUNC a RETURN(hodnota)
Na čo to je
Procedúra niečo spraví. Funkcia niečo vypočíta a vráti – jej volanie sa dá napísať všade, kde môže stáť číslo. Poznáš ich už z knižnice: InputB() je funkcia.
Ako sa to píše
TYP FUNC Meno(parametre)
príkazy
RETURN(výsledok)| Časť | Význam |
|---|---|
TYP | typ hodnoty, ktorú funkcia vracia: BYTE, CHAR, CARD alebo INT |
FUNC | namiesto PROC |
RETURN(výsledok) | skončí funkciu a vráti hodnotu v zátvorkách |
Zátvorky za RETURN sú vo funkcii povinné. RETURN môže byť vo funkcii aj viackrát – vykoná sa ten, ku ktorému program dôjde prvý.
Volanie funkcie sa píše do výrazu:
x=Max(a, b)
PrintBE(Max(7, 12))
IF IsEven(n)=1 THEN … FICelý program
Súbor examples/func.act:
; Functions: routines that give back a value
BYTE FUNC Max(BYTE a, b)
IF a>b THEN
RETURN(a)
FI
RETURN(b)
CARD FUNC Square(CARD n)
RETURN(n*n)
BYTE FUNC IsEven(CARD n)
IF n MOD 2=0 THEN
RETURN(1)
FI
RETURN(0)
PROC Main()
CARD i, sum
Print("The bigger of 7 and 12: ")
PrintBE(Max(7, 12))
Print("12 squared: ")
PrintCE(Square(12))
sum=0
FOR i=1 TO 10
DO
sum==+Square(i)
OD
Print("Squares of 1 to 10 added: ")
PrintCE(sum)
FOR i=1 TO 4
DO
PrintC(i)
IF IsEven(i)=1 THEN
PrintE(" is even")
ELSE
PrintE(" is odd")
FI
OD
RETURNPreklad a spustenie
action26 func.act --simČo uvidíš
The bigger of 7 and 12: 12
12 squared: 144
Squares of 1 to 10 added: 385
1 is odd
2 is even
3 is odd
4 is evenAko to funguje
Maxmá dvaRETURN. Ak jeaväčšie, funkcia skončí hneď prvým a vrátia. Inak program dôjde až na koniec a vrátib.Squareje celá na jednom riadku: vypočítan*na vráti to.IsEvenvracia 1 alebo 0 ako „áno“ a „nie“. Action! nemá zvláštny typ pre pravdu a nepravdu, používa sa číslo: 0 je nie, čokoľvek iné áno.PrintBE(Max(7, 12))– najprv sa zavoláMax, jej výsledok (12) sa stane argumentomPrintBE.sum==+Square(i)– volanie funkcie vo výraze, v slučke desaťkrát.
Funkcia má tú výhodu, že volajúci nemusí vedieť, ako výsledok vznikol. Keď raz Max funguje, používaš ju ako hotovú súčiastku.
Procedúra alebo funkcia?
| Ak rutina | Použi |
|---|---|
| niečo vypíše, nakreslí, zahrá | PROC |
| vypočíta jednu hodnotu | FUNC |
| má vrátiť viac hodnôt | PROC s ukazovateľmi (kapitola 20) alebo globálne premenné (kapitola 16) |
Spoločné slovo pre procedúry a funkcie je rutina.
Časté chyby
| Čo sa stalo | Čo povie prekladač |
|---|---|
RETURN a bez zátvoriek | error ACT028: illegal RETURN: expected '(' with the function result |
funkcia končí holým RETURN | to isté hlásenie |
RETURN(5) v procedúre | error ACT028: illegal RETURN: a PROC cannot return a value |
chýba typ pred FUNC | error ACT006: FUNC needs a result type (BYTE, CHAR, CARD or INT) |
Funkciu možno zavolať aj ako procedúru (Max(1, 2) na vlastnom riadku). Výsledok sa vtedy zahodí. Pri Max to nemá zmysel; pri funkcii, ktorá okrem výsledku aj niečo robí, niekedy áno.
Typ funkcie rozhoduje o tom, čo sa vráti. BYTE FUNC, ktorá vráti 300, vráti 44.
Vyskúšaj si
- Napíš
BYTE FUNC Min(BYTE a, b)a vypíš menšie z dvoch čísel. - Napíš
CARD FUNC Power(CARD base, BYTE exponent), ktorá vypočíta mocninu opakovaným násobením v slučke. - Použi
Maxna nájdenie najväčšieho z troch čísel:Max(Max(a, b), c).
Zhrnutie
TYP FUNC Meno(…)je rutina, ktorá vracia hodnotu.RETURN(hodnota)– so zátvorkami – funkciu ukončí a hodnotu vráti.- Volanie funkcie môže stáť vo výraze, v podmienke aj ako argument inej rutiny.
- „Áno“ a „nie“ sa vracia ako 1 a 0.
Späť: 14. Parametre · Ďalej: 16. Kde premenná platí