Файл: Методические указания по выполнению лабораторных и самостоятельных работ для обучающихся с применением дистанционных.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() (на некоторых компиляторах для их работы может потребоваться за- головочный файл
1 #include
// srand(time(0));
for (auto i = 0; i< 15; i++){ cout<< rand() << '\t'; if ((i + 1) % 3 == 0) cout<
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. По- этому рассмотрим другие способы генерации псевдослучайных чисел, реализо- ванные в заголовочном файле
Генераторы псевдослучайных чисел, формирующие числа с равномерным распределением в указанном диапазоне, называют равномерными генераторами псевдослучайных чисел (РГСЧ, англ. URNG). Они характеризуются следую- щими свойствами:
длина периода, т. е. число сгенерированных чисел, после которого эти числа начинают повторяться;
производительность, т. е. затраты машинной памяти и времени, требуе- мые для генерации последовательности;
стохастичность или качество, т. е. то, насколько генерируемая последо- вательность чисел близка к случайной.
8
Один из генераторов
(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
начального значения
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
15.1,15.1); mt19937 gen_range_float(rd()); for (auto i = 0; i< 15; i++){ cout<
}
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
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
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
} cout << "-- stochastic generator with Student distribution --" << endl; student_t_distribution
} return 0;
}
8 9
10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29