Группа Михайлова — различия между версиями

Материал из SEWiki
Перейти к: навигация, поиск
(C++11)
(Удалено содержимое страницы)
Строка 1: Строка 1:
=Правила жизни=
 
За успешную сдачу практической работы на паре, на которой она была задана студент получает 2 балла рейтинга.
 
За успешную сдачу на следующей паре - один балл.
 
На следующей паре первоначальное задание разбирается. И сдача такого задания оценивается уже в пол балла.
 
  
Проверка работ по электронной почте осуществляется только в экстренных случаях. (Болезнь, например).
 
 
Для получения зачета необходимо набрать некоторе количествоо баллов. Точное значение будет определено позже.
 
Те, кто их не набрал - будут выполнять дополнительные задания.
 
 
=Общее=
 
[https://docs.google.com/spreadsheet/ccc?key=0AhBJfSfjgJfGdEw1RlNXeWhlY1M0MGJacXQ1WXM0d2c&pli=1#gid=0 Результаты]
 
 
=Интересные ссылки=
 
[http://pages.cs.wisc.edu/~driscoll/typename.html O typename]
 
 
[http://habrahabr.ru/post/112953/ Об арифметике с плавающей запятой]
 
 
[http://herbsutter.com/2013/01/01/video-you-dont-know-const-and-mutable/ You don't know const and mutable]
 
 
[http://msdn.microsoft.com/en-us/library/e5ewb1h3(v=vs.80).aspx Memory leaks detection in Visual Studio]
 
 
=Осенний семестр=
 
==Компиляция==
 
 
Напишите псевдо код на основе ассемблерного кода в который разворачивается инструкция for:
 
for (int i = 0; i < N; ++i) {
 
//body
 
}
 
 
Пример псевдокода:
 
if (a == 5) goto mark1
 
something
 
mark1:
 
Чем плоха конструкция
 
  #define MAX(a, b) a > b ? a : b
 
Приведите пример ее некорректного использования. (Возврат не максимального значения, побочные эффекты)
 
Как можно ее улучшить?
 
 
Как работает линковка? Какую роль в ней играет relocation table
 
 
==Сортировка слиянием==
 
Реализуйте алгоритм merge sort
 
 
==Выделение памяти==
 
Создайте двумерный массив двумя способами.
 
1) Используя N + 1 аллокацию
 
2) Используя 2 аллокации
 
Замерьте, при каких значениях размера массива происходит экстерминатус? (Компилируйте 32 разрядную версию. 64 может и не упасть)
 
Какой вариант работает быстрее?
 
Подумайте, почему это происходит.
 
Обращаю внимание, что оба варианта созданных матриц должны иметь тип int**
 
 
Усложненное задание - сделать матрицы трегольными и написать процедуру, сливающие 2 такие матрицы в прямоугольную
 
 
==Расширяющийся массив==
 
Реализуйте класс расширяющегося массива.
 
Size - количество элементов в массиве.
 
Capacity - вместимость массива.
 
Size <= Capacity
 
Если при добавлении очередного элемента Size превышает Capacity, то Capacity следует увеличить вдвое
 
struct Array {
 
  Array(size_t capacity = 3);
 
  Array(Array & array);
 
  ~Array();
 
  Array & operator=(Array & array);
 
  size_t Size();
 
  size_t Capacity();
 
  void Add(int value);
 
  int Get(size_t index);
 
  void Set(size_t index, int value);
 
  void Swap(Array & array);
 
  private:
 
  int* myData;
 
  size_t mySize;
 
  size_t myCapacity;
 
};
 
==Обертка над FILE==
 
==String==
 
Реализовать класс String со следующими методами/требованиями
 
String()
 
String(String &)
 
String(char *)
 
operator=(String &)
 
operator=(char *) //реализовывать не нужно. Объясните, почему?
 
append(String &)
 
char ? at(size_t) // реализовать в двух версиях. Константную и не константную
 
char * c_str() - возвращает обычную нуль-терминированную строку
 
 
Данные хранить как буффер для строки и ее размер. Строку хранить НЕ как нуль-терминированную.
 
В приведенном выше ключевое слово const не используется умышленно.
 
 
Дополнительное задание - реализовать строку с таким же интерфейсом, но реализующую стратегию Copy On Write (COW)
 
 
==Smart FILE==
 
==Rational==
 
Напишите класс работающий с рациональными числами и определите следующие операторы:
 
* ostream <<
 
* istream >>
 
* +=
 
* -=
 
* *=
 
* /=
 
* +
 
* - бинарный
 
* - унарный
 
* *
 
* /
 
* ++ префиксный
 
* ++ постфиксный
 
* -- префиксный
 
* -- постфиксный
 
* ==
 
* !=
 
* <
 
* >
 
* <=
 
* >=
 
 
==Smart pointers==
 
Реализовать шаблонный scoped_ptr
 
[http://www.boost.org/doc/libs/1_52_0/libs/smart_ptr/scoped_ptr.htm]
 
 
 
=Весенний семестр=
 
==Задание 1==
 
Реализовать алгоритм merge sort для сортировки произвольных контейнеров.
 
Специализировать алгоритм так, чтобы для некоторых контейнеров он работал эффективнее.
 
Например: list vs vector
 
 
==HashMap==
 
# HashMap<TKey, TValue, TTraits = SomeDefaultTraits<TKey>>, TKey - тип ключа, TValue - тип значения
 
# TTraits - некоторый тип, определяющий как именно будет вычисляться хеш-значение для ключа, а также сравнение с другими ключами. Реализация по-умолчанию должна уметь работать со всеми встроенными типами
 
# Для упрощения реализации количество ячеек в массиве можно считать константным
 
# Обязательные для реализации функции
 
## begin()/end() - функции, возвращающие итераторы начала/конца таблицы. Тип итерируемых элементов - std::pair<TKey, TValue>
 
## TValue & operator[](TKey) - оператор, возращающий значение по ключу. Если такого ключа в коллекции нет - он создается вместе со значением TValue по-умолчанию.
 
## iterator lower_bound(TKey) - возвращает итератор на искомый элемент. Если такого нет - возвращает итератор, равный end()
 
## iterator insert(std::pair<TKey, TValue>) - помещает пару ключ-значение в таблицу. Возвращает итератор на место, в которое элемент был вставлен. Если в таблице уже существует пара с таким же ключем - сгенерировать ошибку. Например, поделив на ноль =)
 
## void remove(TKey) - угадайте с трех раз
 
# Дополнительно
 
## Представляемая реализация должна работать с любыми примитивными типами "из коробки" т.е. без явного указания traits.
 
## Помимо примитивных типов, реализовать поддержку std::string и любого своего поля, хеш для когорого считается из более чем двух полей.
 
## Для вычисления хеша запрещается использовать готовые функции из std. (std::hash_value)
 
## Протестировать как минимум на следующем коде:
 
  HashMap<int, int> hm; 
 
  for (int i = 0; i < N; ++i) hm[i] = i;
 
  for (int i = 0; i < N; ++i) if (i != hm[i]) std::cout << ...; 
 
Где N в несколько (>=4) раз больше числа "бакетов".
 
==Iterator==
 
Реализовать итератор, "ходящий" по строке, пропуская цифры.
 
В частности код:
 
  std::string s = "aa44a";
 
  std::copy(magic1, magic2, std::ostreambuf_iterator<char>(std::cout));
 
Должен вывести на экран "aaa". (magic1&2 - это собственно способ задания итератора. Он остается на ваше усмотрение)
 
 
==Algorithms==
 
Реализовать на выбор любые 2 алгоритма из списка
 
  std::random_shuffle
 
  std::rotate
 
  std::reverse
 
 
==Указатели на функции==
 
Используя libexpat распарсить http://img.lenta.ru/r/EX/yandexfull.rss
 
Сгруппировать новости по категориям и вывести заголовки.
 
 
Дополнительное задание (1 балл максимум):
 
Реализовать std::ptr_fun и std::bind
 
 
==Исключения==
 
Реализовать класс квадратной матрицы. Уделить особое внимание обработке исключений (bad_alloc, out of range)
 
Методы
 
# Конструктор от одного аргумента - размер матрицы
 
# copy ctor/operator=/dtor
 
# operator[] реализованный так, чтобы было возможно использовать его как m[9][10]
 
При возникновении каких-либо проблем при конструировании объекта Matrix необходимо обработать эти проблемы и не допустить утечки памяти.
 
Используйте ручное управление памятью (new/delete)
 
Память под матрицу выделять "построчно"
 
 
==Гарантии безопасности исключений==
 
Реализовать ini-парсер. Пример работы с таким классом
 
  ini_parser parser("settings.ini");
 
  std::string key1 = parser.get_string("General", "Key1");
 
  int n = parser.get_int("General", "Key2"); // Если значение Key2 не может быть преобразовано к Int - сгенерировать исключение
 
  parser.set_int("NewSection", "Key1", n);
 
  parser.write("settings2.ini");
 
 
==RTTI==
 
Реализовать парадигму multiple dispatch
 
  Asteroid  ra1, ra2;
 
  Spaceship rs1, rs2;
 
  Object &a1 = ra1;
 
  Object &a2 = ra2;
 
  Object &s1 = rs1;
 
  Object &s2 = rs2;
 
  a1.CollideWith(a2);
 
  a1.CollideWith(s1);
 
  s1.CollideWith(s2);
 
  s1.CollideWith(a1);
 
Доп. задание: реализовать то же самое тремя различными способами.
 
 
==C++11==
 
Реализовать вектор, используя (осмысленно) как можно больше новых механизмов C++11 (делегирующие конструкторы, список инициализации, foreach, move semantics, auto и прочие)
 

Версия 14:08, 22 мая 2013