Funkcije u C programiranju s primjerima: rekurzivne i inline
ล to je funkcija u C-u?
Funkcija u C programiranju je viลกekratni blok koda koji program ฤini lakลกim za razumijevanje, testiranje i moลพe se lako modificirati bez mijenjanja pozivajuฤeg programa. Funkcije dijele kod i modulariziraju program za bolje i uฤinkovitije rezultate. Ukratko, veฤi program je podijeljen na razliฤite potprograme 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 naziva programa. To je obavezan dio za koriลกtenje funkcija u kodu. U deklaraciji funkcije samo navodimo naziv funkcije koju ฤemo koristiti u naลกem programu poput deklaracije varijable. Ne moลพemo koristiti funkciju ako nije deklarirana u programu. Deklaracija funkcije takoฤer se naziva "Funkcija prototip".
Deklaracije funkcija (zvane prototip) obiฤno se rade iznad glavne () funkcije i imaju opฤi oblik:
return_data_type function_name (data_type arguments);
- The vrsta_povratnih_podataka: je tip podataka funkcije vrijednosti vraฤen natrag pozivnoj izjavi.
- The naziv_funkcije: slijedi zagrada
- argumenti imena s njihovim deklaracijama tipa podataka po izboru se stavljaju 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);
Ovdje je 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.
Po defaultu, argumenti se prosljeฤuju po vrijednosti u kojem se kopija podataka daje pozvanoj funkciji. 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 na njih se ne moลพe pozivati โโizvan funkcije. Meฤutim, varijable koje su deklarirane izvan svih funkcija su globalne i dostupne iz cijelog programa. Konstante deklarirane s a #definirati na vrhu programa dostupni su iz cijelog programa. Razmatramo sljedeฤi program koji ispisuje vrijednost globalne varijable iz glavne i 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
Razmotrite faktorijel broja koji se izraฤunava kao ลกto slijedi 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.
Rezime
- Funkcija je mini-program ili potprogram.
- Funkcije se koriste za modularizaciju programa.
- Knjiลพnica i korisniฤki definirane dvije su vrste funkcija.
- Funkcija se sastoji od deklaracije, tijela funkcije i dijela poziva funkcije.
- Deklaracija funkcije i tijelo su obavezni.
- Poziv funkcije moลพe biti neobavezan u programu.
- C program ima barem jednu funkciju; to je glavna funkcija ().
- Svaka funkcija ima naziv, vrstu podataka povratne vrijednosti ili prazninu, parametre.
- Svaka funkcija mora biti definirana i deklarirana u vaลกem C programu.
- Imajte na umu da obiฤni varijable u C funkciji uniลกtavaju se ฤim izaฤemo iz poziva funkcije.
- Argumenti proslijeฤeni funkciji neฤe se promijeniti jer su proslijeฤeni vrijednoลกฤu none putem adrese.
- Opseg varijable naziva se vidljivost varijabli unutar programa
- Postoje globalne i lokalne varijable C programiranje




