Функции в программировании на C с примерами: рекурсивные и встроенные

⚡ Умное резюме

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

  • 🧩 Какие функции выполняют: Функция группирует многократно используемые инструкции, благодаря чему большая программа разбивается на более мелкие, управляемые подпрограммы, которые проще отлаживать.
  • 📚 Два типа: Библиотечные функции, такие как printf и scanf, являются готовыми, в то время как пользовательские функции пишутся программистом.
  • ???? Три части: Использование функции включает в себя её объявление или прототип, её определение или тело, а также вызов, который её выполняет.
  • 🎯 Аргументы: Значения передаются по позиции и, по умолчанию, по значению, поэтому исходная переменная остается неизменной внутри вызываемой функции.
  • 🌐 Объем: Локальные переменные существуют только внутри своей функции, в то время как глобальные и статические переменные сохраняют свои значения на протяжении всей программы или между вызовами.
  • 🤖 Помощь ИИ: GitHub Copilot и ИИ-помощники создают шаблоны для функций на языке C, предлагают типы возвращаемых значений и отмечают отсутствующие возвращаемые значения или несоответствующие аргументы.

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

Что такое функция в C?

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

Что такое функция в C

Когда вы разделяете большую программу на различные функции, становится легко управлять каждой функцией индивидуально. Всякий раз, когда в программе возникает ошибка, вы можете легко исследовать ошибочные функции и исправить только эти ошибки. Вы можете легко вызывать и использовать функции, когда они необходимы, что автоматически приводит к экономии времени и места.

Библиотека против. Пользовательские функции

Каждая программа на языке 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` в начале программы, доступны из всей программы. Рассмотрим следующую программу, которая выводит значение глобальной переменной как из функции `main`, так и из пользовательской функции:

#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 используется для хранения наиболее часто используемых инструкций. Он используется для модульной организации программы.

Всякий раз при вызове функции указатель инструкции переходит к определению функции. После выполнения функции указатель инструкции возвращается к оператору, из которого он перешел к определению функции.

Всякий раз, когда мы используем функции, нам требуется дополнительный указатель head, чтобы перейти к определению функции и вернуться к оператору. Чтобы устранить необходимость в таких указателях, мы используем встроенные функции.

Во встроенной функции вызов функции напрямую заменяется реальным программным кодом. Он не переходит ни к одному блоку, поскольку все операции выполняются внутри встроенной функции.

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

Встроенная функция похожа на обычную функцию, за исключением того, что ключевое слово 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

Приведенная выше программа демонстрирует использование встроенной функции для сложения двух чисел. Как мы видим, мы вернули сложение двух чисел внутри встроенной функции только без написания дополнительных строк. Во время вызова функции мы только что передали значения, которые необходимо сложить.

Часто задаваемые вопросы (FAQ)

Передача по значению копирует аргумент в функцию, поэтому изменения остаются локальными, а исходная переменная остается нетронутой. Передача по ссылке передает адрес переменной через указатель, позволяя функции напрямую изменять исходные данные вызывающей стороны.

Фактический параметр — это реальное значение или переменная, которую вызывающая сторона передает во время вызова функции. Формальный параметр — это заполнитель, указанный в определении функции, которая его получает. Они сопоставляются по позиции: первый — первый, второй — второй.

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

Функции обеспечивают повторное использование, позволяя одному блоку выполняться многократно, и модульность, разбивая большую программу на более мелкие части. Они также улучшают читаемость, упрощают тестирование и отладку, а также скрывают сложные детали за одним именем, экономя время разработки.

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

Рекурсия подходит для задач с естественной повторяющейся структурой, таких как обход дерева или вычисление факториалов, обеспечивая более короткий и понятный код. Итерация обычно работает быстрее и использует меньше памяти, поскольку позволяет избежать повторных вызовов. Выбирайте рекурсию для ясности, итерацию — для производительности при работе с большими входными данными.

Да. Искусственный интеллект-помощник в программировании может написать функцию на языке C, используя подсказку на обычном языке, предложить параметры и типы возвращаемых значений, а также отметить ошибки, такие как отсутствие возвращаемого значения или несоответствие аргументов. Всегда компилируйте и тестируйте сгенерированную функцию, прежде чем полагаться на нее.

Второй пилот GitHub Он пишет функции на языке C, дополняя тело функции именем функции или коротким комментарием, а также предлагая объявления, циклы и рекурсивные вызовы. Часто он добавляет соответствующий прототип перед функцией main(), хотя логику все равно следует проверить.

Подведем итог этой публикации следующим образом: