Tooprogram.ru

Компьютерный справочник
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Функции в си примеры

Процедуры и функции в Си.

Процедуры в си

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

Чтобы задать собственную процедуру в си необходимо указать

void имя процедуры( тип параметра 1 параметр1, тип параметра2 параметр2 …. )

//набор команд выполняемых процедурой

Процедура в си описывается до основной программы, которая начинается с ключевого слова main()

Пример процедуры анализа количества правильных ответов и выставления оценки.

void ocenka ( int kol, int pr)

float k; // параметр для расчета относительного числа правильных ответов

k=(float)pr/kol;// рассчитываем коэффициент относительного числа правильных ответов

if ( (koef>=0.3) && (koef

if ( (koef>=0.6) && (koef

if ( (koef>=0.9) && (koef

Данная процедура использует два параметра kol – общее количество, pr – количество правильных ответов

Чтобы вызвать процедуру

Необходимо просто написать ее имя и в скобочках указать значения параметров. Значения параметров можно указать явно

В этом случае в процедуре параметры будут kol = 5 и pr =3

В процедуру в качестве значений параметров можно поставить значения переменных.

В этом случае в процедуре параметры будут kol=10 и pr =4

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

перечисление заголовочных файлов

объявление глобальных переменных

Перечисление функций и процедур

Глобальные переменные можно вызывать и изменять в любой процедуре. Локальные переменные объявляются внутри каждой процедуры и могут изменяться только внутри каждой процедуры, другие процедуры не могут использовать локальные переменные.

Пример программы 13. Локальные и глобальные переменные. В программе

int stat; // глобальная переменная, может вызваться и изменяться в любых местах программы

x=3;// переменная поменялась только в рамках процедуры будет выведено 3

stat=stat+1;// изменение глобальной переменной

int x;// локальная переменная

// процедура изменила глобальную переменную stat. будет выведено 2

//процедура не поменяла локальную для основной программы переменную x. будет выведено 10

Для игр и тестов можно использовать следующую структуру программы

Перечисление заголовочных файлов

Объявление глобальных переменных отвечающих за общую статистику теста

Процедура ввода начальных параметров

Процедура стандартного вопроса теста или хода игры

Процедура расчета и вывода статистки игры

Вызов процедуры ввода начальных параметров

// выполняем тест пока ответ на продолжение игры ==1

Вызов процедуры стандартного вопроса теста или хода игры

printf(«Хотите продолжить ? 1 -Да. 2 — Нет.n»);

Вызов процедуры расчета и вывода статистки игры

Следуя такой логике, приведем пример правильно написанной программы тестирования таблицы квадратов.

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

// тест на таблицу квадратов

int prav;// счетчик правильных ответов

int stat;// счетчик количества вопросов

// процедура выставления оценки kol количество всего вопросов, pr – количество //правильных ответов

void ocenka ( int kol, int pr)

float k; // локальная переменная для определения относительного коэффициента правильных ответов

// процедура стандартного вопроса теста . Запрашиваем квадрат числа ch

void vopr(int ch)

printf(«Введите квадрат числа %dn», ch);

// проверка правильности ответа

prav=prav+1; // увеличиваем счетчик правильных ответов

int b; // начальное число

int ans; // ответ на вопрос о завершении теста

// ввод начального числа теста

printf(«Введите начальное число «);

// для прохождения первой итерации

// выполняем тест пока ответ на продолжение игры ==1

stat=stat+1;// увеличиваем число вопросов

// вопрос теста спрашиваем квадрат текущего числа b

b=b+1;// увеличиваем текущее число

// запрос на продолжение теста

printf(«Хотите продолжить проверку? 1 -Да. 2 — Нет.n»);

// вывод результатов теста

printf(«Всего примеров %d Правильных из них %dn», stat, prav);

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

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

Тип функции Название функции (параметры)

return возвращаемое значение;

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

Пример программы 15. Программа запрашивает значение аргумента x и возвращает значение от данного аргумента введенной собственной математической функции parabola

// задаем собственную математическую функцию параболу a*x*x+b*x+c

Функции в языке Си

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

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

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

Определение функции

Каждая функция в языке Си должна быть определена, то есть должны быть указаны:

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

Определение функции имеет следующий синтаксис:

Читать еще:  Игра на си шарп

Пример : Функция сложения двух вещественных чисел

В указанном примере возвращаемое значение имеет тип float . В качестве возвращаемого значения в вызывающую функцию передается значение переменной y . Формальными аргументами являются значения переменных x и z .

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

Различают системные (в составе систем программирования) и собственные функции.

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

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

Разбиение программ на функции дает следующие преимущества:

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

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

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

Общий вид вызова функции

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

Возврат в вызывающую функцию

По окончании выполнения вызываемой функции осуществляется возврат значения в точку ее вызова. Это значение присваивается переменной, тип которой должен соответствовать типу возвращаемого значения функции. Функция может передать в вызывающую программу только одно значение. Для передачи возвращаемого значения в вызывающую функцию используется оператор return в одной из форм:

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

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

Функции могут и не возвращать значения, а просто выполнять некоторые вычисления. В этом случае указывается пустой тип возвращаемого значения void , а оператор return может либо отсутствовать, либо не возвращать никакого значения:

Пример : Посчитать сумму двух чисел.

В языке Си нельзя определять одну функцию внутри другой.

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

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

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

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

Рекурсивные функции

Функция, которая вызывает сама себя, называется рекурсивной функцией .

Рекурсия — вызов функции из самой функции.

Пример рекурсивной функции — функция вычисления факториала.

Результат выполнения

Более подробно рекурсивные функции рассмотрены в этой статье.

Математические функции

Математические функции хранятся в стандартной библиотеке math.h . Аргументы большинства математических функций имеют тип double . Возвращаемое значение также имеет тип double .
Углы в тригонометрических функциях задаются в радианах.

Основные математические функции стандартной библиотеки.

ФункцияОписание
int abs( int x)Модуль целого числа x
double acos( double x)Арккосинус x
double asin( double x)Арксинус x
double atan( double x)Арктангенс x
double cos( double x)Косинус x
double cosh( double x)Косинус гиперболический x
double exp( double x)Экспонента x
double fabs( double x)Модуль вещественного числа
double fmod( double x, double y)Остаток от деления x/y
double log( double x)Натуральный логарифм x
double log10( double x)Десятичный логарифм x
double pow( double x, double y)x в степени y
double sin( double x)Синус x
double sinh( double x)Синус гиперболический x
double sqrt( double x)Квадратный корень x
double tan( double x)Тангенс x
double tanh( double x)Тангенс гиперболический x

Особенности использования функций в языке C++ рассмотрены в этой статье.

C ++ — Функции

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

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

Функция declaration сообщает компилятор об имени функции во, типе возвращаемого значения и параметрах. Функция definition обеспечивает реальное тело функции.

Стандартная библиотека C ++ предоставляет множество встроенных функций, которые может вызывать ваша программа. Например, функция strcat () для объединения двух строк, функция memcpy() для копирования одной ячейки памяти в другое место и множество других функций.

Функция известна с различными именами, такими как метод или подпрограмма или процедура и т. д.

Определение функции

Общая форма определения функции C ++ заключается в следующем:

Определение функции C ++ состоит из заголовка функции и тела функции. Вот все части функции —

  • Return Type. Функция может возвращать значение. Тип return_type — это тип данных значения, возвращаемого функцией. Некоторые функции выполняют требуемые операции без возврата значения. В этом случае return_type является ключевым словом void .
  • Function Name — это фактическое имя функции. Имя функции и список параметров вместе составляют подпись функции.
  • Parameters . Параметр подобен заполнителю. Когда функция вызывается, вы передаете значение параметру. Это значение называется фактическим параметром или аргументом. Список параметров относится к типу, порядку и количеству параметров функции. Параметры являются необязательными; то есть функция не может содержать никаких параметров.
  • Function Body. Тело функции содержит набор операторов, которые определяют, что делает функция.

Пример

Ниже приведен исходный код для функции max () . Эта функция принимает два параметра num1 и num2 и возвращает наибольшую из них:

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

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

Объявление функции имеет следующие части —

Для указанной выше функции max () следующим является объявление функции —

Имена параметров не важны в объявлении функции только для их типа, поэтому следующее также является действительным объявлением —

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

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

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

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

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

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

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

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

При вызове функции существует два способа передачи аргументов функции —

Call by Value (Вызов по значению)Этот метод копирует фактическое значение аргумента в формальный параметр функции. В этом случае изменения, внесенные в параметр внутри функции, не влияют на аргумент.
Call by Pointer (Вызов по указателю)Этот метод копирует адрес аргумента в формальный параметр. Внутри функции адрес используется для доступа к фактическому аргументу, используемому в вызове. Это означает, что изменения, внесенные в параметр, влияют на аргумент.
Call by Reference (Вызов по ссылке)Этот метод копирует ссылку аргумента в формальный параметр. Внутри функции ссылка используется для доступа к фактическому аргументу, используемому в вызове. Это означает, что изменения, внесенные в параметр, влияют на аргумент.

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

Значения по умолчанию для параметров

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

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

Когда приведенный выше код компилируется и выполняется, он производит следующий результат:

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

Пожалуйста, приостановите работу AdBlock на этом сайте.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Переменной 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 удаляются из памяти. А мы возвращаемся к строке

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

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

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

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

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

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

Практика

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

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

Ссылка на основную публикацию
Adblock
detector