Файл: Методические указания по выполнению лабораторных и самостоятельных работ для обучающихся с применением дистанционных.pdf

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 12.01.2024

Просмотров: 77

Скачиваний: 2

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

Министерство науки и высшего образования Российской Федерации
Федеральное государственное бюджетное образовательное учреждение высшего образования
«ТОМСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
СИСТЕМ УПРАВЛЕНИЯ И РАДИОЭЛЕКТРОНИКИ» (ТУСУР)
Факультет дистанционного обучения (ФДО)
А. В. Демаков, А. А. Квасников, С. П. Куксенко
ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ
Методические указания
по выполнению лабораторных и самостоятельных работ
для обучающихся с применением дистанционных
образовательных технологий
Томск 2022

Корректор: А. Н. Миронова
Демаков А. В. и др.
Объектно-ориентированное программирование : методические указания по выполнению лабораторных и самостоятельных работ для обучающихся с применением дистанционных образовательных техно- логий / А. В. Демаков, А. А. Квасников, С. П. Куксенко. – Томск : ФДО,
ТУСУР, 2022. – 63 с.
© Демаков А. В., Квасников А. А.,
Куксенко С. П., 2022
© Оформление.
ФДО, ТУСУР, 2022

3
ОГЛАВЛЕНИЕ
Введение ....................................................................................................................... 4 1 Самостоятельная работа № 1 «Генераторы псевдослучайных чисел» ............... 5 1.1 Цели и задачи работы ........................................................................................ 5 1.2 Краткие теоретические сведения и демонстрационные примеры ................ 5 1.3 Задание на лабораторную работу ................................................................... 14 2 Лабораторная работа № 1 «Классы» .................................................................... 15 2.1 Цели и задачи работы ...................................................................................... 15 2.2 Теоретические сведения: ключевые темы ..................................................... 15 2.3 Программное и методическое обеспечение .................................................. 15 2.4 Задание для выполнения работы .................................................................... 18 2.5 Порядок выполнения работы .......................................................................... 18 2.6 Требования к оформлению отчета.................................................................. 19 2.7 Варианты индивидуальных заданий .............................................................. 20 2.8 Система оценивания ........................................................................................ 23 3 Самостоятельная работа № 2 «Шаблоны» ........................................................... 25 3.1 Цели и задачи работы ...................................................................................... 25 3.2 Краткие теоретические сведения и демонстрационные примеры .............. 25 3.3 Задание на работу ............................................................................................. 32 4 Лабораторная работа № 2 «Наследование и виртуальные функции» .............. 34 4.1 Цели и задачи работы ...................................................................................... 34 4.2 Теоретические сведения .................................................................................. 34 4.3 Программное и методическое обеспечение .................................................. 50 4.4 Задание для выполнения работы .................................................................... 50 4.5 Порядок выполнения работы .......................................................................... 50 4.6 Требования к оформлению отчета.................................................................. 51 4.7 Варианты индивидуальных заданий .............................................................. 52 4.8 Система оценивания ........................................................................................ 55
Список использованных источников ...................................................................... 56
Приложение А (обязательное) Пользовательский проект .................................... 57


4
ВВЕДЕНИЕ
Я придумал термин «объектно-ориентированный», и я уверяю вас, что не имел в виду C++.
Алан Кей
Основными понятиями, лежащими в основе объектно-ориентированного программирования (ООП), являются класс и его объект. Так, согласно источ- нику [1], «объектно-ориентированное программирование – это методология про- граммирования, которая основана на представлении программы в виде совокуп- ности объектов, каждый из которых является реализацией определенного класса, а классы образуют иерархию на принципах наследуемости». Отсюда следует, что для понимания принципов ООП требуется уметь разрабатывать классы и рабо- тать с их объектами.
Поэтому общей целью данного пособия является получение навыков по разработке классов, созданию их объектов и оперированию ими. Для этого предусмотрены две лабораторные и две самостоятельные работы. Полученные в ходе их выполнения навыки и знания станут основой для дальнейшего изучения особенностей использования парадигмы ООП, широко применяемой на практике при разработке различного универсального и специализированного программ- ного обеспечения для решения различных практических и научных задач.
После выполнения каждой лабораторной работы необходимо составить от- чет и отправить его на проверку преподавателю. Если отчет удовлетворяет уста- новленным требованиям, а задание выполнено надлежащим образом, то лабора- торная работа идет в зачет дисциплины. Отчет возвращается на доработку до тех пор, пока все требования не будут выполнены. Самостоятельные работы от- дельно не оцениваются, поэтому отчеты по ним не требуется отправлять на про- верку.

5
1
САМОСТОЯТЕЛЬНАЯ РАБОТА № 1 «ГЕНЕРАТОРЫ
ПСЕВДОСЛУЧАЙНЫХ ЧИСЕЛ»
Случайности не случайны.
М/ф «Кунг-фу панда»
1.1
Цели и задачи работы
Цель работы – изучить особенности использования генераторов псевдо- случайных чисел в языке C++.
Для достижения поставленной цели необходимо решить следующие задачи:
 ознакомиться с представленными тестовыми примерами по генерации псевдослучайных чисел на языке C++ с разными видами распределений;
 выполнить модернизацию параметров шаблонов генераторов псевдо- случайных чисел в представленных программных кодах;
 разработать программные коды с требуемыми видами распределений.
1.2
Краткие теоретические сведения
и демонстрационные примеры
Генерация случайных чисел часто используется на практике, например в специализированных программах, играх и пр. Поэтому ознакомимся с тем, как генерировать случайные (рандомные) числа с использованием встроенных средств языка С++. Следует помнить, что для генерации случайных чисел ис- пользуются специальные шаблонные функции, которые реализуют заложенный в них алгоритм, поэтому генерируемые случайные числа по сути не случайны, а псевдослучайны. При этом они могут иметь разные распределения.
В общем виде генерация псевдослучайных чисел основана на задании начального значения, с которым выполняются математические преобразования.
Это позволяет конвертировать его в новое число, которое затем с использова- нием тех же преобразований дает еще одно новое число. Процесс продолжается до получения требуемой последовательности псевдослучайных чисел. Далее приведены демонстрационные примеры, разработанные для компилятора GDB online Debugger [2].


6
В язык С++ встроено несколько генераторов случайных чисел, как новых, так и «доставшихся по наследству» от языка C, в частности функции rand() и srand() (на некоторых компиляторах для их работы может потребоваться за- головочный файл ). Первая из них предназначена для задания начального значения для генерации псевдослучайных чисел (может отсутство- вать), а вторая генерирует их от нуля до константы RAND_MAX (значение может различаться на разных компиляторах). Ниже приведен программный код их ис- пользования. Пример результата его работы приведен на рисунке 1.1.
1 #include using namespace std; int main(){ srand(1000);
// srand(time(0));
for (auto i = 0; i< 15; i++){ cout<< rand() << '\t'; if ((i + 1) % 3 == 0) cout< } cout<<"RAND_MAX="<}
2 3
4 5
6 7
8 9
10 11 12 766020790 1182770779 1333893513 173226398 1071903604 1702255141 2121871803 2124051570 983886268 1364009855 1991873138 779257283 1653856994 1570801147 147856433
RAND_MAX=2147483647
Рис. 1.1 – Пример генерации псевдослучайных чисел при использовании функций srand() и rand()

7
Если запустить этот код несколько раз, то результат (сгенерированные числа) будет одним и тем же. Чтобы получать разные результаты при каждом запуске, необходимо изменять значение аргумента функции srand() вручную.
Однако можно автоматизировать это, например, используя функцию time() с нулевым значением аргумента (строка 4 кода). (На некоторых компиляторах для работы функции time()может потребоваться заголовочный файл
.) Функция возвращает число секунд, прошедшее с полуночи
01.01.1970 до момента её вызова. Поэтому при каждом запуске программы начальное значение для генерации псевдослучайных чисел будет разным.
Использование функции rand() прекрасно подходит при изучении про- граммирования, но слабо применимо на практике, т. к. оно, как минимум, не поз- воляет явно генерировать числа с плавающей точкой (запятой). Кроме того, она не подходит, если нужно генерировать числа, превышающие RAND_MAX. По- этому рассмотрим другие способы генерации псевдослучайных чисел, реализо- ванные в заголовочном файле . Их использование является предпо- чтительным по сравнению с устаревшей функцией rand(). Кроме того, они прекрасно сочетаются с контейнерами стандартной библиотеки шаблонов (STL) языка С++.
Генераторы псевдослучайных чисел, формирующие числа с равномерным распределением в указанном диапазоне, называют равномерными генераторами псевдослучайных чисел (РГСЧ, англ. URNG). Они характеризуются следую- щими свойствами:
 длина периода, т. е. число сгенерированных чисел, после которого эти числа начинают повторяться;
 производительность, т. е. затраты машинной памяти и времени, требуе- мые для генерации последовательности;
 стохастичность или качество, т. е. то, насколько генерируемая последо- вательность чисел близка к случайной.


8
Один из генераторов – это вихрь Мерсенна (std::mt19937), который формирует случайные 32-битные целые беззнаковые числа
(unsigned int). Существует также 64-битная версия (std::mt19937_64).
Здесь использован наиболее известный алгоритм, названный MT19937, период которого составляет 2 19937
− 1. (Число Мерсенна – это число вида M
n
=2
n
– 1, где
n – натуральное число.)
Для демонстрации работы генератора применим следующий программный код, в котором сначала использовано начальное детерминированное значение, а затем недетерминированное значение, генерируемое с помощью объекта класса random_device(результаты равномерно распределены в диапазоне
[0, 2 32
)). Пример результата его работы показан на рисунке 1.2. Имя генератора
(использовано gen) может быть произвольным.
1 #include
#include using namespace std; int main(){ cout <<"-- deterministic 32-bit generator --" <// вихрь Мерсенна c заданием
начального значения
for (auto i = 0; i < 15; i++){ cout << gen() << '\t';
// генерируемые 32-битные
значения при каждом запуске будут ОДИНАКОВЫ
if ((i + 1) % 3 == 0) cout << endl;
} cout << "-- stochastic 32-bit generator --" << endl; random_device rd;
// задание случайного начального
значения, недетерминированный (стохастический) генератор
2 3
4 5
6 7
8 9
10 11 12 13

9 14 mt19937 gen_32(rd());
// вихрь Мерсенна со случайным
начальным значением
for (auto i = 0; i < 15; i++){ cout << gen_32() << '\t';
// генерируемые
32-битные значения при каждом запуске будут РАЗЛИЧНЫ
if ((i + 1) % 3 == 0) cout << endl;
} return 0;
}
15 16 17 18 19 20 21
-- deterministic 32-bit generator --
2807145907 882709079 493951047 2621574848 4081433851 44058974 2070996316 1549632257 3747249597 3650674304 911961945 58396205 174846504 1478498153 1705937244
-- stochastic 32-bit generator --
3465764765 3092374054 362616658 1775880886 1642154037 2297831172 1838808206 2271903162 1682959543 3058204819 3320854527 2740241380 1994775372 2165420906 957931652
Рис. 1.2 – Пример генерации псевдослучайных чисел при использовании std::mt19937
При задании начального значения с помощью объекта класса random_deviceгенерируются псевдослучайные числа, которые различны при каждом запуске программы, но диапазон их разброса не контролируется. Для за- дания требуемого диапазона можно использовать однородное распределение
(вероятность генерации всех чисел одинакова) с помощью шаблонных классов std::uniform_int_distribution<> (для генерации целых чисел) и std::uniform_real_distribution<> (для генерации чисел с плаваю- щей точкой). Пример результата его работы показан на рисунке 1.3.


10 1 #include
#include using namespace std; int main(){ random_device rd; cout<< "-- stochastic generator from a range of int values --" <dist(-15,15); mt19937 gen_range(rd()); for (auto i = 0; i< 15; i++){ cout< } cout<< "-- stochastic generator from a range of float values --" <dist_float(-
15.1,15.1); mt19937 gen_range_float(rd()); for (auto i = 0; i< 15; i++){ cout< } return 0;
}
2 3
4 5
6 7
8 9
10 11 12 13 14 15 16 17 18 19 20 21 22 23

11
Рис. 1.3 – Пример генерации псевдослучайных чисел при использовании std::mt19937 из заданного диапазона
Рассмотрим третий механизм равномерного распределения. Так, для пре- образования сгенерированных чисел в значения с плавающей запятой (точкой) из их диапазона [0, 1) используется шаблон std::generate_canonical<>, позволяющий задавать требуемые тип данных и число бит мантиссы. При пре- образовании равномерное распределение сохраняется. Пример результата его использования приведен на рисунке 1.4.
1 #include
#include using namespace std; int main(){ random_device rd; cout << "-- stochastic generator with generate canonical --" << endl; mt19937 gen(rd()); for (auto i = 0; i < 15; i++){ cout<<:generate_canonical>(gen)<<' '; if ((i + 1) % 3 == 0)
2 3
4 5
6 7
8 9
10

12 11 cout << endl;
} return 0;
}
12 13 14
-- stochastic generator with generate canonical --
0.584187 0.564575 0.660237 0.146985 0.850514 0.502728 0.95594 0.0815856 0.51544 0.485214 0.673156 0.744271 0.109471 0.0914353 0.273847
Рис. 1.4 – Пример генерации псевдослучайных чисел при использовании std::mt19937 и std::generate_canonical<>
Для генерации чисел с дискретным и непрерывным распределениями в C++ используется много механизмов, включая биномиальное, Бернулли, гео- метрическое, Пуассона, Коши, Стьюдента и пр.
Например, шаблон std::geometric_distribution<> предназна- чен для задания геометрического распределения, а std::poisson_distri- bution<>
– для пуассоновского. Оба работают с целыми неотрицательными числами. Шаблон std::student_t_distribution< > задает распределе- ния Стьюдента для чисел с плавающей запятой (точкой). Следующий код демон- стрирует использование этих распределений. Пример результата его работы по- казан на рисунке 1.5.
1 #include
#include using namespace std; int main(){ random_device rd; mt19937 gen(rd());
2 3
4 5
6

13 7 cout << "-- stochastic generator with geometric distribution --" << endl; geometric_distribution<> distribGeo(0.5); for (auto i = 0; i < 15; i++){ cout << distributionGeometric(gen) << " "; if ((i + 1) % 3 == 0) cout << endl;
} cout << "-- stochastic generator with Poisson distribution --" << endl; poisson_distribution distribPoisson(10); for (auto i = 0; i < 15; i++){ cout << distributionPoisson(gen) << " "; if ((i + 1) % 3 == 0) cout << endl;
} cout << "-- stochastic generator with Student distribution --" << endl; student_t_distribution distribStudent(5.0); for (auto i = 0; i < 15; i++){ cout << distributionStudent(gen) << " "; if ((i + 1) % 3 == 0) cout << endl;
} return 0;
}
8 9
10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29