s12-lab-book
.pdf
ООП - лабораторные работы (весна 2012)
Release 0
Полевой Дмитрий
April 02, 2012
CONTENTS
1 лабораторная работа (обзор С++)  | 
	1  | 
|
1.1  | 
	Пример - cоздание проcтого консольного приложения c выводом в консоль . . . . . .  | 
	2  | 
1.2  | 
	Пример - печать таблицы функции . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  | 
	3  | 
1.3Пример - обработка последовательности (на примере использование std::vector) . . . 5
  | 
	1.4  | 
	Задания (лабораторная работа 1) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  | 
	8  | 
2  | 
	лабораторная работа (создание собственных классов)  | 
	9  | 
|
  | 
	2.1  | 
	Пример - класс рациональных чисел . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  | 
	10  | 
  | 
	2.2  | 
	Задания (лабораторная работа 2) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  | 
	15  | 
3  | 
	лабораторная работа (создание классов и управление памятью)  | 
	16  | 
|
  | 
	3.1  | 
	Пример - класс стека на динамическом массиве std::vector<> . . . . . . . . . . . . . .  | 
	17  | 
  | 
	3.2  | 
	Пример - класс стека на односвязном списке . . . . . . . . . . . . . . . . . . . . . . . .  | 
	20  | 
3.3Пример - разнесение кода стека на односвязном списке (заголовок и реализация) . . 23
3.4  | 
	Пример - создание шаблонного класса для стека на односвязном списке . . . . . . . .  | 
	26  | 
3.5  | 
	Задания (лабораторная работа 3) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  | 
	30  | 
4 лабораторная работа (класс матрицы и различные варианты его реализации)  | 
	31  | 
|
4.1Пример - класс матрицы с использованием std::vector<> и приведенного индекса . . 32
4.2  | 
	Пример - класс матрицы с использованием std::vector<> и массива строк . . . . . . .  | 
	35  | 
4.3  | 
	Задания (лабораторная работа 4) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  | 
	38  | 
5 лабораторная работа (тестирование разных вариантов реализации стека)  | 
	39  | 
|
5.1  | 
	Пример - генерирование псевдослучайной последовательности . . . . . . . . . . . . .  | 
	40  | 
5.2  | 
	Пример - измерение времени выполнения (части) программы . . . . . . . . . . . . . .  | 
	41  | 
5.3  | 
	Задания (лабораторная работа 5) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  | 
	42  | 
6 лабораторная работа (замена слов в текстовых файлах)  | 
	43  | 
|
6.1  | 
	Пример - анализ параметров командной строки . . . . . . . . . . . . . . . . . . . . . .  | 
	44  | 
6.2  | 
	Пример - посимвольная обработка текстового файла . . . . . . . . . . . . . . . . . . .  | 
	45  | 
6.3  | 
	Пример - составление частотного словаря слов . . . . . . . . . . . . . . . . . . . . . . .  | 
	46  | 
6.4  | 
	Задания (лабораторная работа 6) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  | 
	47  | 
7 лабораторная работа (создание простой ОО БД с консольным интерфейсом)  | 
	48  | 
|
7.1  | 
	Пример - исследование наследования и виртуального вызова . . . . . . . . . . . . . .  | 
	48  | 
7.2  | 
	Пример - исследование использования интерфейсов . . . . . . . . . . . . . . . . . . . .  | 
	49  | 
7.3  | 
	Пример - работа с бинарными данными . . . . . . . . . . . . . . . . . . . . . . . . . . .  | 
	50  | 
7.4Пример - сериализация и десериализация (в тектовом форматированном формате) . 51
7.5  | 
	Задания (лабораторная работа 7) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  | 
	52  | 
8 бонусные задачи  | 
	53  | 
|
8.1  | 
	Очередь с приоритетом . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  | 
	53  | 
8.2  | 
	Полином . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  | 
	53  | 
8.3  | 
	Длинная арифметика . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  | 
	53  | 
i
8.4 bmp-> ascII art . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  | 
	53  | 
ii
CHAPTER
ONE
ЛАБОРАТОРНАЯ РАБОТА (ОБЗОР С++)
Теория:
•минимальная программа на С++
•функция main
•пространства имен и using namespace std
•использование std::cout
•строковые литералы
•переменные (определение, инициализация и использование)
•управление исполнением (цикл, ветвление, выбор из вариантов, правила кодирования)
•функции (параметры и возвращаемое значение)
•константные данные (в т.ч. стиль кодирования)
•управляющие символы
•манипуляторы в потоках (заголовок <iomanip>, манипуляторы endl и setw)
•объявление и определение функций
•консольный ввод данных (в т.ч. обработка ошибок ввода)
•использованеи шаблонных классов
•хранение и обработка последовательностей (на примере std::vector<>)
•использования ссылок (в т.ч. для передачи параметров)
•разделения блоков ввода/вывода и алгоритмической обработки
•управляющие символы
•тип void и его использование
•утверждения assert и их использование для обеспечения качества кода
1
ООП - лабораторные работы (весна 2012), Release 0
1.1Пример - cоздание проcтого консольного приложения c выводом в консоль
1/**
2 \ le lab-01-00.cpp
3\brief короткое приложение "Hello, world!"
4\author Полевой Дмитрий
5 \date 05.02.2012
6*/
7#include <iostream>
8
9using namespace std;
10
11int main()
12{
13
14
cout << "Hello, world!";
15return 0;
16}
Результаты работы программы (lab-01-00.exe)
1.1. Пример - cоздание проcтого консольного приложения c выводом в консоль  | 
	2  | 
ООП - лабораторные работы (весна 2012), Release 0
1.2 Пример - печать таблицы функции
Задача - написать консольное приложение, которое печатает таблицу значений функции:
•для нечетных x
f(x) = x=2
•для четных x
f(x) = x ïðè x < 9
f(x) = 10 x при остальных x
1/**
2 \ le lab-01-01.cpp
3\brief печать таблицы функции
4\author Полевой Дмитрий
5 \date 01.02.2012
6*/
7#include <iostream>
8#include <iomanip>
9#include <cassert>
10
11  | 
	using namespace std;  | 
12
13double f(const int arg)
14{
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
double funcValue(0.0); switch (arg % 2)
{
case 0:
if (arg < 9)
{
funcValue = arg;
}
else
{
funcValue = 10 - arg;
}
break; case 1:
funcValue = -arg / 2.0; break;
default: assert(0);
}
return funcValue;
35 }
36
37int main()
38{
39
40
41
42
43
44
45
46
const int N_ROW(10);
cout << setw(3) << 'x' << '|' << setw(5) << "f(x)" << endl; cout << "------------\n";
for (int iRow(0); iRow < N_ROW; ++iRow)
{
cout << setw(3) << iRow << '|' << setw(5) << f(iRow) << endl;
}
47return 0;
48}
1.2. Пример - печать таблицы функции  | 
	3  | 
ООП - лабораторные работы (весна 2012), Release 0
Результаты работы программы (lab-01-01.exe)
1.2. Пример - печать таблицы функции  | 
	4  | 
ООП - лабораторные работы (весна 2012), Release 0
1.3Пример - обработка последовательности (на примере использование std::vector)
Задача - написать консольное приложение, которое:
•считывает с консоли последовательность целых чисел (длинна последователности от 1 до 10);
•находит индекс минимального и максимального элемента в последовательности;
•показывает индексы и значения минимального и максимального элементов;
•показывает все элементы последовательности.
1/**
2 \ le lab-01-02.cpp
3\brief печать таблицы функции
4\author Полевой Дмитрий
5 \date 01.02.2012
6*/
7#include <iostream>
8#include <vector>
9
10  | 
	using namespace std;  | 
11  | 
	
  | 
12  | 
	bool get(vector<int>& data);  | 
13
14void ndMinMaxIdx(const vector<int>& data, int& iMin, int& iMax)
15{
16
17
18
19
20
21
22
23
24
25
26
27 }
28
iMin = 0; iMax = 0;
for (size_t i(1); i < data.size(); ++i) // по всем элементам
{
if (data.at(i) < data.at(iMin))
{
iMin = i;
}
iMax = (data.at(i) > data.at(iMax)) ? i : iMax;
}
29int main()
30{
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
cout << "Please, enter number of elements (from 1 to 10) > "; int n(-1);
cin >> n;
if ((n < 1) || (10 < n))
{
cout << "Invalid size " << n << "\nTry again later\n";
}
else
{
vector<int> data(n); if (get(data))
{
int iMin(0); int iMax(0);
ndMinMaxIdx(data, iMin, iMax);
cout << "min index is " << iMin << " and value is " << data.at(iMin) << endl;
cout << "max index is " << iMax << " and value is " << data[iMax]; cout << "\nall values - ";
1.3. Пример - обработка последовательности (на примере использование std::vector)  | 
	5  | 
ООП - лабораторные работы (весна 2012), Release 0
50for (vector<int>::iterator it(data.begin()), itEnd(data.end());
51it != itEnd; ++it)
52{
53cout << *it << ' ';
54}
55}
56}
57
58return 0;
59}
60
61bool get(vector<int>& data)
62{
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85 }
//результат работы функции - все ли значения введены правильно bool res(true);
//очередное значение последовательности
int val(0);
for (size_t i(0); ((i < data.size()) && res); ++i) // по элементам массива
{
cout << "Please enter element with index " << i << " > "; cin >> val;
if (cin.good())
//введено число
{
data.at(i) = val;
}
else
//ошибка разбора числа
{
cout << "Invalid element value, please, try again later"; res = false;
}
}
return res;
1.3.1 Тестирование решения (lab-01-02.exe)
Проверим нижнюю границу размеров и зададим заведомо неправильное значение 0.
Проверим верхнюю границу размеров и зададим заведомо неправильное значение 11.
Введем заведомо неправильный вариант значения элемента последовательности.
1.3. Пример - обработка последовательности (на примере использование std::vector)  | 
	6  | 
ООП - лабораторные работы (весна 2012), Release 0
Введем корректные данные.
1.3. Пример - обработка последовательности (на примере использование std::vector)  | 
	7  | 
