Объявление и описание функций
Цель работы
Изучить операторы, используемые для организации подпрограмм – функций.
Порядок выполнения работы
Получить задание (раздел 5) для выполнения лабораторной работы согласно своему варианту (номер студента по журналу). Разработать и отладить программу. Составить отчет о лабораторной работе и защитить его у преподавателя.
Содержание отчета
- наименование и цель работы.
- задание на лабораторную работу согласно варианту.
- схема алгоритма, текст программы на алгоритмическом языке.
- результаты работы программы.
Краткая теория
Программы, которые не разделены на отдельные структурные элементы, называются монолитными. Большие монолитные программы сложны для разработки, отладки и сопровождения. Минимальным самостоятельным элементом монолитной программы является оператор.
Целесообразно разбить программу на более крупные, чем операторы, компоненты. Роль таких компонент выполняют процедуры и функции (в Си++ используются только функции). Часто их объединяют в понятие подпрограмм. Подпрограмма имеет ту же структуру, что и монолитная программа. То есть может содержать разделы описания переменных, типов, констант и т.д. Кроме того, иметь собственные процедуры и функции. Имена объектов, описанных в подпрограмме, считаются известными только в пределах данной подпрограммы.
Работа подпрограммы, по определению завершается после выполнения последнего оператора ее тела. Borland С++ имеет специальный оператор return, который немедленно завершает выполнение подпрограммы и возвращает управление в точку вызова
Данная лабораторная работа посвящена изучению приёмов работы с функциями.
Объявление и описание функций
Функции представляют собой программные блоки, которые могут вызываться из разных частей программы. При вызове в них передаются некоторые переменные, константы, выражения, являющиеся аргументами, которые в самих функциях воспринимаются как формальные параметры. При этом функции возвращают значение определенного типа, которое замещает в вызвавшем выражении имя вызванной функции.
Например, оператор
I = 5 * F(x);
вызывает функцию F с аргументом х, умножает возвращенное ею значение на 5 и присваивает результат переменной I.
Допускается также вызов функции, не использующей возвращаемого ею значения. Например:
F(x);
В этом случае возвращаемое функцией значение игнорируется.
Функция описывается следующим образом:
тип_возвращаемого_значения имя_функции(список_параметров)
{
операторы тела функции
}
Первая строка этого описания, содержащая тип возвращаемого значения, имя функции и список параметров, называется заголовком функции. Если функция ничего не возвращает, то тип возвращаемого значения объявляется как void.
Список параметров, заключаемый в скобки, в простейшем случае представляет собой разделяемый запятыми список вида
тип_параметра имя_параметра
Например, заголовок
double FSum(double x1, double x2, int A)
объявляет функцию с именем FSum, с тремя параметрами x1, x2 и А, из которых первые два имеют тип double, а последний – int. Тип возвращаемого результата – double. Имена параметров x1, x2 и А – локальные, т.е. они имеют значение только внутри данной функции и никак не связаны с именами аргументов (фактических параметров), переданных при вызове функции. Значения этих параметров в начале выполнения функции равны значениям аргументов на момент вызова функции.
Ниже приведен заголовок функции, не возвращающей никакого значения:
void SPrint(char s[])
Она принимает один параметр типа строки (массив символов) и, например, отображает его на экране.
Если функция не принимает никаких параметров, то скобки или оставляются пустыми, или в них записывается ключевое слово void. например:
void F1(void)
или
void F1()
Как правило (хотя формально не обязательно), помимо описания функции в текст программы включается также прототип функции – ее предварительное объявление. Прототип представляет собой тот же заголовок функции, но с точкой с запятой «;» в конце. Кроме того, в прототипе можно не указывать имена параметров.
Примеры прототипов приведенных выше заголовков функций:
double FSum(double x1, double x2, int A);
void SPrint(char s[]);
void F1(void);
или
double FSum(double, double, int);
void SPrint(char[]);
void F1();
Введение в программу прототипов функций преследует несколько целей:
1. Это позволяет использовать в данном модуле функцию, описанную в каком-нибудь другом модуле. Тогда из прототипа компилятор получает сведения, сколько параметров, какого типа и в какой последовательности получает данная функция.
2. Если в начале модуля определены прототипы функций, то последовательности размещения в модуле описания функций безразлична. При ее отсутствии любая используемая функция должна быть описана до ее первого вызова в тексте.
3. Прототипы, размещенные в одном месте (обычно в начале модуля), делают программу более наглядной и самодокументированной.
Тело функции пишется по тем же правилам, что и любой код программы, и может содержать объявления типов, констант, переменных и любые выполняемые операторы. Не допускается объявление и описание в теле других функций. Таким образом, функции не могут быть вложены друг в друга.
Все объявления в теле функции носят локальный характер. объявленные переменные доступны только внутри данной функции. Если их идентификаторы совпадают с идентификаторами каких-то глобальных переменных модуля, то эти внешние переменные становятся невидимыми и недоступными (получить доступ к ним можно с помощью операции «::»).
Выход из функции может осуществляться следующими способами. Если функция не должна возвращать никакого значения, то выход из нее происходит или по достижении закрывающей ее тело фигурной скобки, или при выполнении оператора return. Если же функция должна возвращать некоторое значение, то нормальный выход из нее осуществляется оператором
return выражение
где выражение должно формировать возвращаемое значение и соответствовать типу, объявленному в заголовке функции.
Например:
double FSum(double x1, double x2, int A)
{
return A * (x1 + x2);
}