Funktsioonid C-programmeerimises näidetega: Rekursiivne ja Inline
⚡ Nutikas kokkuvõte
C programmeerimisfunktsioonid on korduvkasutatavad koodiplokid, mis jagavad suure programmi väiksemateks alamprogrammideks, muutes selle mõistmise, testimise ja muutmise lihtsamaks. Igal funktsioonil on deklaratsioon, definitsioon ja väljakutseosa.
Mis on funktsioon C-s?
Funktsioon C programmeerimisel on korduvkasutatav koodiplokk, mis muudab programmi hõlpsamini mõistetavaks, testitavaks ja hõlpsasti muudetavaks ilma kutsuvat programmi muutmata. Funktsioonid jagavad koodi ja modulariseerivad programmi paremate ja tõhusamate tulemuste saavutamiseks. Lühidalt öeldes jagatakse suurem programm erinevateks alamprogrammideks, mida nimetatakse funktsioonideks.
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:
- Raamatukogu funktsioonid
- 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
- Funktsiooni deklaratsioon
- Funktsiooni määratlus
- Funktsioonikutse
Funktsioonide deklaratsioon
Funktsioonideklaratsioon tähendab programmi nime kirjutamist. See on funktsioonide koodis kasutamise kohustuslik osa. Funktsioonideklaratsioonis määrame lihtsalt funktsiooni nime, mida kavatseme oma programmis kasutada, näiteks muutujadeklaratsioonis. Me ei saa funktsiooni kasutada, kui see pole programmis deklareeritud. Funktsioonideklaratsiooni nimetatakse ka "funktsiooni prototüübiks".
Funktsioonide deklaratsioonid (mida nimetatakse prototüübiks) tehakse tavaliselt põhifunktsiooni () kohal ja need on üldisel kujul:
return_data_type function_name (data_type arguments);
- return_data_type: on kutsuvale lausele tagastatud väärtusfunktsiooni andmetüüp.
- Funktsiooni_nimi: järel on sulud
- Argumentide nimed koos nende andmetüübi deklaratsioonidega (valikuliselt) paigutatakse 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 edastatakse argumendid väärtuse järgi, mille puhul 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-keeles on funktsiooni sees deklareeritud muutujad selle koodiploki suhtes lokaalsed ja neile ei saa funktsioonist väljaspool viidata. Funktsioonide väliselt deklareeritud muutujad on aga globaalsed ja neile pääseb ligi kogu programmist. Programmi alguses #define-ga deklareeritud konstandid on ligipääsetavad kogu programmist. Vaatleme järgmist programmi, mis prindib globaalse muutuja väärtuse nii peamisest kui ka kasutaja defineeritud 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:
- Deklareerime täisarvulise globaalse muutuja, mille algväärtus on 1348.
- 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.
- Trükime globaalse muutuja põhifunktsiooni sees.
- 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:
- 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.
- Deklareerime ja initsialiseerime täisarvulise muutuja väärtusega "6" ja prindime seejärel selle faktoriaalväärtuse, kutsudes esile meie faktoriaalfunktsiooni.
Rekursiivse mehhanismi paremaks mõistmiseks vaadake järgmist diagrammi, mis seisneb funktsiooni enda kutsumises kuni baasjuhtumi või stop-punktini.ping tingimus on saavutatud ja pärast seda kogume eelnevad väärtused:
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.





