Funkcije u C programiranju s primjerima: rekurzivne i inline
โก Pametni saลพetak
Funkcije u C programiranju su blokovi koda koji se mogu ponovno koristiti i dijele veliki program na manje podprograme, ลกto olakลกava razumijevanje, testiranje i mijenjanje. Svaka funkcija ima deklaraciju, definiciju i pozivni dio.

ล to je funkcija u C-u?
Funkcija u C programiranju je blok koda koji se moลพe ponovno koristiti i koji olakลกava razumijevanje i testiranje programa te se moลพe lako mijenjati bez promjene pozivajuฤeg programa. Funkcije dijele kod i modulariziraju program radi boljih i uฤinkovitijih rezultata. Ukratko, veฤi program podijeljen je na razliฤite podprograme koji se nazivaju funkcijama.
Kada veliki program podijelite na razliฤite funkcije, postaje lako upravljati svakom funkcijom zasebno. Kad god se pojavi greลกka u programu, moลพete jednostavno istraลพiti neispravne funkcije i ispraviti samo te greลกke. Moลพete jednostavno pozvati i koristiti funkcije kad god su potrebne ลกto automatski dovodi do uลกtede vremena i prostora.
Knjiลพnica vs. Korisniฤki definirane funkcije
Svaki 'C' program ima najmanje jednu funkciju koja je glavna funkcija, ali program moลพe imati bilo koji broj funkcija. Funkcija main () u C-u je poฤetna toฤka programa.
U 'C' programiranju, funkcije se dijele na dvije vrste:
- Funkcije knjiลพnice
- Korisniฤki definirane funkcije
Razlika izmeฤu biblioteke i korisniฤki definiranih funkcija u C-u je u tome ลกto ne trebamo pisati kod za funkciju biblioteke. Veฤ je prisutan unutar datoteke zaglavlja koju uvijek ukljuฤujemo na poฤetku programa. Samo trebate upisati naziv funkcije i koristiti ga zajedno s odgovarajuฤom sintaksom. Printf, scanf su primjeri funkcija knjiลพnice.
Dok je korisniฤki definirana funkcija vrsta funkcije u kojoj moramo napisati tijelo funkcije i pozvati je kad god zahtijevamo da funkcija izvede neku operaciju u naลกem programu.
Korisniฤki definiranu funkciju u C-u uvijek piลกe korisnik, ali kasnije moลพe biti dio 'C' biblioteke. To je velika prednost 'C' programiranja.
Funkcije C programiranja podijeljene su u tri aktivnosti kao ลกto su,
- Deklaracija funkcije
- Definicija funkcije
- Poziv funkcije
Izjava o funkciji
Deklaracija funkcije znaฤi pisanje imena programa. To je obavezan dio koriลกtenja funkcija u kodu. U deklaraciji funkcije samo navodimo ime funkcije koju ฤemo koristiti u naลกem programu, poput deklaracije varijable. Funkciju ne moลพemo koristiti osim ako nije deklarirana u programu. Deklaracija funkcije naziva se i "prototip funkcije".
Deklaracije funkcija (zvane prototip) obiฤno se rade iznad glavne () funkcije i imaju opฤi oblik:
return_data_type function_name (data_type arguments);
- return_data_type: je tip podataka funkcije vrijednosti koja se vraฤa natrag u pozivajuฤu naredbu.
- Iza naziva_funkcije slijede zagrade
- Imena argumenata s njihovim deklaracijama tipova podataka, opcionalno, nalaze se unutar zagrada.
Razmatramo sljedeฤi program koji pokazuje kako deklarirati funkciju kocke za izraฤunavanje vrijednosti kocke cjelobrojne varijable
#include <stdio.h> /*Function declaration*/ int add(int a,b); /*End of Function declaration*/ int main() {
Imajte na umu da funkcija ne mora nuลพno vratiti vrijednost. U ovom sluฤaju koristi se kljuฤna rijeฤ void.
Na primjer, deklaracija funkcije output_message oznaฤava da funkcija ne vraฤa vrijednost: void output_message();
Definicija funkcije
Definicija funkcije znaฤi samo pisanje tijela funkcije. Tijelo funkcije sastoji se od naredbi koje ฤe izvrลกiti odreฤeni zadatak. Tijelo funkcije sastoji se od jednog ili bloka iskaza. Takoฤer je obavezan dio funkcije.
int add(int a,int b) //function body { int c; c=a+b; return c; }
Poziv funkcije
Poziv funkcije znaฤi pozivanje funkcije kad god je to potrebno u programu. Kad god pozovemo funkciju, ona izvodi operaciju za koju je dizajnirana. Poziv funkcije je izborni dio programa.
result = add(4,5);
Evo, kompletan kod:
#include <stdio.h> int add(int a, int b); //function declaration int main() { int a=10,b=20; int c=add(10,20); //function call printf("Addition:%d\n",c); getch(); } int add(int a,int b) //function body { int c; c=a+b; return c; }
Izlaz:
Addition:30
Argumenti funkcije
Argumenti funkcije koriste se za primanje potrebnih vrijednosti pozivom funkcije. Usklaฤeni su po poloลพaju; prvi argument se prosljeฤuje prvom parametru, drugi drugom parametru i tako dalje.
Prema zadanim postavkama, argumenti se prosljeฤuju kao vrijednost u kojoj se pozvanoj funkciji daje kopija podataka. Stvarno proslijeฤena varijabla se neฤe promijeniti.
Razmatramo sljedeฤi program koji pokazuje parametre proslijeฤene vrijednostima:
int add (int x, int y); int main() { int a, b, result; a = 5; b = 10; result = add(a, b); printf("%d + %d\ = %d\n", a, b, result); return 0;} int add (int x, int y) { x += y; return(x);}
Izlaz programa je:
5 + 10 = 15
Imajte na umu da vrijednosti a i b proslijeฤene funkciji dodavanja nisu promijenjene jer je samo njezina vrijednost proslijeฤena u parametar x.
Opseg varijable
Opseg varijable znaฤi vidljivost varijabli unutar koda programa.
U C-u, varijable koje su deklarirane unutar funkcije lokalne su za taj blok koda i ne moลพe se na njih pozivati โโizvan funkcije. Meฤutim, varijable koje su deklarirane izvan svih funkcija globalne su i dostupne su iz cijelog programa. Konstante deklarirane s #define na vrhu programa dostupne su iz cijelog programa. Razmatramo sljedeฤi program koji ispisuje vrijednost globalne varijable i iz glavne i iz korisniฤki definirane funkcije:
#include <stdio.h> int global = 1348; void test(); int main() { printf("from the main function : global =%d \n", global); test () ; return 0;} void test (){ printf("from user defined function : global =%d \n", global);}
Rezultat:
from the main function : global =1348 from user defined function : global =1348
Razgovaramo o detaljima programa:
- Deklariramo cjelobrojnu globalnu varijablu s 1348 kao poฤetnom vrijednoลกฤu.
- Deklariramo i definiramo funkciju test() koja ne prima argumente niti vraฤa vrijednost. Ova funkcija samo ispisuje vrijednost globalne varijable kako bi se pokazalo da se globalnim varijablama moลพe pristupiti bilo gdje u programu.
- Ispisujemo globalnu varijablu unutar glavne funkcije.
- Pozivamo test funkciju kako bismo ispisali vrijednost globalne varijable.
U C-u, kada se argumenti prosljeฤuju parametrima funkcije, parametri djeluju kao lokalne varijable koje ฤe biti uniลกtene prilikom izlaska iz funkcije.
Kada koristite globalne varijable, koristite ih s oprezom jer mogu dovesti do pogreลกaka i mogu se promijeniti bilo gdje u programu. Treba ih inicijalizirati prije koriลกtenja.
Statiฤke varijable
Statiฤke varijable imaju lokalni opseg. Meฤutim, oni se ne uniลกtavaju prilikom izlaska iz funkcije. Stoga statiฤka varijabla zauvijek zadrลพava svoju vrijednost i moลพe joj se pristupiti kada se funkcija ponovno unese. Statiฤka varijabla se inicijalizira kada se deklarira i treba joj prefiks static.
Sljedeฤi program koristi statiฤku varijablu:
#include <stdio.h> void say_hi(); int main() { int i; for (i = 0; i < 5; i++) { say_hi();} return 0;} void say_hi() { static int calls_number = 1; printf("Hi number %d\n", calls_number); calls_number ++; }
Program prikazuje:
Hi number 1 Hi number 2 Hi number 3 Hi number 4 Hi number 5
Rekurzivne funkcije
Razmotrimo faktorijel broja koji se izraฤunava na sljedeฤi naฤin: 6! = 6 * 5 * 4 * 3 * 2 * 1.
Ovaj izraฤun se izvodi kao opetovano izraฤunavanje ฤinjenice * (ฤinjenica -1) dok ฤinjenica ne bude jednaka 1.
Rekurzivna funkcija je funkcija koja poziva samu sebe i ukljuฤuje izlazni uvjet kako bi zavrลกila rekurzivne pozive. U sluฤaju izraฤuna faktorijelnog broja, izlazni uvjet je ฤinjenica jednaka 1. Rekurzija funkcionira tako ลกto "slaลพe" pozive sve dok izlazni uvjet nije istinit.
Na primjer:
#include <stdio.h> int factorial(int number); int main() { int x = 6; printf("The factorial of %d is %d\n", x, factorial(x)); return 0;} int factorial(int number) { if (number == 1) return (1); /* exiting condition */ else return (number * factorial(number - 1)); }
Program prikazuje:
The factorial of 6 is 720
Ovdje raspravljamo o detaljima programa:
- Deklariramo naลกu rekurzivnu faktorijelnu funkciju koja uzima cjelobrojni parametar i vraฤa faktorijel tog parametra. Ova funkcija ฤe se sama pozvati i smanjivati โโbroj dok se ne izaฤe ili ne postigne osnovno stanje. Kada je uvjet istinit, prethodno generirane vrijednosti pomnoลพit ฤe se jedna s drugom, a konaฤna faktorijelna vrijednost se vraฤa.
- Deklariramo i inicijaliziramo cjelobrojnu varijablu s vrijednoลกฤu "6", a zatim ispisujemo njezinu vrijednost faktorijela pozivanjem naลกe funkcije faktorijela.
Razmotrite sljedeฤi grafikon kako biste bolje razumjeli rekurzivni mehanizam koji se sastoji od pozivanja same funkcije sve dok se ne postigne osnovni sluฤaj ili zaustaviping uvjet je postignut, a nakon toga prikupljamo prethodne vrijednosti:
Inline funkcije
Funkcija u C programiranju sluลพi za pohranjivanje najฤeลกฤe koriลกtenih instrukcija. Koristi se za modularizaciju programa.
Kad god se funkcija pozove, pokazivaฤ instrukcije skaฤe na definiciju funkcije. Nakon izvrลกavanja funkcije, pokazivaฤ instrukcije vraฤa se na naredbu odakle je skoฤio na definiciju funkcije.
Kad god koristimo funkcije, potrebna nam je dodatna pokazivaฤ glavu za skok na definiciju funkcije i povratak na iskaz. Kako bismo uklonili potrebu za takvim glavama pokazivaฤa, koristimo ugraฤene funkcije.
U ugraฤenoj funkciji, poziv funkcije izravno se zamjenjuje stvarnim programskim kodom. Ne skaฤe ni na jedan blok jer se sve operacije izvode unutar ugraฤene funkcije.
Inline funkcije se uglavnom koriste za mala izraฤunavanja. Nisu prikladni kada je ukljuฤeno veliko raฤunalstvo.
Inline funkcija sliฤna je normalnoj funkciji osim ลกto se kljuฤna rijeฤ inline nalazi ispred naziva funkcije. Inline funkcije se stvaraju sa sljedeฤom sintaksom:
inline function_name ()
{
//function definition
}
Napiลกimo program za implementaciju ugraฤene funkcije.
inline int add(int a, int b) //inline function declaration { return(a+b); } int main() { int c=add(10,20); printf("Addition:%d\n",c); getch(); }
Izlaz:
Addition: 30
Gornji program pokazuje koriลกtenje ugraฤene funkcije za zbrajanje dvaju brojeva. Kao ลกto vidimo, vratili smo zbrajanje na dva broja unutar ugraฤene funkcije samo bez pisanja dodatnih redaka. Tijekom poziva funkcije upravo smo proslijedili vrijednosti na kojima moramo izvrลกiti zbrajanje.




