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: