Лаб_часть2 - Камышинский технологический институт

advertisement
ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ
ГОСУДАРСТВЕННОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ
ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ
ВОЛГОГРАДСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
КАМЫШИНСКИЙ ТЕХНОЛОГИЧЕСКИЙ ИНСТИТУТ (ФИЛИАЛ)
ВОЛГОГРАДСКОГО ГОСУДАРСТВЕННОГО ТЕХНИЧЕСКОГО УНИВЕРСИТЕТА
КАФЕДРА «АВТОМАТИЗИРОВАННЫЕ СИСТЕМЫ ОБРАБОТКИ
ИНФОРМАЦИИ И УПРАВЛЕНИЯ»
Структурное и объектно-ориентированное
программирование
Методические указания к лабораторным работам
по дисциплине «Основы алгоритмизации и программирования»
Часть II
РПК «Политехник»
Волгоград
2005
УДК 519. 682 (07)
М 54
СТРУКТУРНОЕ И ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ:
Методические указания к лабораторным работам по дисциплине «Основы алгоритмизации и программирования». Часть II / Сост. В. И. Кручинин; Волгоград. гос. техн. ун-т. – Волгоград, 2005. – 27 с.
Предназначены для студентов, обучающихся по специальности 2202
«Автоматизированные системы обработки информации и управления».
Выполняются в компьютерном классе.
Библиогр.: 2 назв.
Рецензент И. В. Степанченко
Печатается по решению редакционно-издательского совета
Волгоградского государственного технического университета
 Волгоградский
государственный
технический
университет, 2005
2
Лабораторная работа № 3.
Решение задач с использованием операторов ветвления.
Цель работы: Знакомство с правилами использования операторов ветвления в программах на языке C++ на примере решения двух задач.
Продолжительность работы: 2 часа.
Оценка в баллах: минимум – 3, максимум – 5.
Условие задачи № 1.
Выяснить, поместится ли круг площади S2 в квадрат площади S1
Анализ условия задачи.
Для нахождения алгоритма решения задачи построим чертеж.
R
a
Площадь квадрата вычисляется по формуле:
S1  a  a
Площадь круга вычисляется так:
S 2    R2
Из рисунка видно, что если радиус круга не превосходит половины длины стороны, то круг поместится внутри квадрата. Это и будет условием
решения задачи.
Текст программы.
Создайте проект и наберите следующий текст:
#include <iostream.h>
#include “rchar.h”
main()
{
float a,R;
cout<< R(“Введите радиус:”);cin>>R;
cout<< R(“Введите сторону квадрата:”);cin>>a;
if (R<a/2) cout<< R(“Поместится\n”);
else cout<< R(“Не поместится”);
return 0;
}
3
Уже первая компиляция программы покажет наличие ошибок. Ошибки
получились из-за повторения имен. С одной стороны, функция отображения русских букв имеет имя R, и точно так же называется переменная,
обозначающая радиус. Так не должно быть. В программе не может использоваться переменная, совпадающая по имени с именем функции.
Замените имя переменной на имя RAD и проверьте правильность работы
программы.
Условие задачи № 2.
Вычислить площадь геометрической фигуры по выбору пользователя. В
качестве фигуры может использоваться параллелограмм, треугольник,
трапеция, круг, сектор.
Анализ условия задачи.
Для вычисления площадей фигур можно использовать следующие формулы:
S  a b
- для параллелограмма
S 
ah
2
S 
( a  b)  h
2
- для треугольника
-для трапеции
S    R 2 - для круга
S 
  R2 
- для сектора
360
Исполнение программы.
Скопируйте в папку Study проект GEOM из той же папки, где находится
описание данной работы. Загрузите среду и вызовите проект GEOM из
папки Study.
Проверьте правильность работы программы.
Замечания к проекту GEOM.
1. Программа построена по принципу «меню». На экран выдаётся
список вариантов. Пользователь может выбрать один из них.
2. Выбранный вариант обрабатывается одной из ветвей оператора
switch. При неправильном выборе работает ветвь по умолчанию
(default).
4
В четвертой и пятой ветви используются функции математической библиотеки. Функция pow обеспечивает возведение числа в
нужную степень (в нашем случае – во вторую). Использование
функции atan является маленькой хитростью, т.к. atan(1) – это
четверть числа ПИ.
Задание для самостоятельной работы.
Составьте программу для решения следующей задачи:
Определить, на какую цифру оканчивается заданное целое число, и вывести на экран название этой цифры.
Максимальная оценка (5 баллов) – за полное решение задачи.
3.
Лабораторная работа № 4.
Решение задач с использованием операторов организации циклов.
Цель работы: Знакомство с правилами использования операторов цикла
в программах на языке C++.
Продолжительность работы: 2 часа.
Оценка в баллах: минимум – 3, максимум – 6.
Проект № 1.
Скопируйте в папку Study проект Cikl из той же папки, где находится
описание данной работы. Загрузите среду и вызовите проект Cikl из папки Study.
Ознакомьтесь с тестом программы. Она похожа на программу из предыдущей лабораторной работы. Решается та же задача вычисления площадей геометрических фигур, но для вычисления отдельной площади нет
необходимости запускать программу сначала.
Работа выполняется циклически. После выдачи меню пользователь выбирает вариант, выполняется расчет и вновь на экран выдается меню.
Цикл прекращается только тогда, когда с клавиатуры вводится число 6 –
признак конца работы. Обратите внимание, что в оператор switch также
добавлен анализ этого ответа: сообщение о неверном выборе выдается
только в случае ответа более 6.
Проверьте правильность работы программы.
Проект № 2.
Скопируйте в папку Study проект из той же папки, где находится описание данной работы. Загрузите среду и вызовите проект Matrica из папки
Study.
Данное приложение обеспечивает ввод квадратной матрицы, ее преобразование и вывод новой матрицы на экран. Суть преобразования – деление
5
элементов каждой строки матрицы на значение, которое указано в той же
строке на главной диагонали.
Например, если будет введена матрица
2 14 24
15 5 30
21 47 7
то в результате преобразования должно получиться
1 7 12
3 1 6
3 7 1 граммы.
Проверьте правильность работы про-
Если
обнаружится ошибка, то найдите ее и исправьте.
Задание для самостоятельной работы.
Составьте программу для решения следующей задачи:
Ввести массив целых чисел. Построить другой массив, в который включить только те числа, которые делятся нацело на заданное целое число
С.
Задача оценивается в 4 дополнительных балла.
Лабораторная работа № 5.
Решение задач на обработку строк.
Цель работы: Знакомство с приёмами обработки строковой информации в программах на языке C++.
Продолжительность работы: 2 часа.
Оценка в баллах: минимум – 4, максимум – 6.
Проект Stroka1.
Скопируйте в папку Study проект Stroka1 из той же папки, где находится
описание данной работы. Загрузите среду и вызовите проект Stroka1 из
папки Study.
Приложение решает следующую задачу.
Вводится текстовая строка. Выполняется поиск самого длинного слова,
которое и выводится на экран. Слова могут отделяться одно от другого одним пробелом или одной запятой.
Ознакомьтесь с тестом программы.
Задание по проекту.
6
Проверьте правильность работы программы с помощью таких тестовых
строк:
Мужик съел лук
Я изловил кошку
Кот ел рыбу
Исправьте имеющиеся ошибки. Для поиска ошибок можно использовать
отладчик.
Оценка выполненной работы.
За разбор программы – минимум (4 балла).
За исправление одной ошибки в течение текущего занятия – максимум (6
баллов).
За исправление двух ошибок в течение текущей пары – дополнительно 2
балла (всего 8 баллов).
Задание для самостоятельной работы (дополнительно 3 балла).
Разработать программу, которая вводит строку и определяет, является ли строка палиндромом.
Примечание. Палиндром – это выражение, которое читается одинаково и
слева направо, и справа налево. Например, «КАЗАК», «АРОЗАУПАЛАНАЛАПУАЗОРА», «КИТНАМОРЕНЕРОМАНТИК».
Лабораторная работа № 6.
Решение задач с использованием функций.
Цель работы: Знакомство с правилами использования функций при разработке программ.
Продолжительность работы: 4 часа.
Оценка в баллах: минимум – 1, максимум – 1, дополнительные баллы –
2.
Проект KVUR.
Скопируйте в папку Study проект KVUR из той же папки, где находится
описание данной работы. Загрузите среду и вызовите проект KVUR из
папки Study.
Приложение представляет собой программу нахождения корней квадратного уравнения
AX
по заданным коэффициентам A, B, C.
7
2
 BX  C  0
Известно, что квадратное уравнение может иметь два действительных
корня, один или ни одного. Число корней зависит от значения дискриминанта D, который вычисляется по формуле:
D  B2  4  A C
Возможно три случая:
 D>0, когда уравнение имеет два корня, вычисляемых по формулам
x1 

X

B D
2 A
x2 
B
D
2 A
D=0, когда уравнение имеет один корень, вычисляемый по формуле
 B

2 A
D<0, когда действительных корней нет.
Задание 1.
 Ознакомьтесь с текстом программы.
 Проверьте, правильно ли работает программа. Для этого придумайте тестовые примеры, позволяющие проверить все три случая.
