Funkce v programování C s příklady: rekurzivní a inline

⚡ Chytré shrnutí

Funkce v programování v jazyce C jsou opakovaně použitelné bloky kódu, které rozdělují velký program na menší podprogramy, což usnadňuje jeho pochopení, testování a úpravy. Každá funkce má deklaraci, definici a část pro volání.

  • 🧩 Jaké funkce dělají: Funkce seskupuje opakovaně použitelné instrukce, takže velký program se rozdělí na menší, lépe spravovatelné podprogramy, které se snáze ladí.
  • ???? Dva typy: Knihovní funkce jako printf a scanf jsou hotové, zatímco uživatelsky definované funkce píše programátor.
  • ???? Tři části: Použití funkce zahrnuje její deklaraci nebo prototyp, její definici nebo tělo a volání, které ji spouští.
  • 🎯 argumenty: Hodnoty se předávají podle pozice a standardně podle hodnoty, takže původní proměnná zůstává uvnitř volané funkce nezměněna.
  • 🌐 Rozsah: Lokální proměnné existují pouze uvnitř své funkce, zatímco globální a statické proměnné si uchovávají své hodnoty v celém programu nebo mezi jeho voláními.
  • 🤖 Asistence AI: GitHub Copilot a AI asistenti vytvářejí scaffolding C funkcí, navrhují typy návratových hodnot a označují chybějící návratové hodnoty nebo neshodné argumenty.

Funkce v programování C

Co je funkce v C?

Funkce v programování v C je opakovaně použitelný blok kódu, který usnadňuje pochopení a testování programu a umožňuje jeho snadnou úpravu bez změny volajícího programu. Funkce rozdělují kód a modularizují program pro dosažení lepších a efektivnějších výsledků. Stručně řečeno, větší program je rozdělen do různých podprogramů, které se nazývají funkce.

Co je funkce v C

Když rozdělíte velký program na různé funkce, bude snadné spravovat každou funkci samostatně. Kdykoli se v programu vyskytne chyba, můžete snadno prozkoumat chybné funkce a opravit pouze tyto chyby. Můžete snadno volat a používat funkce, kdykoli jsou potřeba, což automaticky vede k úspoře času a prostoru.

Knihovna vs. Uživatelsky definované funkce

Každý 'C' program má alespoň jednu funkci, která je hlavní funkcí, ale program může mít libovolný počet funkcí. Funkce main () v C je výchozím bodem programu.

V programování „C“ jsou funkce rozděleny do dvou typů:

  1. Funkce knihovny
  2. Uživatelsky definované funkce

Rozdíl mezi knihovnou a uživatelsky definovanými funkcemi v C je v tom, že pro funkci knihovny nepotřebujeme psát kód. Je již přítomen v hlavičkovém souboru, který vždy vkládáme na začátek programu. Stačí zadat název funkce a použít ji spolu se správnou syntaxí. Printf, scanf jsou příklady funkcí knihovny.

Zatímco uživatelsky definovaná funkce je typ funkce, ve které musíme napsat tělo funkce a zavolat funkci, kdykoli požadujeme, aby funkce provedla nějakou operaci v našem programu.

Uživatelem definovanou funkci v C vždy zapisuje uživatel, ale později může být součástí knihovny 'C'. Je to hlavní výhoda programování 'C'.

Programovací funkce C jsou rozděleny do tří činností, jako je

  1. Deklarace funkce
  2. Definice funkce
  3. Volání funkce

Deklarace funkce

Deklarace funkce znamená napsání názvu programu. Je to povinná část pro použití funkcí v kódu. V deklaraci funkce pouze specifikujeme název funkce, kterou budeme v našem programu používat, podobně jako deklaraci proměnné. Funkci nemůžeme použít, pokud není deklarována v programu. Deklarace funkce se také nazývá „prototyp funkce“.

Deklarace funkcí (nazývané prototyp) se obvykle provádějí nad funkcí main () a mají obecný tvar:

return_data_type function_name (data_type arguments);
  • return_data_type: je datový typ funkce value vrácené zpět volajícímu příkazu.
  • Za názvem funkce následují závorky.
  • Názvy argumentů s jejich deklaracemi datových typů jsou volitelně umístěny uvnitř závorek.

Uvažujeme následující program, který ukazuje, jak deklarovat funkci krychle pro výpočet hodnoty krychle celočíselné proměnné

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

Mějte na paměti, že funkce nemusí nutně vracet hodnotu. V tomto případě se použije klíčové slovo void.

Například deklarace funkce output_message označuje, že funkce nevrací hodnotu: void output_message();

Definice funkce

Definice funkce znamená pouze zapsání těla funkce. Tělo funkce se skládá z příkazů, které budou vykonávat konkrétní úkol. Tělo funkce se skládá z jednoho nebo bloku příkazů. Je také povinnou součástí funkce.

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

Volání funkce

Volání funkce znamená volání funkce, kdykoli je to v programu vyžadováno. Kdykoli zavoláme funkci, provede operaci, pro kterou byla navržena. Volání funkce je volitelná část programu.

  result = add(4,5);

Zde je kompletní kód:

#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ýstup:

Addition:30

Argumenty funkce

Argumenty funkce se používají k získání potřebných hodnot voláním funkce. Jsou přizpůsobeny podle polohy; první argument je předán prvnímu parametru, druhý druhému parametru a tak dále.

Ve výchozím nastavení se argumenty předávají jako hodnota, ve které je volané funkci poskytnuta kopie dat. Skutečně předávaná proměnná se nezmění.

Uvažujeme následující program, který demonstruje parametry předávané hodnotou:

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

Výstup programu je:

5 + 10 = 15

Mějte na paměti, že hodnoty aab předané do funkce add nebyly změněny, protože do parametru x byla předána pouze jeho hodnota.

Variabilní rozsah

Rozsah proměnných znamená viditelnost proměnných v kódu programu.

V jazyce C jsou proměnné deklarované uvnitř funkce lokální pro daný blok kódu a nelze se na ně odkazovat mimo funkci. Proměnné deklarované mimo všechny funkce jsou však globální a přístupné z celého programu. Konstanty deklarované s #define na začátku programu jsou přístupné z celého programu. Uvažujme následující program, který vypisuje hodnotu globální proměnné z hlavní i uživatelem definované funkce:

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

Výsledek:

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

Probereme detaily programu:

Variabilní rozsah

  1. Deklarujeme celočíselnou globální proměnnou s 1348 jako počáteční hodnotou.
  2. Deklarujeme a definujeme funkci test(), která nebere argumenty ani nevrací hodnotu. Tato funkce pouze vypíše hodnotu globální proměnné, aby demonstrovala, že ke globálním proměnným lze přistupovat kdekoli v programu.
  3. Globální proměnnou vytiskneme v rámci hlavní funkce.
  4. Zavoláme testovací funkci, abychom vytiskli hodnotu globální proměnné.

V C, když jsou argumenty předány parametrům funkce, parametry fungují jako lokální proměnné, které budou zničeny při ukončení funkce.

Při použití globální proměnné, používejte je opatrně, protože mohou vést k chybám a mohou se změnit kdekoli v programu. Před použitím by měly být inicializovány.

Statické proměnné

Statické proměnné mají lokální rozsah. Při ukončení funkce se však nezničí. Proto si statická proměnná uchovává svou hodnotu navždy a lze k ní přistupovat při opětovném zadání funkce. Statická proměnná je inicializována při deklaraci a potřebuje předponu static.

Následující program používá statickou proměnnou:

#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 zobrazí:

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

Rekurzivní funkce

Uvažujme faktoriál čísla, který se vypočítá takto: 6! = 6 * 5 * 4 * 3 * 2 * 1.

Tento výpočet se provádí jako opakovaný výpočet faktu * (skutečnost -1), dokud se skutečnost nerovná 1.

Rekurzivní funkce je funkce, která volá sama sebe a obsahuje podmínku ukončení za účelem dokončení rekurzivních volání. V případě výpočtu faktoriálového čísla je výstupní podmínka fakt rovna 1. Rekurze funguje tak, že volání „skládá“ tak dlouho, dokud není výstupní podmínka pravdivá.

Například:

#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 zobrazí:

 The factorial of 6 is 720

Zde probíráme detaily programu:

Rekurzivní funkce

  1. Deklarujeme naši rekurzivní faktoriálovou funkci, která bere celočíselný parametr a vrací faktoriál tohoto parametru. Tato funkce bude volat sama sebe a snižovat číslo, dokud není dosaženo výstupní nebo základní podmínky. Když je podmínka pravdivá, dříve vygenerované hodnoty se vzájemně vynásobí a vrátí se konečná hodnota faktoriálu.
  2. Deklarujeme a inicializujeme celočíselnou proměnnou s hodnotou “6″ a poté vytiskneme její faktoriálovou hodnotu voláním naší faktoriálové funkce.

Pro lepší pochopení rekurzivního mechanismu, který spočívá ve volání samotné funkce, dokud není dosaženo základního případu nebo zastavení, si prohlédněte následující tabulku.ping je dosažena podmínka a poté shromažďujeme předchozí hodnoty:

Rekurzivní funkce

Inline funkce

Funkce v programování C se používá k uložení nejčastěji používaných instrukcí. Používá se pro modularizaci programu.

Kdykoli je funkce volána, ukazatel instrukce skočí na definici funkce. Po provedení funkce se ukazatel instrukce vrátí zpět na příkaz, odkud skočil do definice funkce.

Kdykoli používáme funkce, potřebujeme navíc ukazatel přejděte na definici funkce a vraťte se k příkazu. Abychom eliminovali potřebu takových ukazovacích hlav, používáme inline funkce.

V inline funkci je volání funkce přímo nahrazeno skutečným programovým kódem. Neskočí na žádný blok, protože všechny operace se provádějí uvnitř inline funkce.

Inline funkce se většinou používají pro malé výpočty. Nejsou vhodné, pokud se jedná o velký výpočetní výkon.

Inline funkce je podobná normální funkci s tím rozdílem, že klíčové slovo inline je umístěno před názvem funkce. Inline funkce jsou vytvořeny s následující syntaxí:

inline function_name ()
{
    //function definition
}

Pojďme napsat program pro implementaci inline funkce.

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ýstup:

Addition: 30

Výše uvedený program demonstruje použití inline funkce pro sčítání dvou čísel. Jak vidíme, vrátili jsme sčítání na dvou číslech v rámci inline funkce pouze bez psaní dalších řádků. Během volání funkce jsme právě předali hodnoty, na kterých musíme provést sčítání.

Nejčastější dotazy

Volání podle hodnoty zkopíruje argument do funkce, takže změny zůstanou lokální a původní proměnná se zachová. Volání odkazem předává adresu proměnné přes ukazatel, což umožňuje funkci přímo upravovat původní data volajícího.

Skutečný parametr je skutečná hodnota nebo proměnná, kterou volající předává během volání funkce. Formální parametr je zástupný symbol uvedený v definici funkce, která jej přijímá. Porovnávají se podle pozice, první k první, druhý k druhé.

Funkce AC vrací přímo s příkazem return pouze jednu hodnotu. Chcete-li odeslat zpět několik výsledků, zabalte je do struktury, vyplňte pole nebo předejte ukazatele jako argumenty, aby funkce zapsala každý výsledek do vlastních proměnných volajícího.

Funkce přinášejí opakovanou použitelnost, takže jeden blok se spouští mnohokrát, a modularitu, která rozděluje velký program na menší části. Zlepšují také čitelnost, zjednodušují testování a ladění a skrývají složité detaily za jedním názvem, což šetří čas vývoje.

Funkce main() je vstupním bodem, kde se zahajuje provádění každého programu v jazyce C. Operační systém ji volá jako první a její návratová hodnota, obvykle 0, signalizuje úspěch. Příjem argumentů příkazového řádku může trvat příkazy argc a argv.

Rekurze je vhodná pro problémy s přirozeně se opakující strukturou, jako je například procházení stromů nebo faktoriály, protože poskytuje kratší a přehlednější kód. Iterace obvykle běží rychleji a spotřebovává méně paměti, protože se vyhýbá opakovaným voláním. Rekurzi zvolte pro přehlednost, iteraci pro výkon s velkými vstupy.

Ano. Asistent kódování s umělou inteligencí může napsat funkci v jazyce C z příkazového řádku v jednoduchém jazyce, navrhnout parametry a typy návratových hodnot a označit chyby, jako je chybějící návratová hodnota nebo neshodující se argument. Vždy zkompilujte a otestujte vygenerovanou funkci, než se na ni spolehnete.

GitHub Copilot píše funkce v jazyce C, doplňuje tělo funkce názvem funkce nebo krátkým komentářem a navrhuje deklarace, smyčky a rekurzivní volání. Často přidává odpovídající prototyp nad main(), i když byste si měli logiku stále projít.

Shrňte tento příspěvek takto: