Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТ...docx
Скачиваний:
12
Добавлен:
21.09.2019
Размер:
695.51 Кб
Скачать

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

Цель работы: изучение как работать с функциями и применение технологии

процедурной абстракции

Основные теоретические сведения

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

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

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

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

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

таком подходе основана методология структурного программирования,

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

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

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

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

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

языках программирования есть два типа подпрограмм – "процедуры" и

"функции").

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

лабораторных занятиях. Например, в лабораторной работе № 4 (программа

4.4) для построения таблицы квадратных корней был применен следующий

цикл 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. Определение новых функций

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

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

"area(...)"). Эта программа вычисляет площадь прямоугольника заданной

длины и ширины.

#include<iostream.h>

int area(int length, int width); /* Описание функции */

// ГЛАВНАЯ ФУНКЦИЯ:

void 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";

}

// КОНЕЦ ГЛАВНОЙ ФУНКЦИИ

// ФУНКЦИЯ ВЫЧИСЛЕНИЯ ПЛОЩАДИ:

int area(int length, int width) /* Начало определения функции

*/

{

int number;

number = length * width;

return number;

} /* Конец определения функции */

// КОНЕЦ ФУНКЦИИ

Программа 5.1

Программа 5.1, конечно, допускает запись в более сжатой форме, но

в данном виде она служит хорошей иллюстрацией некоторых свойств

функций Си++:

· Структура определения (реализации) функции подобна структуре

функции "main()" – в теле функции есть описания локальных

переменных и исполняемые операторы.

· У функции могут быть параметры, которые указываются в списке

внутри круглых скобок после имени функции. У каждого параметра

задается тип.

· Если вызов функции встречается ранее ее определения, то в

начале программы должно содержаться описание функции

(прототип). Прототип функции описывает ее параметры и тип

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

размещаются после описания глобальных констант.

Внутри функции может быть несколько операторов возврата "return".

Функция завершается после выполнения любого оператора "return".

Например:

double absolute_value(double number)

{

if (number >= 0)

return number;

else

return -number;

}