Funkcje w programowaniu C z przykładami: rekursywne i inline

⚡ Inteligentne podsumowanie

Funkcje w programowaniu w C to wielokrotnego użytku bloki kodu, które dzielą duży program na mniejsze podprogramy, ułatwiając jego zrozumienie, testowanie i modyfikację. Każda funkcja składa się z deklaracji, definicji i części wywołującej.

  • 🧩 Jakie funkcje wykonują: Funkcja grupuje instrukcje wielokrotnego użytku, dzięki czemu duży program można podzielić na mniejsze, łatwiejsze do zarządzania podprogramy, które są prostsze do debugowania.
  • 📚 Dwa typy: Funkcje biblioteczne, takie jak printf i scanf, są gotowe, natomiast funkcje definiowane przez użytkownika są tworzone przez programistę.
  • 📝 Trzy części: Użycie funkcji wymaga jej deklaracji lub prototypu, definicji lub treści, a także wywołania, które ją uruchamia.
  • 🎯 argumenty: Wartości są przekazywane według pozycji i domyślnie według wartości, więc oryginalna zmienna pozostaje niezmieniona wewnątrz wywoływanej funkcji.
  • 🌐 Zakres: Zmienne lokalne znajdują się wyłącznie wewnątrz funkcji, natomiast zmienne globalne i statyczne zachowują swoje wartości w całym programie lub pomiędzy wywołaniami.
  • 🤖 Pomoc AI: GitHub Copilot i asystenci AI wspierają funkcje C, sugerują typy zwracane i sygnalizują brakujące zwroty lub niezgodne argumenty.

Funkcje w programowaniu w C.

Co to jest funkcja w C?

Funkcja w programowaniu C To wielokrotnego użytku blok kodu, który ułatwia zrozumienie i testowanie programu oraz umożliwia jego łatwą modyfikację bez konieczności zmiany programu wywołującego. Funkcje dzielą kod i modularyzują program, zapewniając lepsze i efektywniejsze rezultaty. Krótko mówiąc, większy program jest dzielony na różne podprogramy, które nazywane są funkcjami.

Co to jest funkcja w C

Kiedy dzielisz duży program na różne funkcje, zarządzanie każdą funkcją z osobna staje się łatwe. Ilekroć w programie wystąpi błąd, można łatwo zbadać wadliwe funkcje i poprawić tylko te błędy. Możesz łatwo wywoływać i korzystać z funkcji, gdy są potrzebne, co automatycznie prowadzi do oszczędności czasu i miejsca.

Biblioteka kontra. Funkcje zdefiniowane przez użytkownika

Każdy program w języku C ma co najmniej jedną funkcję, która jest funkcją główną, ale program może mieć dowolną liczbę funkcji. Funkcja main () w C jest punktem wyjścia programu.

W programowaniu w C funkcje dzielą się na dwa typy:

  1. Funkcje biblioteczne
  2. Funkcje zdefiniowane przez użytkownika

Różnica między biblioteką a funkcjami zdefiniowanymi przez użytkownika w C polega na tym, że nie musimy pisać kodu dla funkcji bibliotecznej. Jest już obecny w pliku nagłówkowym, który zawsze umieszczamy na początku programu. Wystarczy wpisać nazwę funkcji i użyć jej wraz z odpowiednią składnią. Printf, scanf to przykłady funkcji bibliotecznych.

Natomiast funkcja zdefiniowana przez użytkownika to typ funkcji, w którym musimy napisać treść funkcji i wywołać ją za każdym razem, gdy chcemy, aby wykonała ona jakąś operację w naszym programie.

Funkcja zdefiniowana przez użytkownika w C jest zawsze pisana przez użytkownika, ale później może być częścią biblioteki 'C'. Jest to główna zaleta programowania w 'C'.

Funkcje programowania C są podzielone na trzy działania, takie jak:

  1. Deklaracja funkcji
  2. Definicja funkcji
  3. Wywołanie funkcji

Deklaracja funkcji

Deklaracja funkcji oznacza napisanie nazwy programu. Jest to obowiązkowy element korzystania z funkcji w kodzie. W deklaracji funkcji po prostu podajemy nazwę funkcji, której będziemy używać w programie, podobnie jak w deklaracji zmiennej. Nie możemy użyć funkcji, jeśli nie została ona zadeklarowana w programie. Deklaracja funkcji jest również nazywana „prototypem funkcji”.

Deklaracje funkcji (zwane prototypami) są zwykle wykonywane nad funkcją main () i przyjmują ogólną postać:

return_data_type function_name (data_type arguments);
  • return_data_type: jest typem danych funkcji wartości zwracanej do instrukcji wywołującej.
  • Po nazwie funkcji następują nawiasy
  • Nazwy argumentów z deklaracjami typów danych są opcjonalnie umieszczane w nawiasach.

Rozważymy następujący program, który pokazuje, jak zadeklarować funkcję sześcianu, aby obliczyć wartość sześcianu zmiennej całkowitej

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

Należy pamiętać, że funkcja niekoniecznie zwraca wartość. W tym przypadku używane jest słowo kluczowe void.

Na przykład deklaracja funkcji komunikat_wyjściowy wskazuje, że funkcja nie zwraca wartości: void komunikat_wyjściowy();

Definicja funkcji

Definicja funkcji oznacza po prostu napisanie treści funkcji. Ciało funkcji składa się z instrukcji, które mają wykonać określone zadanie. Ciało funkcji składa się z pojedynczej instrukcji lub bloku instrukcji. Jest to również obowiązkowa część funkcji.

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

Wywołanie funkcji

Wywołanie funkcji oznacza wywołanie funkcji, gdy jest ona wymagana w programie. Gdy wywołujemy funkcję, wykonuje ona operację, do której została zaprojektowana. Wywołanie funkcji jest opcjonalną częścią programu.

  result = add(4,5);

Oto kompletny kod:

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

Wyjście:

Addition:30

Argumenty funkcji

Argumenty funkcji służą do otrzymania niezbędnych wartości w wyniku wywołania funkcji. Są dopasowywani według pozycji; pierwszy argument jest przekazywany do pierwszego parametru, drugi do drugiego parametru i tak dalej.

Domyślnie argumenty są przekazywane przez wartość, w której do wywoływanej funkcji przekazywana jest kopia danych. Faktycznie przekazana zmienna nie ulegnie zmianie.

Rozważmy poniższy program, który demonstruje parametry przekazywane przez wartość:

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

Wyjście programu to:

5 + 10 = 15

Należy pamiętać, że wartości a i b przekazane do funkcji add nie uległy zmianie, ponieważ do parametru x przekazano jedynie ich wartość.

Zmienny zakres

Zasięg zmiennej oznacza widoczność zmiennych w kodzie programu.

W języku C zmienne zadeklarowane wewnątrz funkcji są lokalne dla tego bloku kodu i nie można się do nich odwoływać poza funkcją. Natomiast zmienne zadeklarowane poza wszystkimi funkcjami są globalne i dostępne z poziomu całego programu. Stałe zadeklarowane za pomocą #define na początku programu są dostępne z poziomu całego programu. Rozważmy poniższy program, który wyświetla wartość zmiennej globalnej zarówno z funkcji głównej, jak i zdefiniowanej przez użytkownika:

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

Wynik:

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

Omawiamy szczegóły programu:

Zmienny zakres

  1. Deklarujemy zmienną globalną typu całkowitego z wartością początkową 1348.
  2. Deklarujemy i definiujemy funkcję test(), która nie przyjmuje argumentów ani nie zwraca wartości. Ta funkcja drukuje jedynie wartość zmiennej globalnej, aby zademonstrować, że dostęp do zmiennych globalnych można uzyskać w dowolnym miejscu programu.
  3. Drukujemy zmienną globalną w obrębie funkcji głównej.
  4. Wywołujemy funkcję testową w celu wydrukowania wartości zmiennej globalnej.

W języku C, gdy argumenty są przekazywane do parametrów funkcji, parametry te zachowują się jak zmienne lokalne, które zostaną zniszczone podczas opuszczania funkcji.

Podczas korzystania zmienne globalne, używaj ich ostrożnie, ponieważ mogą prowadzić do błędów i mogą zmieniać się w dowolnym miejscu programu. Należy je zainicjować przed użyciem.

Zmienne statyczne

Zmienne statyczne mają zasięg lokalny. Jednak nie są niszczone podczas wychodzenia z funkcji. Dlatego zmienna statyczna zachowuje swoją wartość na zawsze i można uzyskać do niej dostęp, gdy funkcja jest ponownie otwierana. Zmienna statyczna jest inicjowana podczas deklarowania i potrzebuje prefiksu static.

Poniższy program używa zmiennej statycznej:

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

Program wyświetla:

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

Funkcje rekurencyjne

Rozważ silnię liczby, którą obliczamy następująco: 6! =6*5*4*3*2*1.

To obliczenie jest wykonywane w formie wielokrotnego obliczania faktu * (fakt -1), aż fakt będzie równy 1.

Funkcja rekurencyjna to funkcja, która wywołuje samą siebie i zawiera warunek wyjścia w celu zakończenia wywołań rekurencyjnych. W przypadku obliczenia liczby silni, warunek wyjścia jest równy 1. Rekurencja działa poprzez „układanie” wywołań, aż warunek wyjścia będzie prawdziwy.

Na przykład:

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

Program wyświetla:

 The factorial of 6 is 720

Tutaj omawiamy szczegóły programu:

Funkcje rekurencyjne

  1. Deklarujemy naszą rekurencyjną funkcję silni, która przyjmuje parametr całkowity i zwraca silnię tego parametru. Ta funkcja wywoła się sama i zmniejszy liczbę, aż do osiągnięcia warunku wyjściowego lub podstawowego. Gdy warunek jest spełniony, wcześniej wygenerowane wartości zostaną pomnożone przez siebie i zwrócona zostanie ostateczna wartość silni.
  2. Deklarujemy i inicjujemy zmienną całkowitą o wartości „6”, a następnie drukujemy jej wartość silni, wywołując naszą funkcję silni.

Aby lepiej zrozumieć mechanizm rekurencyjny, który polega na wywołaniu samej funkcji do momentu wystąpienia przypadku bazowego lub zatrzymania, należy zapoznać się z poniższym wykresem.ping warunek zostanie osiągnięty, a następnie zbieramy poprzednie wartości:

Funkcje rekurencyjne

Funkcje wbudowane

Funkcja w programowaniu C służy do przechowywania najczęściej używanych instrukcji. Służy do modularyzacji programu.

Za każdym razem, gdy wywoływana jest funkcja, wskaźnik instrukcji przeskakuje do definicji funkcji. Po wykonaniu funkcji wskaźnik instrukcji wraca do instrukcji, z której przeskoczył do definicji funkcji.

Ilekroć używamy funkcji, potrzebujemy dodatku wskaźnik przejdź do definicji funkcji i wróć do instrukcji. Aby wyeliminować potrzebę stosowania takich głów wskaźników, używamy funkcji wbudowanych.

W funkcji inline wywołanie funkcji jest bezpośrednio zastępowane przez rzeczywisty kod programu. Nie przechodzi do żadnego bloku, ponieważ wszystkie operacje są wykonywane wewnątrz funkcji inline.

Funkcje wbudowane są najczęściej używane do małych obliczeń. Nie nadają się, gdy w grę wchodzą duże obliczenia.

Funkcja inline jest podobna do normalnej funkcji, z tym wyjątkiem, że słowo kluczowe inline jest umieszczane przed nazwą funkcji. Funkcje inline są tworzone za pomocą następującej składni:

inline function_name ()
{
    //function definition
}

Napiszmy program implementujący funkcję 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();
}

Wyjście:

Addition: 30

Powyższy program demonstruje użycie funkcji inline do dodawania dwóch liczb. Jak widać, zwróciliśmy dodawanie dwóch liczb tylko w funkcji inline bez pisania żadnych dodatkowych wierszy. Podczas wywołania funkcji przekazaliśmy tylko wartości, na których musimy wykonać dodawanie.

FAQ

Wywołanie przez wartość kopiuje argument do funkcji, więc zmiany pozostają lokalne, a oryginalna zmienna pozostaje nienaruszona. Wywołanie przez referencję przekazuje adres zmiennej przez wskaźnik, pozwalając funkcji bezpośrednio modyfikować oryginalne dane wywołującego.

Parametrem rzeczywistym jest rzeczywista wartość lub zmienna przekazywana przez wywołującego podczas wywołania funkcji. Parametrem formalnym jest symbol zastępczy określony w definicji funkcji, która go otrzymuje. Są one dopasowywane według pozycji, od pierwszego do pierwszego, od drugiego do drugiego.

Funkcja AC zwraca bezpośrednio tylko jedną wartość. Aby zwrócić kilka wyników, należy je umieścić w strukturze, wypełnić tablicę lub przekazać wskaźniki jako argumenty, tak aby funkcja zapisywała każdy wynik we własnych zmiennych wywołującego.

Funkcje zapewniają możliwość wielokrotnego użycia, dzięki czemu jeden blok może być uruchamiany wielokrotnie, oraz modułowość, która pozwala podzielić duży program na mniejsze części. Poprawiają również czytelność, upraszczają testowanie i debugowanie oraz ukrywają złożone szczegóły pod jedną nazwą, oszczędzając czas programowania.

Funkcja main() to punkt wejścia, w którym rozpoczyna się wykonywanie każdego programu w języku C. System operacyjny wywołuje ją jako pierwszą, a jej wartość zwracana, zazwyczaj 0, sygnalizuje powodzenie. Do odebrania argumentów wiersza poleceń może być wymagane argc i argv.

Rekurencja rozwiązuje problemy z naturalnie powtarzającą się strukturą, takie jak przechodzenie przez drzewo lub silnia, dając krótszy i bardziej przejrzysty kod. Iteracja zazwyczaj działa szybciej i zużywa mniej pamięci, ponieważ unika powtarzających się wywołań. Wybierz rekurencję dla przejrzystości, a iterację dla wydajności przy dużych danych wejściowych.

Tak. Asystent kodowania AI może napisać funkcję w C z poziomu wiersza poleceń, zasugerować parametry i typy zwracane oraz zgłosić błędy, takie jak brakujący return lub niedopasowany argument. Zawsze kompiluj i testuj wygenerowaną funkcję, zanim zaczniesz na niej polegać.

Drugi pilot GitHub Pisze funkcje w C, uzupełniając ciało na podstawie nazwy funkcji lub krótkiego komentarza i proponując deklaracje, pętle i wywołania rekurencyjne. Często dodaje pasujący prototyp powyżej funkcji main(), choć nadal warto przejrzeć logikę.

Podsumuj ten post następująco: