Условия задач
Описание файла
PDF-файл из архива "Условия задач", который расположен в категории "". Всё это находится в предмете "проектирование больших систем с++" из 11 семестр (3 семестр магистратуры), которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .
Просмотр PDF-файла онлайн
Текст из PDF
Упражнения и задачиРешения задач, отмеченных звездочкой ?, можно присылать в любом виде (файлс кодом, ссылка на github, . . . ) на почту vkonovodov@gmail.com. Бонусные баллы зарешения задач ? могут быть поставлены нескольким первым приславшим правильноерешение.C++11/14.(1) ? Реализуйте класс ComplexNumber так, чтобы компилировался следующий код:constexpr ComplexNumber Conjugate(const ComplexNumber& x) {ComplexNumber res;res.SetRe(x.GetRe());res.SetIm(-x.GetIm());return res;}int main() {constexpr ComplexNumber a(1, 2);constexpr ComplexNumber b(1, -2);constexpr auto c = Conjugate(a);static_assert(b == c, "failed");}(2) ? Напишите функцию Compose, которая строит функтор-суперпозицию двух заданных функциональных объектов (принимающих на вход одну переменную).Пример: перевести в массив double одним вызовом std::transform массивstd::string, в котором записаны дробные числа:const char* f2(const std::string& str) {return str.c_str();}int main() {std::string s[] = {"1.2", "2.343", "3.2"};std::vector<double> d(3);auto f1 = atof;std::transform(s,s + 3,d.begin(),Compose(f1, f2));// ...}Постарайтесь использовать возможности C++11/14.Распределение памяти и умные указатели.(3) Напишите аллокатор, который выполняет стандартное распределение памяти спомощью operator new и логирует сообщения о работе каждой функции.
Проверьте его работу с несколькими стандартными контейнерами. Попробуйте модифицировать аллокатор так, чтобы он по возможности выделял блоки памятииз внутреннего статического буфера.(4) ? Реализуйте указатель TSharedPtr или TIntrusivePtr, создав базовый классTBasePtr, в котором определите операторы ->, *, ==, !=, bool. В основном классе должны быть определены основные копирующие и перемещающие операции,методы UseCount, Get, а также конструктор от обычного указателя.Продемонстрируйте работу умного указателя с каким-нибудь счетчиком ссылок.1(5) ? В следующей программе не вызываются перегруженные operator new иoperator delete.#include <iostream>class A {public:// ...static void * operator new(size_t size) {std::cout << "operator new!" << std::endl;return ::operator new(size);}static void operator delete(void *p, size_t size) {std::cout << "operator delete!" << std::endl;return ::operator delete(p);}};int main() {auto sp = std::make_shared<A>();}Используя функцию std::allocate_shared и свой аллокатор, реализуйте создание std::shared_ptr, при котором вызывается перегруженный operator new, нопри этом не используется конструкция new A.Паттерны проектирования.(6) ? Спроектируйте и реализуйте иерархию классов для генерации случайных чисел, а также фабрику для создания экземпляра класса генератора с заданнымипараметрами.class TRandomNumberGenerator {public:virtual -TRandomNumberGenerator();virtual double Generate() const = 0;};Необходимо поддержать три типа распределения: Пуассона, Бернулли и геометрическое.
Тип распределения задаётся строковым параметром type, которыйпринимает значения из множества poisson, bernoulli, geometric. При создании генератора передаются также параметры распределений.(7) Используя идиому Type Erasure, напишите класс Any, сохраняющий объектылюбого типа, и обеспечивающий к ним доступ:Any a(5);a.get<int>(); // 5a.get<std::string>(); // errorМетапрограммирование.(8) Напишите шаблон для вычисления биномиального коэффициента Ckn на этапекомпиляции.(9) ? Определите структуруtemplate <char ...c> struct TString { };и необходимые операторы пользовательских литералов так, чтобы компилировался код:constexpr auto hello = "hello"_s + " world"_s;static_assert(hello == "hello world"_s);2Обработка ошибок.(10) Для функции swap напишите static_assert, который проверяет, что операцииstd::move внутри реализации не сгенерируют исключений. Продемонстрируйтеслучай, когда программа не компилируется.template<typename T>void swap(T& a, T& b) {auto c = std::move(b);b = std::move(a);a = std::move(c);}(11) ? Определите класс TMyExcхeption, унаследовав его от одного из стандартныхисключений, определите в нем оператор << для записи в объект исключениясопровождающего текста при его генерации.
Породите из него несколько классовнаследников. Продемонстрируйте перехват исключений этого типа.3.