Funktsioonid C-programmeerimises näidetega: Rekursiivne ja Inline

Mis on funktsioon C-s?

Funktsioon C programmeerimisel on korduvkasutatav koodiplokk, mis muudab programmi lihtsamini mõistetavaks, testitavaks ja mida saab hõlpsasti muuta ilma kutsuvat programmi muutmata. Funktsioonid jagavad koodi ja moduleerivad programmi paremate ja tõhusamate tulemuste saavutamiseks. Lühidalt öeldes on suurem programm jagatud erinevateks alamprogrammideks, mida nimetatakse funktsioonideks

Mis on funktsioon C-s

Kui jagate suure programmi erinevateks funktsioonideks, muutub iga funktsiooni eraldi haldamine lihtsaks. Kui programmis ilmneb tõrge, saate vigaseid funktsioone hõlpsalt uurida ja parandada ainult neid vigu. Saate hõlpsasti helistada ja funktsioone kasutada alati, kui neid vajatakse, mis säästab automaatselt aega ja ruumi.

Raamatukogu vs. Kasutaja määratud funktsioonid

Igal C-programmil on vähemalt üks funktsioon, mis on põhifunktsioon, kuid programmil võib olla suvaline arv funktsioone. Peamine () funktsioon C-s on programmi alguspunkt.

"C" programmeerimisel on funktsioonid jagatud kahte tüüpi:

  1. Raamatukogu funktsioonid
  2. Kasutaja määratud funktsioonid

Teegi ja kasutaja määratud funktsioonide erinevus C-s seisneb selles, et me ei pea raamatukogu funktsiooni jaoks koodi kirjutama. See on juba olemas päisefailis, mille lisame alati programmi algusesse. Peate lihtsalt sisestama funktsiooni nime ja kasutama seda koos õige süntaksiga. Printf, scanf on raamatukogu funktsiooni näited.

Seevastu kasutaja määratud funktsioon on funktsiooni tüüp, mille puhul peame kirjutama funktsiooni keha ja kutsuma funktsiooni alati, kui vajame funktsiooni meie programmis mõne toimingu sooritamiseks.

Kasutaja määratud funktsiooni C-s kirjutab alati kasutaja, kuid hiljem võib see olla osa 'C' teegist. See on "C" programmeerimise suur eelis.

C programmeerimisfunktsioonid on jagatud kolmeks tegevuseks, näiteks

  1. Funktsiooni deklaratsioon
  2. Funktsiooni määratlus
  3. Funktsioonikutse

Funktsioonide deklaratsioon

Funktsiooni deklaratsioon tähendab programmi nime kirjutamist. See on koodis funktsioonide kasutamise kohustuslik osa. Funktsiooni deklaratsioonis määrame lihtsalt funktsiooni nime, mida me oma programmis nagu muutuja deklaratsiooni kasutame. Me ei saa kasutada funktsiooni, kui see pole programmis deklareeritud. Funktsiooni deklaratsiooni nimetatakse ka funktsiooniks prototüüp. "

Funktsioonide deklaratsioonid (mida nimetatakse prototüübiks) tehakse tavaliselt põhifunktsiooni () kohal ja need on üldisel kujul:

return_data_type function_name (data_type arguments);
  • . tagastamise_andmete_tüüp: on kutsuvasse lausesse tagasi tagastatud väärtusfunktsiooni andmetüüp.
  • . funktsiooni_nimi: järgnevad sulud
  • Argumendid nimed koos nende andmetüübi deklaratsioonidega paigutatakse valikuliselt sulgudesse.

Vaatleme järgmist programmi, mis näitab, kuidas deklareerida kuubifunktsiooni täisarvulise muutuja kuubiväärtuse arvutamiseks

