Funktioner i C-programmering med eksempler: Rekursiv & Inline

โšก Smart opsummering

Funktioner i C-programmering er genbrugelige kodeblokke, der opdeler et stort program i mindre underprogrammer, hvilket gรธr det lettere at forstรฅ, teste og รฆndre. Hver funktion har en deklaration, en definition og en kalddel.

  • ๐Ÿงฉ Hvilke funktioner gรธr: En funktion grupperer genanvendelige instruktioner, sรฅ et stort program opdeles i mindre, hรฅndterbare underprogrammer, der er enklere at fejlsรธge.
  • ๐Ÿ“š To typer: Biblioteksfunktioner som printf og scanf er fรฆrdige, mens brugerdefinerede funktioner skrives af programmรธren.
  • ๐Ÿ“ Tre dele: Brugen af โ€‹โ€‹en funktion involverer dens deklaration eller prototype, dens definition eller brรธdtekst og det kald, der kรธrer den.
  • ๐ŸŽฏ argumenter: Vรฆrdier sendes efter position og som standard efter vรฆrdi, sรฅ den oprindelige variabel forbliver uรฆndret i den kaldte funktion.
  • ๐ŸŒ Anvendelsesomrรฅde: Lokale variabler findes kun i deres funktion, mens globale og statiske variabler beholder deres vรฆrdier pรฅ tvรฆrs af programmet eller mellem kald.
  • ๐Ÿค– AI assistance: GitHub Copilot og AI-assistenter understรธtter C-funktioner, foreslรฅr returtyper og markerer manglende returer eller uoverensstemmelser i argumenterne.

Funktioner i C-programmering

Hvad er en funktion i C?

Funktion i C-programmering er en genanvendelig kodeblok, der gรธr et program lettere at forstรฅ, teste og nemt kan รฆndres uden at รฆndre det kaldende program. Funktioner opdeler koden og modulariserer programmet for bedre og mere effektive resultater. Kort sagt er et stรธrre program opdelt i forskellige underprogrammer, der kaldes som funktioner.

Hvad er en funktion i C

Nรฅr du deler et stort program op i forskellige funktioner, bliver det nemt at styre hver funktion individuelt. Nรฅr der opstรฅr en fejl i programmet, kan du nemt undersรธge defekte funktioner og kun rette disse fejl. Du kan nemt ringe til og bruge funktioner, nรฅr de er pรฅkrรฆvet, hvilket automatisk sparer tid og plads.

Bibliotek vs. Brugerdefinerede funktioner

Hvert 'C'-program har mindst รฉn funktion, som er hovedfunktionen, men et program kan have et hvilket som helst antal funktioner. Hovedfunktionen () i C er udgangspunktet for et program.

I 'C'-programmering er funktioner opdelt i to typer:

  1. Bibliotekets funktioner
  2. Brugerdefinerede funktioner

Forskellen mellem biblioteket og brugerdefinerede funktioner i C er, at vi ikke behรธver at skrive en kode til en biblioteksfunktion. Det er allerede til stede i header-filen, som vi altid inkluderer i begyndelsen af โ€‹โ€‹et program. Du skal bare skrive navnet pรฅ en funktion og bruge den sammen med den korrekte syntaks. Printf, scanf er eksempler pรฅ en biblioteksfunktion.

Hvorimod en brugerdefineret funktion er en type funktion, hvor vi er nรธdt til at skrive en krop af en funktion og kalde funktionen, nรฅr vi krรฆver, at funktionen udfรธrer en operation i vores program.

En brugerdefineret funktion i C skrives altid af brugeren, men senere kan den vรฆre en del af 'C'-biblioteket. Det er en stor fordel ved 'C'-programmering.

C programmeringsfunktioner er opdelt i tre aktiviteter, sรฅsom,

  1. Funktionserklรฆring
  2. Funktionsdefinition
  3. Funktionsopkald

Funktionserklรฆring

Funktionsdeklaration betyder at skrive navnet pรฅ et program. Det er en obligatorisk del af brugen af โ€‹โ€‹funktioner i kode. I en funktionsdeklaration angiver vi blot navnet pรฅ en funktion, som vi skal bruge i vores program, ligesom en variabeldeklaration. Vi kan ikke bruge en funktion, medmindre den er deklareret i et program. En funktionsdeklaration kaldes ogsรฅ "funktionsprototype".

Funktionserklรฆringerne (kaldet prototype) udfรธres normalt over hovedfunktionen () og har den generelle form:

return_data_type function_name (data_type arguments);
  • return_data_type: er datatypen for den vรฆrdifunktion, der returneres tilbage til den kaldende sรฆtning.
  • Funktionsnavnet: efterfรธlges af parenteser
  • Argumentnavne med deres datatypedeklarationer placeres eventuelt i parenteserne.

Vi betragter fรธlgende program, der viser, hvordan man erklรฆrer en terningfunktion for at beregne terningvรฆrdien af โ€‹โ€‹en heltalsvariabel

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

Husk, at en funktion ikke nรธdvendigvis returnerer en vรฆrdi. I dette tilfรฆlde bruges sรธgeordet void.

For eksempel angiver erklรฆringen output_message funktion, at funktionen ikke returnerer en vรฆrdi: void output_message();

Funktionsdefinition

Funktionsdefinition betyder blot at skrive en funktions brรธdtekst. En krop af en funktion bestรฅr af udsagn, som skal udfรธre en bestemt opgave. Et funktionslegeme bestรฅr af en enkelt eller en blok af udsagn. Det er ogsรฅ en obligatorisk del af en funktion.

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

Funktionsopkald

Et funktionskald betyder at kalde en funktion, nรฅr det er pรฅkrรฆvet i et program. Nรฅr vi kalder en funktion, udfรธrer den en operation, som den er designet til. Et funktionskald er en valgfri del af et program.

  result = add(4,5);

Her er den komplette kode:

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

Output:

Addition:30

Funktionsargumenter

En funktions argumenter bruges til at modtage de nรธdvendige vรฆrdier ved funktionskaldet. De matches efter position; det fรธrste argument sendes til den fรธrste parameter, det andet til den anden parameter og sรฅ videre.

Som standard sendes argumenterne med den vรฆrdi, hvor en kopi af dataene gives til den kaldte funktion. Den faktisk sendte variabel รฆndres ikke.

Vi betragter fรธlgende program, som demonstrerer parametre, der passeres af vรฆrdi:

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

Programmets output er:

5 + 10 = 15

Husk, at vรฆrdierne af a og b blev sendt for at tilfรธje funktion ikke blev รฆndret, fordi kun dens vรฆrdi blev overfรธrt til parameteren x.

Variabelt omfang

Variabelt omfang betyder synligheden af โ€‹โ€‹variabler i en kode i programmet.

I C er variabler, der er deklareret i en funktion, lokale for den pรฅgรฆldende kodeblok og kan ikke refereres til uden for funktionen. Variabler, der er deklareret uden for alle funktioner, er dog globale og tilgรฆngelige fra hele programmet. Konstanter, der er deklareret med et #define รธverst i et program, er tilgรฆngelige fra hele programmet. Vi betragter fรธlgende program, der udskriver vรฆrdien af โ€‹โ€‹den globale variabel fra bรฅde hoved- og brugerdefineret funktion:

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

Resultat:

from the main function : global =1348
from user defined function : global =1348

Vi diskuterer programdetaljerne:

Variabelt omfang

  1. Vi erklรฆrer en heltals global variabel med 1348 som startvรฆrdi.
  2. Vi erklรฆrer og definerer en test() funktion, som hverken tager argumenter eller returnerer en vรฆrdi. Denne funktion udskriver kun den globale variabelvรฆrdi for at demonstrere, at de globale variabler kan tilgรฅs overalt i programmet.
  3. Vi udskriver den globale variabel i hovedfunktionen.
  4. Vi kalder testfunktionen for at udskrive den globale variabelvรฆrdi.

I C, nรฅr argumenter sendes til funktionsparametre, fungerer parametrene som lokale variable, som vil blive รธdelagt, nรฅr funktionen afsluttes.

Nรฅr du bruger globale variabler, brug dem med forsigtighed, fordi de kan fรธre til fejl, og de kan รฆndres hvor som helst i et program. De skal initialiseres fรธr brug.

Statiske variable

De statiske variable har et lokalt omfang. De รธdelรฆgges dog ikke, nรฅr funktionen forlades. Derfor bevarer en statisk variabel sin vรฆrdi for evigt og kan tilgรฅs, nรฅr funktionen genindsรฆttes. En statisk variabel initialiseres, nรฅr den erklรฆres og har brug for prรฆfikset static.

Fรธlgende program bruger en statisk variabel:

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

Programmet viser:

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

Rekursive funktioner

Betragt faktorialen af โ€‹โ€‹et tal, der beregnes som fรธlger: 6! = 6 * 5 * 4 * 3 * 2 * 1.

Denne beregning udfรธres som gentagne gange at beregne fakta * (faktum -1), indtil fakta er lig med 1.

En rekursiv funktion er en funktion, der kalder sig selv og inkluderer en exit-betingelse for at afslutte de rekursive kald. I tilfรฆldet med beregningen af โ€‹โ€‹et faktortal er udgangsbetingelsen faktisk lig med 1. Rekursion fungerer ved at "stabling" opkald, indtil udgangsbetingelsen er sand.

For eksempel:

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

Programmet viser:

 The factorial of 6 is 720

Her diskuterer vi programdetaljer:

Rekursive funktioner

  1. Vi erklรฆrer vores rekursive faktorielle funktion, som tager en heltalsparameter og returnerer denne parameters faktoriale. Denne funktion kalder sig selv og reducerer tallet, indtil udgangen eller basistilstanden er nรฅet. Nรฅr betingelsen er sand, vil de tidligere genererede vรฆrdier blive ganget med hinanden, og den endelige faktorvรฆrdi returneres.
  2. Vi erklรฆrer og initialiserer en heltalsvariabel med vรฆrdien "6" og udskriver derefter dens faktorielle vรฆrdi ved at kalde vores faktorielle funktion.

Overvej fรธlgende diagram for bedre at forstรฅ den rekursive mekanisme, som bestรฅr i at kalde funktionen for sig selv, indtil basistilfรฆldet eller stoppetping betingelsen er nรฅet, og derefter indsamler vi de foregรฅende vรฆrdier:

Rekursive funktioner

Inline funktioner

Funktion i C-programmering bruges til at gemme de hyppigst anvendte instruktioner. Det bruges til modularisering af programmet.

Nรฅr en funktion kaldes, springer instruktionsmarkรธren til funktionsdefinitionen. Efter at have udfรธrt en funktion, falder instruktionsmarkรธren tilbage til sรฆtningen, hvorfra den hoppede til funktionsdefinitionen.

Nรฅr vi bruger funktioner, har vi brug for en ekstra pointer hovedet for at springe til funktionsdefinitionen og vende tilbage til sรฆtningen. For at eliminere behovet for sรฅdanne pointerhoveder bruger vi inline-funktioner.

I en inline-funktion erstattes et funktionskald direkte af en egentlig programkode. Den hopper ikke til nogen blok, fordi alle handlinger udfรธres inde i inline-funktionen.

Inline-funktioner bruges mest til smรฅ beregninger. De er ikke egnede, nรฅr der er tale om store databehandlinger.

En inline-funktion ligner den normale funktion, bortset fra at nรธgleordet inline er placeret fรธr funktionsnavnet. Inline-funktioner oprettes med fรธlgende syntaks:

inline function_name ()
{
    //function definition
}

Lad os skrive et program til at implementere en inline-funktion.

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

Output:

Addition: 30

Ovenstรฅende program demonstrerer brugen af โ€‹โ€‹en inline-funktion til tilfรธjelse af to tal. Som vi kan se, har vi kun returneret tilfรธjelsen pรฅ to tal inden for inline-funktionen uden at skrive nogen ekstra linjer. Under funktionskald har vi netop videregivet vรฆrdier, som vi skal udfรธre addition pรฅ.

Ofte Stillede Spรธrgsmรฅl

Call by value kopierer argumentet ind i funktionen, sรฅ รฆndringerne forbliver lokale, og den oprindelige variabel forbliver uberรธrt. Call by reference sender variabeladressen gennem en pointer, sรฅ funktionen kan รฆndre den kaldendes oprindelige data direkte.

Den faktiske parameter er den reelle vรฆrdi eller variabel, som kalderen sender under et funktionskald. Den formelle parameter er den pladsholder, der er navngivet i den funktionsdefinition, der modtager den. De matches efter position, fรธrste til fรธrste, anden til anden.

AC-funktionen returnerer kun รฉn vรฆrdi direkte med returvรฆrdien. For at sende flere resultater tilbage, skal du pakke dem ind i en struktur, udfylde et array eller sende pointere som argumenter, sรฅ funktionen skriver hvert resultat ind i kalderens egne variabler.

Funktioner giver genbrugelighed, sรฅ รฉn blok kรธrer mange gange, og modularitet, som opdeler et stort program i mindre dele. De forbedrer ogsรฅ lรฆsbarheden, forenkler test og fejlfinding og skjuler komplekse detaljer bag et enkelt navn, hvilket sparer udviklingstid.

Funktionen main() er det indgangspunkt, hvor ethvert C-program begynder at kรธre. Operativsystemet kalder den fรธrst, og dens returvรฆrdi, normalt 0, signalerer succes. Det kan krรฆve argc og argv at modtage kommandolinjeargumenter.

Rekursion passer til problemer med en naturligt gentagende struktur, sรฅsom trรฆgennemgang eller faktorialer, hvilket giver kortere og klarere kode. Iteration kรธrer normalt hurtigere og bruger mindre hukommelse, fordi den undgรฅr gentagne kald. Vรฆlg rekursion for klarhed, iteration for ydeevne pรฅ store input.

Ja. En AI-kodningsassistent kan skrive en C-funktion fra en letforstรฅelig prompt, foreslรฅ parametre og returtyper og markere fejl sรฅsom manglende returvarer eller et uoverensstemmelsesargument. Kompilรฉr og test altid den genererede funktion, fรธr du bruger den.

GitHub Copilot skriver C-funktioner, fuldender kroppen fra funktionsnavnet eller en kort kommentar og foreslรฅr deklarationer, lรธkker og rekursive kald. Den tilfรธjer ofte en matchende prototype over main(), selvom du stadig bรธr gennemgรฅ logikken.

Opsummer dette indlรฆg med: