Advertisement
TShiva

Semestr 2

Feb 11th, 2015
417
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 46.03 KB | None | 0 0
  1. Задачи практикума на ЭВМ для 2-го курса
  2. II семестр 2010/2011 уч. г.
  3.  
  4.  
  5. ТРЕБОВАНИЯ К ПРОГРАММАМ
  6.  
  7. 1. Все программы должны быть написано самостоятельно.
  8.  
  9. 2. Программы должны быть тщательно протестированы.
  10.  
  11. 3. Необходимо точно выполнять условия задач, при сомнениях --
  12. консультироваться с преподавателем. Программы представляются в
  13. исходных текстах.
  14.  
  15. 4. Текст программы должен быть откомментирован. В заголовке указать имя
  16. автора, группу, краткую формулировку задания. Переменные должны иметь
  17. осмысленные имена. Желательно объявление переменной снабжать
  18. комментарием о ее назначении.
  19.  
  20. 5. Следует структурировать программу, разбивая ее на (относительно)
  21. независимые части. Осуждается порочная практика размещения многих
  22. операторов в одной строке.
  23.  
  24. 6. Программы следует разбивать на модули, выделяя в заголовочные файлы
  25. интерфейсную часть классов. Демонстрационная часть должна быть выделена
  26. в отдельный модуль.
  27.  
  28. 7. Интерфейс программы должен быть достаточно удобен для пользователя.
  29.  
  30. 8. Программа должна компилироваться без ошибок и предупреждений при всех
  31. включенных сообщениях компилятора.
  32.  
  33. 9. Перед сдачей программа должна быть хорошо протестирована.
  34.  
  35. 10. В программе не должно быть глобальных переменных.
  36.  
  37. 11. Классы должны содержать операторы ввода/вывода.
  38. Классы, использующие динамическую память, должны содержать также
  39. следующие методы:
  40. o конструктор по умолчанию;
  41. o конструктор копии;
  42. o перегруженный оператор присваивания;
  43. o деструктор;
  44.  
  45. 12. Ошибки (ввода/вывода, нехватки памяти и проч.) должны корректно
  46. обрабатываться программой, причем нужно реализовать "мягкую" обработку.
  47. 13. Сроки сдачи программ:
  48. 1-я -- до 1 марта,
  49. 2-я -- до 1 апреля,
  50. 3-я -- до 1 мая,
  51. 4-я -- до конца семестра.
  52.  
  53.  
  54. =============================================================================
  55.  
  56. ------------------------------------------------------------------------
  57. I. Классы с динамической памятью.
  58. ------------------------------------------------------------------------
  59.  
  60.  
  61. 1. Реализовать класс "Стек символов" (на базе списка).
  62.  
  63. Реализовать класс "Массив стеков". Длина массива определяется во время
  64. инициализации и в дальнейшем не меняется. Массив должен хранить сами стеки,
  65. а не указатели на них. Доступ к элементам массива осуществляется с помощью
  66. квадратных скобок.
  67.  
  68. 2. Реализовать класс "Очередь символов" (на базе списка).
  69.  
  70. Реализовать класс "Массив очередей". Длина массива определяется во время
  71. инициализации и в дальнейшем не меняется. Массив должен хранить сами
  72. очереди, а не указатели на них. Доступ к элементам массива осуществляется с помощью
  73. квадратных скобок.
  74.  
  75. 3. Реализовать класс "Дек символов" (на базе списка).
  76.  
  77. Реализовать класс "Массив деков". Длина массива определяется во время
  78. инициализации и в дальнейшем не меняется. Массив должен хранить сами деки,
  79. а не указатели на них. Доступ к элементам массива осуществляется с помощью
  80. квадратных скобок.
  81.  
  82. 4. Реализовать класс "Матрица целых чисел" размера m x n. Класс должен включать
  83. в себя методы:
  84.  
  85. * получить размеры матрицы;
  86. * получить элемент с заданными координатами;
  87. * изменить элемент с заданными координатами;
  88. * прибавить заданную матрицу;
  89. * умножить на заданную матрицу;
  90. * умножить на константу.
  91.  
  92. 5. Реализовать класс "Защищенный массив символов". Массив должен быть
  93. одномерным и индексироваться целыми числами. Границы изменения индекса
  94. задаются при инициализации и в дальнейшем не изменяются. Методы: получить
  95. границы массива, прочитать / изменить значение компоненты, вывести массив в
  96. поток. При этом должна производиться проверка на нарушение границ, в случае
  97. нарушения выводиться на экран сообщение об ошибке. Обращение к элементам
  98. массива должно быть таким же, как и для обычных массивов.
  99.  
  100. Реализовать класс "Текст". Текст хранить в виде массива защищенных
  101. массивов. Его максимальные размеры задаются во время инициализации и
  102. в дальнейшем не меняются.
  103. Методы: добавить строку в конец текста,
  104. прочитать/изменить строку с заданным номером, удалить строку с заданным номером,
  105. потоковый ввод/вывод текста.
  106.  
  107. 6. Реализовать класс "Текст". Текст хранить в виде списка строк. Размеры
  108. текста могут динамически изменяться. Методы:
  109.  
  110. * добавить строку в начало текста
  111. * добавить строку в конец текста
  112. * добавить строку после n-й строки;
  113. * получить n-ю строку;
  114. * изменить n-ю строку;
  115. * удалить n-ю строку;
  116. * получить количество строк в тексте;
  117. * получить количество символов в тексте;
  118. * удалить весь текст.
  119.  
  120. Реализовать функцию, которая сравнивает два текста на равенство
  121. (посимвольно).
  122.  
  123. 7. Реализовать класс "Однонаправленный список символов". Класс должен
  124. включать в себя методы:
  125.  
  126. * стандартные методы списка
  127. * получение длины списка
  128. * вставить символ после i-го
  129. * удалить i-й символ
  130. * удалить первое вхождение заданного символа
  131.  
  132. Реализовать класс "Массив списков". Длина массива определяется во время
  133. инициализации и в дальнейшем не меняется.
  134.  
  135. 8. Реализовать класс "Двунаправленный список символов". Класс должен
  136. включать в себя методы:
  137.  
  138. * стандартные методы списка
  139. * получение длины списка
  140. * вставить символ после i-го
  141. * удалить i-й символ
  142. * удалить первое вхождение заданного символа
  143.  
  144. Реализовать класс "Массив списков". Длина массива определяется во время
  145. инициализации и в дальнейшем не меняется. Массив должен хранить сами
  146. списки, а не указатели на них.
  147.  
  148. ------------------------------------------------------------------------
  149. II. Наследование
  150. ------------------------------------------------------------------------
  151.  
  152. 11. Реализовать класс "Многочлен от переменных x,y,z с вещественными
  153. коэффициентами" с методами:
  154.  
  155. * вычисление значения многочлена на заданных числах;
  156. * вычисление степени многочлена по каждой переменной;
  157. * инициализация многочлена по строке.
  158.  
  159. Объект инициализируется символьной строкой, не содержащей скобок. На базе
  160. этого класса реализовать иерархию производных классов:
  161.  
  162. 1) "Многочлен от переменной x". Новый метод:
  163.  
  164. * вычисление производной многочлена (результат - новый многочлен).
  165.  
  166. 2) "Квадратный трехчлен". Инициализация символьной строкой и тройкой чисел.
  167. Методы:
  168.  
  169. * нахождение корней многочлена;
  170. * разложение многочлена на множители (результат - пара новых многочленов или
  171. признак того, что исходный многочлен неприводим).
  172.  
  173. 3) "Квадратичные формы от переменных x,y,z". Инициализация только
  174. символьной строкой. Методы:
  175.  
  176. * форма диагональна или нет;
  177. * форма невырождена или нет.
  178.  
  179. 12. Реализовать класс "Текст". Текст хранится в виде массива строк, длина
  180. текста не фиксирована. Методы:
  181.  
  182. * добавить строку в конец текста;
  183. * удалить последнюю строку;
  184. * текст пуст / непуст.
  185.  
  186. Реализовать также следующие классы (подумав, какой на базе какого):
  187.  
  188. 1) "Объявление". Объявление представляет собой текст, имеет строку для
  189. хранения адреса и массив строк с телефонами. Методы:
  190.  
  191. * изменить адрес;
  192. * добавить / удалить телефон;
  193. * подсчитать количество символов в объявлении;
  194. * распечатать объявление (в поток).
  195.  
  196. 2) "Объявления с вознаграждением". Представляет собой объявление с
  197. информацией о сумме вознаграждения и методе, позволяющем ее получить.
  198.  
  199. 3) "Доска объявлений". Содержит массив объявлений. Размер массива
  200. определятся при инициализации и в дальнейшем не увеличивается. Методы:
  201. добавление / чтение / удаление объявления;
  202.  
  203. 13. Реализовать класс "Человек", включающий в себя имя, фамилию, отчество,
  204. год рождения и методы, позволяющие изменять / получать значения этих полей.
  205.  
  206. Реализовать производные классы:
  207.  
  208. 1) "Преподаватель университета" с полями: должность, ученая степень,
  209. специальность, список научных трудов (массив строк).
  210.  
  211. 2) "Член партии" с полями: название партии, год вступления в партию, номер
  212. партбилета, автобиография (массив строк).
  213.  
  214. 3) "Преподаватели - члены партии" (производный от 2 и 3). Дополнительное
  215. поле -- список трудов в поддержку партии.
  216.  
  217. Классы должны содержать методы доступа и изменения всех полей. Предельные
  218. размеры динамических массивов задаются при инициализации и не увеличиваются
  219. в дальнейшем.
  220.  
  221. 14. Реализовать класс "Человек", включающий в себя имя, фамилию, отчество,
  222. год рождения и методы, позволяющие изменять / получать значения этих полей.
  223.  
  224. Реализовать производные классы:
  225.  
  226. 1) "Предприниматель" -- содержит номер лицензии, адрес регистрации, ИНН,
  227. данные о налоговых платежах (массив пар вида <дата, сумма>).
  228.  
  229. 2) "Турист" -- содержит данные паспорта (строка), данные о пересечении
  230. границы в виде массива пар <дата, страна>.
  231.  
  232. 3) "Челнок" (производный от 2 и 3) -- добавляется массив строк - список
  233. адресов, по которым покупается товар.
  234.  
  235. Классы должны содержать методы доступа и изменения всех полей. Предельные
  236. размеры динамических массивов задаются при инициализации и не увеличиваются
  237. в дальнейшем.
  238.  
  239. 15. Описать абстрактный класс "Вещественнозначная функция" с методами:
  240.  
  241. 1. проверить, принадлежит ли число области определения функции;
  242. 2. вычислить значение функции в точке;
  243.  
  244. Сделайте 3 класса-наследника для конкретных функций.
  245.  
  246. Описать класс "Функционал на функциях на отрезке [a,b]" с методом, аргумент
  247. которого - указатель на "вещественнозначную функцию", результат -
  248. вещественное число. Производные от "Функционала" классы должны реализовать
  249. следующие функционалы:
  250.  
  251. 1. интегрирование методом прямоугольников (5-10 промежуточных значений);
  252. 2. то же, методом трапеций;
  253. 3. максимум модулей значений функции на концах отрезка и в середине.
  254.  
  255. Оболочка должна инициализировать объекты -- функции и функционалы и
  256. распечатать значения заданного функционала на заданной функции.
  257.  
  258. 16. Описать абстрактный класс "Функция на отрезке [a,b]" с методом, вычисляющим
  259. значение функции в заданной точке и методами, позволяющими работать с
  260. границами отрезка.
  261.  
  262. Реализовать производные классы
  263.  
  264. 1. полиномы 2-й степени одной переменной
  265. 2. линейная комбинация тригонометрических функций sin и cos
  266. 3. экспонента от полинома 1-й степени одной переменной
  267. 4. константную функцию
  268.  
  269. 17. "Матрицы"
  270.  
  271. Разработать базовый класс "Квадратная матрица вещественных чисел"
  272. с методами чтения/записи элемента в заданную позицию, а также
  273. операторами ввода/вывода.
  274.  
  275. От базового класса наследуются следующие классы:
  276.  
  277. (1) "Полная матрица вещественных чисел", хранящая n2 чисел.
  278.  
  279. (2) "Диагональная матрица вещественных чисел".
  280.  
  281. (3) "Верхнетреугольная матрица вещественных чисел".
  282.  
  283. От (3) наследуется:
  284.  
  285. (4) "Симметрическая матрица вещественных чисел".
  286.  
  287. Придумать оптимальный способ хранения каждого из четырех производных типов
  288. матриц (так, для диагональных матриц не требуется квадратная таблица чисел).
  289. Переопределить те методы, работа которых зависит от типа матрицы.
  290. Так, при попытке записать ненулевое число в позицию (3,1)
  291. треугольной матрицы должна диагностироваться ошибка, при записи числа в
  292. позицию (i,j) симметричной матрицы то же значение должно возникать в
  293. позиции (j,i) и т.п.
  294.  
  295. 18. Реализовать класс "Библиотечная карточка" с полями "автор", "название",
  296. "количество страниц", "авторский знак", "инвентарный номер",
  297. "код по тематическому каталогу", а также методы доступа к ним.
  298.  
  299. Реализовать производные от него классы:
  300.  
  301. 1) "Карточка для книги" с дополнительными полями "тираж", "год издания"
  302. и "место издания".
  303.  
  304. 2) "Карточка для журнала" с дополнительными полями
  305. "год издания", "номер", "содержание" (в виде массива строк автор/название
  306. статьи).
  307.  
  308. 3) "Карточка диссертации" с дополнительными полями "код специальности",
  309. "место и год выполнения".
  310.  
  311. Реализовать класс "Каталог", позволяющий хранить карточки разных типов
  312. (использовать механизм RTTI). Предусмотреть методы добавления, удаления
  313. карточек, возможность перебора всех карточек по-очереди, а также поиск
  314. карточек по автору + названию.
  315.  
  316. ------------------------------------------------------------------------
  317. III. Шаблоны.
  318. ------------------------------------------------------------------------
  319.  
  320. 21. Имеется необходимость работать с упорядоченными бинарными
  321. деревьями поиска символов, строк и точек на плоскости (точка задается
  322. своими координатами, считаем, что точка A(x,y) > B(x1,y1),
  323. если x>x1 или (x=x1 и y>y1) ).
  324. Разработайте набор классов, позволяющих работать с такими объектами.
  325. Для деревьев предусмотреть методы: вставка и удаление элемента в дерево, вывод
  326. дерева в поток в порядке убывания элементов, ввод из
  327. потока, метод, возвращающий самый длинный путь в дереве в виде динамического
  328. массива элементов.
  329.  
  330. 22. Имеется необходимость работать с упорядоченными бинарными
  331. деревьями поиска вещественных чисел, линейных многочленов и двоичных строк.
  332. Двоичная строка --- это строка из 0 и 1, их можно сравнивать
  333. в лексикографическом порядке. Линейный многочлен ax+b меньше многочлена
  334. cx+d, если пара <a,b> меньше пары <c,d> в лексикографическом порядке.
  335. Разработайте набор классов, позволяющих работать с такими объектами.
  336. Для деревьев предусмотреть методы: вставка и удаление элемента в дерево, вывод
  337. дерева в поток по уровням (от корня к листьям), ввод из
  338. потока, метод, возвращающий путь в дереве от корня к элементу x
  339. в виде динамического массива элементов.
  340.  
  341. 23. Имеется необходимость работать с упорядоченными бинарными
  342. деревьями поиска целых чисел, комплексных чисел и записей в телефонной книге.
  343. Запись в телефонной книге содержит информацию о фамилии, имени, отчестве и
  344. номер телефона (длинное целое). Записи упорядочены по ФИО абонентов.
  345. Комплексное число представляется в виде пары (модуль, аргумент),
  346. считается, что z>z1, если |z|>|z1| или (|z|=|z1| и Arg z > Arg z1).
  347. Разработайте набор классов, позволяющих работать с такими объектами.
  348. Для деревьев предусмотреть методы: вставка и удаление элемента в дерево, вывод
  349. дерева в поток в порядке возрастания элементов, ввод из
  350. потока, оператор ==, определяющий, что деревья состоят из одних и тех же
  351. элементов.
  352.  
  353. 24. Имеется необходимость работать с упорядоченными бинарными
  354. деревьями поиска символов, комплексных чисел и динамических массивов
  355. целых чисел.
  356. Комплексное число представляется в виде z=a+bi,
  357. считается, что z>z1, если Re z > Re z1 или (Re z = Re z1 и Im z > Im z1).
  358. Динамические массивы целых чисел можно сравнивать относительно
  359. лексикографического порядка.
  360. Разработайте набор классов, позволяющих работать с такими объектами.
  361. Для деревьев предусмотреть методы: вставка и удаление элемента в дерево, вывод
  362. дерева в поток по уровням (от листьев к корню), ввод из
  363. потока, оператор <=, определяющий, является ли дерево T1 поддеревом
  364. дерева T.
  365.  
  366.  
  367. 25. Имеется необходимость работать с упорядоченными бинарными
  368. деревьями поиска вещественных чисел, троек целых чисел и строк символов.
  369. Тройки целых чисел и строки сравниваются относительно лексикографического
  370. порядка.
  371. Разработайте набор классов, позволяющих работать с такими объектами.
  372. Для деревьев предусмотреть методы: вставка и удаление элемента в дерево, вывод
  373. дерева в поток по уровням (сперва корень, потом все потомки корня и т.п.,
  374. последними --- листья), ввод из
  375. потока, а также метод, позволяющий получить все листья дерева в виде
  376. динамического массива элементов.
  377.  
  378.  
  379. 26. Дата --- это тройка чисел вида дд-мм-гг. Даты упорядочены
  380. естественным образом.
  381. Имеется необходимость работать с упорядоченными бинарными
  382. деревьями поиска целых чисел, строк символов и дат.
  383. Разработайте набор классов, позволяющих работать с такими объектами.
  384. Для деревьев предусмотреть методы: вставка и удаление элемента в дерево, вывод
  385. дерева в поток по уровням (от листьев к корню), ввод из
  386. потока, а также метод, позволяющий получить самый длинный путь в дереве
  387. в виде динамического массива элементов (любой из таких путей, если их
  388. несколько).
  389.  
  390. 27. Библиотечная карточка содержит информацию об авторе книги, название книги,
  391. инвентарный номер книги (целое число). Карточки упорядочены по авторам
  392. (главный ключ) и названиям.
  393. Имеется необходимость работать с упорядоченными бинарными
  394. деревьями поиска символов, троек из 0 и 1, библиотечных карточек.
  395. Тройки из 0 и 1 сравниваются относительно лексикографического порядка.
  396. Разработайте набор классов, позволяющих работать с такими объектами.
  397. Для деревьев предусмотреть методы: вставка и удаление элемента в дерево, вывод
  398. дерева в поток в порядке возрастания элементов, ввод из
  399. потока, а также метод, удаляющий из дерева все листья.
  400.  
  401. 28. Запись в адресной книге состоит из фамилии, имени и отчества и адреса.
  402. Упорядочены такие записи по фамилии, имени и отчеству.
  403. Время представляется тройкой чисел чч:мм:сс, такие тройки упорядочены
  404. естественным образом.
  405. Имеется необходимость работать с упорядоченными бинарными
  406. деревьями поиска целых чисел, времени, библиотечных карточек.
  407. Разработайте набор классов, позволяющих работать с такими объектами.
  408. Для деревьев предусмотреть методы: вставка и удаление элемента в дерево, вывод
  409. дерева в поток в порядке убывания элементов, ввод из
  410. потока, а также метод, позволяющий получить n-й уровень дерева в виде
  411. динамического массива элементов (нулевой уровень состоит из корневого
  412. элемента, первый --- все потомки корня, второй --- потомки потомков и т.д.).
  413.  
  414. ------------------------------------------------------------------------
  415. IV. Сложные задачи
  416. ------------------------------------------------------------------------
  417.  
  418. 31. МНОГОМЕРНЫЕ МАССИВЫ
  419.  
  420. Разработать класс, объектами которого являются многомерные массивы
  421. (размерностью до MAX_DIM) с элементами типа NUMBER.
  422.  
  423. Конструктор класса выглядит примерно так:
  424.  
  425. Array::Array(int dim, ...); // первый параметр -- размерность,
  426. // остальные параметры -- границы по соответствующей размерности.
  427.  
  428. Array M(3, 3,4,2); // пример создания массива размерности 3
  429. // по 1-й размерности -- 3 (0..2),
  430. // по 2-й размерности -- 4 (0..3),
  431. // по 3-й размерности -- 2 (0..1).
  432.  
  433. Необходимы методы для определения размерности массива, величины массива по
  434. данной размерности, сравнения двух многомерных массивов, базовые
  435. арифметические операции:
  436.  
  437. * сложение, вычитание двух массивов
  438. * умножение элементов массива на скаляр
  439.  
  440. Доступ к элементам массива осуществляется обычным образом:
  441. M[2][0][1] = M[i][j][1] ;
  442.  
  443. При индексации проверяется выход за границы массива.
  444.  
  445. Результатом индексирования массива числом индексов K, где K<N и N -
  446. размерность массива при конструировании, является многомерный массив
  447. размерности N-K. Пример: Пусть задан двумерный массив M(3, 3,4,3), то
  448. M[1][2] одномерный массив элементов
  449. M[1] двумерный массив элементов
  450. M[1][2][2] элемент массива.
  451.  
  452. В тестовой задаче в качестве типа NUMBER можно использовать тип double.
  453.  
  454. 32. ЛОГИКА ПРЕДИКАТОВ
  455.  
  456. Реализовать класс "Сигнатура формул логики предикатов". Символы
  457. сигнатуры обозначаются одной буквой. Нужно предусмотреть возможности:
  458. * получить тип символа (предикатный, функциональный, константный)
  459. по его обозначению;
  460. * получить местность символа;
  461. * добавить / удалить символ;
  462. * получить количество символов каждого типа;
  463. * проитерировать элементы сигнатуры;
  464. * сравнить две сигнатуры на равенство.
  465.  
  466. Реализовать класс "Формула логики предикатов". Внутреннее представление
  467. формулы -- дерево. Переменные обозначать одной буквой. Реализовать:
  468. * преобразование строка-формула и наоборот;
  469.  
  470. Реализовать класс "Конечная алгебраическая система" (конечной сигнатуры).
  471. Элементы основного множества -- символы.
  472. Предусмотреть методы:
  473.  
  474. * получение мощности системы;
  475. * вычисление значения предиката / операции / константы на заданном наборе
  476. аргументов;
  477. * итератор, позволяющий перебрать элементы системы;
  478. * вычисление значения заданной формулы логики предикатов на наборе
  479. элементов системы.
  480.  
  481.  
  482. 33. ЛОГИКА ВЫСКАЗЫВАНИЙ
  483.  
  484. Реализовать класс "Формула логики высказываний" (в предположении, что формулы
  485. строятся с использованием только связок конъюнкция, дизъюнкция, импликация,
  486. эквивалентность, отрицание, сложение по модулю 2, константы 0 и 1).
  487. Внутреннее представление формулы -- дерево.
  488.  
  489. Методы:
  490.  
  491. * преобразование из строки во внутреннее представление и наоборот;
  492. * вычисление истинности при заданном наборе значений переменных;
  493. * приведение формулы к ДНФ;
  494. * приведение формулы к КНФ
  495. (в двух последних результат -- новый объект).
  496.  
  497. Реализовать класс "Вывод методом резолюций", который для множества формул
  498. Г и формулы Ф методом резолюций проверяет, выводится ли Ф из Г или нет.
  499. Класс должен иметь методы, позволяющие получить сам вывод (т.е. КНФ всех
  500. необходимых формул; список начальных дизъюнктов; список всех выводимых
  501. дизъюнктов с указанием того, из каких дизъюнктов они выведены).
  502.  
  503.  
  504.  
  505. 34. ДЛИННЫЕ ЧИСЛА
  506.  
  507. Реализовать два следующих класса.
  508.  
  509. 1. Длинные целые числа.
  510.  
  511. Реализуйте класс, объектами которого являются целые числа с неограниченным
  512. числом цифр. Число хранится в двоичном виде, память под массив данных
  513. должна выделяться динамически.
  514.  
  515. Действия над длинными числами:
  516.  
  517. * сложение, вычитание, умножение, деление нацело, взятие остатка,
  518. деление с остатком, возведение в целую степень;
  519. * операции сравнения двух длинных чисел;
  520. * ввод-вывод чисел (через потоки);
  521. * операции сдвига (на один/несколько бит);
  522. * взятие абсолютной величины числа.
  523.  
  524. Предусмотрите инициализацию числа строкой:
  525. LongNumber N("123456789012345678901234567890");
  526. N = "100000000000000000000000";
  527. и преобразование числа в строку.
  528.  
  529. 2. Рациональные числа.
  530.  
  531. Используя класс целых длинных чисел, реализовать арифметику рациональных
  532. чисел. Рациональное число хранить в приведенном виде.
  533.  
  534. Действия над рациональными числами:
  535.  
  536. * сложение, вычитание, умножение, деление нацело, взятие остатка,
  537. деление с остатком, возведение в целую степень;
  538. * операции сравнения двух длинных чисел;
  539. * ввод-вывод чисел (через потоки);
  540. * взятие абсолютной величины числа.
  541.  
  542. Предусмотрите инициализацию числа строкой:
  543. Rational R("123456789012345678901234567890");
  544. R = "100000000000000000000000.0000200001";
  545. R = "1/7";
  546.  
  547. Оператор ввода из потока должен уметь читать число как в десятичном
  548. представлении (123456789.0987654321), так и в виде дроби
  549. (123456789/987654321). Оператор вывода печатает число в виде дроби.
  550.  
  551. Дополнительно предусмотреть преобразование числа в строку
  552.  
  553. а) в виде обычной дроби;
  554.  
  555. б) в виде десятичной дроби с заданным числом цифр в дробной части:
  556. Rational r("2/3");
  557. convertToDecimal( R, 4 ) == "0.6667"
  558.  
  559.  
  560.  
  561. 35. МОДЕЛИРОВАНИЕ. "Волчий остров"
  562.  
  563. Остров (прямоугольник фиксированного размера) заселен дикими кроликами,
  564. волками и волчицами. Имеется по несколько представителей каждого вида.
  565. Кролики с вероятностью 1/9 передвигаются в один из восьми соседних
  566. квадратов или остаются на прежнем месте. Каждый кролик с вероятностью 1/5
  567. превращается в двух кроликов. Каждая волчица передвигается случайным
  568. образом, пока в одном из восьми соседних квадратов не окажется кролик, за
  569. которым она охотится. Если волчица и кролик оказываются в одном квадрате,
  570. волчица съедает кролика и получает одно "очко". В противном случае она
  571. теряет 0.1 "очка". Волки и волчицы c нулевым количеством "очков" умирают.
  572. Волк ведет себя подобно волчице до тех пор, пока поблизости не исчезнут все
  573. кролики; тогда если волчица находится в одном из восьми близлежащих
  574. квадратов, волк гонится за ней. Если волк и волчица окажутся в одном
  575. квадрате и там нет кролика, которого нужно съесть, они производят потомство
  576. случайного пола.
  577.  
  578. Для создания более устойчивой экологической системы острова введите на
  579. острове запретные зоны для хищников.
  580.  
  581. Разработать набор классов, реализующих данную программу.
  582.  
  583. Предусмотреть редактирование, сохранение на диске и восстановление с диска
  584. популяции, гибкое изменение параметров системы, пошаговую демонстрацию и
  585. режим быстрого просчета.
  586.  
  587.  
  588.  
  589. 36. МНОЖЕСТВО С ХЭШ-ТАБЛИЦЕЙ
  590.  
  591. Реализовать класс-шаблон, объектами которого являются множества элементов с
  592. элементами типа T (int, float, myObject, и т.д.) Для внутреннего
  593. представления множества использовать динамическую хэш-таблицу.
  594. Предполагается, что элемента типа Т можно сравнивать на равенство, кроме того
  595. для элементов типа Т определен оператор int() преобразования в целое число.
  596.  
  597. Операции над множеством:
  598.  
  599. * узнать мощность множества
  600. * добавить/удалить элемент
  601. * проверить есть ли элемент в множестве
  602. * сделать множество пустым
  603. * ввод/вывод множество в поток
  604.  
  605. Отношения между двумя множествами:
  606.  
  607. * равны ли два множества
  608. * содержит ли одно множество другое
  609. * пересечение двух множеств
  610. * объединение двух множеств
  611. * разность двух множеств
  612. * симметрическая разность двух множеств
  613.  
  614. Реализовать класс "Итератор множества", который позволяет перебирать
  615. элементы заданного множества. Порядок перебора элементов не фиксирован.
  616. Набор методов итератора:
  617.  
  618. * установить итератор в начальное состояние,
  619. * проверить: итератор перебрал все элементы множества,
  620. * выдать текущий элемент,
  621. * перейти к следующему элементу.
  622.  
  623. Пример:
  624. myObject e(..);
  625. SetOf S;
  626. S.adjoinElement( e ); // добавить элемент e в S.
  627.  
  628. SetIterator Iter( S );
  629. for( Iter.reset(); !Iter.done(); Iter.next() ) {
  630. myObject tmp = I.value();
  631. ...
  632. }
  633.  
  634. Рекомендуется сначала сделать обычные классы с типом элемента myObject, не
  635. используя шаблоны. После того, как эти классы будут отлажены, можно
  636. модифицировать их для использования шаблонов.
  637.  
  638.  
  639. 37. МНОЖЕСТВО НА БАЗЕ ДБ-ДЕРЕВА
  640.  
  641. 1. Реализовать шаблонный класс "Двоичное Б-дерево" элементов типа Т
  642. (описание двоичного Б-дерева смотри в книге Н.Вирта "Алгоритмы и
  643. структуры данных"). Предполагается, что элементы типа Т
  644. можно сравнивать на равенство (==) и относительно некоторого порядка <.
  645.  
  646. 2. Реализовать шаблонный класс "Множество" элементов типа Т на базе двоичного
  647. Б-дерева.
  648.  
  649. Операции над множеством:
  650.  
  651. * узнать мощность множества
  652. * добавить/удалить элемент
  653. * проверить есть ли элемент в множестве
  654. * сделать множество пустым
  655. * ввод/вывод множество в поток
  656.  
  657. Отношения между двумя множествами:
  658.  
  659. * равны ли два множества
  660. * содержит ли одно множество другое
  661. * пересечение двух множеств
  662. * объединение двух множеств
  663. * разность двух множеств
  664. * симметрическая разность двух множеств
  665.  
  666. Реализовать класс "Итератор множества", который позволяет перебирать
  667. элементы заданного множества. Порядок перебора элементов не фиксирован.
  668. Набор методов итератора:
  669.  
  670. * установить итератор в начальное состояние,
  671. * проверить: итератор перебрал все элементы множества,
  672. * выдать текущий элемент,
  673. * перейти к следующему элементу.
  674.  
  675. Пример:
  676. myObject e(..);
  677. SetOf S;
  678. S.adjoinElement( e ); // добавить элемент e в S.
  679.  
  680. SetIterator Iter( S );
  681. for( Iter.reset(); !Iter.done(); Iter.next() ) {
  682. myObject tmp = I.value();
  683. ...
  684. }
  685.  
  686. 38. Б-ДЕРЕВО
  687.  
  688. Реализовать шаблонный класс "Б-дерево" элементов типа Т в предположении,
  689. что все дерево помещается в оперативной памяти. Порялок дерева задается
  690. при инициализации и не меняется. Для элементов типа Т
  691. определен оператор порядка < и сравнения на равенство ==.
  692.  
  693. Необходимо реализовать:
  694. * поиск элемента в дереве
  695. * вставка и удаление элемента
  696. * вывод дерева в поток в порядке возрастания элементов
  697. * ввод из потока
  698. * проверка дерева на пустоту
  699. * очистка дерева
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement