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.

  • 🧩 Milliseid funktsioone täidavad: Funktsioon grupeerib korduvkasutatavad käsud, nii et suur programm jaguneb väiksemateks, hallatavamateks alamprogrammideks, mida on lihtsam siluda.
  • 📚 Kaks liiki: Teegifunktsioonid nagu printf ja scanf on valmis, samas kui kasutaja määratletud funktsioonid kirjutab programmeerija.
  • 📝 Kolm osa: Funktsiooni kasutamine hõlmab selle deklaratsiooni ehk prototüüpi, definitsiooni ehk keha ja seda käivitavat kõnet.
  • 🎯 Argumendid: Väärtused edastatakse positsiooni ja vaikimisi väärtuse kaupa, seega algne muutuja jääb kutsutud funktsioonis muutmata.
  • 🌐 Reguleerimisala: Lokaalsed muutujad elavad ainult oma funktsiooni sees, samas kui globaalsed ja staatilised muutujad säilitavad oma väärtused kogu programmi vältel või kõnede vahel.
  • 🤖 AI abi: GitHub Copilot ja tehisintellekti assistendid loovad C-funktsioonide tugisambaid, pakuvad välja tagastustüüpe ja märgistavad puuduvad tagastused või mittevastavad argumendid.

Funktsioonid C-programmeerimises

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.

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

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:

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.

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:

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.

KKK

Väärtusepõhine kutsumine kopeerib argumendi funktsiooni, seega muudatused jäävad lokaalseteks ja algset muutujat ei muudeta. Viitepõhine kutsumine edastab muutuja aadressi pointeri kaudu, lastes funktsioonil otse muuta kutsuja algseid andmeid.

Tegelik parameeter on tegelik väärtus või muutuja, mille kutsuja funktsioonikõne ajal edastab. Formaalne parameeter on funktsiooni definitsioonis nimetatud kohatäide, mis selle saab. Need sobitatakse positsiooni järgi, esimene esimesele, teine ​​teisele.

Funktsioon AC tagastab returniga otse ainult ühe väärtuse. Mitme tulemuse tagasisaatmiseks mähkige need struktuuri, täitke massiiv või edastage argumentidena pointerid, et funktsioon kirjutaks iga tulemuse kutsuja enda muutujatesse.

Funktsioonid pakuvad korduvkasutatavust, nii et üks plokk käivitub mitu korda, ja modulaarsust, mis jagab suure programmi väiksemateks osadeks. Need parandavad ka loetavust, lihtsustavad testimist ja silumist ning peidavad keerulised detailid ühe nime taha, säästes arendusaega.

Funktsioon main() on sisenemispunkt, kust iga C-keele programm käivitatakse. Operatsioonisüsteem kutsub seda esimesena välja ja selle tagastusväärtus, tavaliselt 0, annab märku edust. Käsureaargumentide vastuvõtmiseks võib vaja minna käske argc ja argv.

Rekursioon sobib loomulikult korduva struktuuriga probleemidele, näiteks puu läbimine või faktoriaalid, pakkudes lühemat ja selgemat koodi. Iteratsioon töötab tavaliselt kiiremini ja kasutab vähem mälu, kuna see väldib korduvaid väljakutseid. Valige selguse huvides rekursioon, iteratsioon aga jõudluse huvides suurte sisendite korral.

Jah. Tehisintellektiga kodeerimisassistent saab kirjutada C-funktsiooni tavalise keele käsurealt, soovitada parameetreid ja tagastustüüpe ning märkida vigu, näiteks puuduvat tagastust või mittevastavat argumenti. Enne genereeritud funktsioonile lootmist tuleb see alati kompileerida ja testida.

GitHubi koopia kirjutab C-funktsioone, täiendades sisu funktsiooni nime või lühikese kommentaariga ning pakkudes välja deklaratsioone, tsükleid ja rekursiivseid väljakutseid. Sageli lisab see main() kohale sobiva prototüübi, kuigi loogikat tuleks ikkagi üle vaadata.

Võta see postitus kokku järgmiselt: