- •Задание:
- •Задание:
- •Лабораторная работа 4 Переменные, типы данных и выражения
- •1. Идентификаторы
- •2. Типы данных
- •2.2 Вещественные числа
- •2.3 Преобразование типов в выражениях
- •2.4 Символьный тип
- •2.5 Символьные строки
- •2.6 Типы данных, определяемые пользователем
- •3. Вывод вещественных чисел на экран
- •4. Описания, константы и перечисления
- •4.1 Тип "Перечисление"
- •4.2 Расположение описаний констант и переменных в исходном тексте
- •5. Присваивание и выражения
- •5.1 Краткая форма записи операторов присваивания
- •5.2 Логические выражения и операторы
- •6. Сводка результатов
- •Лабораторная работа 5 Функции и процедурная абстракция
- •1. Назначение подпрограмм
- •2. Определение новых функций
- •3. Способы передачи параметров внутрь функций
- •3.1 Передача параметров по значению
- •3.2 Передача параметров по ссылке
- •4. Полиморфизм и перегрузка функций
- •5. Процедурная абстракция и "хороший" стиль программирования
- •6. Модульное программирование
- •Лабораторные работа 6 Текстовые файлы и потоки ввода/вывода
- •1. Потоки ввода/вывода
- •Создание потоков
- •1.2 Подключение и отключение потоков от файлов
- •2. Проверка ошибок выполнения файловых операций
- •3. Символьный ввод/вывод
- •3.1 Функция ввода "get(...)"
- •3.2 Функция вывода "put(...)"
- •3.3 Функция "putback(...)"
- •4. Проверка достижения конца файла при операциях ввода
- •4.1 Проверка конца файла с помощью функции "eof()"
- •5. Передача потоков функциям в качестве параметров
- •Лабораторные работа 7 Операторы ветвления и циклы
- •1. Логические значения, выражения и функции
- •2. Циклы "for", "while" и "do...While"
- •3. Множественное ветвление и оператор "switch"
- •4. Блоки и область видимости переменных
- •5. Замечание о вложенных циклах
- •6. Сводка результатов
- •Задание:
- •Лабораторные работа 8 Массивы и символьные строки
- •1. Назначение массивов
- •1.1 Объявление массивов
- •1.2 Использование элементов массивов в выражениях
- •2. Передача массивов в качестве параметров функций
- •3. Сортировка массивов
- •4. Двумерные массивы
- •5. Символьные строки
- •5.2 Объявление и инициализация символьных строк
- •5.3 Библиотечные функции для работы с символьными строками
- •5.4 Чтение символьных строк из потока ввода с помощью функции "getline(...)"
- •6. Сводка результатов
Лабораторная работа 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;
}