Функції програмування на C із прикладами: рекурсивні та вбудовані

⚡ Розумний підсумок

Функції в програмуванні на C — це блоки коду повторного використання, які розділяють велику програму на менші підпрограми, що полегшує її розуміння, тестування та модифікацію. Кожна функція має оголошення, визначення та частину виклику.

  • 🧩 Які функції виконують: Функція групує інструкції повторного використання, тому велика програма розбивається на менші, керовані підпрограми, які легше налагоджувати.
  • 📚 Два типи: Бібліотечні функції, такі як printf та scanf, є готовими, тоді як користувацькі функції пишуться програмістом.
  • ???? Три частини: Використання функції включає її оголошення або прототип, її визначення або тіло та виклик, який її виконує.
  • 🎯 аргументи: Значення передаються за позицією та, за замовчуванням, за значенням, тому вихідна змінна залишається незмінною всередині викликаної функції.
  • 🌐 Сфера застосування: Локальні змінні знаходяться лише всередині своїх функцій, тоді як глобальні та статичні змінні зберігають свої значення протягом усієї програми або між викликами.
  • 🤖 Допомога AI: GitHub Copilot та помічники зі штучним інтелектом створюють скампелінг для функцій C, пропонують типи повернень та позначають відсутні повернення або невідповідні аргументи.

Функції в програмуванні на C

Що таке функція в C?

Функція в програмуванні на C — це блок коду, який можна використовувати повторно, що спрощує розуміння та тестування програми, а також дозволяє легко змінювати її без зміни викликаючої програми. Функції розділяють код та модулюють програму для кращих та ефективніших результатів. Коротше кажучи, більша програма поділяється на різні підпрограми, які називаються функціями.

Що таке функція в C

Коли ви розділяєте велику програму на різні функції, стає легко керувати кожною функцією окремо. Щоразу, коли в програмі виникає помилка, ви можете легко дослідити несправні функції та виправити лише ці помилки. Ви можете легко викликати та використовувати функції, коли вони потрібні, що автоматично веде до економії часу та місця.

Бібліотека Vs. Визначені користувачем функції

Кожна програма на C має принаймні одну функцію, яка є основною, але програма може мати будь-яку кількість функцій. Функція main () у C є початковою точкою програми.

У програмуванні на C функції поділяються на два типи:

  1. Функції бібліотеки
  2. Визначені користувачем функції

Різниця між бібліотекою та функціями, визначеними користувачем у C, полягає в тому, що нам не потрібно писати код для бібліотечної функції. Він уже присутній у файлі заголовка, який ми завжди включаємо на початку програми. Вам просто потрібно ввести назву функції та використати її разом із відповідним синтаксисом. Printf, scanf є прикладами бібліотечної функції.

Тоді як функція, визначена користувачем, — це тип функції, у якій ми повинні написати тіло функції та викликати функцію щоразу, коли нам потрібно, щоб функція виконала певну операцію в нашій програмі.

Визначена користувачем функція в C завжди пишеться користувачем, але пізніше вона може бути частиною бібліотеки «C». Це головна перевага програмування на C.

Функції програмування C поділяються на три дії, такі як:

  1. Оголошення функції
  2. Визначення функції
  3. Виклик функції

Декларація про функції

Оголошення функції означає написання назви програми. Це обов'язкова частина використання функцій у коді. В оголошенні функції ми просто вказуємо назву функції, яку ми збираємося використовувати в нашій програмі, як-от оголошення змінної. Ми не можемо використовувати функцію, якщо вона не оголошена в програмі. Оголошення функції також називається «прототипом функції».

Оголошення функції (які називаються прототипом) зазвичай виконуються над функцією main () і мають загальний вигляд:

return_data_type function_name (data_type arguments);
  • return_data_type: – це тип даних функції значення, що повертається викликаючому оператору.
  • Після function_name: йдуть дужки
  • Імена аргументів з їхніми оголошеннями типів даних (за бажанням) розміщуються в дужках.

Ми розглянемо наступну програму, яка показує, як оголосити функцію куба для обчислення значення куба цілочисельної змінної

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

