Funcții în programarea C cu exemple: recursive și inline

⚡ Rezumat inteligent

Funcțiile din programarea C sunt blocuri de cod reutilizabile care împart un program mare în subprograme mai mici, facilitând înțelegerea, testarea și modificarea acestuia. Fiecare funcție are o declarație, o definiție și o parte de apel.

  • 🧩 Ce funcții fac: O funcție grupează instrucțiuni reutilizabile, astfel încât un program mare se împarte în subprograme mai mici, ușor de gestionat, care sunt mai simplu de depanat.
  • 📚 Doua tipuri: Funcțiile de bibliotecă precum printf și scanf sunt predefinite, în timp ce funcțiile definite de utilizator sunt scrise de programator.
  • 📝 Trei părți: Utilizarea unei funcții implică declarația sau prototipul acesteia, definiția sau corpul acesteia și apelul care o execută.
  • 🎯 argumente: Valorile sunt transmise prin poziție și, implicit, prin valoare, astfel încât variabila originală rămâne neschimbată în interiorul funcției apelate.
  • 🌐 Domeniu de aplicare: Variabilele locale există doar în interiorul funcției lor, în timp ce variabilele globale și statice își păstrează valorile în cadrul programului sau între apeluri.
  • 🤖 Asistență AI: Asistenții GitHub Copilot și AI definesc funcțiile C, sugerează tipuri de date returnate și semnalează valorile returnate lipsă sau argumentele nepotrivite.

Funcții în programarea C

Ce este o funcție în C?

Funcție în programarea C este un bloc de cod reutilizabil care face un program mai ușor de înțeles, de testat și poate fi ușor modificat fără a schimba programul apelant. Funcțiile împart codul și modularizează programul pentru rezultate mai bune și mai eficiente. Pe scurt, un program mai mare este împărțit în diverse subprograme care sunt apelate ca funcții.

Ce este o funcție în C

Când împărțiți un program mare în diferite funcții, devine ușor să gestionați fiecare funcție în mod individual. Ori de câte ori apare o eroare în program, puteți investiga cu ușurință funcțiile defecte și puteți corecta numai acele erori. Puteți apela și utiliza cu ușurință funcții ori de câte ori sunt necesare, ceea ce duce automat la economisirea de timp și spațiu.

Biblioteca vs. Funcții definite de utilizator

Fiecare program „C” are cel puțin o funcție care este funcția principală, dar un program poate avea orice număr de funcții. Funcția principală () din C este un punct de plecare al unui program.

În programarea „C”, funcțiile sunt împărțite în două tipuri:

  1. Funcțiile bibliotecii
  2. Funcții definite de utilizator

Diferența dintre bibliotecă și funcțiile definite de utilizator în C este că nu trebuie să scriem un cod pentru o funcție de bibliotecă. Este deja prezent în fișierul antet pe care îl includem întotdeauna la începutul unui program. Trebuie doar să tastați numele unei funcții și să o utilizați împreună cu sintaxa adecvată. Printf, scanf sunt exemple de funcție de bibliotecă.

În timp ce, o funcție definită de utilizator este un tip de funcție în care trebuie să scriem corpul unei funcții și să apelăm funcția ori de câte ori solicităm ca funcția să efectueze o operație în programul nostru.

O funcție definită de utilizator în C este întotdeauna scrisă de utilizator, dar mai târziu poate face parte din biblioteca „C”. Este un avantaj major al programării „C”.

Funcțiile de programare C sunt împărțite în trei activități, cum ar fi,

  1. Declarația funcției
  2. Definirea funcției
  3. Apel de funcție

Declarația funcției

Declararea unei funcții înseamnă scrierea numelui unui program. Este o parte obligatorie pentru utilizarea funcțiilor în cod. Într-o declarație de funcție, specificăm doar numele funcției pe care o vom folosi în programul nostru, ca o declarație de variabilă. Nu putem folosi o funcție decât dacă este declarată într-un program. O declarație de funcție este numită și „prototip de funcție”.

Declarațiile de funcție (numite prototip) sunt de obicei făcute deasupra funcției principale () și iau forma generală:

return_data_type function_name (data_type arguments);
  • return_data_type: este tipul de date al funcției value returnat instrucțiunii apelante.
  • Numele_funcției: este urmat de paranteze
  • Numele argumentelor cu declarațiile lor de tip de date sunt plasate opțional între paranteze.

Luăm în considerare următorul program care arată cum se declară o funcție cub pentru a calcula valoarea cubului unei variabile întregi

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

