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

Action!
TYP FUNC Meno(parametre)
  príkazy
RETURN(výsledok)
ČasťVýznam
TYPtyp hodnoty, ktorú funkcia vracia: BYTE, CHAR, CARD alebo INT
FUNCnamiesto 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:

Action!
x=Max(a, b)
PrintBE(Max(7, 12))
IF IsEven(n)=1 THEN … FI

Celý program

Súbor examples/func.act:

Action!
; 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
RETURN

Preklad 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 even

Ako to funguje

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 rutinaPouži
niečo vypíše, nakreslí, zahráPROC
vypočíta jednu hodnotuFUNC
má vrátiť viac hodnôtPROC 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átvoriekerror ACT028: illegal RETURN: expected '(' with the function result
funkcia končí holým RETURNto isté hlásenie
RETURN(5) v procedúreerror ACT028: illegal RETURN: a PROC cannot return a value
chýba typ pred FUNCerror 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

  1. Napíš BYTE FUNC Min(BYTE a, b) a vypíš menšie z dvoch čísel.
  2. Napíš CARD FUNC Power(CARD base, BYTE exponent), ktorá vypočíta mocninu opakovaným násobením v slučke.
  3. Použi Max na nájdenie najväčšieho z troch čísel: Max(Max(a, b), c).

Zhrnutie

Späť: 14. Parametre · Ďalej: 16. Kde premenná platí