#include <stdio.h>
/*Function declaration*/
int add(int a,b);
/*End of Function declaration*/
int main() {

Pidage meeles, et funktsioon ei pruugi tagastada väärtust. Sel juhul kasutatakse märksõna void.

Näiteks funktsiooni deklaratsioon output_message näitab, et funktsioon ei tagasta väärtust: void output_message();

Funktsiooni definitsioon

Funktsiooni määratlus tähendab lihtsalt funktsiooni keha kirjutamist. Funktsiooni keha koosneb väidetest, mis täidavad konkreetset ülesannet. Funktsiooni keha koosneb ühest lausest või lausete plokist. See on ka funktsiooni kohustuslik osa.

int add(int a,int b)	//function body	
{
	int c;
	c=a+b;
	return c;
}

Funktsioonikutse

Funktsioonikutse tähendab funktsiooni kutsumist alati, kui seda programmis nõutakse. Kui me funktsiooni kutsume, sooritab see toimingu, mille jaoks see on loodud. Funktsioonikutse on programmi valikuline osa.

  result = add(4,5);

Siin on täielik kood:

#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;
}

Väljund:

Addition:30

Funktsiooni argumendid

Funktsiooni argumente kasutatakse vajalike väärtuste saamiseks funktsioonikutsega. Need on sobitatud positsiooni järgi; esimene argument edastatakse esimesele parameetrile, teine ​​teisele parameetrile ja nii edasi.

Vaikimisi argumendid edastatakse väärtuse järgi milles kutsutavale funktsioonile antakse andmete koopia. Tegelikult edastatud muutuja ei muutu.

Vaatleme järgmist programmi, mis näitab väärtuste järgi edastatud parameetreid:

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);}

Programmi väljund on:

5 + 10 = 15

Pidage meeles, et funktsiooni a ja b väärtusi ei muudetud funktsiooni lisamiseks, kuna parameetrisse x edastati ainult selle väärtus.

Muutuv ulatus

Muutuja ulatus tähendab muutujate nähtavust programmi koodis.

C-s on funktsiooni sees deklareeritud muutujad selle koodiploki jaoks kohalikud ja neile ei saa viidata väljaspool funktsiooni. Muutujad, mis on deklareeritud väljaspool kõiki funktsioone, on aga globaalsed ja juurdepääsetavad kogu programmist. A-ga deklareeritud konstandid #defineeri programmi ülaosas on juurdepääsetavad kogu programmist. Vaatleme järgmist programmi, mis prindib globaalse muutuja väärtuse nii põhi- kui ka kasutaja määratud funktsioonist:

#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);}

Tulemus:

from the main function : global =1348
from user defined function : global =1348

Arutame programmi üksikasju:

Muutuv ulatus

  1. Deklareerime täisarvulise globaalse muutuja, mille algväärtus on 1348.
  2. Deklareerime ja määratleme funktsiooni test(), mis ei võta argumente ega tagasta väärtust. See funktsioon prindib ainult globaalse muutuja väärtuse, et näidata, et globaalsetele muutujatele on juurdepääs programmis kõikjal.
  3. Trükime globaalse muutuja põhifunktsiooni sees.
  4. Globaalse muutuja väärtuse printimiseks kutsume välja testfunktsiooni.

Kui C-s edastatakse argumendid funktsiooni parameetritele, toimivad parameetrid kohalike muutujatena, mis funktsioonist väljumisel hävitatakse.

Kui kasutate globaalsed muutujad, kasutage neid ettevaatlikult, kuna need võivad põhjustada vigu ja need võivad programmis kõikjal muutuda. Enne kasutamist tuleb need lähtestada.

Staatilised muutujad

Staatilistel muutujatel on lokaalne ulatus. Funktsioonist väljumisel neid aga ei hävitata. Seetõttu säilitab staatiline muutuja oma väärtuse igavesti ja sellele pääseb juurde funktsiooni uuesti sisestamisel. Staatiline muutuja initsialiseeritakse deklareerimisel ja vajab eesliidet staatiline.

Järgmine programm kasutab staatilist muutujat:

#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 ++; }

Programm kuvab:

Hi number 1
Hi number 2
Hi number 3
Hi number 4
Hi number 5

Rekursiivsed funktsioonid

Vaatleme arvu faktoriaali, mis arvutatakse järgmiselt 6! =6*5*4*3*2*1.

Seda arvutust tehakse korduva fakti * (fakt -1) arvutamisena, kuni fakt võrdub 1-ga.

Rekursiivne funktsioon on funktsioon, mis kutsub ennast välja ja sisaldab väljumistingimust rekursiivsete kõnede lõpetamiseks. Faktoriaalarvu arvutamise puhul on väljumise tingimuseks fakt, mis on võrdne 1-ga. Rekursioon toimib kõnede virnastamise teel, kuni väljumise tingimus on tõene.

