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.

  • 🧩 Koje funkcije rade: Funkcija grupira instrukcije za višekratnu upotrebu, tako da se veliki program dijeli na manje, upravljive podprograme koje je jednostavnije debugirati.
  • 📚 Dvije vrste: Bibliotečke funkcije poput printf i scanf su gotove, dok korisnički definirane funkcije piše programer.
  • 📝 Tri dijela: Korištenje funkcije uključuje njezinu deklaraciju ili prototip, njezinu definiciju ili tijelo i poziv koji je izvršava.
  • 🎯 argumenti: Vrijednosti se prenose po poziciji i, prema zadanim postavkama, po vrijednosti, tako da izvorna varijabla ostaje nepromijenjena unutar pozvane funkcije.
  • 🌐 Opseg: Lokalne varijable žive samo unutar svoje funkcije, dok globalne i statičke varijable zadržavaju svoje vrijednosti unutar programa ili između poziva.
  • 🤖 AI pomoć: GitHub Copilot i AI asistenti scaffoldiraju C funkcije, predlažu tipove povrata i označavaju nedostajuće povrate ili neusklađene argumente.

Funkcije u C programiranju

Š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.

Što je funkcija u C-u

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:

  1. Funkcije knjižnice
  2. 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,

  1. Deklaracija funkcije
  2. Definicija funkcije
  3. 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:

Opseg varijable

  1. Deklariramo cjelobrojnu globalnu varijablu s 1348 kao početnom vrijednošću.
  2. 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.
  3. Ispisujemo globalnu varijablu unutar glavne funkcije.
  4. 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:

Rekurzivne funkcije

  1. 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.
  2. 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:

Rekurzivne funkcije

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.

Pitanja i odgovori

Poziv po vrijednosti kopira argument u funkciju, tako da promjene ostaju lokalne, a izvorna varijabla netaknuta. Poziv po referenci prosljeđuje adresu varijable putem pokazivača, omogućujući funkciji da izravno mijenja izvorne podatke pozivatelja.

Stvarni parametar je stvarna vrijednost ili varijabla koju pozivatelj prosljeđuje tijekom poziva funkcije. Formalni parametar je rezervirano mjesto navedeno u definiciji funkcije koja ga prima. Uspoređuju se po poziciji, prvi s prvim, drugi s drugim.

Funkcija AC vraća samo jednu vrijednost izravno s return. Da biste poslali natrag nekoliko rezultata, omotajte ih u strukturu, ispunite niz ili proslijedite pokazivače kao argumente tako da funkcija zapisuje svaki rezultat u vlastite varijable pozivatelja.

Funkcije donose mogućnost ponovne upotrebe, tako da se jedan blok izvršava više puta, i modularnost, koja dijeli veliki program na manje dijelove. Također poboljšavaju čitljivost, pojednostavljuju testiranje i otklanjanje pogrešaka te skrivaju složene detalje iza jednog imena, štedeći vrijeme razvoja.

Funkcija main() je ulazna točka gdje svaki C program započinje izvršavanje. Operativni sustav je prvo poziva, a njezina povratna vrijednost, obično 0, signalizira uspjeh. Za primanje argumenata naredbenog retka mogu biti potrebni argc i argv.

Rekurzija odgovara problemima s prirodno ponavljajućom strukturom, poput obilaska stabla ili faktorijala, dajući kraći i jasniji kod. Iteracija se obično izvodi brže i koristi manje memorije jer izbjegava ponovljene pozive. Odaberite rekurziju radi jasnoće, a iteraciju radi performansi na velikim ulazima.

Da. Pomoćnik za kodiranje umjetne inteligencije može napisati C funkciju iz jednostavnog prompta, predložiti parametre i tipove povrata te označiti greške poput nedostajućeg povrata ili neusklađenog argumenta. Uvijek kompajlirajte i testirajte generiranu funkciju prije nego što se oslonite na nju.

GitHub kopilot piše C funkcije, dovršavajući tijelo iz imena funkcije ili kratkog komentara te predlažući deklaracije, petlje i rekurzivne pozive. Često dodaje odgovarajući prototip iznad main(), iako biste ipak trebali pregledati logiku.

Sažmite ovu objavu uz: