Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

s12-lab-book

.pdf
Скачиваний:
6
Добавлен:
20.04.2015
Размер:
448.77 Кб
Скачать

ООП - лабораторные работы (весна 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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]