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 |