Обратите внимание, что программа составлена по принципу простой
программы, т.е. имеет только одну функцию – главную функцию main().
В этой функции описан весь алгоритм решения задачи: и ввод исходных
данных, и вычисления по формулам, и вывод результатов на экран. Такой
порядок написания программы может быть оправдан ТОЛЬКО для небольших программ. Когда алгоритм программы достаточно сложен, ее
СТРУКТУРИРУЮТ, разбивая на отдельные функции.
Выполним структурирование программы. Для этого опишем процедуры ввода данных, вычисления дискриминанта и вычисления корней в
виде отдельных функций. Пусть эти функции будут иметь следующие
имена: vvod, discr, korni.
Функция vvod.
void vvod(double & a, double & b, double & c)
{
cout << "Vvedite A,B,C \n";
cout<<"A=";cin>>a;
cout<<"B=";cin>>b;
cout<<"C=";cin>>c;
}
8
Никаких исходных данных для работы функции не требуется – все значения она вводит сама. Но у нее есть три параметра: a, b, c. Все параметры – вещественные. Они предназначены для ввода коэффициентов уравнения. Особенность их в том, что они являются универсальными параметрами – ссылками. Значения, которые будут введены в них, автоматически попадут в АРГУМЕНТЫ. В результате выполнения функции будут
введены три числа. Как и функция main() эта функция также имеет тип
void. Это значит, что после своего завершения она НЕ ВОЗВАРАЩАЕТ
никакого значения.
Функция discr.
double discr(double a, double b, double c)
{ double d;
d=b*b-4*a*c;
return d;
}
Для работы функции требуются те значения, по которым она сможет вычислить дискриминант. Это коэффициенты уравнения, функция получает
их через ПАРАМЕТРЫ вещественного типа. Внутри функции объявлена
локальная переменная d, в которой получается результат вычисления.
Этот результат после завершения функции ВОЗВРАЩАЕТСЯ в то место,
откуда была вызвана функция. Возвращение обеспечивается тем, что тип
функции – не void, а double.
Функция korni
int korni(double a,double b,double d,double & x1,double & x2)
{ if (d<0) return 0;
if (d>0)
{
x1=(-b+sqrt(d))/(2*a);
x2=(-b-sqrt(d))/(2*a);
return 2;
} else
{
x1=-b/(2*a); return 1;}
}
Эта функция имеет три обычных параметра (в них она получает значения, нужные для вычислений), два параметра-ссылки (в них она записывает результаты вычислений – корни). Завершая работу, функция ВОЗВРАЩАЕТ целое число – сколько корней найдено.
Задание 2.
Скопируйте в папку Study проект KVUR_F из той же папки, где находится описание данной работы. Загрузите среду и вызовите проект KVUR_F
из папки Study. В этой программе также решаются квадратные уравнения, но с использованием разработанных выше функций.
 Разберитесь с текстом программы.
9
 Проверьте, правильно ли она работает.
Оценка выполненной работы – 1 балл.
Задание для самостоятельной работы (дополнительно 2 балла).
Измените программу KVUR_F, выделив в самостоятельную функцию
процедуру выдачи результатов на экран. Составьте описание функции и
обеспечьте вызов этой функции из функции main().
Лабораторная работа № 7.
Обработка структур данных.
Цель работы: Знакомство с порядком использования структур данных
при разработке программ.
Продолжительность работы: 2 часа.
Оценка в баллах: минимум – 1, максимум – 1, дополнительные баллы –
2.
Проект BIBLIO.
Скопируйте в папку Study проект BIBLIO из той же папки, где находится
описание данной работы. Загрузите среду и вызовите проект BIBLIO из
папки Study.
Приложение представляет собой программу решения следующей задачи:
В детской библиотеке заведены карточки на 900
читателей. Информация об одном читателе содержит
следующие данные:
- фамилию читателя
- его пол (1, если М, и 2, если Ж)
- возраст (число полных лет).
Разработать программу, обеспечивающую:
1) Ввод данных о читателях
2) Определение числа девочек школьного возраста
(от 7 до 16 лет)
Программа состоит из трех функций: главная (main), функция ввода
сведений о читателе и функция подсчета числа девочек. В каждой из
функций имеется два параметра:
- имя массива читателей:
- количество читателей.
В функции ввода параметр k описан как ссылка, потому что после
ввода данных число читателей в массиве увеличивается на 1, и это увеличение должно изменить переменную kol в главной функции. Добавление новых данных происходит в массив mas.
10
Задание.
 Ознакомьтесь с текстом программы.
 Проверьте, правильно ли работает программа. Для этого придумайте тестовые примеры, содержащие сведения о нескольких читателях разного пола и возраста.
Оценка выполненной работы – 1 балл.
Задание для самостоятельной работы (дополнительно 2 балла).
Добавьте в программу возможность вывода на экран данных обо всех
читателях. Оформите это в виде отдельной строчки меню, отдельного
варианта в операторе switch. Выдачу данных на экран должна выполнять
новая функция, которая должна вызываться из соответствующей строки
case оператора switch.
Лабораторная работа № 8.
Решение задач с использованием указателей.
Цель работы: Знакомство с порядком использования указателей при
разработке программ.
Продолжительность работы: 4 часа.
Оценка в баллах: минимум – 1, максимум – 1, дополнительные баллы – 4
(1+3).
Проект POINTER.
Скопируйте в папку Study проект POINTER из той же папки, где находится описание данной работы. Загрузите среду и вызовите проект
POINTER из папки Study.
Приложение представляет собой программу решения следующей задачи:
В детской библиотеке заведены карточки на 600
читателей. Информация об одном читателе содержит
следующие данные:
- фамилию читателя
- его пол (1, если М, и 2, если Ж)
- год рождения.
Разработать программу, обеспечивающую:
1) Ввод данных о читателях
2) Определение числа читателей заданного пола
в заданном интервале годов рождения
3) Поиск сведений о читателе с заданной фамилией
11
Программа состоит из четырех функций: главная (main), функция
ввода сведений о читателе, функция поиска данных с заданными характеристиками и функция поиска данных о человеке с заданной фамилией.
Ключи поиска вводятся в главной функции и передаются в виде аргументов в функции.
В функции input имеется два параметра:
- имя массива читателей (задан как указатель на символьный массив):
- количество читателей (задан как ссылка на целое).
Обратите внимание, что в теле функции работа с массивом осуществляется через указатель с использованием операции ->.
В функции poisk используется 5 параметров:
- m как указатель на имя массива;
- k в качестве количества читателей;
- p, min, max задают ключи поиска (пол, начало интервала, конец
интервала).
Работа с полями структуры выполняется также с помощью операции ->.
В функции poisk_chita используются все возможные варианты параметров. Массив данных задан через указатель на массив структур типа
chita. Количество элементов задано обычным локальным параметром
типа int. Фамилия читателя, по которой выполняется поиск в массиве,
передается через указатель на строку (на массив типа char). Четвертый
параметр z является ссылкой на структуру (info в главной функции), в
которую записывается найденная информация в том случае, если она
действительно имеется.
Обратите внимание, как записывается найденная информация в переменную z (оператор помечен словом «найдено»). Присваивание выполняется не отдельными полями, а целиком с помощью операции * (разыменование).
Функция poisk_chita возвращает целое значение 1, если данные
найдены (т.е. в переменной info есть сведения), и значение 0, если данных нет (т.е. в поле info нет нужных данных). Обратите внимание, что в
главной функции (в варианте case 3) доступ полям структуры обеспечивается операцией «точка», т.к. info – это структура, а не указатель на нее.
Задание.
 Ознакомьтесь с тестом программы.
 Проверьте, правильно ли работает программа. Для этого придумайте тестовые примеры, содержащие сведения о нескольких читателях разного пола и года рождения.
Оценка выполненной работы – 1 балл.
12
Задания для самостоятельной работы.
1. Добавьте в программу возможность вывода на экран данных обо
всех читателях. Оформите это в виде отдельной строчки меню,
отдельного варианта в операторе switch. Выдачу данных на экран
должна выполнять новая функция, которая должна вызываться
из соответствующей строки case оператора switch (дополнительно 1 балл).
2. Добавьте в программу новую функцию, обеспечивающую поиск
первого встретившегося в массиве читателя с заданным годом
рождения и возвращающую адрес соответствующего элемента
массива (дополнительно 3 балла).
Примечание. Адрес возвращается через указатель.
Лабораторная работа № 9.
Решение задач с использованием динамической памяти.
Цель работы: Знакомство с порядком применения указателей при разработке программ, использующих динамическую память.
Продолжительность работы: 4 часа.
Оценка в баллах: минимум – 2, максимум – 4, дополнительные баллы – 9
(3+3+3).
Проект DYNAM.
Скопируйте в папку Study проект DYNAM из той же папки, где находится описание данной работы. Загрузите среду и вызовите проект DYNAM
из папки Study.
Приложение представляет собой программу решения следующей задачи:
В детской библиотеке заведены карточки на читателей.
Количество карточек на момент написания программы
неизвестно. Информация об одном читателе содержит
следующие данные:
- фамилию читателя
- его пол (1, если мужской, и 2, если женский)
- число, месяц и год рождения.
Разработать программу, обеспечивающую:
1) Организацию массива данных в динамической памяти
2) Ввод данных о читателях
3) Поиск сведений о читателе заданного пола
с заданной фамилией
4) Уничтожение массива данных и
освобождение динамической памяти
13
Программа состоит из четырех функций: главная (main), функция создания массива, функция ввода сведений о читателе, функция поиска
данных о человеке с заданной фамилией и функция уничтожения массива. Ключи поиска вводятся в главной функции и передаются в виде аргументов в функции.
В функцию makemas значение, соответствующее размеру массива.
Массив структур заданного размера запрашивается в динамической памяти операцией new. Адрес запоминается в переменной d. Он может
быть и нулевым в том случае, когда места в динамической памяти не
окажется. Значение адреса возвращается в главную функцию и присваивается переменной ukazmas.
В функции input имеется одна особенность. Она выполнятся только
тогда, когда массив действительно существует, и есть куда размещать
вводимые данные. Проверка существования массива обеспечивается по
значению адреса массива. Если адрес нулевой, то массив не существует.
Функция poisk_chita аналогична такой же функции из лабораторной
работы № 3.
Уничтожение массива и освобождение динамической памяти выполняется в главной функции (вариант case 4). Освобождение памяти осуществляется операцией delete.
Задание.
 Ознакомьтесь с текстом программы.
 Проверьте, правильно ли работает программа. Для этого придумайте тестовые примеры, содержащие сведения о нескольких читателях разного пола и года рождения.
Оценка выполненной работы – 2 балла.
Задания для самостоятельной работы.
1. Добавьте в программу возможность вывода на экран данных обо всех
читателях. Оформите это в виде отдельной строчки меню, отдельного
варианта в операторе switch. Выдачу данных на экран должна выполнять новая функция, которая должна вызываться из соответствующей строки case оператора switch (2 балла).
2. Попробуйте полностью заполнить массив данными. Для этого создайте массив небольшого размера (например, на 2 читателя), введите данные на двух человек, а затем попробуйте ввести данные на третьего читателя. Что будет? Измените функцию ввода так, чтобы она
контролировала число ввод данных сверх заданного размера и возвращала признак 0, если данные не введены, или 1, если введены
(дополнительно 3 балла).
14
3.
4.
Разработайте функцию, обеспечивающую сортировку массива данных по году рождения. Желательно учесть месяц и число (дополнительно 3 балла).
Разработайте функцию, обеспечивающую удаление из массива данных о читателе с заданной фамилией. Размер массива при этом должен остаться прежним, но сведения должны быть расположены последовательно. Например, при удалении данных о втором читателе
на его место должны переместиться данные о третьем, на место третьего – данные четвертого и т.д. Число читателей должно уменьшиться на 1 (дополнительно 3 балла).
Лабораторная работа № 10.
Решение задач на рекурсии.
Цель работы: Знакомство с правилами разработки рекурсивных функций.
Продолжительность работы: 2 часа.
Оценка в баллах: минимум – 1, максимум – 1, дополнительные баллы – 4
(1+3).
Задача.
Составить рекурсивную функцию подсчета факториала натурального числа.
Очевидно, что задача имеет простое итеративное решение. Формула для подсчета факториала известна:
N! = 1.2.3 ... (N-2)(N-1)N ,
причем по определению 0!=1. Обычная функция может иметь следующий вид:
int fact(int k)
{ int n,i;
for (n=1,i=1;i<=k;i++) n=n*i;
return n;
}
Попробуем увидеть в задаче не одну, а несколько задач. Ведь
шаги цикла заставляют нас решать последовательно ряд задач: на первом
шаге подсчитываем значение 1!, на втором – 2!, на третьем – 3!, причем
каждый новый шаг опирается на решение, полученное на предыдущем
шаге. При этом мы опираемся на известное решение: 0! = 1. Если будет
известно значение P(N-1) для (N-1)-го шага, то легко получить значение
для N-го: P(N) = Р(n-1).N.
15
Нам удалось представить задачу в виде нескольких задач.
Начиная с задачи, которая имеет известное решение (0!=1), каждая последующая задача имеет размерность на 1 большую, т.е. требует в качестве исходных данных на одно число больше. Очевидно, что если будет
известно решение (N-1)-ой задачи, то мы решим и N-ую, но для решения
(N-1)-ой нам придется воспользоваться тем же алгоритмом. Наконец, нет
необходимости решать «ноль»-задачу – ее решение известно: 0!=1.
Подведем итог. Мы имеем ситуацию с известным решением, когда N=0 (факториал равен 1) и неизвестным решением, когда N>0 – в
этом случае сделаем шаг рекурсии. Мы можем различить эти ситуации
по текущему значению N. Рекурсивная функция может иметь следующий
вид:
int fact_rek(int k)
{ if (k==0) return 1;
return k*fact_rek(k-1);
}
Задание .
1. Скопируйте в папку Study проект REKURS из той же папки, где
находится описание данной работы. Загрузите среду и вызовите
проект REKURS из папки Study.
2. В проекте – программа, использующая функции fact и fact_rek.
Проверьте правильность работы программы, подобрав несколько
тестовых примеров.
Оценка выполненной работы – 1 балл.
Задания для самостоятельной работы.
1. В тексте программы REKURS есть закомментированные фрагменты. Откройте их, убрав знаки комментария. Что обеспечивает
новый фрагмент в главной функции? Какой алгоритм реализован в функции maximum? Проверьте правильность работы нового фрагмента, подобрав тестовый пример (1 дополнительный
балл).
2. Разработайте рекурсивную функцию поиска заданного символа в
заданной строке.
Продемонстрируйте работу функции, написав соответствующий текст в
главной функции (3 дополнительные балла).
Лабораторная работа № 11.
Решение задач на использование базовых классов.
16
Цель работы: Знакомство с правилами описания и использования классов.
Продолжительность работы: 4 часа.
Оценка в баллах: минимум – 1, максимум – 1, дополнительные баллы –
2.
Задача.
Учетная карточка человека, проживающего в гостинице, содержит
следующие сведения
 Фамилия,
 Дата заселения (день, месяц, год),
 Номер комнаты.
Разработать программу, обеспечивающую обработку данных о клиентах гостиницы.
Решение.
Очевидно, что для решения задачи есть смысл определить новый тип
данных – структуру, в которой будут собраны сведения об одном клиенте. Пусть это будет следующий тип:
struct client
{ char fam[30]; // фамилия
int data[3];
// дата заселения
int num;
// номер комнаты
};
Такое описание позволит использовать в программе переменные, каждая
из которых будет имитировать одного клиента. Например:
client A, B, C;
Для работы с такими переменными можно определить функции, обеспечивающие ввод сведений и вывод сведений. Функции можно определить
обычным образом – как глобальные функции. Но можно описание данных и описание функций объединить в одно общее описание – описания
класса. Получится следующее описание:
class client
{ char fam[30]; // фамилия
int data[3];
// дата заселения
int num;
// номер комнаты
public:
void input() // функция ввода
{ … }
void print() // функция вывода
17
{ … }
};
Функции input и print – это компонентные функции. Они могут быть вызваны только для обработки переменных типа client. В терминах объектно-ориентированного программирования принято говорить, что эти
функции вызываются для обработки объектов класса client.
Пример использования класса client рассмотрен в проекте GOSTIN.
Проект GOSTIN.
Скопируйте в папку Study проект GOSTIN из той же папки, где находится описание данной работы. Загрузите среду и вызовите проект GOSTIN
из папки Study.
Задание.
1.



2.
Разберитесь, как устроена программа:
Обратите внимание, что компонентные функции размещены в
секции public. Это гарантирует их вызов из главной функции.
Обратите внимание, что компонентные функции не имеют параметров, но могут работать с данными своего класса.
Обратите внимание, что компонентные функции вызываются для
конкретного объекта через операцию «точка». Тем самым обеспечивается работа с данными выбранного объекта.
Подберите тестовый пример (сведения о нескольких клиентах) и
проверьте правильность работы программы.
Проект GOSTINDINAM.
Другой вариант решения задачи – в проекте GOSTINDINAM
Скопируйте в папку Study проект GOSTINDINAM из той же папки, где
находится описание данной работы. Загрузите среду и вызовите проект
GOSTINDINAM из папки Study.
Задание.
1. Разберитесь, как устроена программа:
 Обратите внимание, что в класс в качестве данных включен указатель на структуру. Сама же структура (данные о клиенте) размещаются в динамической памяти. Такое решение позволяет
экономить на размере программы (в текст программы включаются только указатели на данные).
 Число функций класса увеличилось. Добавилась функция client и
функция ~client.
18



2.
Первая функция – это конструктор, обеспечивающий задание
начальных значений полям объекта (инициализация объекта). В
нашем случае значение получает указатель cl. Он инициализируется адресом структуры, а место для этой структуры выделяется
в динамической памяти. Конструктор вызывается автоматически
один раз в момент объявления объекта (в нашем случае - когда
объявляется массив mas. Конструктор вызывается для каждого
объекта.
Вторая функция – это деструктор. Эта функция обеспечивает
разрушение объекта. Она вызывается также автоматически в момент завершения программы. Деструктор вызывается столько
раз, сколько объектов было создано (в нашем случае – 500).
Каждый вызов деструктора освобождает в динамической памяти
место, захваченное ранее под объект.
Обратите внимание, что компонентные функции вызываются для
конкретного объекта через операцию «точка». Однако, внутри
функции работа с полями объекта выполняется через операцию
«стрелочка», потому что известен адрес данных объекта.
Подберите тестовый пример (сведения о нескольких клиентах) и
проверьте правильность работы программы
Оценка выполненной работы – 1 балл.
Задание для самостоятельной работы.
Разработайте для проекта GOSTINDINAM компонентную функцию,
обеспечивающую поиск клиента, проживавшего в заданном номере,
начиная с заданной даты (дополнительно 2 балла).
Лабораторная работа № 12.
Решение задач на использование механизма наследования.
Цель работы: Знакомство с правилами описания классов при наследовании.
Продолжительность работы: 2 часа.
Оценка в баллах: минимум – 1, максимум – 1, дополнительные баллы –
4.
Суть проблемы.
В программе на языке C++ можно использовать не один, а сразу
несколько классов. Соответственно, данные будут представлены объек19
тами разных классов. Анализируя условие задачи, можно обнаружить,
что объекты разных классов содержат одинаковые элементы, использование которых осуществляется одинаковыми методами. Возникает естественное желание сэкономить на описаниях, не описывая дважды одно и
то же. Это достигается с помощью наследования классов.
Пример.
Предположим, что мы имеем круг. Круг как объект определяется
величиной его радиуса, а все остальные сведения о нем (площадь, длина
окружности) могут быть вычислены по формулам. Один или несколько
кругов могут быть данными для обработки в программе. Если составить
описание класса объектов типа КРУГ, то радиус – это данные класса, а
площадь и длина окружности – это компонентные функции (методы)
класса. Для подсчета площади круга и длины окружности используют
формулы:
 Площадь круга
S   * R 2 , где R – это радиус круга

Длина окружности
C  2 *  * R , где R – также радиус круга
Предположим, что в той же программе мы собираемся использовать еще два вида объектов – цилиндры и конусы. И у цилиндра, и у конуса имеются в основаниях круги: у конуса – один, у цилиндра – два.
И
у цилиндра, и у конуса необходимо задавать радиус основания и можно
подсчитать площадь основания, а также длину окружности основания.
Вместе с тем, у этих объектов есть собственные свойства, такие как площадь поверхности и объем, для вычисления которых имеются особые
формулы:
 Поверхность цилиндра
20
P  2 * * R2  2 * * R * h ,
где R – радиус основания, h – высота цилиндра
 Поверхность конуса
P   * R * L   * R 2 , где R – радиус основания, L – образующая конуса, которая вычисляется по следующей формуле:
R 2 , где R – радиус основания, h – высота цилиндра
L 
h2 
4

Объем цилиндра
V   * R 2 * h , где R – радиус основания, h – высота цилиндра
 Объем конуса
V 
 * R2 * h
3
, где R – радиус основания, h – высота ци-
линдра
Очевидно, что для каждого вида объектов можно составить свое
описание класса. Для описания цилиндра надо задать высоту и радиус
основания, то же – для описания конуса. Кроме того, в каждом классе
потребуются компонентные функции как для вычисления площади поверхности и объема, так и для обслуживания оснований. Получается, что
при описании классов ЦИЛИНДР и КОНУС приходится повторять то,
что уже было описано в классе КРУГ.
Этого можно избежать, если использовать механизм наследования. Для нашего случая он будет реализовывать такую схему:
К ласс
c ilin d r
К ласс
conus
К ласс
k rug
Класс krug является базовым для классов cilindr и conus, которые являются его наследниками. Описание классов krug, cilindr и conus приведено в проекте NASLED.
Проект NASLED.
21
Скопируйте в папку Study проект NASLED из той же папки, где находится описание данной работы. Загрузите среду и вызовите проект NASLED
из папки Study.
Задание.
1. Изучите состав класса krug.. Обратите внимание:
 Конструктор обеспечивает инициализацию объекта-круга при
его объявлении.
 Радиус круга находится в области private. Так как при выполнении программы может потребоваться узнать, какой именно радиус имеет объект, то надо предусмотреть функцию, возвращающую значение радиуса – это обеспечит функция radius.
 Функция izmrad позволяет изменить значение радиуса, если это
будет нужно по ходу выполнения программы.
 Деструктор описывать нет необходимости, потому что динамическая память не используется.
2. Изучите состав классов cilindr и conus. Обратите внимание:
 Базовый класс наследуется со статусом public. Это оставляет открытыми функции базового класса, и их можно вызывать в любом месте программы (в частности, в главной функции).
 Внутри каждого класса используется функция radius для получения значения радиуса основания, так как переменная rad в
классах-наследниках недоступна.
 Внутри каждого класса имеется собственная функция plo для
вычисления площади поверхности. Для вычисления площади основания также используется функция plo, но из базового класса.
3. Проверьте правильность работы программы. Объясните:
 Что и почему выводит на экран Оператор 1, Оператор 2?
 Что выполняют операторы в строке с пометкой «Операторы 3»?
 Правильный ли результат выдают операторы 4 и 5, 6 и 7?
Оценка выполненной работы – 1 балл.
Задание для самостоятельной работы.
Разработайте в проекте NASLED класс FIGURA, объектами которого
являются фигуры следующего вида:
Включите в состав класса конструктор
и функции вычисления поверхности
объекта и его объема. Продемонстри22
руйте работу с объектом данного класса (дополнительно 4 балла).
Лабораторная работа № 13.
Решение задач на использование перегрузки операций.
Цель работы: Знакомство с примерами перегрузки бинарных и унарных
операций.
Продолжительность работы: 2 часа.
Оценка в баллах: минимум – 1, максимум – 2.
Проект PEREGRUZ.
Скопируйте в папку Study проект PEREGRUZ из той же папки, где находится описание данной работы. Загрузите среду и вызовите проект PEREGRUZ из папки Study.
В данном проекте решается следующая задача:
Разработать класс МАССИВ, описывающий объекты-массивы. Каждый объект содержит целочисленный массив размером 200 элементов и целую переменную, значение которой соответствует числу
занятых элементов. Для работы с объектами предусмотреть конструктор и функцию отображения массива на экран (количество
элементов и сам массив).
Определить с помощью перегрузки 4 операции обработки объектов:
 Добавить элемент. Использовать знак +. Результат операции – количество элементов в массиве с учетом добавленного.
 Исключить последний элемент массива. Использовать знак
«префиксный –». Результат операции – количество элементов в массиве, оставшееся после исключения.
 Вычислить сумму элементов массива. Использовать операцию «префиксный ++».
 Упорядочить массив по возрастанию. Использовать знак !
Задание.
1. Проверьте работоспособность программы.
2. Разберитесь, как реализована каждая операция-функция.
Оценка выполненной работы – 1 балл.
Задание для самостоятельной работы.
23
Добавьте в программу перегрузку операции *. Перегруженная операция должна выполнять умножение всех элементов массива на заданное
число (1 балл).
Лабораторная работа № 14.
Решение задач с использованием базового класса ввода-вывода.
Цель работы: Знакомство с примерами использования функций базового класса ввода-вывода.
Продолжительность работы: 2 часа.
Оценка в баллах: минимум – 1, максимум – 1.
Проект VVODVYVOD.
Скопируйте в папку Study проект VVODVYVOD из той же папки, где
находится описание данной работы. Загрузите среду и вызовите проект
VVODVYVOD из папки Study.
В данном проекте демонстрируются примеры использования функций
базового класса ввода-вывода. Используются следующие функции:
 width – установить ширину выводного поля
 fill – объявление символа-заполнителя свободного места в выводном поле
 setf – установление режимов вывода данных
 unsetf – отмена установленных режимов
 pecision – установка размера поля цифрового вывода
Задание.
1. Разберитесь в структуре и проверьте работоспособность программы.
2. Уясните, какая работа выполняется каждой функцией.
Оценка выполненной работы – 1 балл.
Лабораторная работа № 15.
Решение задач на обработку файлов.
Цель работы: Знакомство с примером использования функций обработки файлов.
Продолжительность работы: 4 часа.
Оценка в баллах: минимум – 2, максимум – 5.
Проект FILES.
24
Скопируйте в папку Study проект FILES из той же папки, где находится
описание данной работы. Загрузите среду и вызовите проект FILES из
папки Study.
В данном проекте рассматривается пример программы, организующей
файлы, в которых могут храниться данные заданной структуры. Используются следующие функции обработки файлов:
 open – отрыть файл
 good – проверить нормальность завершения операции открытия
файла
 close – закрыть файл
 seekg – установить указатель внутри файла в заданную позицию
 eof – проверить, не завершился ли файл (указатель достиг конца
файла)
 ignore – пропустить (не считывать) данные из файла
 read – читать данные из файла
 clear – очистить флаги ввода-вывода
 write – записать данные в файл
 fail – проверить ненормальность ввода-вывода
С использованием этих функций разработаны следующие функции класса baza:
 open_baze – открыть уже существующий или создать новый
файл, если его нет
 close_baze – зарыть файл, если он открыт
 get – прочитать элемент из файла по его порядковому номеру
 put – записать в файл данные на место существующего элемента
или вывести новые данные в конец файла
В классе baza имеется также функция print, обеспечивающая форматный
вывод элемента.
При вводе данных нового элемента используется перегруженная операция >>, позволяющая ввести структуру целиком.
Задание.
Проверьте работоспособность программы. Придумайте тестовый пример
и продемонстрируйте его выполнение.
Оценка выполненной работы – 2 балла.
Задание для самостоятельной работы.
Разберитесь в структуре и выясните, какая работа и как выполняется
каждой функцией класса baza (3 балла).
25
Литература.
1.
2.
В.И. Кручинин. Основы алгоритмизации и программирования. Учебное пособие: Камышин, 2003. – электронный вариант.
В.И. Кручинин. Структурное и объектно-ориентированное программирование. Учебное пособие: Камышин, 2004. – электронный вариант.
СОДЕРЖАНИЕ
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Лабораторная работа № 3…………………………... 3
Лабораторная работа № 4…………………………... .5
Лабораторная работа № 5……………………………. 6
Лабораторная работа № 6……………………………. 7
Лабораторная работа № 7………………………….. .10
Лабораторная работа № 8………………………….. . 11
Лабораторная работа № 9........................................... 13
Лабораторная работа № 10…………………………. 15
Лабораторная работа № 11…………………………. 16
Лабораторная работа № 12…………………………. 19
Лабораторная работа № 13…………………………. 23
Лабораторная работа № 14…………………………. 24
Лабораторная работа № 15…………………………. 24
26
Составитель Владимир Иванович Кручинин
СТРУКТУРНОЕ И ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ
Методические указания к лабораторным работам
по дисциплине «Основы алгоритмизации и программирования». Часть II
Под редакцией автора
Темплан 2005 г., поз. № 30.
Подписано в печать 30. 11. 2005 г. Формат 60×84 1/16.
Бумага потребительская. Гарнитура ”Times“.
Усл. печ. л. 1, 69. Усл. авт. л. 1,5.
Тираж 75 экз. Заказ
Волгоградский государственный технический университет
400131 Волгоград, просп. им. В. И. Ленина, 28.
РПК «Политехник»
Волгоградского государственного технического университета
400131 Волгоград, ул. Советская, 35.
27
Download