Назначение подпрограмм
Естественный и интуитивно понятный подход к решению больших сложных
задач состоит в том, чтобы разбить большую задачу на набор меньших, которые мож-
но решить более или менее независимо и затем скомбинировать полученные решения
для получения полного решения. На таком подходе основана методология структур-
ного программирования, которое господствовало в разработке программного обеспе-
чения до появления объектно-ориентированного подхода.
При структурном программировании большая программа разделяется на набор
более или менее независимых подпрограмм. В Си++ подпрограммы называются
функциями (в Паскале и некоторых других языках программирования есть два типа
подпрограмм – "процедуры" и "функции").
Подпрограммы уже неоднократно встречались в предыдущих лекциях. Напри-
мер, в программе 2.3.2 для построения таблицы квадратных корней был применен
следующий цикл for:
...
#include<math.h>
...
...
for (number=1; number<=10; number=number+1)
{
cout.width(20);
|
|
cout << number << sqrt(number) << "\n";
}
...
Функция "sqrt(...)" – это подпрограмма, описание которой хранится в заголо-
вочном файле "math.h", а реализация – в библиотечном файле "math.lib". При вызове
функции "sqrt(...)" ей передается числовой параметр "number", функция применяет
алгоритм вычисления квадратного корня из этого числа, и затем возвращает вычис-
ленное значение обратно в место вызова. Для применения этой функции программи-
сту совсем необязательно знать, какой именно алгоритм реализован внутри нее. Глав-
ное, чтобы функция гарантированно возвращала верный результат. Было бы довольно
нелепо включать в явном виде алгоритм извлечения квадратного корня (и, возможно,
делать это неоднократно) в главную функцию программы "main".
В данной лекции описывается, как программист может определять свои собст-
венные функции. Сначала предполагается, что эти функции размещаются в одном
файле с функцией "main". В конце лекции показывается, как распределять функции
программы по нескольким файлам.
Определение новых функций
Простым примером определения и использования новой функции является
программа 2.1 (в ней пользовательская функция называется "area(...)"). Эта про-
грамма вычисляет площадь прямоугольника заданной длины и ширины.
#include<iostream.h>
int area(int length, int width); /* Описание функции */
32
// ГЛАВНАЯ ФУНКЦИЯ:
int main()
{
int this_length, this_width;
cout << "Введите длину: "; /* <--- строка 10 */
cin >> this_length;
cout << "Введите ширину: ";
cin >> this_width;
cout << "\n"; /* <--- строка 14 */
cout << "Площадь прямоугольника с размерами ";
|
|
cout << this_length << "x" << this_width;
cout << " равна " << area(this_length, this_width) << "\n";
return 0;
}
// КОНЕЦ ГЛАВНОЙ ФУНКЦИИ
// ФУНКЦИЯ ВЫЧИСЛЕНИЯ ПЛОЩАДИ:
int area(int length, int width) /* Начало определения функции */
{
int number;
number = length * width;
return number;
} /* Конец определения функции */
// КОНЕЦ ФУНКЦИИ
Программа 2.1.
Программа 2.1, конечно, допускает запись в более сжатой форме, но в данном
виде она служит хорошей иллюстрацией некоторых свойств функций Си++:
• Структура определения (реализации) функции подобна структуре функции
"main()" – в теле функции есть описания локальных переменных и испол-
няемые операторы.
• У функции могут быть параметры, которые указываются в списке внутри
круглых скобок после имени функции. У каждого параметра задается тип.
• Если вызов функции встречается ранее ее определения, то в начале про-
граммы должно содержаться описание функции (прототип). Прототип
функции описывает ее параметры и тип возвращаемого значения. Обычно
прототипы функций размещаются после описания глобальных констант.
Внутри функции может быть несколько операторов возврата "return". Функ-
ция завершается после выполнения любого оператора "return". Например:
double absolute_value(double number)
{
if (number >= 0)
return number;
else
return -number;
}
33