Näiteks:

#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));
}

Programm kuvab:

 The factorial of 6 is 720

Siin arutame programmi üksikasju:

Rekursiivsed funktsioonid

  1. Deklareerime oma rekursiivse faktoriaalfunktsiooni, mis võtab täisarvulise parameetri ja tagastab selle parameetri faktoriaali. See funktsioon helistab ise ja vähendab numbrit, kuni on saavutatud väljumine või põhitingimus. Kui tingimus on tõene, korrutatakse eelnevalt loodud väärtused üksteisega ja tagastatakse lõplik faktoriaalväärtus.
  2. Deklareerime ja initsialiseerime täisarvulise muutuja väärtusega "6" ja prindime seejärel selle faktoriaalväärtuse, kutsudes esile meie faktoriaalfunktsiooni.

Mõelge järgmisele diagrammile, et paremini mõista rekursiivset mehhanismi, mis seisneb funktsiooni enda kutsumises kuni põhijuhtumi või peatumistingimuse saavutamiseni, ja pärast seda kogume eelmised väärtused:

Rekursiivsed funktsioonid

Tekstisisesed funktsioonid

C-programmeerimise funktsiooni kasutatakse kõige sagedamini kasutatavate käskude salvestamiseks. Seda kasutatakse programmi modulariseerimiseks.

Kui funktsiooni kutsutakse, hüppab käsu osuti funktsiooni määratlusele. Pärast funktsiooni täitmist langeb käsu osuti tagasi avaldusele, kust see hüppas funktsiooni määratlusele.

Funktsioonide kasutamisel vajame lisa pointer funktsiooni definitsiooni juurde hüppamiseks ja avalduse juurde naasmiseks suunduge. Selliste osutipeade vajaduse kaotamiseks kasutame sisemisi funktsioone.

Siseses funktsioonis asendatakse funktsioonikutse otse tegeliku programmikoodiga. See ei hüppa ühelegi plokile, kuna kõik toimingud tehakse sisemise funktsiooni sees.

Inline funktsioone kasutatakse enamasti väikeste arvutuste jaoks. Need ei sobi, kui tegemist on suure andmetöötlusega.

Tekstisisene funktsioon sarnaneb tavalisele funktsioonile, välja arvatud see, et märksõna tekstisisene on funktsiooni nime ees. Tekstisisesed funktsioonid luuakse järgmise süntaksiga:

inline function_name ()
{
    //function definition
}

Kirjutame programmi sisemise funktsiooni rakendamiseks.

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();
}

Väljund:

Addition: 30

Ülaltoodud programm demonstreerib sisemise funktsiooni kasutamist kahe numbri liitmiseks. Nagu näeme, oleme reafunktsioonis tagastanud kahe arvu liitmise ainult ilma täiendavaid ridu kirjutamata. Funktsioonikõne ajal oleme just edastanud väärtused, millele peame liitma.

kokkuvõte

  • Funktsioon on miniprogramm või alamprogramm.
  • Funktsioone kasutatakse programmi modulariseerimiseks.
  • Teek ja kasutaja määratud on kahte tüüpi funktsioonid.
  • Funktsioon koosneb deklaratsioonist, funktsiooni kehast ja funktsiooni kutseosast.
  • Ametikoha deklaratsioon ja keha on kohustuslikud.
  • Funktsioonikutse võib programmis olla valikuline.
  • C programmil on vähemalt üks funktsioon; see on põhifunktsioon ().
  • Igal funktsioonil on nimi, tagastatava väärtuse andmetüüp või tühimik, parameetrid.
  • Iga funktsioon tuleb teie C-programmis määratleda ja deklareerida.
  • Pea meeles, et tavaline muutujad funktsioonis C hävitatakse kohe, kui funktsioonikutsest väljume.
  • Funktsioonile edastatud argumente ei muudeta, kuna need edastati väärtuse, mitte aadressi järgi.
  • Muutujate ulatust nimetatakse muutujate nähtavaks programmi sees
  • Seal on globaalsed ja kohalikud muutujad C programmeerimine