Как создать функцию в си
Перейти к содержимому

Как создать функцию в си

  • автор:

Функции в C++ — урок 6

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

#include #include using namespace std; int main() < string valid_pass = "qwerty123"; string user_pass; cout else < cout return 0; > 

А вот аналогичный пример с функцией:

#include #include using namespace std; void check_pass (string password) < string valid_pass = "qwerty123"; if (password == valid_pass) < cout else < cout > int main()

По сути, после компиляции не будет никакой разницы для процессора, как для первого кода, так и для второго. Но ведь такую проверку пароля мы можем делать в нашей программе довольно много раз. И тогда получается копипаста и код становится нечитаемым. Функции — один из самых важных компонентов языка C++.

  • Любая функция имеет тип, также, как и любая переменная.
  • Функция может возвращать значение, тип которого в большинстве случаев аналогично типу самой функции.
  • Если функция не возвращает никакого значения, то она должна иметь тип void (такие функции иногда называют процедурами)
  • При объявлении функции, после ее типа должно находиться имя функции и две круглые скобки — открывающая и закрывающая, внутри которых могут находиться один или несколько аргументов функции, которых также может не быть вообще.
  • после списка аргументов функции ставится открывающая фигурная скобка, после которой находится само тело функции.
  • В конце тела функции обязательно ставится закрывающая фигурная скобка.

Пример построения функции

#include using namespace std; void function_name () < cout int main() < function_name(); // Вызов функции return 0; >

Перед вами тривиальная программа, Hello, world, только реализованная с использованием функций.

Если мы хотим вывести «Hello, world» где-то еще, нам просто нужно вызвать соответствующую функцию. В данном случае это делается так: function_name(); . Вызов функции имеет вид имени функции с последующими круглыми скобками. Эти скобки могут быть пустыми, если функция не имеет аргументов. Если же аргументы в самой функции есть, их необходимо указать в круглых скобках.

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

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

Рассмотрим пример функции, возвращающей значение на примере проверки пароля.

#include #include using namespace std; string check_pass (string password) < string valid_pass = "qwerty123"; string error_message; if (password == valid_pass) < error_message = "Доступ разрешен."; >else < error_message = "Неверный пароль!"; >return error_message; > int main()

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

Самой первой выполняется функция main(), которая должна присутствовать в каждой программе. Теперь мы объявляем переменную user_pass типа string, затем выводим пользователю сообщение «Введите пароль», который после ввода попадает в строку user_pass. А вот дальше начинает работать наша собственная функция check_pass() .

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

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

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

После того, как произошел вызов функции check_pass() , начинает работать данная функция. Если функцию нигде не вызвать, то этот код будет проигнорирован программой. Итак, мы передали в качестве аргумента строку, которую ввел пользователь.

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

Теперь мы проверяем, правильный ли пароль ввел пользователь или нет. если пользователь ввел правильный пароль, присваиваем переменной error_message соответствующее значение. если нет, то сообщение об ошибке.

После этой проверки мы возвращаем переменную error_message . На этом работа нашей функции закончена. А теперь, в функции main(), то значение, которое возвратила наша функция мы присваиваем переменной error_msg и выводим это значение (строку) на экран терминала.

Также, можно организовать повторный ввод пароля с помощью рекурсии (о ней мы еще поговорим). Если объяснять вкратце, рекурсия — это когда функция вызывает сама себя. Смотрите еще один пример:

#include #include using namespace std; bool password_is_valid (string password) < string valid_pass = "qwerty123"; if (valid_pass == password) return true; else return false; >void get_pass () < string user_pass; cout else < cout > int main()

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

Не расстраивайтесь, если не сразу поймете все аспекты функций в C++, т. к. это довольно сложная тема и мы еще будем разбирать примеры с функциями в следующих уроках.

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

Если Вы найдете какие-либо ошибки в моем коде, обязательно напишите об этом в комментариях. здесь же можно задавать все вопросы.

Пользовательские функции в Си

Итак, зачем нужны пользовательские функции? Пользовательские функции нужны для того, чтобы программистам было проще писать программы.

Помните, мы говорили о парадигмах программирования, а точнее о структурном программировании. Основной идеей там было то, что любую программу можно написать используя только три основных конструкции: следование, условие и цикл. Теперь к этим конструкциям мы добавим ещё одну – «подпрограммы» – и получим новую парадигму процедурное программирование» .

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

В принципе, мы уже используем эту парадигму. Если вам пока ещё не совсем ясно, почему это проще, то просто представьте, что вместо того чтобы вызвать функцию exp(x) из заголовочного файла math.h вам каждый раз необходимо было бы описывать подробно, как вычислить значение этой функции.

Итак, в этом уроке мы подробно обсудим то, как функции устроены изнутри. А также научимся создавать свои собственные пользовательские функции.

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

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

int main(void)< // заголовок функции // в фигурных скобках записано тело функции >

С телом функции всё ясно: там описывается алгоритм работы функции. Давайте разберёмся с заголовком. Он состоит из трёх обязательных частей:

  • тип возвращаемого значения;
  • имя функции;
  • аргументы функции.

Сначала записывается тип возвращаемого значения, например, int , как в функции main . Если функция не должна возвращать никакое значение в программу, то на этом месте пишется ключевое слово void . Казалось бы, что раз функция ничего не возвращает, то и не нужно ничего писать. Раньше, кстати, в языке Си так и было сделано, но потом для единообразия всё-таки добавили. Сейчас современные компиляторы будут выдавать предупреждения/ошибки, если вы не укажете тип возвращаемого значения.
В некоторых языках программирования функции, которые не возвращают никакого значения, называют процедурами (например, pascal). Более того, для создания функций и процедур предусмотрен различный синтаксис. В языке Си такой дискриминации нет.

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

Давайте посмотрим на заголовки уже знакомых нам функций.

// функция с именем srand, принимающая целое число, ничего не возвращает void srand(int) //функция с именем sqrt, принимающая вещественное число типа float, возвращает вещественное число типа float float sqrt(float) //функция с именем rand, которая не принимает аргументов, возвращает целое число int rand(void) //функция с именем pow, принимающая два аргумента типа double, возвращает вещественное число типа double double pow(double, double)

Как создать свою функцию

Для того чтобы создать свою функцию, необходимо её полностью описать. Тут действует общее правило: прежде чем использовать – объяви и опиши, как должно работать. Для этого вернёмся к схеме структуры программы на языке Си, которая у нас была в самом первом уроке. Отметим на ней те места, где можно описывать функции.

Уточнение структуры программы. Объявление функций.

Рис.1 Уточнение структуры программы. Объявление функций.

Как видите, имеется аж два места, где это можно сделать.

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

#include // объявляем пользовательскую функцию с именем max_num // вход: два целочисленных параметра с именами a и b // выход: максимальное из двух аргументов int max_num(int a, int b) < int max = b; if (a >b) max = a; return max; > //основная программа int main(void)

Давайте я подробно опишу, как будет работать эта программа. Выполняется тело функции main . Создются целые переменные x , y и m . В переменные x и y считываются данные с клавиатуры. Допустим мы ввели 3 5 , тогда x = 3 , y = 5 . Это вам всё и так должно быть понятно. Теперь следующая строчка

m = max_num(x,y);

Переменной m надо присвоить то, что находится справа от знака = . Там у нас указано имя функции, которую мы создали сами. Компьютер ищет объявление и описание этой функции. Оно находится выше. Согласно этому объявлению данная функция должна принять два целочисленных значения. В нашем случае это значения, записанные в переменных x и y . Т.е. числа 3 и 5 . Обратите внимание, что в функцию передаются не сами переменные x и y , а только значения (два числа), которые в них хранятся. То, что на самом деле передаётся в функцию при её вызове в программе, называется фактическими параметрами функции.

Теперь начинает выполняться функция max_num . Первым делом для каждого параметра, описанного в заголовке функции, создается отдельная временная переменная. В нашем случае создаются две целочисленных переменных с именами a и b . Этим переменным присваиваются значения фактических параметров. Сами же параметры, описанные в заголовке функции, называются формальными параметрами. Итак, формальным параметрам a и b присваиваются значения фактических параметров 3 и 5 соответственно. Теперь a = 3 , b = 5 . Дальше внутри функции мы можем работать с этими переменными так, как будто они обычные переменные.

Создаётся целочисленная переменная с именем max , ей присваивается значение b . Дальше проверяется условие a > b . Если оно истинно, то значение в переменной max следует заменить на a .

Далее следует оператор return , который возвращает в вызывающую программу (функцию main ) значение, записанное в переменной max , т.е. 5 . После чего переменные a , b и max удаляются из памяти. А мы возвращаемся к строке

m = max_num(x,y);

Функция max_num вернула значение 5 , значит теперь справа от знака = записано 5 . Это значение записывается в переменную m. Дальше на экран выводится строчка, и программа завершается.

Внимательно прочитайте последние 4 абазаца ещё раз, чтобы до конца уяснить, как работает программа.

А я пока расскажу, зачем нужен нижний блок описания функций. Представьте себе, что в вашей программе вы написали 20 небольших функций. И все они описаны перед функцией main . Не очень-то удобно добираться до основной программы так долго. Чтобы решить эту проблему, функции можно описывать в нижнем блоке.

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

Прототип функции полностью повторяет заголовок функции, после которого стоит ; . Указав прототип в верхнем блоке, в нижнем мы уже можем полностью описать функцию. Для примера выше это могло бы выглядеть так:

#include int max_num(int, int); int main(void) < int x =0, y = 0; int m = 0; scanf("%d %d", &x, &y); m = max_num(x,y); printf("max(%d,%d) = %d\n",x,y,m); return 0; >int max_num(int a, int b) < int max = b; if (a >b) max = a; return max; >

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

Сохрани в закладки или поддержи проект.

Практика

Решите предложенные задачи:

Для удобства работы сразу переходите в полноэкранный режим

Дополнительные материалы

  1. пока нет

Создание функции на Си

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

#include #include int main() < int n,x,i; float sum; printf(" Введите n ") ; scanf("%d",&n); printf(" Введите x ") ; scanf("%d",&x); for (i=1;i<=n;i++) < sum=sum+((x+cos((i*x*180)/3.14))/(pow(2,i))); >printf("Вывод: %f",sum); return 0; > 

Моя функция :

 #include #include int n,x,i,m; float sum = 0.0f; float func (int n,int x) < for (i=1;i<=n;i++) < sum=sum+((x+cos((i*x*180)/3.14))/(pow(2,i))); >return(sum); > int main()

Отслеживать
Александр Белый
задан 23 фев 2021 в 16:22
Александр Белый Александр Белый
1 1 1 бронзовый знак
Так функцию-то покажите
23 фев 2021 в 16:27

Переменная sum не инициализирована. Заменить float sum; на float sum = 0.0f; . Вынести функцию func за пределы main .

23 фев 2021 в 16:29
показал ,исправил
23 фев 2021 в 16:29
wololo, заменил и вывел, но ответ остаётся равным :0.0000
23 фев 2021 в 16:34

Напишите какие данные вы вводите и получаете 0? Например у меня просто float sum = 0.0f; написать достаточно и выдает не нулевой ответ.

23 фев 2021 в 16:39

0

Сортировка: Сброс на вариант по умолчанию

Знаете кого-то, кто может ответить? Поделитесь ссылкой на этот вопрос по почте, через Твиттер или Facebook.

  • c
  • функции

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

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

Функция в C

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

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

  • Библиотека Vs. Пользовательские функции
  • Объявление функции
  • Определение функции
  • Вызов функции
  • Аргументы функции
  • Переменная сфера
  • Статические переменные
  • Рекурсивные функции
  • Встроенные функции

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

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

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

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

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

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

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

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

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

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

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

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

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

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

#include /*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

Вызов функции

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

result = add(4,5);

#include 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

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)

5 + 10 = 15

Имейте в виду, что значения a и b, переданные функции add, не изменились, поскольку в параметр x было передано только его значение.

Переменная сфера

Область видимости переменных означает видимость переменных в коде программы.

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

#include int global = 1348; void test(); int main() < printf("from the main function : global =%d \n", global); test () ; return 0;>void test ()

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

Обсуждаем детали программы:

  1. Мы объявляем целочисленную глобальную переменную с 1348 в качестве начального значения.
  2. Мы объявляем и определяем функцию test (), которая не принимает аргументы и не возвращает значение. Эта функция печатает только значение глобальной переменной, чтобы продемонстрировать, что к глобальным переменным можно получить доступ в любом месте программы.
  3. Мы печатаем глобальную переменную внутри главной функции.
  4. Мы вызываем тестовую функцию в orde для вывода значения глобальной переменной.

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

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

Статические переменные

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

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

#include void say_hi(); int main() < int i; for (i = 0; i < 5; i++) < say_hi();>return 0;> void say_hi()

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

Addition: 30

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

Резюме

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *