Лекция 3. Функции и процедурная абстракция

Назначение подпрограмм

Естественный и интуитивно понятный подход к решению больших сложных

задач состоит в том, чтобы разбить большую задачу на набор меньших, которые мож-

но решить более или менее независимо и затем скомбинировать полученные решения

для получения полного решения. На таком подходе основана методология структур-

ного программирования, которое господствовало в разработке программного обеспе-

чения до появления объектно-ориентированного подхода.

При структурном программировании большая программа разделяется на набор

более или менее независимых подпрограмм. В Си++ подпрограммы называются

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

подпрограмм – "процедуры" и "функции").

Подпрограммы уже неоднократно встречались в предыдущих лекциях. Напри-

мер, в программе 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


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: