Professional Documents
Culture Documents
Potprogrami:
• dekompozicija složenih problema
na jednostavnije
• procesna apstrakcija
• samo funkcije (nema procedura)
• funkcija - n-arni operator
najvišeg prioriteta
• vraća rezultat (preko imena) +
bočni efekti, oboje opciono
Definisanje funkcija
tip ime(argumenti) telo
ime funkcije
• identifikator
tip funkcije
• mogu svi standardni skalarni tipovi,
kao i korisnički definisani tipovi
• po starim verzijama može izostati i
onda se podrazumeva tip int
• void – funkcija ne vraća vrednost
Definisanje funkcija
tip funkcije
• ako stoji * ispred imena – vrednost
funkcije je pokazivač na objekat
navedenog tipa
• može i generički pokazivač (void *),
pokazivač na pokazivač, ...
• vrednost mora da bude
samo jedan objekat
(zato tip ne može biti niz)
ali može biti pokazivač
Definisanje funkcija
argumenti funkcije
• formalni (u definiciji) – parametri
• stvarni (u pozivu) - argumenti
• može bez parametara – f() ili f(void)
• unošenje vrednosti i
iznošenje rezultata
• proizvoljan broj argumenata
razdvojenih sa ,
• definišu se kao i promenljive,
ali tip i kvalifikator za svaki posebno
(npr. double x, double y)
Definisanje funkcija
argumenti funkcije
• argument može da bude niz
zadatog tipa ili
pokazivač na dati tip (int *a)
• za 1-D niz ne mora dužina, samo []
(int a[])
• za n-D moraju se navesti dužine za
sve dimenzije osim za prvu
(int b[][5])
Definisanje funkcija
• inicijalizuju se vrednostima
stvarnih argumenata
• pokazivač se ne menja
• indirektan pristup
Prenos argumenata
• skalarni - po vrednosti
povratak iz funkcije
• naredba return
• argument – izraz
koji predstavlja vrednost funkcije
povratak iz funkcije
poziv se vrši
• u okviru izraza
• ako funkcija ne vraća vrednost ili ona
nije potrebna =>
poziv može i kao posebna naredba
• još može i u nizu izraza, kao i u
ternarnom izrazu kao izraz2 ili izraz3
Pozivanje funkcija
• izračunavaju se proizvoljnim
redosledom pre pozivanja funkcije
Pozivanje funkcija
stvarni argumenti pri pozivu
• po potrebi se konvertuju
u tip fomalnih
#include <stdio.h>
return zbir;
}
…
Primer pozivanja
main () {
…
Pozivanje funkcija
#include <stdio.h>
#include <math.h>
int main () {
double x, y, r, fi;
• glavni program –
funkcija int main() koju poziva OS
Obrada programskog sistema
prevođenje
prevođenje
prototip
prototip
• ne rezerviše prostor
prototip
prototip
lokalne
• promenljive definisane
na početku tela funkcije
• važe samo unutar funkcije,
nevidljive za druge funkcije
• mogu ista imena u različitim
funkcijama - različite promenljive
Lokalne i globalne
promenljive
globalne
• oblast važenja –
od mesta definicije
do kraja datoteke
Lokalne i globalne
promenljive
globalne
• obavezna deklaracija
(samo osobine)
• nema dodele prostora
i inicijalizacije
• koristi se službena reč extern
ispred
Lokalne i globalne
promenljive
prenos podataka
preko globalnih promenljivih
• manje fleksibilan
(svaki poziv obrađuje iste
promenljive)
Lokalne i globalne
promenljive
/* primer prenosa podataka preko globalnih promenljivih */
/* jedna datoteka, 1 deo */
#include <stdio.h>
#include <math.h>
double x, y, r, fi;
int main () {
#include <math.h>
r = sqrt(x*x+y*y);
fi = (x==0 && y==0) ? 0 : atan2(y,x);
}
...
Lokalne i globalne
promenljive
/* primer prenosa podataka preko globalnih promenljivih */
/* dve datoteka; druga datoteka */
#include <stdio.h>
double x, y, r, fi;
void polar (void);
int main () {
extern double x,y,r,fi;
int i, j, k; // int i, j, k;
globalne
statičke
automatske
registri
globalne promenljive
globalne promenljive
statičke promenljive:
statičke promenljive:
automatske promenljive
• eksplicitno sa auto
Kategorije promenljivih
automatske promenljive
• inicijalizacija
izrazima koji mogu da sadrže promenljive,
ali sa definisanim vrednostima
ako nema eksplicitne početne vrednosti,
onda slučajno
Kategorije promenljivih
registri
• prefiks register
za definiciju makroa
uslovno prevođenje:
#if izraz
prevodi do #else ili #endif ako je izraz tačan
#ifdef ime
prevodi ako je ime prethodno def. sa #define
#ifndef ime
prevodi ako ime nije prethodno def. sa #define
#else
početak alternativnog bloka
#endif
kraj uslovnog bloka
Rekurzivne funkcije
• otkrivanje grešaka
teže nego kod iterativnih
Rekurzivne funkcije
• int fakt(int n) {
return (n>0) ? (n*fakt(n-1)):1;}
• N+1 puta se
poziva funkcija
inicijalizuje formalni argument
ispituje vrednost argumenta,
oduzima i množi, uključući čuvanje i
obnavljanje steka
Rekurzivne funkcije
• funkcije su objekti
na koje se može pokazivati
standardne naredbe za
definiciju promenljivih, npr.
pri pozivu
• *f(x, n)
prvo se poziva funkcija
(zbog višeg prioriteta),
a zatim indirektno adresiranje
• (*pf)(x, n)
prvo indirektno adresiranje na pokazivač pf,
a zatim poziv funkcije
Pokazivači na funkcije
• npr. :
Primer:
#include <stdio.h>
int main() {
#include <math.h>
#include <stdio.h>
#include <stdarg.h>
int zbir (int n, ...) {
int s,i; va_list pa; va_start (pa,n);
for (s=i=0; i<n; i++)
s+=va_arg(pa, int);
va_end(pa);
return s;
}
Primer: zbir promenljivog broja
argumenata
#include <stdio.h>
int main() {
printf (“1+2= %d\n”, zbir(2,1,2));
printf (“1+2+3= %d\n”,
zbir(3,1,2,3));
}