Rețineți că o funcție nu returnează neapărat o valoare. În acest caz, este folosit cuvântul cheie void.

De exemplu, declarația funcției output_message indică faptul că funcția nu returnează o valoare: void output_message();

Definiția funcției

Definiția funcției înseamnă doar scrierea corpului unei funcții. Un corp al unei funcții este format din instrucțiuni care vor îndeplini o anumită sarcină. Un corp de funcție este format dintr-un singur sau dintr-un bloc de instrucțiuni. Este, de asemenea, o parte obligatorie a unei funcții.

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

Apel de funcție

Un apel de funcție înseamnă apelarea unei funcții ori de câte ori este necesară într-un program. Ori de câte ori apelăm o funcție, aceasta efectuează o operație pentru care a fost concepută. Un apel de funcție este o parte opțională a unui program.

  result = add(4,5);

Iată codul complet:

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

ieșire:

Addition:30

Argumente funcționale

Argumentele unei funcții sunt folosite pentru a primi valorile necesare prin apelul funcției. Ele sunt potrivite după poziție; primul argument este transmis primului parametru, al doilea celui de-al doilea parametru și așa mai departe.

În mod implicit, argumentele sunt transmise prin valoare, în care o copie a datelor este dată funcției apelate. Variabila transmisă efectiv nu se va modifica.

Luăm în considerare următorul program care demonstrează parametrii trecuți după valoare:

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

Ieșirea programului este:

5 + 10 = 15

Rețineți că valorile lui a și b au fost transmise funcției de adunare nu au fost modificate deoarece doar valoarea acesteia a fost transmisă în parametrul x.

Domeniul de aplicare variabil

Domeniul de aplicare al variabilei înseamnă vizibilitatea variabilelor într-un cod al programului.

În C, variabilele declarate în interiorul unei funcții sunt locale blocului de cod respectiv și nu pot fi accesate în afara funcției. Cu toate acestea, variabilele declarate în afara tuturor funcțiilor sunt globale și accesibile din întregul program. Constantele declarate cu #define la începutul unui program sunt accesibile din întregul program. Considerăm următorul program care afișează valoarea variabilei globale atât din funcția principală, cât și din funcția definită de utilizator:

#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

Discutăm detaliile programului:

Domeniul de aplicare variabil

  1. Declaram o variabila globala intreaga cu 1348 ca valoare initiala.
  2. Declaram si definim o functie test() care nici nu preia argumente si nici nu returneaza o valoare. Această funcție imprimă doar valoarea variabilei globale pentru a demonstra că variabilele globale pot fi accesate oriunde în program.
  3. Tipărim variabila globală în cadrul funcției principale.
  4. Apelăm funcția de testare pentru a imprima valoarea variabilei globale.

În C, când argumentele sunt transmise parametrilor funcției, parametrii acționează ca variabile locale care vor fi distruse la ieșirea din funcție.

Când utilizați variabile globale, folosiți-le cu prudență deoarece pot duce la erori și se pot schimba oriunde într-un program. Acestea trebuie inițializate înainte de utilizare.

Variabile statice

Variabilele statice au un scop local. Cu toate acestea, ele nu sunt distruse la ieșirea din funcție. Prin urmare, o variabilă statică își păstrează valoarea pentru totdeauna și poate fi accesată atunci când funcția este reintrodusă. O variabilă statică este inițializată atunci când este declarată și are nevoie de prefixul static.

Următorul program utilizează o variabilă statică:

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

Programul afișează:

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

Funcții recursive

Luați în considerare factorialul unui număr care se calculează după cum urmează: 6! =6* 5* 4* 3* 2* 1.

Acest calcul se face ca calcul repetat al faptului * (fapt -1) până când faptul este egal cu 1.

O funcție recursivă este o funcție care se autoapelează și include o condiție de ieșire pentru a finaliza apelurile recursive. În cazul calculului numărului factorial, condiția de ieșire este de fapt egală cu 1. Recursiunea funcționează prin „stivuirea” apelurilor până când condiția de ieșire este adevărată.

De exemplu:

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

Programul afișează:

 The factorial of 6 is 720

Aici, discutăm detaliile programului:

Funcții recursive

  1. Declaram functia factoriala recursiva care ia un parametru intreg si returneaza factorialul acestui parametru. Această funcție se va autoapela și va scădea numărul până când se va ajunge la ieșire sau condiția de bază. Când condiția este adevărată, valorile generate anterior vor fi înmulțite între ele, iar valoarea factorială finală este returnată.
  2. Declaram și inițializam o variabilă întreagă cu valoarea „6″ și apoi imprimăm valoarea sa factorială apelând funcția noastră factorială.

Luați în considerare diagrama următoare pentru a înțelege mai bine mecanismul recursiv care constă în apelarea funcției în sine până la cazul de bază sau oprireping condiția este atinsă, iar după aceea, colectăm valorile anterioare:

Funcții recursive

Funcții în linie

Funcția în programarea C este folosită pentru a stoca instrucțiunile cele mai frecvent utilizate. Este folosit pentru modularizarea programului.

Ori de câte ori este apelată o funcție, indicatorul de instrucțiune sare la definiția funcției. După executarea unei funcții, indicatorul de instrucțiune revine la instrucțiunea de unde a sărit la definiția funcției.

Ori de câte ori folosim funcții, avem nevoie de un plus indicatorul cap pentru a sări la definiția funcției și a reveni la instrucțiune. Pentru a elimina necesitatea unor astfel de capete de indicator, folosim funcții inline.

Într-o funcție inline, un apel de funcție este înlocuit direct cu un cod de program real. Nu sare la niciun bloc deoarece toate operațiunile sunt efectuate în interiorul funcției inline.

Funcțiile inline sunt utilizate în principal pentru calcule mici. Ele nu sunt potrivite atunci când sunt implicate calculatoare mari.

O funcție inline este similară cu funcția normală, cu excepția faptului că cuvântul cheie inline este plasat înaintea numelui funcției. Funcțiile inline sunt create cu următoarea sintaxă:

inline function_name ()
{
    //function definition
}

Să scriem un program pentru a implementa o funcție inline.

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

ieșire:

Addition: 30

Programul de mai sus demonstrează utilizarea unei funcții inline pentru adăugarea a două numere. După cum putem vedea, am returnat adunarea pe două numere în cadrul funcției inline numai fără a scrie linii suplimentare. În timpul apelului de funcție tocmai am transmis valori pe care trebuie să efectuăm adunarea.

Întrebări frecvente

Apelul prin valoare copiază argumentul în funcție, astfel încât modificările rămân locale, iar variabila originală este neatinsă. Apelul prin referință transmite adresa variabilei printr-un pointer, permițând funcției să modifice direct datele originale ale apelantului.

Parametrul real este valoarea sau variabila reală pe care apelantul o transmite în timpul unui apel de funcție. Parametrul formal este provizoriul numit în definiția funcției care îl primește. Aceștia sunt potriviți după poziție, de la primul la primul, de la al doilea la al doilea.

Funcția AC returnează o singură valoare direct cu return. Pentru a trimite mai multe rezultate, încadrați-le într-o structură, completați un array sau transmiteți pointeri ca argumente, astfel încât funcția să scrie fiecare rezultat în propriile variabile ale apelantului.

Funcțiile aduc reutilizabilitate, astfel încât un bloc rulează de mai multe ori, și modularitate, ceea ce împarte un program mare în părți mai mici. De asemenea, îmbunătățesc lizibilitatea, simplifică testarea și depanarea și ascund detalii complexe în spatele unui singur nume, economisind timp de dezvoltare.

Funcția main() este punctul de intrare prin care fiecare program C începe execuția. Sistemul de operare o apelează prima, iar valoarea sa returnată, de obicei 0, semnalează succesul. Este posibil să fie nevoie de argc și argv pentru a primi argumente în linia de comandă.

Recursivitatea se potrivește problemelor cu o structură repetitivă naturală, cum ar fi traversarea arborilor sau factorialii, oferind un cod mai scurt și mai clar. Iterația se execută de obicei mai rapid și utilizează mai puțină memorie, deoarece evită apelurile repetate. Alegeți recursivitatea pentru claritate, iterația pentru performanță pe intrări mari.

Da. Un asistent de codare cu inteligență artificială poate scrie o funcție C dintr-un prompt în limbaj simplu, poate sugera parametri și tipuri de returnare și poate semnala erori precum o valoare returnată lipsă sau un argument nepotrivit. Compilați și testați întotdeauna funcția generată înainte de a vă baza pe ea.

Copilotul GitHub scrie funcții C, completând corpul funcției pornind de la numele acesteia sau de la un comentariu scurt și propunând declarații, bucle și apeluri recursive. Adesea adaugă un prototip corespunzător deasupra funcției main(), deși ar trebui să revizuiți totuși logica.

Rezumați această postare cu: