Коришћење функција

Коришћење и начин извршавања функција илустроваћемо на примеру познате функције која сабира два броја и резултат тог збира враћа у главни програм. Пренос параметара извршићемо по вредности.

Погледајмо поново функцију zbir коју ћемо сада искористити и позивати у главном програму. Мало ћемо изменити имена параметрима.

Још једном да напоменемо: променљиве које су дефинисане у функцији су видљиве само унутар ње, односно нису видљиве у другим функцијама. Зато имамо слободу да именујемо променљиве унутар функција како желимо.

int zbir(int m, int n)
{
    int s;
    s = m + n;
    return s;
}

int main(void)
{
    int a, b, c, d, z;
    printf("Unesi brojeve a i b: ");
    scanf("%d %d", &a, &b);
    z = zbir(a, b);
    printf("Zbir brojeva a i b je %d", z);
    z = zbir(c, d);
    printf("Zbir brojeva c i d je %d", z);
    return 0;
}

Како се извршава задатак? На почетку се резервише меморијски простор за главну функцију main(). Позивом функције z = zbir(a, b) одваја се меморијски простор за функцију zbir(), односно променљиве дефинисане у њој. Обрати пажњу да су ове области меморије независне једна од друге.

У главној функцији се одваја меморијски простор за стварне параметре a, b, c, d. У функцији zbir() се одваја простор за формалне параметре и локалне променљиве.

Стање меморије на почетку програма, доделе вредности стварним параметрима и позива функције zbir(a, b):

../_images/Picture310.png

Наредбом z = zbir(a, b) вредности стварних параметара а и b се копирају у формалне параметре, односно сада је m = 3, n = 5.

У функцији се рачуна вредност збира, она се враћа у главни програм и додељује променљивој z.

Вредности параметара а и b се прослеђују у функцију, у њој се рачуна вредност збира и враћа у главни програм:

../_images/Picture42.png

Даље, новим позивом функције z = zbir(c, d) копирају се стварни параметри c и d у формалне параметре m и n. Као и у претходном случају, функција враћа вредност у главни програм.

Вредности параметара c и d се прослеђују у функцију, у њој се рачуна вредност збира и враћа у главни програм:

../_images/Picture51.png

Пошто функција враћа целобројну вредност, у претходном примеру смо користили променљиву z да би у њу сместили резултат који функција враћа у главни програм. Језик С нам дозвољава да директно позовемо функцију и прикажемо резултат, без декларисања помоћних променљивих, чиме скраћујемо и поједностављујемо кôд:

printf("Zbir brojeva a i b je %d", zbir(a, b));

У овој наредби смо показали да се функција може позвати у другој функцији.

Јасно је да овако креирана функција може да се позива неограничен број пута, како самостално, тако и у изразима. Увек се сети оне приче о функцијама printf i scanf које су већ креиране и које позиваш у сваком свом програму, прослеђујући им различите параметре.

На исти начин можеш да креираш функције razlika() и proizvod(). Цела функција се разликује у једном знаку. И у имену, наравно. Али шта је са функцијом kolicnik()? Шта мислиш, да ли ће све бити исто? Одговор је: неће.

Количник се, наравно, добија дељењем бројева. Сећаш се још из првог разреда да резултат дељења не може бити цео, већ реалан број. Зато ће тип функције, односно вредност која се враћа у главни програм увек бити реалан број, без обзира што као аргументе функције користиш целобројне променљиве.

Увек се сети како рачунаш просек у школи. Збир оцена је цео број, број предмета такође, а као резултат увек добијаш реалан број. Нико не каже да има просек 5, већ 5.00.

Функција kolicnik и главни програм би изгледали овако:

#include<stdio.h>
double kolicnik(int m, int n)
{
    double s;
    s = (double) m / n;
    return s;
}

int main(void)
{
    int a, b, c, d;
    double k;
    printf("Unesi brojeve a i b: ");
    scanf("%d %d", &a, &b);
    printf("Unesi brojeve c i d: ");
    scanf("%d %d", &c, &d);
    printf("Kolicnik brojeva a i b je %.2lf\n", kolicnik(a, b));
    printf("Kolicnik brojeva c i d je %.2lf", kolicnik(c, d));
    return 0;
}