Майте на увазі, що функція не обов’язково повертає значення. У цьому випадку використовується ключове слово void.

Наприклад, оголошення функції output_message вказує, що функція не повертає значення: void output_message();

Визначення функції

Визначення функції означає просто написання тіла функції. Тіло функції складається з операторів, які збираються виконати певне завдання. Тіло функції складається з одного або блоку операторів. Це також обов’язкова частина функції.

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

Виклик функції

Виклик функції означає виклик функції щоразу, коли це потрібно в програмі. Щоразу, коли ми викликаємо функцію, вона виконує операцію, для якої вона була розроблена. Виклик функції є необов'язковою частиною програми.

  result = add(4,5);

Ось повний код:

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

вихід:

Addition:30

Аргументи функції

Аргументи функції використовуються для отримання необхідних значень під час виклику функції. Вони узгоджуються за посадою; перший аргумент передається до першого параметра, другий до другого параметра і так далі.

За замовчуванням аргументи передаються за значенням, в якому копія даних надається викликаній функції. Фактично передана змінна не зміниться.

Розглянемо наступну програму, яка демонструє параметри, що передаються за значенням:

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

Результат програми:

5 + 10 = 15

Майте на увазі, що значення a і b, передані до функції додавання, не змінилися, оскільки в параметр x було передано лише його значення.

Змінна область застосування

Область видимості змінної означає видимість змінних у коді програми.

У мові C змінні, оголошені всередині функції, є локальними для цього блоку коду та не можуть бути використані поза функцією. Однак змінні, оголошені поза всіма функціями, є глобальними та доступними з усієї програми. Константи, оголошені з #define на початку програми, доступні з усієї програми. Розглянемо наступну програму, яка виводить значення глобальної змінної як з основної, так і з користувацької функції:

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

Результат:

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

Обговорюємо деталі програми:

Змінна область застосування

  1. Ми оголошуємо цілочисельну глобальну змінну з 1348 як початкове значення.
  2. Ми оголошуємо та визначаємо функцію test(), яка не приймає аргументів і не повертає значення. Ця функція друкує лише значення глобальної змінної, щоб продемонструвати, що до глобальних змінних можна отримати доступ будь-де в програмі.
  3. Ми друкуємо глобальну змінну в основній функції.
  4. Ми викликаємо тестову функцію, щоб надрукувати значення глобальної змінної.

У C, коли аргументи передаються параметрам функції, параметри діють як локальні змінні, які будуть знищені під час виходу з функції.

При використанні глобальні змінні, використовуйте їх з обережністю, оскільки це може призвести до помилок і вони можуть змінитися будь-де в програмі. Перед використанням їх слід ініціалізувати.

Статичні змінні

Статичні змінні мають локальну область видимості. Однак вони не знищуються при виході з функції. Таким чином, статична змінна назавжди зберігає своє значення, і до неї можна отримати доступ при повторному введенні функції. Статична змінна ініціалізується під час оголошення та потребує префікса static.

Наступна програма використовує статичну змінну:

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

Програма відображає:

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

Рекурсивні функції

Розглянемо факторіал числа, який обчислюється наступним чином: 6! = 6 * 5 * 4 * 3 * 2 * 1.

Це обчислення виконується як повторне обчислення факту * (факт -1), доки факт не дорівнюватиме 1.

Рекурсивна функція — це функція, яка викликає сама себе та включає умову виходу для завершення рекурсивних викликів. У випадку обчислення факторіального числа умова виходу фактично дорівнює 1. Рекурсія працює шляхом «стекування» викликів, доки умова виходу не стане істинною.

Наприклад:

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

Програма відображає:

 The factorial of 6 is 720

Тут ми обговорюємо деталі програми:

Рекурсивні функції

  1. Ми оголошуємо нашу рекурсивну факторіальну функцію, яка приймає цілочисельний параметр і повертає факторіал цього параметра. Ця функція викличе сама себе та зменшить число до виходу або базового стану. Коли умова виконується, попередньо згенеровані значення будуть помножені одне на одне, і буде повернуто кінцеве значення факторіалу.
  2. Ми оголошуємо та ініціалізуємо цілочисельну змінну зі значенням «6», а потім друкуємо її факторіальне значення, викликаючи нашу функцію факторіалу.

Розгляньте наступну діаграму, щоб краще зрозуміти рекурсивний механізм, який полягає у виклику самої функції до базового випадку або зупинки.ping умова досягнута, і після цього ми збираємо попередні значення:

Рекурсивні функції

Вбудовані функції

Функція в програмуванні на C використовується для зберігання інструкцій, які найчастіше використовуються. Використовується для модульності програми.

Щоразу, коли викликається функція, покажчик інструкції переходить до визначення функції. Після виконання функції вказівник інструкції повертається до оператора, звідки він перейшов до визначення функції.

Щоразу, коли ми використовуємо функції, нам потрібні додаткові покажчик голову, щоб перейти до визначення функції та повернутися до оператора. Щоб усунути потребу в таких покажчиках, ми використовуємо вбудовані функції.

У вбудованій функції виклик функції безпосередньо замінюється фактичним програмним кодом. Він не переходить до жодного блоку, оскільки всі операції виконуються всередині вбудованої функції.

Вбудовані функції здебільшого використовуються для невеликих обчислень. Вони не підходять, коли задіяні великі обчислення.

Вбудована функція подібна до звичайної функції, за винятком того, що ключове слово inline стоїть перед назвою функції. Вбудовані функції створюються з таким синтаксисом:

inline function_name ()
{
    //function definition
}

Давайте напишемо програму для реалізації вбудованої функції.

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

вихід:

Addition: 30

Наведена вище програма демонструє використання вбудованої функції для додавання двох чисел. Як ми бачимо, ми повернули додавання двох чисел у вбудованій функції лише без написання додаткових рядків. Під час виклику функції ми щойно передали значення, над якими ми повинні виконати додавання.

Поширені запитання

Виклик за значенням копіює аргумент у функцію, тому зміни залишаються локальними, а оригінальна змінна не змінюється. Виклик за посиланням передає адресу змінної через вказівник, дозволяючи функції безпосередньо змінювати оригінальні дані викликаючої сторони.

Фактичний параметр — це реальне значення або змінна, яку передає викликаюча функція під час виклику функції. Формальний параметр — це заповнювач, названий у визначенні функції, яка його отримує. Вони зіставляються за позицією: перший до першого, другий до другого.

Функція AC повертає лише одне значення безпосередньо з return. Щоб повернути кілька результатів, оберніть їх у структуру, заповніть масив або передайте вказівники як аргументи, щоб функція записувала кожен результат у власні змінні викликаючої сторони.

Функції забезпечують можливість повторного використання, тому один блок виконується багато разів, а також модульність, яка розділяє велику програму на менші частини. Вони також покращують читабельність, спрощують тестування та налагодження, а також приховують складні деталі за одним ім'ям, що заощаджує час розробки.

Функція main() – це точка входу, з якої починається виконання кожної програми на C. Операційна система викликає її першою, і її повернене значення, зазвичай 0, сигналізує про успіх. Для отримання аргументів командного рядка можуть знадобитися argc та argv.

Рекурсія підходить для задач із природно повторюваною структурою, такою як обхід дерев або факторіали, забезпечуючи коротший та зрозуміліший код. Ітерація зазвичай виконується швидше та використовує менше пам'яті, оскільки уникає повторних викликів. Виберіть рекурсію для ясності, ітерацію для продуктивності з великими вхідними даними.

Так. Помічник зі штучного інтелекту може написати функцію на C з командного рядка простою мовою, пропонувати параметри та типи повернень, а також позначати помилки, такі як відсутність повернення або невідповідність аргументів. Завжди компілюйте та тестуйте згенеровану функцію, перш ніж покладатися на неї.

Копілот GitHub пише функції на C, доповнюючи тіло функції назвою або коротким коментарем та пропонуючи оголошення, цикли та рекурсивні виклики. Часто додає відповідний прототип вище main(), хоча вам все одно слід переглянути логіку.

Підсумуйте цей пост за допомогою: