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 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.
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:
- Funcțiile bibliotecii
- 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,
- Declarația funcției
- Definirea funcției
- 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:
- Declaram o variabila globala intreaga cu 1348 ca valoare initiala.
- 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.
- Tipărim variabila globală în cadrul funcției principale.
- 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:
- 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ă.
- 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 î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.




