← Natrag

Funkcije

Definicija

Za pravilnu definiciju potrebno je definirati:

Opći oblik:

tip_rezultata naziv_funkcije(lista_parametara) {
  // definicije, deklaracije i naredbe;

  return rezultat;
}

Tip rezultata

Tip mora biti naveden čak i kada funkcija ništa ne vraća (onda se koristi poseban tip void)

Povratak rezultata

Poziv funkcije

Primjer: definicije funkcije

double eksp(float x, int n) {
  int i;
  double rez = 1.;
  for (i = 0; i < n; ++i) rez *= x;

  return rez;
}

Primjer: pozivanja funkcije

#include <stdio.h> // za printf u funkciji main

double eksp(float x, int n) {
...
  return rez;
}
...
int main(void) {
...
  double y = eksp(3.f, 4);
  printf("Tri na cetvrtu je %lf", y);
  printf("Dva na petu je %lf", eksp(2.f, 5));
  eksp(3.f, 2);                          // ispravno, ali beskorisno
  y = eksp(3.5f, 2) + 2 * eksp(2.1f, 3); // 3.5^2 + 2 ∙ 2.1^3
  y = eksp(eksp(2 * 3.f, 2), 4);         // (6^2)^4
...
}

Primjer funkcije koja ne vraća rezultat

void ispisXY(float x, float y) {
  printf("(%.4f, %.4f)", x, y);
  return; može se izostaviti
}

int main(void) {
  float x = 3.25f, y = -12.f;

  printf("Koordinate: ");
  ispisXY(x, y);

  // Ispis programa: "Koordinate: (3.2500, -12.0000)"
  return 0;
}
Implicitne konverzije

Argumenti funkcije implicitno se pretvaraju u odgovarajući tip kada je to moguće. npr. int \Rightarrow float kada je funkcija specificira da prima float, a mi joj predamo int konstantu.

double exsp(float x, int n) {
  ...
  return rez;
}

int main(void) {
    // 2 (int) -> 2 (float)
    printf("%ld", exsp(2, 2));
}

Stack

Stog (engl. stack) osnovna je struktura tipa LIFO (Last In First Out).

Sve^[Sve varijable deklarirane prije pozivanja programa, one za koje se memorija alocira dinamički idu na heap] varijable unutar funkcije se spremaju na stog, kada se funkcija vrati pozivatelju sa stoga se skinu te varijable.

Stog je vrlo brz, ali ograničene veličine.

Demo zadatak

Napraviti Kaprkar’s routine za unesen broj.

Rekurzivne funkcije

Funkcija koja poziva samu sebe.

void ispis(int n) {
  printf("%d\n", n);
  ispis(n - 1);

  return;
}

Ispisivat će

n
n-1
n-2

Računanje faktorijela

size_t fact(size_t n) {
  if (n <= 1) return 1;

  return n*fact(n-1);
}

za fact(5) program će računati 5*fact(4) pa onda 5*4*fact(3) pa onda 5*4*3*fact(2) i na kraju 5*4*3*2*1