Учебники

13) Функции в Си

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

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

Функция в C

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

В этом уроке вы узнаете

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

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

В программировании «С» функции делятся на два типа:

  1. Библиотечные функции
  2. Пользовательские функции

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

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

Пользовательская функция всегда пишется пользователем, но позже она может быть частью библиотеки ‘C’. Это главное преимущество программирования на «С».

В «С» функции программирования делятся на три вида деятельности, такие как:

  1. Объявление функции
  2. Определение функции
  3. Вызов функции

Объявление функции

Объявление функции означает написание имени программы. Это обязательная часть для использования функций в коде. В объявлении функции мы просто указываем имя функции, которую мы собираемся использовать в нашей программе как объявление переменной. Мы не можем использовать функцию, если она не объявлена ​​в программе. Объявление функции также называется « Прототип функции ».

Объявления функций (называемые прототипом) обычно выполняются над функцией main () и имеют общий вид:

return_data_type function_name (data_type arguments);
  • Return_data_type : это тип данных значения функции вернулась обратно в вызывающем заявлении.
  • Имя_функции : следуют круглые скобки
  • Имена аргументов с их объявлениями типов данных могут быть заключены в круглые скобки.

Рассмотрим следующую программу, которая показывает, как объявить функцию куба для вычисления значения куба целочисленной переменной

#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, переданные функции add, не изменились, поскольку в параметр 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. Мы вызываем тестовую функцию в orde для вывода значения глобальной переменной.

В 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», а затем печатаем ее факториальное значение, вызывая нашу факториальную функцию.

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

Встроенные функции

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

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

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

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

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

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

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

Резюме

  • Функция — это мини-программа или подпрограмма.
  • Функции используются для модульной программы.
  • Библиотека и определяемые пользователем два типа функций.
  • Функция состоит из объявления, тела функции и части вызова функции.
  • Объявление функции и тело являются обязательными.
  • Вызов функции может быть необязательным в программе.
  • С программа имеет хотя бы одну функцию; это основная функция ().
  • Каждая функция имеет имя, тип данных возвращаемого значения или void, параметры.
  • Каждая функция должна быть определена и объявлена ​​в вашей C-программе.
  • Имейте в виду, что обычные переменные в функции C уничтожаются, как только мы завершаем вызов функции.
  • Аргументы, передаваемые в функцию, не будут изменены, поскольку они передаются по значению none по адресу.
  • Область видимости переменной называется видимостью переменных в программе
  • В программировании на С есть глобальные и локальные переменные