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ću tablicu kako biste bolje razumjeli rekurzivni mehanizam koji se sastoji od pozivanja same funkcije dok se ne postigne osnovni slučaj ili uvjet zaustavljanja, 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