Funcții în programarea C cu exemple: recursive și inline
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, testat și poate fi modificat cu ușurință fără a schimba programul apelant. Funcțiile împart codul și modularizează programul pentru rezultate mai bune și eficiente. Pe scurt, un program mai mare este împărțit în diferite subprograme care sunt numite 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 funcției înseamnă scrierea unui nume al unui program. Este o parte obligatorie pentru utilizarea funcțiilor în cod. Într-o declarație de funcție, specificăm doar numele unei funcții 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 „Funcție prototip. "
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 de valoare returnată înapoi la instrucțiunea de apelare.
- nume_funcție: este urmat de paranteze
- Argumente opțional, numele cu declarațiile lor de tip de date sunt plasate în 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 după valoare în care se dă o copie a datelor funcţiei apelate. Variabila trecută 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 care sunt declarate în interiorul unei funcții sunt locale pentru acel bloc de cod și nu pot fi menționate în afara funcției. Totuși, variabilele care sunt declarate în afara tuturor funcțiilor sunt globale și accesibile din întregul program. Constantele declarate cu a #defini în partea de sus a unui program sunt accesibile din întregul program. Luăm în considerare următorul program care imprimă valoarea variabilei globale atât din funcția principală, cât și din cea 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
Discutam 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 următorul grafic pentru a înțelege mai bine mecanismul recursiv care constă în a numi funcția ei în sine până când este atins cazul de bază sau condiția de oprire, 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.
Rezumat
- O funcție este un mini-program sau un subprogram.
- Funcțiile sunt utilizate pentru modularizarea programului.
- Biblioteca și definite de utilizator sunt două tipuri de funcții.
- O funcție constă dintr-o declarație, corp de funcție și o parte de apelare a funcției.
- Declarația de funcție și corpul sunt obligatorii.
- Un apel de funcție poate fi opțional într-un program.
- Programul C are cel puțin o funcție; este funcția principală ().
- Fiecare funcție are un nume, un tip de date de valoare returnată sau un void, parametri.
- Fiecare funcție trebuie să fie definită și declarată în programul dvs. C.
- Ține minte că obișnuit variabile într-o funcție C sunt distruse imediat ce ieșim din apelul funcției.
- Argumentele transmise unei funcții nu vor fi modificate deoarece au fost transmise după valoare, niciuna prin adresă.
- Sfera variabilei este denumită vizibilitatea variabilelor în cadrul unui program
- Există variabile globale și locale în programare C