<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://mit.spbau.ru/sewiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=AM5800</id>
		<title>SEWiki - Вклад участника [ru]</title>
		<link rel="self" type="application/atom+xml" href="http://mit.spbau.ru/sewiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=AM5800"/>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php/%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/AM5800"/>
		<updated>2026-04-06T03:56:51Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.26.2</generator>

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

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

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=%D0%93%D1%80%D1%83%D0%BF%D0%BF%D0%B0_%D0%9C%D0%B8%D1%85%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%D0%B0&amp;diff=2469</id>
		<title>Группа Михайлова</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=%D0%93%D1%80%D1%83%D0%BF%D0%BF%D0%B0_%D0%9C%D0%B8%D1%85%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%D0%B0&amp;diff=2469"/>
				<updated>2013-05-22T11:08:00Z</updated>
		
		<summary type="html">&lt;p&gt;AM5800: Удалено содержимое страницы&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>AM5800</name></author>	</entry>

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

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

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

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

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

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

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=%D0%93%D1%80%D1%83%D0%BF%D0%BF%D0%B0_%D0%9C%D0%B8%D1%85%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%D0%B0&amp;diff=2282</id>
		<title>Группа Михайлова</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=%D0%93%D1%80%D1%83%D0%BF%D0%BF%D0%B0_%D0%9C%D0%B8%D1%85%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%D0%B0&amp;diff=2282"/>
				<updated>2013-03-27T05:40:24Z</updated>
		
		<summary type="html">&lt;p&gt;AM5800: /* Весенний семестр */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Правила жизни=&lt;br /&gt;
За успешную сдачу практической работы на паре, на которой она была задана студент получает 2 балла рейтинга.&lt;br /&gt;
За успешную сдачу на следующей паре - один балл.&lt;br /&gt;
На следующей паре первоначальное задание разбирается. И сдача такого задания оценивается уже в пол балла.&lt;br /&gt;
&lt;br /&gt;
Проверка работ по электронной почте осуществляется только в экстренных случаях. (Болезнь, например).&lt;br /&gt;
&lt;br /&gt;
Для получения зачета необходимо набрать некоторе количествоо баллов. Точное значение будет определено позже.&lt;br /&gt;
Те, кто их не набрал - будут выполнять дополнительные задания.&lt;br /&gt;
&lt;br /&gt;
=Общее=&lt;br /&gt;
[https://docs.google.com/spreadsheet/ccc?key=0AhBJfSfjgJfGdEw1RlNXeWhlY1M0MGJacXQ1WXM0d2c&amp;amp;pli=1#gid=0 Результаты]&lt;br /&gt;
&lt;br /&gt;
=Интересные ссылки=&lt;br /&gt;
[http://pages.cs.wisc.edu/~driscoll/typename.html O typename]&lt;br /&gt;
&lt;br /&gt;
[http://habrahabr.ru/post/112953/ Об арифметике с плавающей запятой]&lt;br /&gt;
&lt;br /&gt;
[http://herbsutter.com/2013/01/01/video-you-dont-know-const-and-mutable/ You don't know const and mutable]&lt;br /&gt;
&lt;br /&gt;
[http://msdn.microsoft.com/en-us/library/e5ewb1h3(v=vs.80).aspx Memory leaks detection in Visual Studio]&lt;br /&gt;
&lt;br /&gt;
=Осенний семестр=&lt;br /&gt;
==Компиляция==&lt;br /&gt;
&lt;br /&gt;
Напишите псевдо код на основе ассемблерного кода в который разворачивается инструкция for:&lt;br /&gt;
 for (int i = 0; i &amp;lt; N; ++i) {&lt;br /&gt;
 //body&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Пример псевдокода:&lt;br /&gt;
 if (a == 5) goto mark1&lt;br /&gt;
 something&lt;br /&gt;
 mark1:&lt;br /&gt;
Чем плоха конструкция&lt;br /&gt;
  #define MAX(a, b) a &amp;gt; b ? a : b&lt;br /&gt;
Приведите пример ее некорректного использования. (Возврат не максимального значения, побочные эффекты)&lt;br /&gt;
Как можно ее улучшить?&lt;br /&gt;
&lt;br /&gt;
Как работает линковка? Какую роль в ней играет relocation table&lt;br /&gt;
&lt;br /&gt;
==Сортировка слиянием==&lt;br /&gt;
Реализуйте алгоритм merge sort&lt;br /&gt;
&lt;br /&gt;
==Выделение памяти==&lt;br /&gt;
Создайте двумерный массив двумя способами.&lt;br /&gt;
1) Используя N + 1 аллокацию&lt;br /&gt;
2) Используя 2 аллокации&lt;br /&gt;
Замерьте, при каких значениях размера массива происходит экстерминатус? (Компилируйте 32 разрядную версию. 64 может и не упасть)&lt;br /&gt;
Какой вариант работает быстрее?&lt;br /&gt;
Подумайте, почему это происходит.&lt;br /&gt;
Обращаю внимание, что оба варианта созданных матриц должны иметь тип int**&lt;br /&gt;
&lt;br /&gt;
Усложненное задание - сделать матрицы трегольными и написать процедуру, сливающие 2 такие матрицы в прямоугольную&lt;br /&gt;
&lt;br /&gt;
==Расширяющийся массив==&lt;br /&gt;
Реализуйте класс расширяющегося массива.&lt;br /&gt;
Size - количество элементов в массиве.&lt;br /&gt;
Capacity - вместимость массива.&lt;br /&gt;
Size &amp;lt;= Capacity&lt;br /&gt;
Если при добавлении очередного элемента Size превышает Capacity, то Capacity следует увеличить вдвое&lt;br /&gt;
 struct Array {&lt;br /&gt;
   Array(size_t capacity = 3);&lt;br /&gt;
   Array(Array &amp;amp; array);&lt;br /&gt;
   ~Array();&lt;br /&gt;
   Array &amp;amp; operator=(Array &amp;amp; array);&lt;br /&gt;
   size_t Size();&lt;br /&gt;
   size_t Capacity();&lt;br /&gt;
   void Add(int value);&lt;br /&gt;
   int Get(size_t index);&lt;br /&gt;
   void Set(size_t index, int value);&lt;br /&gt;
   void Swap(Array &amp;amp; array);&lt;br /&gt;
  private:&lt;br /&gt;
   int* myData;&lt;br /&gt;
   size_t mySize;&lt;br /&gt;
   size_t myCapacity;&lt;br /&gt;
 };&lt;br /&gt;
==Обертка над FILE==&lt;br /&gt;
==String==&lt;br /&gt;
Реализовать класс String со следующими методами/требованиями&lt;br /&gt;
 String()&lt;br /&gt;
 String(String &amp;amp;)&lt;br /&gt;
 String(char *)&lt;br /&gt;
 operator=(String &amp;amp;)&lt;br /&gt;
 operator=(char *) //реализовывать не нужно. Объясните, почему?&lt;br /&gt;
 append(String &amp;amp;)&lt;br /&gt;
 char ? at(size_t) // реализовать в двух версиях. Константную и не константную&lt;br /&gt;
 char * c_str() - возвращает обычную нуль-терминированную строку&lt;br /&gt;
&lt;br /&gt;
Данные хранить как буффер для строки и ее размер. Строку хранить НЕ как нуль-терминированную.&lt;br /&gt;
В приведенном выше ключевое слово const не используется умышленно.&lt;br /&gt;
&lt;br /&gt;
Дополнительное задание - реализовать строку с таким же интерфейсом, но реализующую стратегию Copy On Write (COW)&lt;br /&gt;
&lt;br /&gt;
==Smart FILE==&lt;br /&gt;
==Rational==&lt;br /&gt;
Напишите класс работающий с рациональными числами и определите следующие операторы:&lt;br /&gt;
* ostream &amp;lt;&amp;lt;&lt;br /&gt;
* istream &amp;gt;&amp;gt;&lt;br /&gt;
* +=&lt;br /&gt;
* -=&lt;br /&gt;
* *=&lt;br /&gt;
* /=&lt;br /&gt;
* +&lt;br /&gt;
* - бинарный&lt;br /&gt;
* - унарный&lt;br /&gt;
* *&lt;br /&gt;
* /&lt;br /&gt;
* ++ префиксный&lt;br /&gt;
* ++ постфиксный&lt;br /&gt;
* -- префиксный&lt;br /&gt;
* -- постфиксный&lt;br /&gt;
* ==&lt;br /&gt;
* !=&lt;br /&gt;
* &amp;lt;&lt;br /&gt;
* &amp;gt;&lt;br /&gt;
* &amp;lt;=&lt;br /&gt;
* &amp;gt;=&lt;br /&gt;
&lt;br /&gt;
==Smart pointers==&lt;br /&gt;
Реализовать шаблонный scoped_ptr&lt;br /&gt;
[http://www.boost.org/doc/libs/1_52_0/libs/smart_ptr/scoped_ptr.htm]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Весенний семестр=&lt;br /&gt;
==Задание 1==&lt;br /&gt;
Реализовать алгоритм merge sort для сортировки произвольных контейнеров.&lt;br /&gt;
Специализировать алгоритм так, чтобы для некоторых контейнеров он работал эффективнее.&lt;br /&gt;
Например: list vs vector&lt;br /&gt;
&lt;br /&gt;
==HashMap==&lt;br /&gt;
# HashMap&amp;lt;TKey, TValue, TTraits = SomeDefaultTraits&amp;lt;TKey&amp;gt;&amp;gt;, TKey - тип ключа, TValue - тип значения&lt;br /&gt;
# TTraits - некоторый тип, определяющий как именно будет вычисляться хеш-значение для ключа, а также сравнение с другими ключами. Реализация по-умолчанию должна уметь работать со всеми встроенными типами&lt;br /&gt;
# Для упрощения реализации количество ячеек в массиве можно считать константным&lt;br /&gt;
# Обязательные для реализации функции&lt;br /&gt;
## begin()/end() - функции, возвращающие итераторы начала/конца таблицы. Тип итерируемых элементов - std::pair&amp;lt;TKey, TValue&amp;gt; &lt;br /&gt;
## TValue &amp;amp; operator[](TKey) - оператор, возращающий значение по ключу. Если такого ключа в коллекции нет - он создается вместе со значением TValue по-умолчанию.&lt;br /&gt;
## iterator lower_bound(TKey) - возвращает итератор на искомый элемент. Если такого нет - возвращает итератор, равный end()&lt;br /&gt;
## iterator insert(std::pair&amp;lt;TKey, TValue&amp;gt;) - помещает пару ключ-значение в таблицу. Возвращает итератор на место, в которое элемент был вставлен. Если в таблице уже существует пара с таким же ключем - сгенерировать ошибку. Например, поделив на ноль =)&lt;br /&gt;
## void remove(TKey) - угадайте с трех раз&lt;br /&gt;
# Дополнительно&lt;br /&gt;
## Представляемая реализация должна работать с любыми примитивными типами &amp;quot;из коробки&amp;quot; т.е. без явного указания traits.&lt;br /&gt;
## Помимо примитивных типов, реализовать поддержку std::string и любого своего поля, хеш для когорого считается из более чем двух полей.&lt;br /&gt;
## Для вычисления хеша запрещается использовать готовые функции из std. (std::hash_value)&lt;br /&gt;
## Протестировать как минимум на следующем коде: &lt;br /&gt;
  HashMap&amp;lt;int, int&amp;gt; hm;  &lt;br /&gt;
  for (int i = 0; i &amp;lt; N; ++i) hm[i] = i;&lt;br /&gt;
  for (int i = 0; i &amp;lt; N; ++i) if (i != hm[i]) std::cout &amp;lt;&amp;lt; ...;  &lt;br /&gt;
Где N в несколько (&amp;gt;=4) раз больше числа &amp;quot;бакетов&amp;quot;.&lt;br /&gt;
==Iterator==&lt;br /&gt;
Реализовать итератор, &amp;quot;ходящий&amp;quot; по строке, пропуская цифры. &lt;br /&gt;
В частности код:&lt;br /&gt;
  std::string s = &amp;quot;aa44a&amp;quot;;&lt;br /&gt;
  std::copy(magic1, magic2, std::ostreambuf_iterator&amp;lt;char&amp;gt;(std::cout));&lt;br /&gt;
Должен вывести на экран &amp;quot;aaa&amp;quot;. (magic1&amp;amp;2 - это собственно способ задания итератора. Он остается на ваше усмотрение)&lt;br /&gt;
&lt;br /&gt;
==Algorithms==&lt;br /&gt;
Реализовать на выбор любые 2 алгоритма из списка&lt;br /&gt;
  std::random_shuffle&lt;br /&gt;
  std::rotate&lt;br /&gt;
  std::reverse&lt;br /&gt;
&lt;br /&gt;
==Указатели на функции==&lt;br /&gt;
Используя libexpat распарсить http://img.lenta.ru/r/EX/yandexfull.rss&lt;br /&gt;
Сгруппировать новости по категориям и вывести заголовки.&lt;br /&gt;
&lt;br /&gt;
Дополнительное задание (1 балл максимум):&lt;br /&gt;
Реализовать std::ptr_fun и std::bind&lt;br /&gt;
&lt;br /&gt;
==Исключения==&lt;br /&gt;
Реализовать класс квадратной матрицы. Уделить особое внимание обработке исключений (bad_alloc, out of range)&lt;br /&gt;
Методы&lt;br /&gt;
# Конструктор от одного аргумента - размер матрицы&lt;br /&gt;
# copy ctor/operator=/dtor&lt;br /&gt;
# operator[] реализованный так, чтобы было возможно использовать его как m[9][10]&lt;br /&gt;
При возникновении каких-либо проблем при конструировании объекта Matrix необходимо обработать эти проблемы и не допустить утечки памяти.&lt;br /&gt;
Используйте ручное управление памятью (new/delete)&lt;br /&gt;
Память под матрицу выделять &amp;quot;построчно&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Гарантии безопасности исключений==&lt;br /&gt;
Реализовать ini-парсер. Пример работы с таким классом&lt;br /&gt;
  ini_parser parser(&amp;quot;settings.ini&amp;quot;);&lt;br /&gt;
  std::string key1 = parser.get_string(&amp;quot;General&amp;quot;, &amp;quot;Key1&amp;quot;);&lt;br /&gt;
  int n = parser.get_int(&amp;quot;General&amp;quot;, &amp;quot;Key2&amp;quot;); // Если значение Key2 не может быть преобразовано к Int - сгенерировать исключение&lt;br /&gt;
  parser.set_int(&amp;quot;NewSection&amp;quot;, &amp;quot;Key1&amp;quot;, n);&lt;br /&gt;
  parser.write(&amp;quot;settings2.ini&amp;quot;);&lt;/div&gt;</summary>
		<author><name>AM5800</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=%D0%93%D1%80%D1%83%D0%BF%D0%BF%D0%B0_%D0%9C%D0%B8%D1%85%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%D0%B0&amp;diff=2253</id>
		<title>Группа Михайлова</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=%D0%93%D1%80%D1%83%D0%BF%D0%BF%D0%B0_%D0%9C%D0%B8%D1%85%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%D0%B0&amp;diff=2253"/>
				<updated>2013-03-13T11:27:10Z</updated>
		
		<summary type="html">&lt;p&gt;AM5800: /* Исключения */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Правила жизни=&lt;br /&gt;
За успешную сдачу практической работы на паре, на которой она была задана студент получает 2 балла рейтинга.&lt;br /&gt;
За успешную сдачу на следующей паре - один балл.&lt;br /&gt;
На следующей паре первоначальное задание разбирается. И сдача такого задания оценивается уже в пол балла.&lt;br /&gt;
&lt;br /&gt;
Проверка работ по электронной почте осуществляется только в экстренных случаях. (Болезнь, например).&lt;br /&gt;
&lt;br /&gt;
Для получения зачета необходимо набрать некоторе количествоо баллов. Точное значение будет определено позже.&lt;br /&gt;
Те, кто их не набрал - будут выполнять дополнительные задания.&lt;br /&gt;
&lt;br /&gt;
=Общее=&lt;br /&gt;
[https://docs.google.com/spreadsheet/ccc?key=0AhBJfSfjgJfGdEw1RlNXeWhlY1M0MGJacXQ1WXM0d2c&amp;amp;pli=1#gid=0 Результаты]&lt;br /&gt;
&lt;br /&gt;
=Интересные ссылки=&lt;br /&gt;
[http://pages.cs.wisc.edu/~driscoll/typename.html O typename]&lt;br /&gt;
&lt;br /&gt;
[http://habrahabr.ru/post/112953/ Об арифметике с плавающей запятой]&lt;br /&gt;
&lt;br /&gt;
[http://herbsutter.com/2013/01/01/video-you-dont-know-const-and-mutable/ You don't know const and mutable]&lt;br /&gt;
&lt;br /&gt;
[http://msdn.microsoft.com/en-us/library/e5ewb1h3(v=vs.80).aspx Memory leaks detection in Visual Studio]&lt;br /&gt;
&lt;br /&gt;
=Осенний семестр=&lt;br /&gt;
==Компиляция==&lt;br /&gt;
&lt;br /&gt;
Напишите псевдо код на основе ассемблерного кода в который разворачивается инструкция for:&lt;br /&gt;
 for (int i = 0; i &amp;lt; N; ++i) {&lt;br /&gt;
 //body&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Пример псевдокода:&lt;br /&gt;
 if (a == 5) goto mark1&lt;br /&gt;
 something&lt;br /&gt;
 mark1:&lt;br /&gt;
Чем плоха конструкция&lt;br /&gt;
  #define MAX(a, b) a &amp;gt; b ? a : b&lt;br /&gt;
Приведите пример ее некорректного использования. (Возврат не максимального значения, побочные эффекты)&lt;br /&gt;
Как можно ее улучшить?&lt;br /&gt;
&lt;br /&gt;
Как работает линковка? Какую роль в ней играет relocation table&lt;br /&gt;
&lt;br /&gt;
==Сортировка слиянием==&lt;br /&gt;
Реализуйте алгоритм merge sort&lt;br /&gt;
&lt;br /&gt;
==Выделение памяти==&lt;br /&gt;
Создайте двумерный массив двумя способами.&lt;br /&gt;
1) Используя N + 1 аллокацию&lt;br /&gt;
2) Используя 2 аллокации&lt;br /&gt;
Замерьте, при каких значениях размера массива происходит экстерминатус? (Компилируйте 32 разрядную версию. 64 может и не упасть)&lt;br /&gt;
Какой вариант работает быстрее?&lt;br /&gt;
Подумайте, почему это происходит.&lt;br /&gt;
Обращаю внимание, что оба варианта созданных матриц должны иметь тип int**&lt;br /&gt;
&lt;br /&gt;
Усложненное задание - сделать матрицы трегольными и написать процедуру, сливающие 2 такие матрицы в прямоугольную&lt;br /&gt;
&lt;br /&gt;
==Расширяющийся массив==&lt;br /&gt;
Реализуйте класс расширяющегося массива.&lt;br /&gt;
Size - количество элементов в массиве.&lt;br /&gt;
Capacity - вместимость массива.&lt;br /&gt;
Size &amp;lt;= Capacity&lt;br /&gt;
Если при добавлении очередного элемента Size превышает Capacity, то Capacity следует увеличить вдвое&lt;br /&gt;
 struct Array {&lt;br /&gt;
   Array(size_t capacity = 3);&lt;br /&gt;
   Array(Array &amp;amp; array);&lt;br /&gt;
   ~Array();&lt;br /&gt;
   Array &amp;amp; operator=(Array &amp;amp; array);&lt;br /&gt;
   size_t Size();&lt;br /&gt;
   size_t Capacity();&lt;br /&gt;
   void Add(int value);&lt;br /&gt;
   int Get(size_t index);&lt;br /&gt;
   void Set(size_t index, int value);&lt;br /&gt;
   void Swap(Array &amp;amp; array);&lt;br /&gt;
  private:&lt;br /&gt;
   int* myData;&lt;br /&gt;
   size_t mySize;&lt;br /&gt;
   size_t myCapacity;&lt;br /&gt;
 };&lt;br /&gt;
==Обертка над FILE==&lt;br /&gt;
==String==&lt;br /&gt;
Реализовать класс String со следующими методами/требованиями&lt;br /&gt;
 String()&lt;br /&gt;
 String(String &amp;amp;)&lt;br /&gt;
 String(char *)&lt;br /&gt;
 operator=(String &amp;amp;)&lt;br /&gt;
 operator=(char *) //реализовывать не нужно. Объясните, почему?&lt;br /&gt;
 append(String &amp;amp;)&lt;br /&gt;
 char ? at(size_t) // реализовать в двух версиях. Константную и не константную&lt;br /&gt;
 char * c_str() - возвращает обычную нуль-терминированную строку&lt;br /&gt;
&lt;br /&gt;
Данные хранить как буффер для строки и ее размер. Строку хранить НЕ как нуль-терминированную.&lt;br /&gt;
В приведенном выше ключевое слово const не используется умышленно.&lt;br /&gt;
&lt;br /&gt;
Дополнительное задание - реализовать строку с таким же интерфейсом, но реализующую стратегию Copy On Write (COW)&lt;br /&gt;
&lt;br /&gt;
==Smart FILE==&lt;br /&gt;
==Rational==&lt;br /&gt;
Напишите класс работающий с рациональными числами и определите следующие операторы:&lt;br /&gt;
* ostream &amp;lt;&amp;lt;&lt;br /&gt;
* istream &amp;gt;&amp;gt;&lt;br /&gt;
* +=&lt;br /&gt;
* -=&lt;br /&gt;
* *=&lt;br /&gt;
* /=&lt;br /&gt;
* +&lt;br /&gt;
* - бинарный&lt;br /&gt;
* - унарный&lt;br /&gt;
* *&lt;br /&gt;
* /&lt;br /&gt;
* ++ префиксный&lt;br /&gt;
* ++ постфиксный&lt;br /&gt;
* -- префиксный&lt;br /&gt;
* -- постфиксный&lt;br /&gt;
* ==&lt;br /&gt;
* !=&lt;br /&gt;
* &amp;lt;&lt;br /&gt;
* &amp;gt;&lt;br /&gt;
* &amp;lt;=&lt;br /&gt;
* &amp;gt;=&lt;br /&gt;
&lt;br /&gt;
==Smart pointers==&lt;br /&gt;
Реализовать шаблонный scoped_ptr&lt;br /&gt;
[http://www.boost.org/doc/libs/1_52_0/libs/smart_ptr/scoped_ptr.htm]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Весенний семестр=&lt;br /&gt;
==Задание 1==&lt;br /&gt;
Реализовать алгоритм merge sort для сортировки произвольных контейнеров.&lt;br /&gt;
Специализировать алгоритм так, чтобы для некоторых контейнеров он работал эффективнее.&lt;br /&gt;
Например: list vs vector&lt;br /&gt;
&lt;br /&gt;
==HashMap==&lt;br /&gt;
# HashMap&amp;lt;TKey, TValue, TTraits = SomeDefaultTraits&amp;lt;TKey&amp;gt;&amp;gt;, TKey - тип ключа, TValue - тип значения&lt;br /&gt;
# TTraits - некоторый тип, определяющий как именно будет вычисляться хеш-значение для ключа, а также сравнение с другими ключами. Реализация по-умолчанию должна уметь работать со всеми встроенными типами&lt;br /&gt;
# Для упрощения реализации количество ячеек в массиве можно считать константным&lt;br /&gt;
# Обязательные для реализации функции&lt;br /&gt;
## begin()/end() - функции, возвращающие итераторы начала/конца таблицы. Тип итерируемых элементов - std::pair&amp;lt;TKey, TValue&amp;gt; &lt;br /&gt;
## TValue &amp;amp; operator[](TKey) - оператор, возращающий значение по ключу. Если такого ключа в коллекции нет - он создается вместе со значением TValue по-умолчанию.&lt;br /&gt;
## iterator lower_bound(TKey) - возвращает итератор на искомый элемент. Если такого нет - возвращает итератор, равный end()&lt;br /&gt;
## iterator insert(std::pair&amp;lt;TKey, TValue&amp;gt;) - помещает пару ключ-значение в таблицу. Возвращает итератор на место, в которое элемент был вставлен. Если в таблице уже существует пара с таким же ключем - сгенерировать ошибку. Например, поделив на ноль =)&lt;br /&gt;
## void remove(TKey) - угадайте с трех раз&lt;br /&gt;
# Дополнительно&lt;br /&gt;
## Представляемая реализация должна работать с любыми примитивными типами &amp;quot;из коробки&amp;quot; т.е. без явного указания traits.&lt;br /&gt;
## Помимо примитивных типов, реализовать поддержку std::string и любого своего поля, хеш для когорого считается из более чем двух полей.&lt;br /&gt;
## Для вычисления хеша запрещается использовать готовые функции из std. (std::hash_value)&lt;br /&gt;
## Протестировать как минимум на следующем коде: &lt;br /&gt;
  HashMap&amp;lt;int, int&amp;gt; hm;  &lt;br /&gt;
  for (int i = 0; i &amp;lt; N; ++i) hm[i] = i;&lt;br /&gt;
  for (int i = 0; i &amp;lt; N; ++i) if (i != hm[i]) std::cout &amp;lt;&amp;lt; ...;  &lt;br /&gt;
Где N в несколько (&amp;gt;=4) раз больше числа &amp;quot;бакетов&amp;quot;.&lt;br /&gt;
==Iterator==&lt;br /&gt;
Реализовать итератор, &amp;quot;ходящий&amp;quot; по строке, пропуская цифры. &lt;br /&gt;
В частности код:&lt;br /&gt;
  std::string s = &amp;quot;aa44a&amp;quot;;&lt;br /&gt;
  std::copy(magic1, magic2, std::ostreambuf_iterator&amp;lt;char&amp;gt;(std::cout));&lt;br /&gt;
Должен вывести на экран &amp;quot;aaa&amp;quot;. (magic1&amp;amp;2 - это собственно способ задания итератора. Он остается на ваше усмотрение)&lt;br /&gt;
&lt;br /&gt;
==Algorithms==&lt;br /&gt;
Реализовать на выбор любые 2 алгоритма из списка&lt;br /&gt;
  std::random_shuffle&lt;br /&gt;
  std::rotate&lt;br /&gt;
  std::reverse&lt;br /&gt;
&lt;br /&gt;
==Указатели на функции==&lt;br /&gt;
Используя libexpat распарсить http://img.lenta.ru/r/EX/yandexfull.rss&lt;br /&gt;
Сгруппировать новости по категориям и вывести заголовки.&lt;br /&gt;
&lt;br /&gt;
Дополнительное задание (1 балл максимум):&lt;br /&gt;
Реализовать std::ptr_fun и std::bind&lt;br /&gt;
&lt;br /&gt;
==Исключения==&lt;br /&gt;
Реализовать класс квадратной матрицы. Уделить особое внимание обработке исключений (bad_alloc, out of range)&lt;br /&gt;
Методы&lt;br /&gt;
# Конструктор от одного аргумента - размер матрицы&lt;br /&gt;
# copy ctor/operator=/dtor&lt;br /&gt;
# operator[] реализованный так, чтобы было возможно использовать его как m[9][10]&lt;br /&gt;
При возникновении каких-либо проблем при конструировании объекта Matrix необходимо обработать эти проблемы и не допустить утечки памяти.&lt;br /&gt;
Используйте ручное управление памятью (new/delete)&lt;br /&gt;
Память под матрицу выделять &amp;quot;построчно&amp;quot;&lt;/div&gt;</summary>
		<author><name>AM5800</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=%D0%93%D1%80%D1%83%D0%BF%D0%BF%D0%B0_%D0%9C%D0%B8%D1%85%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%D0%B0&amp;diff=2252</id>
		<title>Группа Михайлова</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=%D0%93%D1%80%D1%83%D0%BF%D0%BF%D0%B0_%D0%9C%D0%B8%D1%85%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%D0%B0&amp;diff=2252"/>
				<updated>2013-03-13T11:25:26Z</updated>
		
		<summary type="html">&lt;p&gt;AM5800: /* Исключения */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Правила жизни=&lt;br /&gt;
За успешную сдачу практической работы на паре, на которой она была задана студент получает 2 балла рейтинга.&lt;br /&gt;
За успешную сдачу на следующей паре - один балл.&lt;br /&gt;
На следующей паре первоначальное задание разбирается. И сдача такого задания оценивается уже в пол балла.&lt;br /&gt;
&lt;br /&gt;
Проверка работ по электронной почте осуществляется только в экстренных случаях. (Болезнь, например).&lt;br /&gt;
&lt;br /&gt;
Для получения зачета необходимо набрать некоторе количествоо баллов. Точное значение будет определено позже.&lt;br /&gt;
Те, кто их не набрал - будут выполнять дополнительные задания.&lt;br /&gt;
&lt;br /&gt;
=Общее=&lt;br /&gt;
[https://docs.google.com/spreadsheet/ccc?key=0AhBJfSfjgJfGdEw1RlNXeWhlY1M0MGJacXQ1WXM0d2c&amp;amp;pli=1#gid=0 Результаты]&lt;br /&gt;
&lt;br /&gt;
=Интересные ссылки=&lt;br /&gt;
[http://pages.cs.wisc.edu/~driscoll/typename.html O typename]&lt;br /&gt;
&lt;br /&gt;
[http://habrahabr.ru/post/112953/ Об арифметике с плавающей запятой]&lt;br /&gt;
&lt;br /&gt;
[http://herbsutter.com/2013/01/01/video-you-dont-know-const-and-mutable/ You don't know const and mutable]&lt;br /&gt;
&lt;br /&gt;
[http://msdn.microsoft.com/en-us/library/e5ewb1h3(v=vs.80).aspx Memory leaks detection in Visual Studio]&lt;br /&gt;
&lt;br /&gt;
=Осенний семестр=&lt;br /&gt;
==Компиляция==&lt;br /&gt;
&lt;br /&gt;
Напишите псевдо код на основе ассемблерного кода в который разворачивается инструкция for:&lt;br /&gt;
 for (int i = 0; i &amp;lt; N; ++i) {&lt;br /&gt;
 //body&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Пример псевдокода:&lt;br /&gt;
 if (a == 5) goto mark1&lt;br /&gt;
 something&lt;br /&gt;
 mark1:&lt;br /&gt;
Чем плоха конструкция&lt;br /&gt;
  #define MAX(a, b) a &amp;gt; b ? a : b&lt;br /&gt;
Приведите пример ее некорректного использования. (Возврат не максимального значения, побочные эффекты)&lt;br /&gt;
Как можно ее улучшить?&lt;br /&gt;
&lt;br /&gt;
Как работает линковка? Какую роль в ней играет relocation table&lt;br /&gt;
&lt;br /&gt;
==Сортировка слиянием==&lt;br /&gt;
Реализуйте алгоритм merge sort&lt;br /&gt;
&lt;br /&gt;
==Выделение памяти==&lt;br /&gt;
Создайте двумерный массив двумя способами.&lt;br /&gt;
1) Используя N + 1 аллокацию&lt;br /&gt;
2) Используя 2 аллокации&lt;br /&gt;
Замерьте, при каких значениях размера массива происходит экстерминатус? (Компилируйте 32 разрядную версию. 64 может и не упасть)&lt;br /&gt;
Какой вариант работает быстрее?&lt;br /&gt;
Подумайте, почему это происходит.&lt;br /&gt;
Обращаю внимание, что оба варианта созданных матриц должны иметь тип int**&lt;br /&gt;
&lt;br /&gt;
Усложненное задание - сделать матрицы трегольными и написать процедуру, сливающие 2 такие матрицы в прямоугольную&lt;br /&gt;
&lt;br /&gt;
==Расширяющийся массив==&lt;br /&gt;
Реализуйте класс расширяющегося массива.&lt;br /&gt;
Size - количество элементов в массиве.&lt;br /&gt;
Capacity - вместимость массива.&lt;br /&gt;
Size &amp;lt;= Capacity&lt;br /&gt;
Если при добавлении очередного элемента Size превышает Capacity, то Capacity следует увеличить вдвое&lt;br /&gt;
 struct Array {&lt;br /&gt;
   Array(size_t capacity = 3);&lt;br /&gt;
   Array(Array &amp;amp; array);&lt;br /&gt;
   ~Array();&lt;br /&gt;
   Array &amp;amp; operator=(Array &amp;amp; array);&lt;br /&gt;
   size_t Size();&lt;br /&gt;
   size_t Capacity();&lt;br /&gt;
   void Add(int value);&lt;br /&gt;
   int Get(size_t index);&lt;br /&gt;
   void Set(size_t index, int value);&lt;br /&gt;
   void Swap(Array &amp;amp; array);&lt;br /&gt;
  private:&lt;br /&gt;
   int* myData;&lt;br /&gt;
   size_t mySize;&lt;br /&gt;
   size_t myCapacity;&lt;br /&gt;
 };&lt;br /&gt;
==Обертка над FILE==&lt;br /&gt;
==String==&lt;br /&gt;
Реализовать класс String со следующими методами/требованиями&lt;br /&gt;
 String()&lt;br /&gt;
 String(String &amp;amp;)&lt;br /&gt;
 String(char *)&lt;br /&gt;
 operator=(String &amp;amp;)&lt;br /&gt;
 operator=(char *) //реализовывать не нужно. Объясните, почему?&lt;br /&gt;
 append(String &amp;amp;)&lt;br /&gt;
 char ? at(size_t) // реализовать в двух версиях. Константную и не константную&lt;br /&gt;
 char * c_str() - возвращает обычную нуль-терминированную строку&lt;br /&gt;
&lt;br /&gt;
Данные хранить как буффер для строки и ее размер. Строку хранить НЕ как нуль-терминированную.&lt;br /&gt;
В приведенном выше ключевое слово const не используется умышленно.&lt;br /&gt;
&lt;br /&gt;
Дополнительное задание - реализовать строку с таким же интерфейсом, но реализующую стратегию Copy On Write (COW)&lt;br /&gt;
&lt;br /&gt;
==Smart FILE==&lt;br /&gt;
==Rational==&lt;br /&gt;
Напишите класс работающий с рациональными числами и определите следующие операторы:&lt;br /&gt;
* ostream &amp;lt;&amp;lt;&lt;br /&gt;
* istream &amp;gt;&amp;gt;&lt;br /&gt;
* +=&lt;br /&gt;
* -=&lt;br /&gt;
* *=&lt;br /&gt;
* /=&lt;br /&gt;
* +&lt;br /&gt;
* - бинарный&lt;br /&gt;
* - унарный&lt;br /&gt;
* *&lt;br /&gt;
* /&lt;br /&gt;
* ++ префиксный&lt;br /&gt;
* ++ постфиксный&lt;br /&gt;
* -- префиксный&lt;br /&gt;
* -- постфиксный&lt;br /&gt;
* ==&lt;br /&gt;
* !=&lt;br /&gt;
* &amp;lt;&lt;br /&gt;
* &amp;gt;&lt;br /&gt;
* &amp;lt;=&lt;br /&gt;
* &amp;gt;=&lt;br /&gt;
&lt;br /&gt;
==Smart pointers==&lt;br /&gt;
Реализовать шаблонный scoped_ptr&lt;br /&gt;
[http://www.boost.org/doc/libs/1_52_0/libs/smart_ptr/scoped_ptr.htm]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Весенний семестр=&lt;br /&gt;
==Задание 1==&lt;br /&gt;
Реализовать алгоритм merge sort для сортировки произвольных контейнеров.&lt;br /&gt;
Специализировать алгоритм так, чтобы для некоторых контейнеров он работал эффективнее.&lt;br /&gt;
Например: list vs vector&lt;br /&gt;
&lt;br /&gt;
==HashMap==&lt;br /&gt;
# HashMap&amp;lt;TKey, TValue, TTraits = SomeDefaultTraits&amp;lt;TKey&amp;gt;&amp;gt;, TKey - тип ключа, TValue - тип значения&lt;br /&gt;
# TTraits - некоторый тип, определяющий как именно будет вычисляться хеш-значение для ключа, а также сравнение с другими ключами. Реализация по-умолчанию должна уметь работать со всеми встроенными типами&lt;br /&gt;
# Для упрощения реализации количество ячеек в массиве можно считать константным&lt;br /&gt;
# Обязательные для реализации функции&lt;br /&gt;
## begin()/end() - функции, возвращающие итераторы начала/конца таблицы. Тип итерируемых элементов - std::pair&amp;lt;TKey, TValue&amp;gt; &lt;br /&gt;
## TValue &amp;amp; operator[](TKey) - оператор, возращающий значение по ключу. Если такого ключа в коллекции нет - он создается вместе со значением TValue по-умолчанию.&lt;br /&gt;
## iterator lower_bound(TKey) - возвращает итератор на искомый элемент. Если такого нет - возвращает итератор, равный end()&lt;br /&gt;
## iterator insert(std::pair&amp;lt;TKey, TValue&amp;gt;) - помещает пару ключ-значение в таблицу. Возвращает итератор на место, в которое элемент был вставлен. Если в таблице уже существует пара с таким же ключем - сгенерировать ошибку. Например, поделив на ноль =)&lt;br /&gt;
## void remove(TKey) - угадайте с трех раз&lt;br /&gt;
# Дополнительно&lt;br /&gt;
## Представляемая реализация должна работать с любыми примитивными типами &amp;quot;из коробки&amp;quot; т.е. без явного указания traits.&lt;br /&gt;
## Помимо примитивных типов, реализовать поддержку std::string и любого своего поля, хеш для когорого считается из более чем двух полей.&lt;br /&gt;
## Для вычисления хеша запрещается использовать готовые функции из std. (std::hash_value)&lt;br /&gt;
## Протестировать как минимум на следующем коде: &lt;br /&gt;
  HashMap&amp;lt;int, int&amp;gt; hm;  &lt;br /&gt;
  for (int i = 0; i &amp;lt; N; ++i) hm[i] = i;&lt;br /&gt;
  for (int i = 0; i &amp;lt; N; ++i) if (i != hm[i]) std::cout &amp;lt;&amp;lt; ...;  &lt;br /&gt;
Где N в несколько (&amp;gt;=4) раз больше числа &amp;quot;бакетов&amp;quot;.&lt;br /&gt;
==Iterator==&lt;br /&gt;
Реализовать итератор, &amp;quot;ходящий&amp;quot; по строке, пропуская цифры. &lt;br /&gt;
В частности код:&lt;br /&gt;
  std::string s = &amp;quot;aa44a&amp;quot;;&lt;br /&gt;
  std::copy(magic1, magic2, std::ostreambuf_iterator&amp;lt;char&amp;gt;(std::cout));&lt;br /&gt;
Должен вывести на экран &amp;quot;aaa&amp;quot;. (magic1&amp;amp;2 - это собственно способ задания итератора. Он остается на ваше усмотрение)&lt;br /&gt;
&lt;br /&gt;
==Algorithms==&lt;br /&gt;
Реализовать на выбор любые 2 алгоритма из списка&lt;br /&gt;
  std::random_shuffle&lt;br /&gt;
  std::rotate&lt;br /&gt;
  std::reverse&lt;br /&gt;
&lt;br /&gt;
==Указатели на функции==&lt;br /&gt;
Используя libexpat распарсить http://img.lenta.ru/r/EX/yandexfull.rss&lt;br /&gt;
Сгруппировать новости по категориям и вывести заголовки.&lt;br /&gt;
&lt;br /&gt;
Дополнительное задание (1 балл максимум):&lt;br /&gt;
Реализовать std::ptr_fun и std::bind&lt;br /&gt;
&lt;br /&gt;
==Исключения==&lt;br /&gt;
Реализовать класс квадратной матрицы. Уделить особое внимание обработке исключений (bad_alloc, out of range)&lt;br /&gt;
Методы&lt;br /&gt;
# Конструктор от одного аргумента - размер матрицы&lt;br /&gt;
# copy ctor/operator=/dtor&lt;br /&gt;
# operator[] реализованный так, чтобы было возможно использовать его как m[9][10]&lt;br /&gt;
При возникновении каких-либо проблем при конструировании объекта Matrix необходимо обработать эти проблемы и не допустить утечки памяти.&lt;/div&gt;</summary>
		<author><name>AM5800</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=%D0%93%D1%80%D1%83%D0%BF%D0%BF%D0%B0_%D0%9C%D0%B8%D1%85%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%D0%B0&amp;diff=2251</id>
		<title>Группа Михайлова</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=%D0%93%D1%80%D1%83%D0%BF%D0%BF%D0%B0_%D0%9C%D0%B8%D1%85%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%D0%B0&amp;diff=2251"/>
				<updated>2013-03-13T11:24:49Z</updated>
		
		<summary type="html">&lt;p&gt;AM5800: /* Весенний семестр */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Правила жизни=&lt;br /&gt;
За успешную сдачу практической работы на паре, на которой она была задана студент получает 2 балла рейтинга.&lt;br /&gt;
За успешную сдачу на следующей паре - один балл.&lt;br /&gt;
На следующей паре первоначальное задание разбирается. И сдача такого задания оценивается уже в пол балла.&lt;br /&gt;
&lt;br /&gt;
Проверка работ по электронной почте осуществляется только в экстренных случаях. (Болезнь, например).&lt;br /&gt;
&lt;br /&gt;
Для получения зачета необходимо набрать некоторе количествоо баллов. Точное значение будет определено позже.&lt;br /&gt;
Те, кто их не набрал - будут выполнять дополнительные задания.&lt;br /&gt;
&lt;br /&gt;
=Общее=&lt;br /&gt;
[https://docs.google.com/spreadsheet/ccc?key=0AhBJfSfjgJfGdEw1RlNXeWhlY1M0MGJacXQ1WXM0d2c&amp;amp;pli=1#gid=0 Результаты]&lt;br /&gt;
&lt;br /&gt;
=Интересные ссылки=&lt;br /&gt;
[http://pages.cs.wisc.edu/~driscoll/typename.html O typename]&lt;br /&gt;
&lt;br /&gt;
[http://habrahabr.ru/post/112953/ Об арифметике с плавающей запятой]&lt;br /&gt;
&lt;br /&gt;
[http://herbsutter.com/2013/01/01/video-you-dont-know-const-and-mutable/ You don't know const and mutable]&lt;br /&gt;
&lt;br /&gt;
[http://msdn.microsoft.com/en-us/library/e5ewb1h3(v=vs.80).aspx Memory leaks detection in Visual Studio]&lt;br /&gt;
&lt;br /&gt;
=Осенний семестр=&lt;br /&gt;
==Компиляция==&lt;br /&gt;
&lt;br /&gt;
Напишите псевдо код на основе ассемблерного кода в который разворачивается инструкция for:&lt;br /&gt;
 for (int i = 0; i &amp;lt; N; ++i) {&lt;br /&gt;
 //body&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Пример псевдокода:&lt;br /&gt;
 if (a == 5) goto mark1&lt;br /&gt;
 something&lt;br /&gt;
 mark1:&lt;br /&gt;
Чем плоха конструкция&lt;br /&gt;
  #define MAX(a, b) a &amp;gt; b ? a : b&lt;br /&gt;
Приведите пример ее некорректного использования. (Возврат не максимального значения, побочные эффекты)&lt;br /&gt;
Как можно ее улучшить?&lt;br /&gt;
&lt;br /&gt;
Как работает линковка? Какую роль в ней играет relocation table&lt;br /&gt;
&lt;br /&gt;
==Сортировка слиянием==&lt;br /&gt;
Реализуйте алгоритм merge sort&lt;br /&gt;
&lt;br /&gt;
==Выделение памяти==&lt;br /&gt;
Создайте двумерный массив двумя способами.&lt;br /&gt;
1) Используя N + 1 аллокацию&lt;br /&gt;
2) Используя 2 аллокации&lt;br /&gt;
Замерьте, при каких значениях размера массива происходит экстерминатус? (Компилируйте 32 разрядную версию. 64 может и не упасть)&lt;br /&gt;
Какой вариант работает быстрее?&lt;br /&gt;
Подумайте, почему это происходит.&lt;br /&gt;
Обращаю внимание, что оба варианта созданных матриц должны иметь тип int**&lt;br /&gt;
&lt;br /&gt;
Усложненное задание - сделать матрицы трегольными и написать процедуру, сливающие 2 такие матрицы в прямоугольную&lt;br /&gt;
&lt;br /&gt;
==Расширяющийся массив==&lt;br /&gt;
Реализуйте класс расширяющегося массива.&lt;br /&gt;
Size - количество элементов в массиве.&lt;br /&gt;
Capacity - вместимость массива.&lt;br /&gt;
Size &amp;lt;= Capacity&lt;br /&gt;
Если при добавлении очередного элемента Size превышает Capacity, то Capacity следует увеличить вдвое&lt;br /&gt;
 struct Array {&lt;br /&gt;
   Array(size_t capacity = 3);&lt;br /&gt;
   Array(Array &amp;amp; array);&lt;br /&gt;
   ~Array();&lt;br /&gt;
   Array &amp;amp; operator=(Array &amp;amp; array);&lt;br /&gt;
   size_t Size();&lt;br /&gt;
   size_t Capacity();&lt;br /&gt;
   void Add(int value);&lt;br /&gt;
   int Get(size_t index);&lt;br /&gt;
   void Set(size_t index, int value);&lt;br /&gt;
   void Swap(Array &amp;amp; array);&lt;br /&gt;
  private:&lt;br /&gt;
   int* myData;&lt;br /&gt;
   size_t mySize;&lt;br /&gt;
   size_t myCapacity;&lt;br /&gt;
 };&lt;br /&gt;
==Обертка над FILE==&lt;br /&gt;
==String==&lt;br /&gt;
Реализовать класс String со следующими методами/требованиями&lt;br /&gt;
 String()&lt;br /&gt;
 String(String &amp;amp;)&lt;br /&gt;
 String(char *)&lt;br /&gt;
 operator=(String &amp;amp;)&lt;br /&gt;
 operator=(char *) //реализовывать не нужно. Объясните, почему?&lt;br /&gt;
 append(String &amp;amp;)&lt;br /&gt;
 char ? at(size_t) // реализовать в двух версиях. Константную и не константную&lt;br /&gt;
 char * c_str() - возвращает обычную нуль-терминированную строку&lt;br /&gt;
&lt;br /&gt;
Данные хранить как буффер для строки и ее размер. Строку хранить НЕ как нуль-терминированную.&lt;br /&gt;
В приведенном выше ключевое слово const не используется умышленно.&lt;br /&gt;
&lt;br /&gt;
Дополнительное задание - реализовать строку с таким же интерфейсом, но реализующую стратегию Copy On Write (COW)&lt;br /&gt;
&lt;br /&gt;
==Smart FILE==&lt;br /&gt;
==Rational==&lt;br /&gt;
Напишите класс работающий с рациональными числами и определите следующие операторы:&lt;br /&gt;
* ostream &amp;lt;&amp;lt;&lt;br /&gt;
* istream &amp;gt;&amp;gt;&lt;br /&gt;
* +=&lt;br /&gt;
* -=&lt;br /&gt;
* *=&lt;br /&gt;
* /=&lt;br /&gt;
* +&lt;br /&gt;
* - бинарный&lt;br /&gt;
* - унарный&lt;br /&gt;
* *&lt;br /&gt;
* /&lt;br /&gt;
* ++ префиксный&lt;br /&gt;
* ++ постфиксный&lt;br /&gt;
* -- префиксный&lt;br /&gt;
* -- постфиксный&lt;br /&gt;
* ==&lt;br /&gt;
* !=&lt;br /&gt;
* &amp;lt;&lt;br /&gt;
* &amp;gt;&lt;br /&gt;
* &amp;lt;=&lt;br /&gt;
* &amp;gt;=&lt;br /&gt;
&lt;br /&gt;
==Smart pointers==&lt;br /&gt;
Реализовать шаблонный scoped_ptr&lt;br /&gt;
[http://www.boost.org/doc/libs/1_52_0/libs/smart_ptr/scoped_ptr.htm]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Весенний семестр=&lt;br /&gt;
==Задание 1==&lt;br /&gt;
Реализовать алгоритм merge sort для сортировки произвольных контейнеров.&lt;br /&gt;
Специализировать алгоритм так, чтобы для некоторых контейнеров он работал эффективнее.&lt;br /&gt;
Например: list vs vector&lt;br /&gt;
&lt;br /&gt;
==HashMap==&lt;br /&gt;
# HashMap&amp;lt;TKey, TValue, TTraits = SomeDefaultTraits&amp;lt;TKey&amp;gt;&amp;gt;, TKey - тип ключа, TValue - тип значения&lt;br /&gt;
# TTraits - некоторый тип, определяющий как именно будет вычисляться хеш-значение для ключа, а также сравнение с другими ключами. Реализация по-умолчанию должна уметь работать со всеми встроенными типами&lt;br /&gt;
# Для упрощения реализации количество ячеек в массиве можно считать константным&lt;br /&gt;
# Обязательные для реализации функции&lt;br /&gt;
## begin()/end() - функции, возвращающие итераторы начала/конца таблицы. Тип итерируемых элементов - std::pair&amp;lt;TKey, TValue&amp;gt; &lt;br /&gt;
## TValue &amp;amp; operator[](TKey) - оператор, возращающий значение по ключу. Если такого ключа в коллекции нет - он создается вместе со значением TValue по-умолчанию.&lt;br /&gt;
## iterator lower_bound(TKey) - возвращает итератор на искомый элемент. Если такого нет - возвращает итератор, равный end()&lt;br /&gt;
## iterator insert(std::pair&amp;lt;TKey, TValue&amp;gt;) - помещает пару ключ-значение в таблицу. Возвращает итератор на место, в которое элемент был вставлен. Если в таблице уже существует пара с таким же ключем - сгенерировать ошибку. Например, поделив на ноль =)&lt;br /&gt;
## void remove(TKey) - угадайте с трех раз&lt;br /&gt;
# Дополнительно&lt;br /&gt;
## Представляемая реализация должна работать с любыми примитивными типами &amp;quot;из коробки&amp;quot; т.е. без явного указания traits.&lt;br /&gt;
## Помимо примитивных типов, реализовать поддержку std::string и любого своего поля, хеш для когорого считается из более чем двух полей.&lt;br /&gt;
## Для вычисления хеша запрещается использовать готовые функции из std. (std::hash_value)&lt;br /&gt;
## Протестировать как минимум на следующем коде: &lt;br /&gt;
  HashMap&amp;lt;int, int&amp;gt; hm;  &lt;br /&gt;
  for (int i = 0; i &amp;lt; N; ++i) hm[i] = i;&lt;br /&gt;
  for (int i = 0; i &amp;lt; N; ++i) if (i != hm[i]) std::cout &amp;lt;&amp;lt; ...;  &lt;br /&gt;
Где N в несколько (&amp;gt;=4) раз больше числа &amp;quot;бакетов&amp;quot;.&lt;br /&gt;
==Iterator==&lt;br /&gt;
Реализовать итератор, &amp;quot;ходящий&amp;quot; по строке, пропуская цифры. &lt;br /&gt;
В частности код:&lt;br /&gt;
  std::string s = &amp;quot;aa44a&amp;quot;;&lt;br /&gt;
  std::copy(magic1, magic2, std::ostreambuf_iterator&amp;lt;char&amp;gt;(std::cout));&lt;br /&gt;
Должен вывести на экран &amp;quot;aaa&amp;quot;. (magic1&amp;amp;2 - это собственно способ задания итератора. Он остается на ваше усмотрение)&lt;br /&gt;
&lt;br /&gt;
==Algorithms==&lt;br /&gt;
Реализовать на выбор любые 2 алгоритма из списка&lt;br /&gt;
  std::random_shuffle&lt;br /&gt;
  std::rotate&lt;br /&gt;
  std::reverse&lt;br /&gt;
&lt;br /&gt;
==Указатели на функции==&lt;br /&gt;
Используя libexpat распарсить http://img.lenta.ru/r/EX/yandexfull.rss&lt;br /&gt;
Сгруппировать новости по категориям и вывести заголовки.&lt;br /&gt;
&lt;br /&gt;
Дополнительное задание (1 балл максимум):&lt;br /&gt;
Реализовать std::ptr_fun и std::bind&lt;br /&gt;
&lt;br /&gt;
==Исключения==&lt;br /&gt;
Реализовать класс квадратной матрицы. Уделить особое внимание обработке исключений (bad_alloc, out of range)&lt;br /&gt;
Методы&lt;br /&gt;
## Конструктор от одного аргумента - размер матрицы&lt;br /&gt;
## copy ctor/operator=/dtor&lt;br /&gt;
## operator[] реализованный так, чтобы было возможно использовать его как m[9][10]&lt;br /&gt;
При возникновении каких-либо проблем при конструировании объекта Matrix необходимо обработать эти проблемы и не допустить утечки памяти.&lt;/div&gt;</summary>
		<author><name>AM5800</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=%D0%93%D1%80%D1%83%D0%BF%D0%BF%D0%B0_%D0%9C%D0%B8%D1%85%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%D0%B0&amp;diff=2249</id>
		<title>Группа Михайлова</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=%D0%93%D1%80%D1%83%D0%BF%D0%BF%D0%B0_%D0%9C%D0%B8%D1%85%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%D0%B0&amp;diff=2249"/>
				<updated>2013-03-13T10:56:42Z</updated>
		
		<summary type="html">&lt;p&gt;AM5800: /* Интересные ссылки */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Правила жизни=&lt;br /&gt;
За успешную сдачу практической работы на паре, на которой она была задана студент получает 2 балла рейтинга.&lt;br /&gt;
За успешную сдачу на следующей паре - один балл.&lt;br /&gt;
На следующей паре первоначальное задание разбирается. И сдача такого задания оценивается уже в пол балла.&lt;br /&gt;
&lt;br /&gt;
Проверка работ по электронной почте осуществляется только в экстренных случаях. (Болезнь, например).&lt;br /&gt;
&lt;br /&gt;
Для получения зачета необходимо набрать некоторе количествоо баллов. Точное значение будет определено позже.&lt;br /&gt;
Те, кто их не набрал - будут выполнять дополнительные задания.&lt;br /&gt;
&lt;br /&gt;
=Общее=&lt;br /&gt;
[https://docs.google.com/spreadsheet/ccc?key=0AhBJfSfjgJfGdEw1RlNXeWhlY1M0MGJacXQ1WXM0d2c&amp;amp;pli=1#gid=0 Результаты]&lt;br /&gt;
&lt;br /&gt;
=Интересные ссылки=&lt;br /&gt;
[http://pages.cs.wisc.edu/~driscoll/typename.html O typename]&lt;br /&gt;
&lt;br /&gt;
[http://habrahabr.ru/post/112953/ Об арифметике с плавающей запятой]&lt;br /&gt;
&lt;br /&gt;
[http://herbsutter.com/2013/01/01/video-you-dont-know-const-and-mutable/ You don't know const and mutable]&lt;br /&gt;
&lt;br /&gt;
[http://msdn.microsoft.com/en-us/library/e5ewb1h3(v=vs.80).aspx Memory leaks detection in Visual Studio]&lt;br /&gt;
&lt;br /&gt;
=Осенний семестр=&lt;br /&gt;
==Компиляция==&lt;br /&gt;
&lt;br /&gt;
Напишите псевдо код на основе ассемблерного кода в который разворачивается инструкция for:&lt;br /&gt;
 for (int i = 0; i &amp;lt; N; ++i) {&lt;br /&gt;
 //body&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Пример псевдокода:&lt;br /&gt;
 if (a == 5) goto mark1&lt;br /&gt;
 something&lt;br /&gt;
 mark1:&lt;br /&gt;
Чем плоха конструкция&lt;br /&gt;
  #define MAX(a, b) a &amp;gt; b ? a : b&lt;br /&gt;
Приведите пример ее некорректного использования. (Возврат не максимального значения, побочные эффекты)&lt;br /&gt;
Как можно ее улучшить?&lt;br /&gt;
&lt;br /&gt;
Как работает линковка? Какую роль в ней играет relocation table&lt;br /&gt;
&lt;br /&gt;
==Сортировка слиянием==&lt;br /&gt;
Реализуйте алгоритм merge sort&lt;br /&gt;
&lt;br /&gt;
==Выделение памяти==&lt;br /&gt;
Создайте двумерный массив двумя способами.&lt;br /&gt;
1) Используя N + 1 аллокацию&lt;br /&gt;
2) Используя 2 аллокации&lt;br /&gt;
Замерьте, при каких значениях размера массива происходит экстерминатус? (Компилируйте 32 разрядную версию. 64 может и не упасть)&lt;br /&gt;
Какой вариант работает быстрее?&lt;br /&gt;
Подумайте, почему это происходит.&lt;br /&gt;
Обращаю внимание, что оба варианта созданных матриц должны иметь тип int**&lt;br /&gt;
&lt;br /&gt;
Усложненное задание - сделать матрицы трегольными и написать процедуру, сливающие 2 такие матрицы в прямоугольную&lt;br /&gt;
&lt;br /&gt;
==Расширяющийся массив==&lt;br /&gt;
Реализуйте класс расширяющегося массива.&lt;br /&gt;
Size - количество элементов в массиве.&lt;br /&gt;
Capacity - вместимость массива.&lt;br /&gt;
Size &amp;lt;= Capacity&lt;br /&gt;
Если при добавлении очередного элемента Size превышает Capacity, то Capacity следует увеличить вдвое&lt;br /&gt;
 struct Array {&lt;br /&gt;
   Array(size_t capacity = 3);&lt;br /&gt;
   Array(Array &amp;amp; array);&lt;br /&gt;
   ~Array();&lt;br /&gt;
   Array &amp;amp; operator=(Array &amp;amp; array);&lt;br /&gt;
   size_t Size();&lt;br /&gt;
   size_t Capacity();&lt;br /&gt;
   void Add(int value);&lt;br /&gt;
   int Get(size_t index);&lt;br /&gt;
   void Set(size_t index, int value);&lt;br /&gt;
   void Swap(Array &amp;amp; array);&lt;br /&gt;
  private:&lt;br /&gt;
   int* myData;&lt;br /&gt;
   size_t mySize;&lt;br /&gt;
   size_t myCapacity;&lt;br /&gt;
 };&lt;br /&gt;
==Обертка над FILE==&lt;br /&gt;
==String==&lt;br /&gt;
Реализовать класс String со следующими методами/требованиями&lt;br /&gt;
 String()&lt;br /&gt;
 String(String &amp;amp;)&lt;br /&gt;
 String(char *)&lt;br /&gt;
 operator=(String &amp;amp;)&lt;br /&gt;
 operator=(char *) //реализовывать не нужно. Объясните, почему?&lt;br /&gt;
 append(String &amp;amp;)&lt;br /&gt;
 char ? at(size_t) // реализовать в двух версиях. Константную и не константную&lt;br /&gt;
 char * c_str() - возвращает обычную нуль-терминированную строку&lt;br /&gt;
&lt;br /&gt;
Данные хранить как буффер для строки и ее размер. Строку хранить НЕ как нуль-терминированную.&lt;br /&gt;
В приведенном выше ключевое слово const не используется умышленно.&lt;br /&gt;
&lt;br /&gt;
Дополнительное задание - реализовать строку с таким же интерфейсом, но реализующую стратегию Copy On Write (COW)&lt;br /&gt;
&lt;br /&gt;
==Smart FILE==&lt;br /&gt;
==Rational==&lt;br /&gt;
Напишите класс работающий с рациональными числами и определите следующие операторы:&lt;br /&gt;
* ostream &amp;lt;&amp;lt;&lt;br /&gt;
* istream &amp;gt;&amp;gt;&lt;br /&gt;
* +=&lt;br /&gt;
* -=&lt;br /&gt;
* *=&lt;br /&gt;
* /=&lt;br /&gt;
* +&lt;br /&gt;
* - бинарный&lt;br /&gt;
* - унарный&lt;br /&gt;
* *&lt;br /&gt;
* /&lt;br /&gt;
* ++ префиксный&lt;br /&gt;
* ++ постфиксный&lt;br /&gt;
* -- префиксный&lt;br /&gt;
* -- постфиксный&lt;br /&gt;
* ==&lt;br /&gt;
* !=&lt;br /&gt;
* &amp;lt;&lt;br /&gt;
* &amp;gt;&lt;br /&gt;
* &amp;lt;=&lt;br /&gt;
* &amp;gt;=&lt;br /&gt;
&lt;br /&gt;
==Smart pointers==&lt;br /&gt;
Реализовать шаблонный scoped_ptr&lt;br /&gt;
[http://www.boost.org/doc/libs/1_52_0/libs/smart_ptr/scoped_ptr.htm]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Весенний семестр=&lt;br /&gt;
==Задание 1==&lt;br /&gt;
Реализовать алгоритм merge sort для сортировки произвольных контейнеров.&lt;br /&gt;
Специализировать алгоритм так, чтобы для некоторых контейнеров он работал эффективнее.&lt;br /&gt;
Например: list vs vector&lt;br /&gt;
&lt;br /&gt;
==HashMap==&lt;br /&gt;
# HashMap&amp;lt;TKey, TValue, TTraits = SomeDefaultTraits&amp;lt;TKey&amp;gt;&amp;gt;, TKey - тип ключа, TValue - тип значения&lt;br /&gt;
# TTraits - некоторый тип, определяющий как именно будет вычисляться хеш-значение для ключа, а также сравнение с другими ключами. Реализация по-умолчанию должна уметь работать со всеми встроенными типами&lt;br /&gt;
# Для упрощения реализации количество ячеек в массиве можно считать константным&lt;br /&gt;
# Обязательные для реализации функции&lt;br /&gt;
## begin()/end() - функции, возвращающие итераторы начала/конца таблицы. Тип итерируемых элементов - std::pair&amp;lt;TKey, TValue&amp;gt; &lt;br /&gt;
## TValue &amp;amp; operator[](TKey) - оператор, возращающий значение по ключу. Если такого ключа в коллекции нет - он создается вместе со значением TValue по-умолчанию.&lt;br /&gt;
## iterator lower_bound(TKey) - возвращает итератор на искомый элемент. Если такого нет - возвращает итератор, равный end()&lt;br /&gt;
## iterator insert(std::pair&amp;lt;TKey, TValue&amp;gt;) - помещает пару ключ-значение в таблицу. Возвращает итератор на место, в которое элемент был вставлен. Если в таблице уже существует пара с таким же ключем - сгенерировать ошибку. Например, поделив на ноль =)&lt;br /&gt;
## void remove(TKey) - угадайте с трех раз&lt;br /&gt;
# Дополнительно&lt;br /&gt;
## Представляемая реализация должна работать с любыми примитивными типами &amp;quot;из коробки&amp;quot; т.е. без явного указания traits.&lt;br /&gt;
## Помимо примитивных типов, реализовать поддержку std::string и любого своего поля, хеш для когорого считается из более чем двух полей.&lt;br /&gt;
## Для вычисления хеша запрещается использовать готовые функции из std. (std::hash_value)&lt;br /&gt;
## Протестировать как минимум на следующем коде: &lt;br /&gt;
  HashMap&amp;lt;int, int&amp;gt; hm;  &lt;br /&gt;
  for (int i = 0; i &amp;lt; N; ++i) hm[i] = i;&lt;br /&gt;
  for (int i = 0; i &amp;lt; N; ++i) if (i != hm[i]) std::cout &amp;lt;&amp;lt; ...;  &lt;br /&gt;
Где N в несколько (&amp;gt;=4) раз больше числа &amp;quot;бакетов&amp;quot;.&lt;br /&gt;
==Iterator==&lt;br /&gt;
Реализовать итератор, &amp;quot;ходящий&amp;quot; по строке, пропуская цифры. &lt;br /&gt;
В частности код:&lt;br /&gt;
  std::string s = &amp;quot;aa44a&amp;quot;;&lt;br /&gt;
  std::copy(magic1, magic2, std::ostreambuf_iterator&amp;lt;char&amp;gt;(std::cout));&lt;br /&gt;
Должен вывести на экран &amp;quot;aaa&amp;quot;. (magic1&amp;amp;2 - это собственно способ задания итератора. Он остается на ваше усмотрение)&lt;br /&gt;
&lt;br /&gt;
==Algorithms==&lt;br /&gt;
Реализовать на выбор любые 2 алгоритма из списка&lt;br /&gt;
  std::random_shuffle&lt;br /&gt;
  std::rotate&lt;br /&gt;
  std::reverse&lt;br /&gt;
&lt;br /&gt;
==Указатели на функции==&lt;br /&gt;
Используя libexpat распарсить http://img.lenta.ru/r/EX/yandexfull.rss&lt;br /&gt;
Сгруппировать новости по категориям и вывести заголовки.&lt;br /&gt;
&lt;br /&gt;
Дополнительное задание (1 балл максимум):&lt;br /&gt;
Реализовать std::ptr_fun и std::bind&lt;/div&gt;</summary>
		<author><name>AM5800</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=%D0%93%D1%80%D1%83%D0%BF%D0%BF%D0%B0_%D0%9C%D0%B8%D1%85%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%D0%B0&amp;diff=2247</id>
		<title>Группа Михайлова</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=%D0%93%D1%80%D1%83%D0%BF%D0%BF%D0%B0_%D0%9C%D0%B8%D1%85%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%D0%B0&amp;diff=2247"/>
				<updated>2013-03-13T08:10:12Z</updated>
		
		<summary type="html">&lt;p&gt;AM5800: /* Весенний семестр */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Правила жизни=&lt;br /&gt;
За успешную сдачу практической работы на паре, на которой она была задана студент получает 2 балла рейтинга.&lt;br /&gt;
За успешную сдачу на следующей паре - один балл.&lt;br /&gt;
На следующей паре первоначальное задание разбирается. И сдача такого задания оценивается уже в пол балла.&lt;br /&gt;
&lt;br /&gt;
Проверка работ по электронной почте осуществляется только в экстренных случаях. (Болезнь, например).&lt;br /&gt;
&lt;br /&gt;
Для получения зачета необходимо набрать некоторе количествоо баллов. Точное значение будет определено позже.&lt;br /&gt;
Те, кто их не набрал - будут выполнять дополнительные задания.&lt;br /&gt;
&lt;br /&gt;
=Общее=&lt;br /&gt;
[https://docs.google.com/spreadsheet/ccc?key=0AhBJfSfjgJfGdEw1RlNXeWhlY1M0MGJacXQ1WXM0d2c&amp;amp;pli=1#gid=0 Результаты]&lt;br /&gt;
&lt;br /&gt;
=Интересные ссылки=&lt;br /&gt;
[http://pages.cs.wisc.edu/~driscoll/typename.html O typename]&lt;br /&gt;
&lt;br /&gt;
[http://habrahabr.ru/post/112953/ Об арифметике с плавающей запятой]&lt;br /&gt;
&lt;br /&gt;
[http://herbsutter.com/2013/01/01/video-you-dont-know-const-and-mutable/ You don't know const and mutable]&lt;br /&gt;
&lt;br /&gt;
=Осенний семестр=&lt;br /&gt;
==Компиляция==&lt;br /&gt;
&lt;br /&gt;
Напишите псевдо код на основе ассемблерного кода в который разворачивается инструкция for:&lt;br /&gt;
 for (int i = 0; i &amp;lt; N; ++i) {&lt;br /&gt;
 //body&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Пример псевдокода:&lt;br /&gt;
 if (a == 5) goto mark1&lt;br /&gt;
 something&lt;br /&gt;
 mark1:&lt;br /&gt;
Чем плоха конструкция&lt;br /&gt;
  #define MAX(a, b) a &amp;gt; b ? a : b&lt;br /&gt;
Приведите пример ее некорректного использования. (Возврат не максимального значения, побочные эффекты)&lt;br /&gt;
Как можно ее улучшить?&lt;br /&gt;
&lt;br /&gt;
Как работает линковка? Какую роль в ней играет relocation table&lt;br /&gt;
&lt;br /&gt;
==Сортировка слиянием==&lt;br /&gt;
Реализуйте алгоритм merge sort&lt;br /&gt;
&lt;br /&gt;
==Выделение памяти==&lt;br /&gt;
Создайте двумерный массив двумя способами.&lt;br /&gt;
1) Используя N + 1 аллокацию&lt;br /&gt;
2) Используя 2 аллокации&lt;br /&gt;
Замерьте, при каких значениях размера массива происходит экстерминатус? (Компилируйте 32 разрядную версию. 64 может и не упасть)&lt;br /&gt;
Какой вариант работает быстрее?&lt;br /&gt;
Подумайте, почему это происходит.&lt;br /&gt;
Обращаю внимание, что оба варианта созданных матриц должны иметь тип int**&lt;br /&gt;
&lt;br /&gt;
Усложненное задание - сделать матрицы трегольными и написать процедуру, сливающие 2 такие матрицы в прямоугольную&lt;br /&gt;
&lt;br /&gt;
==Расширяющийся массив==&lt;br /&gt;
Реализуйте класс расширяющегося массива.&lt;br /&gt;
Size - количество элементов в массиве.&lt;br /&gt;
Capacity - вместимость массива.&lt;br /&gt;
Size &amp;lt;= Capacity&lt;br /&gt;
Если при добавлении очередного элемента Size превышает Capacity, то Capacity следует увеличить вдвое&lt;br /&gt;
 struct Array {&lt;br /&gt;
   Array(size_t capacity = 3);&lt;br /&gt;
   Array(Array &amp;amp; array);&lt;br /&gt;
   ~Array();&lt;br /&gt;
   Array &amp;amp; operator=(Array &amp;amp; array);&lt;br /&gt;
   size_t Size();&lt;br /&gt;
   size_t Capacity();&lt;br /&gt;
   void Add(int value);&lt;br /&gt;
   int Get(size_t index);&lt;br /&gt;
   void Set(size_t index, int value);&lt;br /&gt;
   void Swap(Array &amp;amp; array);&lt;br /&gt;
  private:&lt;br /&gt;
   int* myData;&lt;br /&gt;
   size_t mySize;&lt;br /&gt;
   size_t myCapacity;&lt;br /&gt;
 };&lt;br /&gt;
==Обертка над FILE==&lt;br /&gt;
==String==&lt;br /&gt;
Реализовать класс String со следующими методами/требованиями&lt;br /&gt;
 String()&lt;br /&gt;
 String(String &amp;amp;)&lt;br /&gt;
 String(char *)&lt;br /&gt;
 operator=(String &amp;amp;)&lt;br /&gt;
 operator=(char *) //реализовывать не нужно. Объясните, почему?&lt;br /&gt;
 append(String &amp;amp;)&lt;br /&gt;
 char ? at(size_t) // реализовать в двух версиях. Константную и не константную&lt;br /&gt;
 char * c_str() - возвращает обычную нуль-терминированную строку&lt;br /&gt;
&lt;br /&gt;
Данные хранить как буффер для строки и ее размер. Строку хранить НЕ как нуль-терминированную.&lt;br /&gt;
В приведенном выше ключевое слово const не используется умышленно.&lt;br /&gt;
&lt;br /&gt;
Дополнительное задание - реализовать строку с таким же интерфейсом, но реализующую стратегию Copy On Write (COW)&lt;br /&gt;
&lt;br /&gt;
==Smart FILE==&lt;br /&gt;
==Rational==&lt;br /&gt;
Напишите класс работающий с рациональными числами и определите следующие операторы:&lt;br /&gt;
* ostream &amp;lt;&amp;lt;&lt;br /&gt;
* istream &amp;gt;&amp;gt;&lt;br /&gt;
* +=&lt;br /&gt;
* -=&lt;br /&gt;
* *=&lt;br /&gt;
* /=&lt;br /&gt;
* +&lt;br /&gt;
* - бинарный&lt;br /&gt;
* - унарный&lt;br /&gt;
* *&lt;br /&gt;
* /&lt;br /&gt;
* ++ префиксный&lt;br /&gt;
* ++ постфиксный&lt;br /&gt;
* -- префиксный&lt;br /&gt;
* -- постфиксный&lt;br /&gt;
* ==&lt;br /&gt;
* !=&lt;br /&gt;
* &amp;lt;&lt;br /&gt;
* &amp;gt;&lt;br /&gt;
* &amp;lt;=&lt;br /&gt;
* &amp;gt;=&lt;br /&gt;
&lt;br /&gt;
==Smart pointers==&lt;br /&gt;
Реализовать шаблонный scoped_ptr&lt;br /&gt;
[http://www.boost.org/doc/libs/1_52_0/libs/smart_ptr/scoped_ptr.htm]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Весенний семестр=&lt;br /&gt;
==Задание 1==&lt;br /&gt;
Реализовать алгоритм merge sort для сортировки произвольных контейнеров.&lt;br /&gt;
Специализировать алгоритм так, чтобы для некоторых контейнеров он работал эффективнее.&lt;br /&gt;
Например: list vs vector&lt;br /&gt;
&lt;br /&gt;
==HashMap==&lt;br /&gt;
# HashMap&amp;lt;TKey, TValue, TTraits = SomeDefaultTraits&amp;lt;TKey&amp;gt;&amp;gt;, TKey - тип ключа, TValue - тип значения&lt;br /&gt;
# TTraits - некоторый тип, определяющий как именно будет вычисляться хеш-значение для ключа, а также сравнение с другими ключами. Реализация по-умолчанию должна уметь работать со всеми встроенными типами&lt;br /&gt;
# Для упрощения реализации количество ячеек в массиве можно считать константным&lt;br /&gt;
# Обязательные для реализации функции&lt;br /&gt;
## begin()/end() - функции, возвращающие итераторы начала/конца таблицы. Тип итерируемых элементов - std::pair&amp;lt;TKey, TValue&amp;gt; &lt;br /&gt;
## TValue &amp;amp; operator[](TKey) - оператор, возращающий значение по ключу. Если такого ключа в коллекции нет - он создается вместе со значением TValue по-умолчанию.&lt;br /&gt;
## iterator lower_bound(TKey) - возвращает итератор на искомый элемент. Если такого нет - возвращает итератор, равный end()&lt;br /&gt;
## iterator insert(std::pair&amp;lt;TKey, TValue&amp;gt;) - помещает пару ключ-значение в таблицу. Возвращает итератор на место, в которое элемент был вставлен. Если в таблице уже существует пара с таким же ключем - сгенерировать ошибку. Например, поделив на ноль =)&lt;br /&gt;
## void remove(TKey) - угадайте с трех раз&lt;br /&gt;
# Дополнительно&lt;br /&gt;
## Представляемая реализация должна работать с любыми примитивными типами &amp;quot;из коробки&amp;quot; т.е. без явного указания traits.&lt;br /&gt;
## Помимо примитивных типов, реализовать поддержку std::string и любого своего поля, хеш для когорого считается из более чем двух полей.&lt;br /&gt;
## Для вычисления хеша запрещается использовать готовые функции из std. (std::hash_value)&lt;br /&gt;
## Протестировать как минимум на следующем коде: &lt;br /&gt;
  HashMap&amp;lt;int, int&amp;gt; hm;  &lt;br /&gt;
  for (int i = 0; i &amp;lt; N; ++i) hm[i] = i;&lt;br /&gt;
  for (int i = 0; i &amp;lt; N; ++i) if (i != hm[i]) std::cout &amp;lt;&amp;lt; ...;  &lt;br /&gt;
Где N в несколько (&amp;gt;=4) раз больше числа &amp;quot;бакетов&amp;quot;.&lt;br /&gt;
==Iterator==&lt;br /&gt;
Реализовать итератор, &amp;quot;ходящий&amp;quot; по строке, пропуская цифры. &lt;br /&gt;
В частности код:&lt;br /&gt;
  std::string s = &amp;quot;aa44a&amp;quot;;&lt;br /&gt;
  std::copy(magic1, magic2, std::ostreambuf_iterator&amp;lt;char&amp;gt;(std::cout));&lt;br /&gt;
Должен вывести на экран &amp;quot;aaa&amp;quot;. (magic1&amp;amp;2 - это собственно способ задания итератора. Он остается на ваше усмотрение)&lt;br /&gt;
&lt;br /&gt;
==Algorithms==&lt;br /&gt;
Реализовать на выбор любые 2 алгоритма из списка&lt;br /&gt;
  std::random_shuffle&lt;br /&gt;
  std::rotate&lt;br /&gt;
  std::reverse&lt;br /&gt;
&lt;br /&gt;
==Указатели на функции==&lt;br /&gt;
Используя libexpat распарсить http://img.lenta.ru/r/EX/yandexfull.rss&lt;br /&gt;
Сгруппировать новости по категориям и вывести заголовки.&lt;br /&gt;
&lt;br /&gt;
Дополнительное задание (1 балл максимум):&lt;br /&gt;
Реализовать std::ptr_fun и std::bind&lt;/div&gt;</summary>
		<author><name>AM5800</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=%D0%93%D1%80%D1%83%D0%BF%D0%BF%D0%B0_%D0%9C%D0%B8%D1%85%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%D0%B0&amp;diff=2185</id>
		<title>Группа Михайлова</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=%D0%93%D1%80%D1%83%D0%BF%D0%BF%D0%B0_%D0%9C%D0%B8%D1%85%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%D0%B0&amp;diff=2185"/>
				<updated>2013-02-27T10:21:27Z</updated>
		
		<summary type="html">&lt;p&gt;AM5800: /* Весенний семестр */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Правила жизни=&lt;br /&gt;
За успешную сдачу практической работы на паре, на которой она была задана студент получает 2 балла рейтинга.&lt;br /&gt;
За успешную сдачу на следующей паре - один балл.&lt;br /&gt;
На следующей паре первоначальное задание разбирается. И сдача такого задания оценивается уже в пол балла.&lt;br /&gt;
&lt;br /&gt;
Проверка работ по электронной почте осуществляется только в экстренных случаях. (Болезнь, например).&lt;br /&gt;
&lt;br /&gt;
Для получения зачета необходимо набрать некоторе количествоо баллов. Точное значение будет определено позже.&lt;br /&gt;
Те, кто их не набрал - будут выполнять дополнительные задания.&lt;br /&gt;
&lt;br /&gt;
=Общее=&lt;br /&gt;
[https://docs.google.com/spreadsheet/ccc?key=0AhBJfSfjgJfGdEw1RlNXeWhlY1M0MGJacXQ1WXM0d2c&amp;amp;pli=1#gid=0 Результаты]&lt;br /&gt;
&lt;br /&gt;
=Интересные ссылки=&lt;br /&gt;
[http://pages.cs.wisc.edu/~driscoll/typename.html O typename]&lt;br /&gt;
&lt;br /&gt;
[http://habrahabr.ru/post/112953/ Об арифметике с плавающей запятой]&lt;br /&gt;
&lt;br /&gt;
[http://herbsutter.com/2013/01/01/video-you-dont-know-const-and-mutable/ You don't know const and mutable]&lt;br /&gt;
&lt;br /&gt;
=Осенний семестр=&lt;br /&gt;
==Компиляция==&lt;br /&gt;
&lt;br /&gt;
Напишите псевдо код на основе ассемблерного кода в который разворачивается инструкция for:&lt;br /&gt;
 for (int i = 0; i &amp;lt; N; ++i) {&lt;br /&gt;
 //body&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Пример псевдокода:&lt;br /&gt;
 if (a == 5) goto mark1&lt;br /&gt;
 something&lt;br /&gt;
 mark1:&lt;br /&gt;
Чем плоха конструкция&lt;br /&gt;
  #define MAX(a, b) a &amp;gt; b ? a : b&lt;br /&gt;
Приведите пример ее некорректного использования. (Возврат не максимального значения, побочные эффекты)&lt;br /&gt;
Как можно ее улучшить?&lt;br /&gt;
&lt;br /&gt;
Как работает линковка? Какую роль в ней играет relocation table&lt;br /&gt;
&lt;br /&gt;
==Сортировка слиянием==&lt;br /&gt;
Реализуйте алгоритм merge sort&lt;br /&gt;
&lt;br /&gt;
==Выделение памяти==&lt;br /&gt;
Создайте двумерный массив двумя способами.&lt;br /&gt;
1) Используя N + 1 аллокацию&lt;br /&gt;
2) Используя 2 аллокации&lt;br /&gt;
Замерьте, при каких значениях размера массива происходит экстерминатус? (Компилируйте 32 разрядную версию. 64 может и не упасть)&lt;br /&gt;
Какой вариант работает быстрее?&lt;br /&gt;
Подумайте, почему это происходит.&lt;br /&gt;
Обращаю внимание, что оба варианта созданных матриц должны иметь тип int**&lt;br /&gt;
&lt;br /&gt;
Усложненное задание - сделать матрицы трегольными и написать процедуру, сливающие 2 такие матрицы в прямоугольную&lt;br /&gt;
&lt;br /&gt;
==Расширяющийся массив==&lt;br /&gt;
Реализуйте класс расширяющегося массива.&lt;br /&gt;
Size - количество элементов в массиве.&lt;br /&gt;
Capacity - вместимость массива.&lt;br /&gt;
Size &amp;lt;= Capacity&lt;br /&gt;
Если при добавлении очередного элемента Size превышает Capacity, то Capacity следует увеличить вдвое&lt;br /&gt;
 struct Array {&lt;br /&gt;
   Array(size_t capacity = 3);&lt;br /&gt;
   Array(Array &amp;amp; array);&lt;br /&gt;
   ~Array();&lt;br /&gt;
   Array &amp;amp; operator=(Array &amp;amp; array);&lt;br /&gt;
   size_t Size();&lt;br /&gt;
   size_t Capacity();&lt;br /&gt;
   void Add(int value);&lt;br /&gt;
   int Get(size_t index);&lt;br /&gt;
   void Set(size_t index, int value);&lt;br /&gt;
   void Swap(Array &amp;amp; array);&lt;br /&gt;
  private:&lt;br /&gt;
   int* myData;&lt;br /&gt;
   size_t mySize;&lt;br /&gt;
   size_t myCapacity;&lt;br /&gt;
 };&lt;br /&gt;
==Обертка над FILE==&lt;br /&gt;
==String==&lt;br /&gt;
Реализовать класс String со следующими методами/требованиями&lt;br /&gt;
 String()&lt;br /&gt;
 String(String &amp;amp;)&lt;br /&gt;
 String(char *)&lt;br /&gt;
 operator=(String &amp;amp;)&lt;br /&gt;
 operator=(char *) //реализовывать не нужно. Объясните, почему?&lt;br /&gt;
 append(String &amp;amp;)&lt;br /&gt;
 char ? at(size_t) // реализовать в двух версиях. Константную и не константную&lt;br /&gt;
 char * c_str() - возвращает обычную нуль-терминированную строку&lt;br /&gt;
&lt;br /&gt;
Данные хранить как буффер для строки и ее размер. Строку хранить НЕ как нуль-терминированную.&lt;br /&gt;
В приведенном выше ключевое слово const не используется умышленно.&lt;br /&gt;
&lt;br /&gt;
Дополнительное задание - реализовать строку с таким же интерфейсом, но реализующую стратегию Copy On Write (COW)&lt;br /&gt;
&lt;br /&gt;
==Smart FILE==&lt;br /&gt;
==Rational==&lt;br /&gt;
Напишите класс работающий с рациональными числами и определите следующие операторы:&lt;br /&gt;
* ostream &amp;lt;&amp;lt;&lt;br /&gt;
* istream &amp;gt;&amp;gt;&lt;br /&gt;
* +=&lt;br /&gt;
* -=&lt;br /&gt;
* *=&lt;br /&gt;
* /=&lt;br /&gt;
* +&lt;br /&gt;
* - бинарный&lt;br /&gt;
* - унарный&lt;br /&gt;
* *&lt;br /&gt;
* /&lt;br /&gt;
* ++ префиксный&lt;br /&gt;
* ++ постфиксный&lt;br /&gt;
* -- префиксный&lt;br /&gt;
* -- постфиксный&lt;br /&gt;
* ==&lt;br /&gt;
* !=&lt;br /&gt;
* &amp;lt;&lt;br /&gt;
* &amp;gt;&lt;br /&gt;
* &amp;lt;=&lt;br /&gt;
* &amp;gt;=&lt;br /&gt;
&lt;br /&gt;
==Smart pointers==&lt;br /&gt;
Реализовать шаблонный scoped_ptr&lt;br /&gt;
[http://www.boost.org/doc/libs/1_52_0/libs/smart_ptr/scoped_ptr.htm]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Весенний семестр=&lt;br /&gt;
==Задание 1==&lt;br /&gt;
Реализовать алгоритм merge sort для сортировки произвольных контейнеров.&lt;br /&gt;
Специализировать алгоритм так, чтобы для некоторых контейнеров он работал эффективнее.&lt;br /&gt;
Например: list vs vector&lt;br /&gt;
&lt;br /&gt;
==HashMap==&lt;br /&gt;
# HashMap&amp;lt;TKey, TValue, TTraits = SomeDefaultTraits&amp;lt;TKey&amp;gt;&amp;gt;, TKey - тип ключа, TValue - тип значения&lt;br /&gt;
# TTraits - некоторый тип, определяющий как именно будет вычисляться хеш-значение для ключа, а также сравнение с другими ключами. Реализация по-умолчанию должна уметь работать со всеми встроенными типами&lt;br /&gt;
# Для упрощения реализации количество ячеек в массиве можно считать константным&lt;br /&gt;
# Обязательные для реализации функции&lt;br /&gt;
## begin()/end() - функции, возвращающие итераторы начала/конца таблицы. Тип итерируемых элементов - std::pair&amp;lt;TKey, TValue&amp;gt; &lt;br /&gt;
## TValue &amp;amp; operator[](TKey) - оператор, возращающий значение по ключу. Если такого ключа в коллекции нет - он создается вместе со значением TValue по-умолчанию.&lt;br /&gt;
## iterator lower_bound(TKey) - возвращает итератор на искомый элемент. Если такого нет - возвращает итератор, равный end()&lt;br /&gt;
## iterator insert(std::pair&amp;lt;TKey, TValue&amp;gt;) - помещает пару ключ-значение в таблицу. Возвращает итератор на место, в которое элемент был вставлен. Если в таблице уже существует пара с таким же ключем - сгенерировать ошибку. Например, поделив на ноль =)&lt;br /&gt;
## void remove(TKey) - угадайте с трех раз&lt;br /&gt;
# Дополнительно&lt;br /&gt;
## Представляемая реализация должна работать с любыми примитивными типами &amp;quot;из коробки&amp;quot; т.е. без явного указания traits.&lt;br /&gt;
## Помимо примитивных типов, реализовать поддержку std::string и любого своего поля, хеш для когорого считается из более чем двух полей.&lt;br /&gt;
## Для вычисления хеша запрещается использовать готовые функции из std. (std::hash_value)&lt;br /&gt;
## Протестировать как минимум на следующем коде: &lt;br /&gt;
  HashMap&amp;lt;int, int&amp;gt; hm;  &lt;br /&gt;
  for (int i = 0; i &amp;lt; N; ++i) hm[i] = i;&lt;br /&gt;
  for (int i = 0; i &amp;lt; N; ++i) if (i != hm[i]) std::cout &amp;lt;&amp;lt; ...;  &lt;br /&gt;
Где N в несколько (&amp;gt;=4) раз больше числа &amp;quot;бакетов&amp;quot;.&lt;br /&gt;
==Iterator==&lt;br /&gt;
Реализовать итератор, &amp;quot;ходящий&amp;quot; по строке, пропуская цифры. &lt;br /&gt;
В частности код:&lt;br /&gt;
  std::string s = &amp;quot;aa44a&amp;quot;;&lt;br /&gt;
  std::copy(magic1, magic2, std::ostreambuf_iterator&amp;lt;char&amp;gt;(std::cout));&lt;br /&gt;
Должен вывести на экран &amp;quot;aaa&amp;quot;. (magic1&amp;amp;2 - это собственно способ задания итератора. Он остается на ваше усмотрение)&lt;br /&gt;
&lt;br /&gt;
==Algorithms==&lt;br /&gt;
Реализовать на выбор любые 2 алгоритма из списка&lt;br /&gt;
  std::random_shuffle&lt;br /&gt;
  std::rotate&lt;br /&gt;
  std::reverse&lt;/div&gt;</summary>
		<author><name>AM5800</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=%D0%93%D1%80%D1%83%D0%BF%D0%BF%D0%B0_%D0%9C%D0%B8%D1%85%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%D0%B0&amp;diff=2181</id>
		<title>Группа Михайлова</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=%D0%93%D1%80%D1%83%D0%BF%D0%BF%D0%B0_%D0%9C%D0%B8%D1%85%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%D0%B0&amp;diff=2181"/>
				<updated>2013-02-26T17:44:20Z</updated>
		
		<summary type="html">&lt;p&gt;AM5800: /* Задание 1 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Правила жизни=&lt;br /&gt;
За успешную сдачу практической работы на паре, на которой она была задана студент получает 2 балла рейтинга.&lt;br /&gt;
За успешную сдачу на следующей паре - один балл.&lt;br /&gt;
На следующей паре первоначальное задание разбирается. И сдача такого задания оценивается уже в пол балла.&lt;br /&gt;
&lt;br /&gt;
Проверка работ по электронной почте осуществляется только в экстренных случаях. (Болезнь, например).&lt;br /&gt;
&lt;br /&gt;
Для получения зачета необходимо набрать некоторе количествоо баллов. Точное значение будет определено позже.&lt;br /&gt;
Те, кто их не набрал - будут выполнять дополнительные задания.&lt;br /&gt;
&lt;br /&gt;
=Общее=&lt;br /&gt;
[https://docs.google.com/spreadsheet/ccc?key=0AhBJfSfjgJfGdEw1RlNXeWhlY1M0MGJacXQ1WXM0d2c&amp;amp;pli=1#gid=0 Результаты]&lt;br /&gt;
&lt;br /&gt;
=Интересные ссылки=&lt;br /&gt;
[http://pages.cs.wisc.edu/~driscoll/typename.html O typename]&lt;br /&gt;
&lt;br /&gt;
[http://habrahabr.ru/post/112953/ Об арифметике с плавающей запятой]&lt;br /&gt;
&lt;br /&gt;
[http://herbsutter.com/2013/01/01/video-you-dont-know-const-and-mutable/ You don't know const and mutable]&lt;br /&gt;
&lt;br /&gt;
=Осенний семестр=&lt;br /&gt;
==Компиляция==&lt;br /&gt;
&lt;br /&gt;
Напишите псевдо код на основе ассемблерного кода в который разворачивается инструкция for:&lt;br /&gt;
 for (int i = 0; i &amp;lt; N; ++i) {&lt;br /&gt;
 //body&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Пример псевдокода:&lt;br /&gt;
 if (a == 5) goto mark1&lt;br /&gt;
 something&lt;br /&gt;
 mark1:&lt;br /&gt;
Чем плоха конструкция&lt;br /&gt;
  #define MAX(a, b) a &amp;gt; b ? a : b&lt;br /&gt;
Приведите пример ее некорректного использования. (Возврат не максимального значения, побочные эффекты)&lt;br /&gt;
Как можно ее улучшить?&lt;br /&gt;
&lt;br /&gt;
Как работает линковка? Какую роль в ней играет relocation table&lt;br /&gt;
&lt;br /&gt;
==Сортировка слиянием==&lt;br /&gt;
Реализуйте алгоритм merge sort&lt;br /&gt;
&lt;br /&gt;
==Выделение памяти==&lt;br /&gt;
Создайте двумерный массив двумя способами.&lt;br /&gt;
1) Используя N + 1 аллокацию&lt;br /&gt;
2) Используя 2 аллокации&lt;br /&gt;
Замерьте, при каких значениях размера массива происходит экстерминатус? (Компилируйте 32 разрядную версию. 64 может и не упасть)&lt;br /&gt;
Какой вариант работает быстрее?&lt;br /&gt;
Подумайте, почему это происходит.&lt;br /&gt;
Обращаю внимание, что оба варианта созданных матриц должны иметь тип int**&lt;br /&gt;
&lt;br /&gt;
Усложненное задание - сделать матрицы трегольными и написать процедуру, сливающие 2 такие матрицы в прямоугольную&lt;br /&gt;
&lt;br /&gt;
==Расширяющийся массив==&lt;br /&gt;
Реализуйте класс расширяющегося массива.&lt;br /&gt;
Size - количество элементов в массиве.&lt;br /&gt;
Capacity - вместимость массива.&lt;br /&gt;
Size &amp;lt;= Capacity&lt;br /&gt;
Если при добавлении очередного элемента Size превышает Capacity, то Capacity следует увеличить вдвое&lt;br /&gt;
 struct Array {&lt;br /&gt;
   Array(size_t capacity = 3);&lt;br /&gt;
   Array(Array &amp;amp; array);&lt;br /&gt;
   ~Array();&lt;br /&gt;
   Array &amp;amp; operator=(Array &amp;amp; array);&lt;br /&gt;
   size_t Size();&lt;br /&gt;
   size_t Capacity();&lt;br /&gt;
   void Add(int value);&lt;br /&gt;
   int Get(size_t index);&lt;br /&gt;
   void Set(size_t index, int value);&lt;br /&gt;
   void Swap(Array &amp;amp; array);&lt;br /&gt;
  private:&lt;br /&gt;
   int* myData;&lt;br /&gt;
   size_t mySize;&lt;br /&gt;
   size_t myCapacity;&lt;br /&gt;
 };&lt;br /&gt;
==Обертка над FILE==&lt;br /&gt;
==String==&lt;br /&gt;
Реализовать класс String со следующими методами/требованиями&lt;br /&gt;
 String()&lt;br /&gt;
 String(String &amp;amp;)&lt;br /&gt;
 String(char *)&lt;br /&gt;
 operator=(String &amp;amp;)&lt;br /&gt;
 operator=(char *) //реализовывать не нужно. Объясните, почему?&lt;br /&gt;
 append(String &amp;amp;)&lt;br /&gt;
 char ? at(size_t) // реализовать в двух версиях. Константную и не константную&lt;br /&gt;
 char * c_str() - возвращает обычную нуль-терминированную строку&lt;br /&gt;
&lt;br /&gt;
Данные хранить как буффер для строки и ее размер. Строку хранить НЕ как нуль-терминированную.&lt;br /&gt;
В приведенном выше ключевое слово const не используется умышленно.&lt;br /&gt;
&lt;br /&gt;
Дополнительное задание - реализовать строку с таким же интерфейсом, но реализующую стратегию Copy On Write (COW)&lt;br /&gt;
&lt;br /&gt;
==Smart FILE==&lt;br /&gt;
==Rational==&lt;br /&gt;
Напишите класс работающий с рациональными числами и определите следующие операторы:&lt;br /&gt;
* ostream &amp;lt;&amp;lt;&lt;br /&gt;
* istream &amp;gt;&amp;gt;&lt;br /&gt;
* +=&lt;br /&gt;
* -=&lt;br /&gt;
* *=&lt;br /&gt;
* /=&lt;br /&gt;
* +&lt;br /&gt;
* - бинарный&lt;br /&gt;
* - унарный&lt;br /&gt;
* *&lt;br /&gt;
* /&lt;br /&gt;
* ++ префиксный&lt;br /&gt;
* ++ постфиксный&lt;br /&gt;
* -- префиксный&lt;br /&gt;
* -- постфиксный&lt;br /&gt;
* ==&lt;br /&gt;
* !=&lt;br /&gt;
* &amp;lt;&lt;br /&gt;
* &amp;gt;&lt;br /&gt;
* &amp;lt;=&lt;br /&gt;
* &amp;gt;=&lt;br /&gt;
&lt;br /&gt;
==Smart pointers==&lt;br /&gt;
Реализовать шаблонный scoped_ptr&lt;br /&gt;
[http://www.boost.org/doc/libs/1_52_0/libs/smart_ptr/scoped_ptr.htm]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Весенний семестр=&lt;br /&gt;
==Задание 1==&lt;br /&gt;
Реализовать алгоритм merge sort для сортировки произвольных контейнеров.&lt;br /&gt;
Специализировать алгоритм так, чтобы для некоторых контейнеров он работал эффективнее.&lt;br /&gt;
Например: list vs vector&lt;br /&gt;
&lt;br /&gt;
==HashMap==&lt;br /&gt;
# HashMap&amp;lt;TKey, TValue, TTraits = SomeDefaultTraits&amp;lt;TKey&amp;gt;&amp;gt;, TKey - тип ключа, TValue - тип значения&lt;br /&gt;
# TTraits - некоторый тип, определяющий как именно будет вычисляться хеш-значение для ключа, а также сравнение с другими ключами. Реализация по-умолчанию должна уметь работать со всеми встроенными типами&lt;br /&gt;
# Для упрощения реализации количество ячеек в массиве можно считать константным&lt;br /&gt;
# Обязательные для реализации функции&lt;br /&gt;
## begin()/end() - функции, возвращающие итераторы начала/конца таблицы. Тип итерируемых элементов - std::pair&amp;lt;TKey, TValue&amp;gt; &lt;br /&gt;
## TValue &amp;amp; operator[](TKey) - оператор, возращающий значение по ключу. Если такого ключа в коллекции нет - он создается вместе со значением TValue по-умолчанию.&lt;br /&gt;
## iterator lower_bound(TKey) - возвращает итератор на искомый элемент. Если такого нет - возвращает итератор, равный end()&lt;br /&gt;
## iterator insert(std::pair&amp;lt;TKey, TValue&amp;gt;) - помещает пару ключ-значение в таблицу. Возвращает итератор на место, в которое элемент был вставлен. Если в таблице уже существует пара с таким же ключем - сгенерировать ошибку. Например, поделив на ноль =)&lt;br /&gt;
## void remove(TKey) - угадайте с трех раз&lt;br /&gt;
# Дополнительно&lt;br /&gt;
## Представляемая реализация должна работать с любыми примитивными типами &amp;quot;из коробки&amp;quot; т.е. без явного указания traits.&lt;br /&gt;
## Помимо примитивных типов, реализовать поддержку std::string и любого своего поля, хеш для когорого считается из более чем двух полей.&lt;br /&gt;
## Для вычисления хеша запрещается использовать готовые функции из std. (std::hash_value)&lt;br /&gt;
## Протестировать как минимум на следующем коде: &lt;br /&gt;
  HashMap&amp;lt;int, int&amp;gt; hm;  &lt;br /&gt;
  for (int i = 0; i &amp;lt; N; ++i) hm[i] = i;&lt;br /&gt;
  for (int i = 0; i &amp;lt; N; ++i) if (i != hm[i]) std::cout &amp;lt;&amp;lt; ...;  &lt;br /&gt;
Где N в несколько (&amp;gt;=4) раз больше числа &amp;quot;бакетов&amp;quot;.&lt;br /&gt;
==Iterator==&lt;br /&gt;
Реализовать итератор, &amp;quot;ходящий&amp;quot; по строке, пропуская цифры. &lt;br /&gt;
В частности код:&lt;br /&gt;
  std::string s = &amp;quot;aa44a&amp;quot;;&lt;br /&gt;
  std::copy(magic1, magic2, std::ostreambuf_iterator&amp;lt;char&amp;gt;(std::cout));&lt;br /&gt;
Должен вывести на экран &amp;quot;aaa&amp;quot;. (magic1&amp;amp;2 - это собственно способ задания итератора. Он остается на ваше усмотрение)&lt;/div&gt;</summary>
		<author><name>AM5800</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=%D0%93%D1%80%D1%83%D0%BF%D0%BF%D0%B0_%D0%9C%D0%B8%D1%85%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%D0%B0&amp;diff=2180</id>
		<title>Группа Михайлова</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=%D0%93%D1%80%D1%83%D0%BF%D0%BF%D0%B0_%D0%9C%D0%B8%D1%85%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%D0%B0&amp;diff=2180"/>
				<updated>2013-02-26T17:42:06Z</updated>
		
		<summary type="html">&lt;p&gt;AM5800: /* Весенний семестр */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Правила жизни=&lt;br /&gt;
За успешную сдачу практической работы на паре, на которой она была задана студент получает 2 балла рейтинга.&lt;br /&gt;
За успешную сдачу на следующей паре - один балл.&lt;br /&gt;
На следующей паре первоначальное задание разбирается. И сдача такого задания оценивается уже в пол балла.&lt;br /&gt;
&lt;br /&gt;
Проверка работ по электронной почте осуществляется только в экстренных случаях. (Болезнь, например).&lt;br /&gt;
&lt;br /&gt;
Для получения зачета необходимо набрать некоторе количествоо баллов. Точное значение будет определено позже.&lt;br /&gt;
Те, кто их не набрал - будут выполнять дополнительные задания.&lt;br /&gt;
&lt;br /&gt;
=Общее=&lt;br /&gt;
[https://docs.google.com/spreadsheet/ccc?key=0AhBJfSfjgJfGdEw1RlNXeWhlY1M0MGJacXQ1WXM0d2c&amp;amp;pli=1#gid=0 Результаты]&lt;br /&gt;
&lt;br /&gt;
=Интересные ссылки=&lt;br /&gt;
[http://pages.cs.wisc.edu/~driscoll/typename.html O typename]&lt;br /&gt;
&lt;br /&gt;
[http://habrahabr.ru/post/112953/ Об арифметике с плавающей запятой]&lt;br /&gt;
&lt;br /&gt;
[http://herbsutter.com/2013/01/01/video-you-dont-know-const-and-mutable/ You don't know const and mutable]&lt;br /&gt;
&lt;br /&gt;
=Осенний семестр=&lt;br /&gt;
==Компиляция==&lt;br /&gt;
&lt;br /&gt;
Напишите псевдо код на основе ассемблерного кода в который разворачивается инструкция for:&lt;br /&gt;
 for (int i = 0; i &amp;lt; N; ++i) {&lt;br /&gt;
 //body&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Пример псевдокода:&lt;br /&gt;
 if (a == 5) goto mark1&lt;br /&gt;
 something&lt;br /&gt;
 mark1:&lt;br /&gt;
Чем плоха конструкция&lt;br /&gt;
  #define MAX(a, b) a &amp;gt; b ? a : b&lt;br /&gt;
Приведите пример ее некорректного использования. (Возврат не максимального значения, побочные эффекты)&lt;br /&gt;
Как можно ее улучшить?&lt;br /&gt;
&lt;br /&gt;
Как работает линковка? Какую роль в ней играет relocation table&lt;br /&gt;
&lt;br /&gt;
==Сортировка слиянием==&lt;br /&gt;
Реализуйте алгоритм merge sort&lt;br /&gt;
&lt;br /&gt;
==Выделение памяти==&lt;br /&gt;
Создайте двумерный массив двумя способами.&lt;br /&gt;
1) Используя N + 1 аллокацию&lt;br /&gt;
2) Используя 2 аллокации&lt;br /&gt;
Замерьте, при каких значениях размера массива происходит экстерминатус? (Компилируйте 32 разрядную версию. 64 может и не упасть)&lt;br /&gt;
Какой вариант работает быстрее?&lt;br /&gt;
Подумайте, почему это происходит.&lt;br /&gt;
Обращаю внимание, что оба варианта созданных матриц должны иметь тип int**&lt;br /&gt;
&lt;br /&gt;
Усложненное задание - сделать матрицы трегольными и написать процедуру, сливающие 2 такие матрицы в прямоугольную&lt;br /&gt;
&lt;br /&gt;
==Расширяющийся массив==&lt;br /&gt;
Реализуйте класс расширяющегося массива.&lt;br /&gt;
Size - количество элементов в массиве.&lt;br /&gt;
Capacity - вместимость массива.&lt;br /&gt;
Size &amp;lt;= Capacity&lt;br /&gt;
Если при добавлении очередного элемента Size превышает Capacity, то Capacity следует увеличить вдвое&lt;br /&gt;
 struct Array {&lt;br /&gt;
   Array(size_t capacity = 3);&lt;br /&gt;
   Array(Array &amp;amp; array);&lt;br /&gt;
   ~Array();&lt;br /&gt;
   Array &amp;amp; operator=(Array &amp;amp; array);&lt;br /&gt;
   size_t Size();&lt;br /&gt;
   size_t Capacity();&lt;br /&gt;
   void Add(int value);&lt;br /&gt;
   int Get(size_t index);&lt;br /&gt;
   void Set(size_t index, int value);&lt;br /&gt;
   void Swap(Array &amp;amp; array);&lt;br /&gt;
  private:&lt;br /&gt;
   int* myData;&lt;br /&gt;
   size_t mySize;&lt;br /&gt;
   size_t myCapacity;&lt;br /&gt;
 };&lt;br /&gt;
==Обертка над FILE==&lt;br /&gt;
==String==&lt;br /&gt;
Реализовать класс String со следующими методами/требованиями&lt;br /&gt;
 String()&lt;br /&gt;
 String(String &amp;amp;)&lt;br /&gt;
 String(char *)&lt;br /&gt;
 operator=(String &amp;amp;)&lt;br /&gt;
 operator=(char *) //реализовывать не нужно. Объясните, почему?&lt;br /&gt;
 append(String &amp;amp;)&lt;br /&gt;
 char ? at(size_t) // реализовать в двух версиях. Константную и не константную&lt;br /&gt;
 char * c_str() - возвращает обычную нуль-терминированную строку&lt;br /&gt;
&lt;br /&gt;
Данные хранить как буффер для строки и ее размер. Строку хранить НЕ как нуль-терминированную.&lt;br /&gt;
В приведенном выше ключевое слово const не используется умышленно.&lt;br /&gt;
&lt;br /&gt;
Дополнительное задание - реализовать строку с таким же интерфейсом, но реализующую стратегию Copy On Write (COW)&lt;br /&gt;
&lt;br /&gt;
==Smart FILE==&lt;br /&gt;
==Rational==&lt;br /&gt;
Напишите класс работающий с рациональными числами и определите следующие операторы:&lt;br /&gt;
* ostream &amp;lt;&amp;lt;&lt;br /&gt;
* istream &amp;gt;&amp;gt;&lt;br /&gt;
* +=&lt;br /&gt;
* -=&lt;br /&gt;
* *=&lt;br /&gt;
* /=&lt;br /&gt;
* +&lt;br /&gt;
* - бинарный&lt;br /&gt;
* - унарный&lt;br /&gt;
* *&lt;br /&gt;
* /&lt;br /&gt;
* ++ префиксный&lt;br /&gt;
* ++ постфиксный&lt;br /&gt;
* -- префиксный&lt;br /&gt;
* -- постфиксный&lt;br /&gt;
* ==&lt;br /&gt;
* !=&lt;br /&gt;
* &amp;lt;&lt;br /&gt;
* &amp;gt;&lt;br /&gt;
* &amp;lt;=&lt;br /&gt;
* &amp;gt;=&lt;br /&gt;
&lt;br /&gt;
==Smart pointers==&lt;br /&gt;
Реализовать шаблонный scoped_ptr&lt;br /&gt;
[http://www.boost.org/doc/libs/1_52_0/libs/smart_ptr/scoped_ptr.htm]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Весенний семестр=&lt;br /&gt;
==Задание 1==&lt;br /&gt;
==HashMap==&lt;br /&gt;
# HashMap&amp;lt;TKey, TValue, TTraits = SomeDefaultTraits&amp;lt;TKey&amp;gt;&amp;gt;, TKey - тип ключа, TValue - тип значения&lt;br /&gt;
# TTraits - некоторый тип, определяющий как именно будет вычисляться хеш-значение для ключа, а также сравнение с другими ключами. Реализация по-умолчанию должна уметь работать со всеми встроенными типами&lt;br /&gt;
# Для упрощения реализации количество ячеек в массиве можно считать константным&lt;br /&gt;
# Обязательные для реализации функции&lt;br /&gt;
## begin()/end() - функции, возвращающие итераторы начала/конца таблицы. Тип итерируемых элементов - std::pair&amp;lt;TKey, TValue&amp;gt; &lt;br /&gt;
## TValue &amp;amp; operator[](TKey) - оператор, возращающий значение по ключу. Если такого ключа в коллекции нет - он создается вместе со значением TValue по-умолчанию.&lt;br /&gt;
## iterator lower_bound(TKey) - возвращает итератор на искомый элемент. Если такого нет - возвращает итератор, равный end()&lt;br /&gt;
## iterator insert(std::pair&amp;lt;TKey, TValue&amp;gt;) - помещает пару ключ-значение в таблицу. Возвращает итератор на место, в которое элемент был вставлен. Если в таблице уже существует пара с таким же ключем - сгенерировать ошибку. Например, поделив на ноль =)&lt;br /&gt;
## void remove(TKey) - угадайте с трех раз&lt;br /&gt;
# Дополнительно&lt;br /&gt;
## Представляемая реализация должна работать с любыми примитивными типами &amp;quot;из коробки&amp;quot; т.е. без явного указания traits.&lt;br /&gt;
## Помимо примитивных типов, реализовать поддержку std::string и любого своего поля, хеш для когорого считается из более чем двух полей.&lt;br /&gt;
## Для вычисления хеша запрещается использовать готовые функции из std. (std::hash_value)&lt;br /&gt;
## Протестировать как минимум на следующем коде: &lt;br /&gt;
  HashMap&amp;lt;int, int&amp;gt; hm;  &lt;br /&gt;
  for (int i = 0; i &amp;lt; N; ++i) hm[i] = i;&lt;br /&gt;
  for (int i = 0; i &amp;lt; N; ++i) if (i != hm[i]) std::cout &amp;lt;&amp;lt; ...;  &lt;br /&gt;
Где N в несколько (&amp;gt;=4) раз больше числа &amp;quot;бакетов&amp;quot;.&lt;br /&gt;
==Iterator==&lt;br /&gt;
Реализовать итератор, &amp;quot;ходящий&amp;quot; по строке, пропуская цифры. &lt;br /&gt;
В частности код:&lt;br /&gt;
  std::string s = &amp;quot;aa44a&amp;quot;;&lt;br /&gt;
  std::copy(magic1, magic2, std::ostreambuf_iterator&amp;lt;char&amp;gt;(std::cout));&lt;br /&gt;
Должен вывести на экран &amp;quot;aaa&amp;quot;. (magic1&amp;amp;2 - это собственно способ задания итератора. Он остается на ваше усмотрение)&lt;/div&gt;</summary>
		<author><name>AM5800</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=%D0%93%D1%80%D1%83%D0%BF%D0%BF%D0%B0_%D0%9C%D0%B8%D1%85%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%D0%B0&amp;diff=2171</id>
		<title>Группа Михайлова</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=%D0%93%D1%80%D1%83%D0%BF%D0%BF%D0%B0_%D0%9C%D0%B8%D1%85%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%D0%B0&amp;diff=2171"/>
				<updated>2013-02-20T10:50:52Z</updated>
		
		<summary type="html">&lt;p&gt;AM5800: /* Правила жизни */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Правила жизни=&lt;br /&gt;
За успешную сдачу практической работы на паре, на которой она была задана студент получает 2 балла рейтинга.&lt;br /&gt;
За успешную сдачу на следующей паре - один балл.&lt;br /&gt;
На следующей паре первоначальное задание разбирается. И сдача такого задания оценивается уже в пол балла.&lt;br /&gt;
&lt;br /&gt;
Проверка работ по электронной почте осуществляется только в экстренных случаях. (Болезнь, например).&lt;br /&gt;
&lt;br /&gt;
Для получения зачета необходимо набрать некоторе количествоо баллов. Точное значение будет определено позже.&lt;br /&gt;
Те, кто их не набрал - будут выполнять дополнительные задания.&lt;br /&gt;
&lt;br /&gt;
=Общее=&lt;br /&gt;
[https://docs.google.com/spreadsheet/ccc?key=0AhBJfSfjgJfGdEw1RlNXeWhlY1M0MGJacXQ1WXM0d2c&amp;amp;pli=1#gid=0 Результаты]&lt;br /&gt;
&lt;br /&gt;
=Интересные ссылки=&lt;br /&gt;
[http://pages.cs.wisc.edu/~driscoll/typename.html O typename]&lt;br /&gt;
&lt;br /&gt;
[http://habrahabr.ru/post/112953/ Об арифметике с плавающей запятой]&lt;br /&gt;
&lt;br /&gt;
[http://herbsutter.com/2013/01/01/video-you-dont-know-const-and-mutable/ You don't know const and mutable]&lt;br /&gt;
&lt;br /&gt;
=Осенний семестр=&lt;br /&gt;
==Компиляция==&lt;br /&gt;
&lt;br /&gt;
Напишите псевдо код на основе ассемблерного кода в который разворачивается инструкция for:&lt;br /&gt;
 for (int i = 0; i &amp;lt; N; ++i) {&lt;br /&gt;
 //body&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Пример псевдокода:&lt;br /&gt;
 if (a == 5) goto mark1&lt;br /&gt;
 something&lt;br /&gt;
 mark1:&lt;br /&gt;
Чем плоха конструкция&lt;br /&gt;
  #define MAX(a, b) a &amp;gt; b ? a : b&lt;br /&gt;
Приведите пример ее некорректного использования. (Возврат не максимального значения, побочные эффекты)&lt;br /&gt;
Как можно ее улучшить?&lt;br /&gt;
&lt;br /&gt;
Как работает линковка? Какую роль в ней играет relocation table&lt;br /&gt;
&lt;br /&gt;
==Сортировка слиянием==&lt;br /&gt;
Реализуйте алгоритм merge sort&lt;br /&gt;
&lt;br /&gt;
==Выделение памяти==&lt;br /&gt;
Создайте двумерный массив двумя способами.&lt;br /&gt;
1) Используя N + 1 аллокацию&lt;br /&gt;
2) Используя 2 аллокации&lt;br /&gt;
Замерьте, при каких значениях размера массива происходит экстерминатус? (Компилируйте 32 разрядную версию. 64 может и не упасть)&lt;br /&gt;
Какой вариант работает быстрее?&lt;br /&gt;
Подумайте, почему это происходит.&lt;br /&gt;
Обращаю внимание, что оба варианта созданных матриц должны иметь тип int**&lt;br /&gt;
&lt;br /&gt;
Усложненное задание - сделать матрицы трегольными и написать процедуру, сливающие 2 такие матрицы в прямоугольную&lt;br /&gt;
&lt;br /&gt;
==Расширяющийся массив==&lt;br /&gt;
Реализуйте класс расширяющегося массива.&lt;br /&gt;
Size - количество элементов в массиве.&lt;br /&gt;
Capacity - вместимость массива.&lt;br /&gt;
Size &amp;lt;= Capacity&lt;br /&gt;
Если при добавлении очередного элемента Size превышает Capacity, то Capacity следует увеличить вдвое&lt;br /&gt;
 struct Array {&lt;br /&gt;
   Array(size_t capacity = 3);&lt;br /&gt;
   Array(Array &amp;amp; array);&lt;br /&gt;
   ~Array();&lt;br /&gt;
   Array &amp;amp; operator=(Array &amp;amp; array);&lt;br /&gt;
   size_t Size();&lt;br /&gt;
   size_t Capacity();&lt;br /&gt;
   void Add(int value);&lt;br /&gt;
   int Get(size_t index);&lt;br /&gt;
   void Set(size_t index, int value);&lt;br /&gt;
   void Swap(Array &amp;amp; array);&lt;br /&gt;
  private:&lt;br /&gt;
   int* myData;&lt;br /&gt;
   size_t mySize;&lt;br /&gt;
   size_t myCapacity;&lt;br /&gt;
 };&lt;br /&gt;
==Обертка над FILE==&lt;br /&gt;
==String==&lt;br /&gt;
Реализовать класс String со следующими методами/требованиями&lt;br /&gt;
 String()&lt;br /&gt;
 String(String &amp;amp;)&lt;br /&gt;
 String(char *)&lt;br /&gt;
 operator=(String &amp;amp;)&lt;br /&gt;
 operator=(char *) //реализовывать не нужно. Объясните, почему?&lt;br /&gt;
 append(String &amp;amp;)&lt;br /&gt;
 char ? at(size_t) // реализовать в двух версиях. Константную и не константную&lt;br /&gt;
 char * c_str() - возвращает обычную нуль-терминированную строку&lt;br /&gt;
&lt;br /&gt;
Данные хранить как буффер для строки и ее размер. Строку хранить НЕ как нуль-терминированную.&lt;br /&gt;
В приведенном выше ключевое слово const не используется умышленно.&lt;br /&gt;
&lt;br /&gt;
Дополнительное задание - реализовать строку с таким же интерфейсом, но реализующую стратегию Copy On Write (COW)&lt;br /&gt;
&lt;br /&gt;
==Smart FILE==&lt;br /&gt;
==Rational==&lt;br /&gt;
Напишите класс работающий с рациональными числами и определите следующие операторы:&lt;br /&gt;
* ostream &amp;lt;&amp;lt;&lt;br /&gt;
* istream &amp;gt;&amp;gt;&lt;br /&gt;
* +=&lt;br /&gt;
* -=&lt;br /&gt;
* *=&lt;br /&gt;
* /=&lt;br /&gt;
* +&lt;br /&gt;
* - бинарный&lt;br /&gt;
* - унарный&lt;br /&gt;
* *&lt;br /&gt;
* /&lt;br /&gt;
* ++ префиксный&lt;br /&gt;
* ++ постфиксный&lt;br /&gt;
* -- префиксный&lt;br /&gt;
* -- постфиксный&lt;br /&gt;
* ==&lt;br /&gt;
* !=&lt;br /&gt;
* &amp;lt;&lt;br /&gt;
* &amp;gt;&lt;br /&gt;
* &amp;lt;=&lt;br /&gt;
* &amp;gt;=&lt;br /&gt;
&lt;br /&gt;
==Smart pointers==&lt;br /&gt;
Реализовать шаблонный scoped_ptr&lt;br /&gt;
[http://www.boost.org/doc/libs/1_52_0/libs/smart_ptr/scoped_ptr.htm]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Весенний семестр=&lt;br /&gt;
==Задание 1==&lt;br /&gt;
==HashMap==&lt;br /&gt;
# HashMap&amp;lt;TKey, TValue, TTraits = SomeDefaultTraits&amp;lt;TKey&amp;gt;&amp;gt;, TKey - тип ключа, TValue - тип значения&lt;br /&gt;
# TTraits - некоторый тип, определяющий как именно будет вычисляться хеш-значение для ключа, а также сравнение с другими ключами. Реализация по-умолчанию должна уметь работать со всеми встроенными типами&lt;br /&gt;
# Для упрощения реализации количество ячеек в массиве можно считать константным&lt;br /&gt;
# Обязательные для реализации функции&lt;br /&gt;
## begin()/end() - функции, возвращающие итераторы начала/конца таблицы. Тип итерируемых элементов - std::pair&amp;lt;TKey, TValue&amp;gt; &lt;br /&gt;
## TValue &amp;amp; operator[](TKey) - оператор, возращающий значение по ключу. Если такого ключа в коллекции нет - он создается вместе со значением TValue по-умолчанию.&lt;br /&gt;
## iterator lower_bound(TKey) - возвращает итератор на искомый элемент. Если такого нет - возвращает итератор, равный end()&lt;br /&gt;
## iterator insert(std::pair&amp;lt;TKey, TValue&amp;gt;) - помещает пару ключ-значение в таблицу. Возвращает итератор на место, в которое элемент был вставлен. Если в таблице уже существует пара с таким же ключем - сгенерировать ошибку. Например, поделив на ноль =)&lt;br /&gt;
## void remove(TKey) - угадайте с трех раз&lt;br /&gt;
# Дополнительно&lt;br /&gt;
## Представляемая реализация должна работать с любыми примитивными типами &amp;quot;из коробки&amp;quot; т.е. без явного указания traits.&lt;br /&gt;
## Помимо примитивных типов, реализовать поддержку std::string и любого своего поля, хеш для когорого считается из более чем двух полей.&lt;br /&gt;
## Для вычисления хеша запрещается использовать готовые функции из std. (std::hash_value)&lt;br /&gt;
## Протестировать как минимум на следующем коде: &lt;br /&gt;
  HashMap&amp;lt;int, int&amp;gt; hm;  &lt;br /&gt;
  for (int i = 0; i &amp;lt; N; ++i) hm[i] = i;&lt;br /&gt;
  for (int i = 0; i &amp;lt; N; ++i) if (i != hm[i]) std::cout &amp;lt;&amp;lt; ...;  &lt;br /&gt;
Где N в несколько (&amp;gt;=4) раз больше числа &amp;quot;бакетов&amp;quot;.&lt;/div&gt;</summary>
		<author><name>AM5800</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=%D0%93%D1%80%D1%83%D0%BF%D0%BF%D0%B0_%D0%9C%D0%B8%D1%85%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%D0%B0&amp;diff=2170</id>
		<title>Группа Михайлова</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=%D0%93%D1%80%D1%83%D0%BF%D0%BF%D0%B0_%D0%9C%D0%B8%D1%85%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%D0%B0&amp;diff=2170"/>
				<updated>2013-02-20T10:50:18Z</updated>
		
		<summary type="html">&lt;p&gt;AM5800: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Правила жизни=&lt;br /&gt;
За успешную сдачу практической работы на паре, на которой она была задана студент получает 2 балла рейтинга&lt;br /&gt;
За успешную сдачу на следующей паре - один балл.&lt;br /&gt;
На следующей паре первоначальное задание разбирается. И сдача такого задания оценивается уже в пол балла.&lt;br /&gt;
&lt;br /&gt;
Проверка работ по электронной почте осуществляется только в экстренных случаях. (Болезнь, например)&lt;br /&gt;
&lt;br /&gt;
Для получения зачета необходимо набрать некоторе количествоо баллов. Точное значение будет определено позже.&lt;br /&gt;
Те, кто их не набрал - будут выполнять дополнительные задания.&lt;br /&gt;
&lt;br /&gt;
=Общее=&lt;br /&gt;
[https://docs.google.com/spreadsheet/ccc?key=0AhBJfSfjgJfGdEw1RlNXeWhlY1M0MGJacXQ1WXM0d2c&amp;amp;pli=1#gid=0 Результаты]&lt;br /&gt;
&lt;br /&gt;
=Интересные ссылки=&lt;br /&gt;
[http://pages.cs.wisc.edu/~driscoll/typename.html O typename]&lt;br /&gt;
&lt;br /&gt;
[http://habrahabr.ru/post/112953/ Об арифметике с плавающей запятой]&lt;br /&gt;
&lt;br /&gt;
[http://herbsutter.com/2013/01/01/video-you-dont-know-const-and-mutable/ You don't know const and mutable]&lt;br /&gt;
&lt;br /&gt;
=Осенний семестр=&lt;br /&gt;
==Компиляция==&lt;br /&gt;
&lt;br /&gt;
Напишите псевдо код на основе ассемблерного кода в который разворачивается инструкция for:&lt;br /&gt;
 for (int i = 0; i &amp;lt; N; ++i) {&lt;br /&gt;
 //body&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Пример псевдокода:&lt;br /&gt;
 if (a == 5) goto mark1&lt;br /&gt;
 something&lt;br /&gt;
 mark1:&lt;br /&gt;
Чем плоха конструкция&lt;br /&gt;
  #define MAX(a, b) a &amp;gt; b ? a : b&lt;br /&gt;
Приведите пример ее некорректного использования. (Возврат не максимального значения, побочные эффекты)&lt;br /&gt;
Как можно ее улучшить?&lt;br /&gt;
&lt;br /&gt;
Как работает линковка? Какую роль в ней играет relocation table&lt;br /&gt;
&lt;br /&gt;
==Сортировка слиянием==&lt;br /&gt;
Реализуйте алгоритм merge sort&lt;br /&gt;
&lt;br /&gt;
==Выделение памяти==&lt;br /&gt;
Создайте двумерный массив двумя способами.&lt;br /&gt;
1) Используя N + 1 аллокацию&lt;br /&gt;
2) Используя 2 аллокации&lt;br /&gt;
Замерьте, при каких значениях размера массива происходит экстерминатус? (Компилируйте 32 разрядную версию. 64 может и не упасть)&lt;br /&gt;
Какой вариант работает быстрее?&lt;br /&gt;
Подумайте, почему это происходит.&lt;br /&gt;
Обращаю внимание, что оба варианта созданных матриц должны иметь тип int**&lt;br /&gt;
&lt;br /&gt;
Усложненное задание - сделать матрицы трегольными и написать процедуру, сливающие 2 такие матрицы в прямоугольную&lt;br /&gt;
&lt;br /&gt;
==Расширяющийся массив==&lt;br /&gt;
Реализуйте класс расширяющегося массива.&lt;br /&gt;
Size - количество элементов в массиве.&lt;br /&gt;
Capacity - вместимость массива.&lt;br /&gt;
Size &amp;lt;= Capacity&lt;br /&gt;
Если при добавлении очередного элемента Size превышает Capacity, то Capacity следует увеличить вдвое&lt;br /&gt;
 struct Array {&lt;br /&gt;
   Array(size_t capacity = 3);&lt;br /&gt;
   Array(Array &amp;amp; array);&lt;br /&gt;
   ~Array();&lt;br /&gt;
   Array &amp;amp; operator=(Array &amp;amp; array);&lt;br /&gt;
   size_t Size();&lt;br /&gt;
   size_t Capacity();&lt;br /&gt;
   void Add(int value);&lt;br /&gt;
   int Get(size_t index);&lt;br /&gt;
   void Set(size_t index, int value);&lt;br /&gt;
   void Swap(Array &amp;amp; array);&lt;br /&gt;
  private:&lt;br /&gt;
   int* myData;&lt;br /&gt;
   size_t mySize;&lt;br /&gt;
   size_t myCapacity;&lt;br /&gt;
 };&lt;br /&gt;
==Обертка над FILE==&lt;br /&gt;
==String==&lt;br /&gt;
Реализовать класс String со следующими методами/требованиями&lt;br /&gt;
 String()&lt;br /&gt;
 String(String &amp;amp;)&lt;br /&gt;
 String(char *)&lt;br /&gt;
 operator=(String &amp;amp;)&lt;br /&gt;
 operator=(char *) //реализовывать не нужно. Объясните, почему?&lt;br /&gt;
 append(String &amp;amp;)&lt;br /&gt;
 char ? at(size_t) // реализовать в двух версиях. Константную и не константную&lt;br /&gt;
 char * c_str() - возвращает обычную нуль-терминированную строку&lt;br /&gt;
&lt;br /&gt;
Данные хранить как буффер для строки и ее размер. Строку хранить НЕ как нуль-терминированную.&lt;br /&gt;
В приведенном выше ключевое слово const не используется умышленно.&lt;br /&gt;
&lt;br /&gt;
Дополнительное задание - реализовать строку с таким же интерфейсом, но реализующую стратегию Copy On Write (COW)&lt;br /&gt;
&lt;br /&gt;
==Smart FILE==&lt;br /&gt;
==Rational==&lt;br /&gt;
Напишите класс работающий с рациональными числами и определите следующие операторы:&lt;br /&gt;
* ostream &amp;lt;&amp;lt;&lt;br /&gt;
* istream &amp;gt;&amp;gt;&lt;br /&gt;
* +=&lt;br /&gt;
* -=&lt;br /&gt;
* *=&lt;br /&gt;
* /=&lt;br /&gt;
* +&lt;br /&gt;
* - бинарный&lt;br /&gt;
* - унарный&lt;br /&gt;
* *&lt;br /&gt;
* /&lt;br /&gt;
* ++ префиксный&lt;br /&gt;
* ++ постфиксный&lt;br /&gt;
* -- префиксный&lt;br /&gt;
* -- постфиксный&lt;br /&gt;
* ==&lt;br /&gt;
* !=&lt;br /&gt;
* &amp;lt;&lt;br /&gt;
* &amp;gt;&lt;br /&gt;
* &amp;lt;=&lt;br /&gt;
* &amp;gt;=&lt;br /&gt;
&lt;br /&gt;
==Smart pointers==&lt;br /&gt;
Реализовать шаблонный scoped_ptr&lt;br /&gt;
[http://www.boost.org/doc/libs/1_52_0/libs/smart_ptr/scoped_ptr.htm]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Весенний семестр=&lt;br /&gt;
==Задание 1==&lt;br /&gt;
==HashMap==&lt;br /&gt;
# HashMap&amp;lt;TKey, TValue, TTraits = SomeDefaultTraits&amp;lt;TKey&amp;gt;&amp;gt;, TKey - тип ключа, TValue - тип значения&lt;br /&gt;
# TTraits - некоторый тип, определяющий как именно будет вычисляться хеш-значение для ключа, а также сравнение с другими ключами. Реализация по-умолчанию должна уметь работать со всеми встроенными типами&lt;br /&gt;
# Для упрощения реализации количество ячеек в массиве можно считать константным&lt;br /&gt;
# Обязательные для реализации функции&lt;br /&gt;
## begin()/end() - функции, возвращающие итераторы начала/конца таблицы. Тип итерируемых элементов - std::pair&amp;lt;TKey, TValue&amp;gt; &lt;br /&gt;
## TValue &amp;amp; operator[](TKey) - оператор, возращающий значение по ключу. Если такого ключа в коллекции нет - он создается вместе со значением TValue по-умолчанию.&lt;br /&gt;
## iterator lower_bound(TKey) - возвращает итератор на искомый элемент. Если такого нет - возвращает итератор, равный end()&lt;br /&gt;
## iterator insert(std::pair&amp;lt;TKey, TValue&amp;gt;) - помещает пару ключ-значение в таблицу. Возвращает итератор на место, в которое элемент был вставлен. Если в таблице уже существует пара с таким же ключем - сгенерировать ошибку. Например, поделив на ноль =)&lt;br /&gt;
## void remove(TKey) - угадайте с трех раз&lt;br /&gt;
# Дополнительно&lt;br /&gt;
## Представляемая реализация должна работать с любыми примитивными типами &amp;quot;из коробки&amp;quot; т.е. без явного указания traits.&lt;br /&gt;
## Помимо примитивных типов, реализовать поддержку std::string и любого своего поля, хеш для когорого считается из более чем двух полей.&lt;br /&gt;
## Для вычисления хеша запрещается использовать готовые функции из std. (std::hash_value)&lt;br /&gt;
## Протестировать как минимум на следующем коде: &lt;br /&gt;
  HashMap&amp;lt;int, int&amp;gt; hm;  &lt;br /&gt;
  for (int i = 0; i &amp;lt; N; ++i) hm[i] = i;&lt;br /&gt;
  for (int i = 0; i &amp;lt; N; ++i) if (i != hm[i]) std::cout &amp;lt;&amp;lt; ...;  &lt;br /&gt;
Где N в несколько (&amp;gt;=4) раз больше числа &amp;quot;бакетов&amp;quot;.&lt;/div&gt;</summary>
		<author><name>AM5800</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=CPP_2013&amp;diff=2168</id>
		<title>CPP 2013</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=CPP_2013&amp;diff=2168"/>
				<updated>2013-02-20T10:30:29Z</updated>
		
		<summary type="html">&lt;p&gt;AM5800: /* Практические задания */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Лектор - Смаль Александр Владимирович&lt;br /&gt;
&lt;br /&gt;
== Лекции ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Практические задания ==&lt;br /&gt;
&lt;br /&gt;
[[Третья группа]]&lt;br /&gt;
&lt;br /&gt;
[[Группа Михайлова]]&lt;br /&gt;
&lt;br /&gt;
== Программа курса ==&lt;br /&gt;
&lt;br /&gt;
== Список литературы ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;/div&gt;</summary>
		<author><name>AM5800</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=%D0%93%D1%80%D1%83%D0%BF%D0%BF%D0%B0_%D0%9C%D0%B8%D1%85%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%D0%B0&amp;diff=2153</id>
		<title>Группа Михайлова</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=%D0%93%D1%80%D1%83%D0%BF%D0%BF%D0%B0_%D0%9C%D0%B8%D1%85%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%D0%B0&amp;diff=2153"/>
				<updated>2013-02-13T18:34:55Z</updated>
		
		<summary type="html">&lt;p&gt;AM5800: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Общее=&lt;br /&gt;
[https://docs.google.com/spreadsheet/ccc?key=0AhBJfSfjgJfGdEw1RlNXeWhlY1M0MGJacXQ1WXM0d2c&amp;amp;pli=1#gid=0 Результаты]&lt;br /&gt;
&lt;br /&gt;
=Интересные ссылки=&lt;br /&gt;
[http://pages.cs.wisc.edu/~driscoll/typename.html O typename]&lt;br /&gt;
&lt;br /&gt;
[http://habrahabr.ru/post/112953/ Об арифметике с плавающей запятой]&lt;br /&gt;
&lt;br /&gt;
[http://herbsutter.com/2013/01/01/video-you-dont-know-const-and-mutable/ You don't know const and mutable]&lt;br /&gt;
&lt;br /&gt;
=Осенний семестр=&lt;br /&gt;
==Компиляция==&lt;br /&gt;
&lt;br /&gt;
Напишите псевдо код на основе ассемблерного кода в который разворачивается инструкция for:&lt;br /&gt;
 for (int i = 0; i &amp;lt; N; ++i) {&lt;br /&gt;
 //body&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Пример псевдокода:&lt;br /&gt;
 if (a == 5) goto mark1&lt;br /&gt;
 something&lt;br /&gt;
 mark1:&lt;br /&gt;
Чем плоха конструкция&lt;br /&gt;
  #define MAX(a, b) a &amp;gt; b ? a : b&lt;br /&gt;
Приведите пример ее некорректного использования. (Возврат не максимального значения, побочные эффекты)&lt;br /&gt;
Как можно ее улучшить?&lt;br /&gt;
&lt;br /&gt;
Как работает линковка? Какую роль в ней играет relocation table&lt;br /&gt;
&lt;br /&gt;
==Сортировка слиянием==&lt;br /&gt;
Реализуйте алгоритм merge sort&lt;br /&gt;
&lt;br /&gt;
==Выделение памяти==&lt;br /&gt;
Создайте двумерный массив двумя способами.&lt;br /&gt;
1) Используя N + 1 аллокацию&lt;br /&gt;
2) Используя 2 аллокации&lt;br /&gt;
Замерьте, при каких значениях размера массива происходит экстерминатус? (Компилируйте 32 разрядную версию. 64 может и не упасть)&lt;br /&gt;
Какой вариант работает быстрее?&lt;br /&gt;
Подумайте, почему это происходит.&lt;br /&gt;
Обращаю внимание, что оба варианта созданных матриц должны иметь тип int**&lt;br /&gt;
&lt;br /&gt;
Усложненное задание - сделать матрицы трегольными и написать процедуру, сливающие 2 такие матрицы в прямоугольную&lt;br /&gt;
&lt;br /&gt;
==Расширяющийся массив==&lt;br /&gt;
Реализуйте класс расширяющегося массива.&lt;br /&gt;
Size - количество элементов в массиве.&lt;br /&gt;
Capacity - вместимость массива.&lt;br /&gt;
Size &amp;lt;= Capacity&lt;br /&gt;
Если при добавлении очередного элемента Size превышает Capacity, то Capacity следует увеличить вдвое&lt;br /&gt;
 struct Array {&lt;br /&gt;
   Array(size_t capacity = 3);&lt;br /&gt;
   Array(Array &amp;amp; array);&lt;br /&gt;
   ~Array();&lt;br /&gt;
   Array &amp;amp; operator=(Array &amp;amp; array);&lt;br /&gt;
   size_t Size();&lt;br /&gt;
   size_t Capacity();&lt;br /&gt;
   void Add(int value);&lt;br /&gt;
   int Get(size_t index);&lt;br /&gt;
   void Set(size_t index, int value);&lt;br /&gt;
   void Swap(Array &amp;amp; array);&lt;br /&gt;
  private:&lt;br /&gt;
   int* myData;&lt;br /&gt;
   size_t mySize;&lt;br /&gt;
   size_t myCapacity;&lt;br /&gt;
 };&lt;br /&gt;
==Обертка над FILE==&lt;br /&gt;
==String==&lt;br /&gt;
Реализовать класс String со следующими методами/требованиями&lt;br /&gt;
 String()&lt;br /&gt;
 String(String &amp;amp;)&lt;br /&gt;
 String(char *)&lt;br /&gt;
 operator=(String &amp;amp;)&lt;br /&gt;
 operator=(char *) //реализовывать не нужно. Объясните, почему?&lt;br /&gt;
 append(String &amp;amp;)&lt;br /&gt;
 char ? at(size_t) // реализовать в двух версиях. Константную и не константную&lt;br /&gt;
 char * c_str() - возвращает обычную нуль-терминированную строку&lt;br /&gt;
&lt;br /&gt;
Данные хранить как буффер для строки и ее размер. Строку хранить НЕ как нуль-терминированную.&lt;br /&gt;
В приведенном выше ключевое слово const не используется умышленно.&lt;br /&gt;
&lt;br /&gt;
Дополнительное задание - реализовать строку с таким же интерфейсом, но реализующую стратегию Copy On Write (COW)&lt;br /&gt;
&lt;br /&gt;
==Smart FILE==&lt;br /&gt;
==Rational==&lt;br /&gt;
Напишите класс работающий с рациональными числами и определите следующие операторы:&lt;br /&gt;
* ostream &amp;lt;&amp;lt;&lt;br /&gt;
* istream &amp;gt;&amp;gt;&lt;br /&gt;
* +=&lt;br /&gt;
* -=&lt;br /&gt;
* *=&lt;br /&gt;
* /=&lt;br /&gt;
* +&lt;br /&gt;
* - бинарный&lt;br /&gt;
* - унарный&lt;br /&gt;
* *&lt;br /&gt;
* /&lt;br /&gt;
* ++ префиксный&lt;br /&gt;
* ++ постфиксный&lt;br /&gt;
* -- префиксный&lt;br /&gt;
* -- постфиксный&lt;br /&gt;
* ==&lt;br /&gt;
* !=&lt;br /&gt;
* &amp;lt;&lt;br /&gt;
* &amp;gt;&lt;br /&gt;
* &amp;lt;=&lt;br /&gt;
* &amp;gt;=&lt;br /&gt;
&lt;br /&gt;
==Smart pointers==&lt;br /&gt;
Реализовать шаблонный scoped_ptr&lt;br /&gt;
[http://www.boost.org/doc/libs/1_52_0/libs/smart_ptr/scoped_ptr.htm]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Весенний семестр=&lt;br /&gt;
==Задание 1==&lt;br /&gt;
==HashMap==&lt;br /&gt;
# HashMap&amp;lt;TKey, TValue, TTraits = SomeDefaultTraits&amp;lt;TKey&amp;gt;&amp;gt;, TKey - тип ключа, TValue - тип значения&lt;br /&gt;
# TTraits - некоторый тип, определяющий как именно будет вычисляться хеш-значение для ключа, а также сравнение с другими ключами. Реализация по-умолчанию должна уметь работать со всеми встроенными типами&lt;br /&gt;
# Для упрощения реализации количество ячеек в массиве можно считать константным&lt;br /&gt;
# Обязательные для реализации функции&lt;br /&gt;
## begin()/end() - функции, возвращающие итераторы начала/конца таблицы. Тип итерируемых элементов - std::pair&amp;lt;TKey, TValue&amp;gt; &lt;br /&gt;
## TValue &amp;amp; operator[](TKey) - оператор, возращающий значение по ключу. Если такого ключа в коллекции нет - он создается вместе со значением TValue по-умолчанию.&lt;br /&gt;
## iterator lower_bound(TKey) - возвращает итератор на искомый элемент. Если такого нет - возвращает итератор, равный end()&lt;br /&gt;
## iterator insert(std::pair&amp;lt;TKey, TValue&amp;gt;) - помещает пару ключ-значение в таблицу. Возвращает итератор на место, в которое элемент был вставлен. Если в таблице уже существует пара с таким же ключем - сгенерировать ошибку. Например, поделив на ноль =)&lt;br /&gt;
## void remove(TKey) - угадайте с трех раз&lt;br /&gt;
# Дополнительно&lt;br /&gt;
## Представляемая реализация должна работать с любыми примитивными типами &amp;quot;из коробки&amp;quot; т.е. без явного указания traits.&lt;br /&gt;
## Помимо примитивных типов, реализовать поддержку std::string и любого своего поля, хеш для когорого считается из более чем двух полей.&lt;br /&gt;
## Для вычисления хеша запрещается использовать готовые функции из std. (std::hash_value)&lt;br /&gt;
## Протестировать как минимум на следующем коде: &lt;br /&gt;
  HashMap&amp;lt;int, int&amp;gt; hm;  &lt;br /&gt;
  for (int i = 0; i &amp;lt; N; ++i) hm[i] = i;&lt;br /&gt;
  for (int i = 0; i &amp;lt; N; ++i) if (i != hm[i]) std::cout &amp;lt;&amp;lt; ...;  &lt;br /&gt;
Где N в несколько (&amp;gt;=4) раз больше числа &amp;quot;бакетов&amp;quot;.&lt;/div&gt;</summary>
		<author><name>AM5800</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=%D0%93%D1%80%D1%83%D0%BF%D0%BF%D0%B0_%D0%9C%D0%B8%D1%85%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%D0%B0&amp;diff=2115</id>
		<title>Группа Михайлова</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=%D0%93%D1%80%D1%83%D0%BF%D0%BF%D0%B0_%D0%9C%D0%B8%D1%85%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%D0%B0&amp;diff=2115"/>
				<updated>2013-01-09T16:12:33Z</updated>
		
		<summary type="html">&lt;p&gt;AM5800: /* Интересные ссылки */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Общее=&lt;br /&gt;
[https://docs.google.com/spreadsheet/ccc?key=0AhBJfSfjgJfGdEw1RlNXeWhlY1M0MGJacXQ1WXM0d2c&amp;amp;pli=1#gid=0 Результаты]&lt;br /&gt;
&lt;br /&gt;
=Интересные ссылки=&lt;br /&gt;
[http://pages.cs.wisc.edu/~driscoll/typename.html O typename]&lt;br /&gt;
&lt;br /&gt;
[http://habrahabr.ru/post/112953/ Об арифметике с плавающей запятой]&lt;br /&gt;
&lt;br /&gt;
[http://herbsutter.com/2013/01/01/video-you-dont-know-const-and-mutable/ You don't know const and mutable]&lt;br /&gt;
&lt;br /&gt;
=Задания=&lt;br /&gt;
==Компиляция==&lt;br /&gt;
&lt;br /&gt;
Напишите псевдо код на основе ассемблерного кода в который разворачивается инструкция for:&lt;br /&gt;
 for (int i = 0; i &amp;lt; N; ++i) {&lt;br /&gt;
 //body&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Пример псевдокода:&lt;br /&gt;
 if (a == 5) goto mark1&lt;br /&gt;
 something&lt;br /&gt;
 mark1:&lt;br /&gt;
Чем плоха конструкция&lt;br /&gt;
  #define MAX(a, b) a &amp;gt; b ? a : b&lt;br /&gt;
Приведите пример ее некорректного использования. (Возврат не максимального значения, побочные эффекты)&lt;br /&gt;
Как можно ее улучшить?&lt;br /&gt;
&lt;br /&gt;
Как работает линковка? Какую роль в ней играет relocation table&lt;br /&gt;
&lt;br /&gt;
==Сортировка слиянием==&lt;br /&gt;
Реализуйте алгоритм merge sort&lt;br /&gt;
&lt;br /&gt;
==Выделение памяти==&lt;br /&gt;
Создайте двумерный массив двумя способами.&lt;br /&gt;
1) Используя N + 1 аллокацию&lt;br /&gt;
2) Используя 2 аллокации&lt;br /&gt;
Замерьте, при каких значениях размера массива происходит экстерминатус? (Компилируйте 32 разрядную версию. 64 может и не упасть)&lt;br /&gt;
Какой вариант работает быстрее?&lt;br /&gt;
Подумайте, почему это происходит.&lt;br /&gt;
Обращаю внимание, что оба варианта созданных матриц должны иметь тип int**&lt;br /&gt;
&lt;br /&gt;
Усложненное задание - сделать матрицы трегольными и написать процедуру, сливающие 2 такие матрицы в прямоугольную&lt;br /&gt;
&lt;br /&gt;
==Расширяющийся массив==&lt;br /&gt;
Реализуйте класс расширяющегося массива.&lt;br /&gt;
Size - количество элементов в массиве.&lt;br /&gt;
Capacity - вместимость массива.&lt;br /&gt;
Size &amp;lt;= Capacity&lt;br /&gt;
Если при добавлении очередного элемента Size превышает Capacity, то Capacity следует увеличить вдвое&lt;br /&gt;
 struct Array {&lt;br /&gt;
   Array(size_t capacity = 3);&lt;br /&gt;
   Array(Array &amp;amp; array);&lt;br /&gt;
   ~Array();&lt;br /&gt;
   Array &amp;amp; operator=(Array &amp;amp; array);&lt;br /&gt;
   size_t Size();&lt;br /&gt;
   size_t Capacity();&lt;br /&gt;
   void Add(int value);&lt;br /&gt;
   int Get(size_t index);&lt;br /&gt;
   void Set(size_t index, int value);&lt;br /&gt;
   void Swap(Array &amp;amp; array);&lt;br /&gt;
  private:&lt;br /&gt;
   int* myData;&lt;br /&gt;
   size_t mySize;&lt;br /&gt;
   size_t myCapacity;&lt;br /&gt;
 };&lt;br /&gt;
==Обертка над FILE==&lt;br /&gt;
==String==&lt;br /&gt;
Реализовать класс String со следующими методами/требованиями&lt;br /&gt;
 String()&lt;br /&gt;
 String(String &amp;amp;)&lt;br /&gt;
 String(char *)&lt;br /&gt;
 operator=(String &amp;amp;)&lt;br /&gt;
 operator=(char *) //реализовывать не нужно. Объясните, почему?&lt;br /&gt;
 append(String &amp;amp;)&lt;br /&gt;
 char ? at(size_t) // реализовать в двух версиях. Константную и не константную&lt;br /&gt;
 char * c_str() - возвращает обычную нуль-терминированную строку&lt;br /&gt;
&lt;br /&gt;
Данные хранить как буффер для строки и ее размер. Строку хранить НЕ как нуль-терминированную.&lt;br /&gt;
В приведенном выше ключевое слово const не используется умышленно.&lt;br /&gt;
&lt;br /&gt;
Дополнительное задание - реализовать строку с таким же интерфейсом, но реализующую стратегию Copy On Write (COW)&lt;br /&gt;
&lt;br /&gt;
==Smart FILE==&lt;br /&gt;
==Rational==&lt;br /&gt;
Напишите класс работающий с рациональными числами и определите следующие операторы:&lt;br /&gt;
* ostream &amp;lt;&amp;lt;&lt;br /&gt;
* istream &amp;gt;&amp;gt;&lt;br /&gt;
* +=&lt;br /&gt;
* -=&lt;br /&gt;
* *=&lt;br /&gt;
* /=&lt;br /&gt;
* +&lt;br /&gt;
* - бинарный&lt;br /&gt;
* - унарный&lt;br /&gt;
* *&lt;br /&gt;
* /&lt;br /&gt;
* ++ префиксный&lt;br /&gt;
* ++ постфиксный&lt;br /&gt;
* -- префиксный&lt;br /&gt;
* -- постфиксный&lt;br /&gt;
* ==&lt;br /&gt;
* !=&lt;br /&gt;
* &amp;lt;&lt;br /&gt;
* &amp;gt;&lt;br /&gt;
* &amp;lt;=&lt;br /&gt;
* &amp;gt;=&lt;br /&gt;
&lt;br /&gt;
=Smart pointers=&lt;br /&gt;
Реализовать шаблонный scoped_ptr&lt;br /&gt;
[http://www.boost.org/doc/libs/1_52_0/libs/smart_ptr/scoped_ptr.htm]&lt;/div&gt;</summary>
		<author><name>AM5800</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=%D0%93%D1%80%D1%83%D0%BF%D0%BF%D0%B0_%D0%9C%D0%B8%D1%85%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%D0%B0&amp;diff=2086</id>
		<title>Группа Михайлова</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=%D0%93%D1%80%D1%83%D0%BF%D0%BF%D0%B0_%D0%9C%D0%B8%D1%85%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%D0%B0&amp;diff=2086"/>
				<updated>2012-12-12T20:29:45Z</updated>
		
		<summary type="html">&lt;p&gt;AM5800: /* Smar pointers */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Общее=&lt;br /&gt;
[https://docs.google.com/spreadsheet/ccc?key=0AhBJfSfjgJfGdEw1RlNXeWhlY1M0MGJacXQ1WXM0d2c&amp;amp;pli=1#gid=0 Результаты]&lt;br /&gt;
&lt;br /&gt;
=Интересные ссылки=&lt;br /&gt;
[http://pages.cs.wisc.edu/~driscoll/typename.html O typename]&lt;br /&gt;
&lt;br /&gt;
[http://habrahabr.ru/post/112953/ Об арифметике с плавающей запятой]&lt;br /&gt;
&lt;br /&gt;
=Задания=&lt;br /&gt;
==Компиляция==&lt;br /&gt;
&lt;br /&gt;
Напишите псевдо код на основе ассемблерного кода в который разворачивается инструкция for:&lt;br /&gt;
 for (int i = 0; i &amp;lt; N; ++i) {&lt;br /&gt;
 //body&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Пример псевдокода:&lt;br /&gt;
 if (a == 5) goto mark1&lt;br /&gt;
 something&lt;br /&gt;
 mark1:&lt;br /&gt;
Чем плоха конструкция&lt;br /&gt;
  #define MAX(a, b) a &amp;gt; b ? a : b&lt;br /&gt;
Приведите пример ее некорректного использования. (Возврат не максимального значения, побочные эффекты)&lt;br /&gt;
Как можно ее улучшить?&lt;br /&gt;
&lt;br /&gt;
Как работает линковка? Какую роль в ней играет relocation table&lt;br /&gt;
&lt;br /&gt;
==Сортировка слиянием==&lt;br /&gt;
Реализуйте алгоритм merge sort&lt;br /&gt;
&lt;br /&gt;
==Выделение памяти==&lt;br /&gt;
Создайте двумерный массив двумя способами.&lt;br /&gt;
1) Используя N + 1 аллокацию&lt;br /&gt;
2) Используя 2 аллокации&lt;br /&gt;
Замерьте, при каких значениях размера массива происходит экстерминатус? (Компилируйте 32 разрядную версию. 64 может и не упасть)&lt;br /&gt;
Какой вариант работает быстрее?&lt;br /&gt;
Подумайте, почему это происходит.&lt;br /&gt;
Обращаю внимание, что оба варианта созданных матриц должны иметь тип int**&lt;br /&gt;
&lt;br /&gt;
Усложненное задание - сделать матрицы трегольными и написать процедуру, сливающие 2 такие матрицы в прямоугольную&lt;br /&gt;
&lt;br /&gt;
==Расширяющийся массив==&lt;br /&gt;
Реализуйте класс расширяющегося массива.&lt;br /&gt;
Size - количество элементов в массиве.&lt;br /&gt;
Capacity - вместимость массива.&lt;br /&gt;
Size &amp;lt;= Capacity&lt;br /&gt;
Если при добавлении очередного элемента Size превышает Capacity, то Capacity следует увеличить вдвое&lt;br /&gt;
 struct Array {&lt;br /&gt;
   Array(size_t capacity = 3);&lt;br /&gt;
   Array(Array &amp;amp; array);&lt;br /&gt;
   ~Array();&lt;br /&gt;
   Array &amp;amp; operator=(Array &amp;amp; array);&lt;br /&gt;
   size_t Size();&lt;br /&gt;
   size_t Capacity();&lt;br /&gt;
   void Add(int value);&lt;br /&gt;
   int Get(size_t index);&lt;br /&gt;
   void Set(size_t index, int value);&lt;br /&gt;
   void Swap(Array &amp;amp; array);&lt;br /&gt;
  private:&lt;br /&gt;
   int* myData;&lt;br /&gt;
   size_t mySize;&lt;br /&gt;
   size_t myCapacity;&lt;br /&gt;
 };&lt;br /&gt;
==Обертка над FILE==&lt;br /&gt;
==String==&lt;br /&gt;
Реализовать класс String со следующими методами/требованиями&lt;br /&gt;
 String()&lt;br /&gt;
 String(String &amp;amp;)&lt;br /&gt;
 String(char *)&lt;br /&gt;
 operator=(String &amp;amp;)&lt;br /&gt;
 operator=(char *) //реализовывать не нужно. Объясните, почему?&lt;br /&gt;
 append(String &amp;amp;)&lt;br /&gt;
 char ? at(size_t) // реализовать в двух версиях. Константную и не константную&lt;br /&gt;
 char * c_str() - возвращает обычную нуль-терминированную строку&lt;br /&gt;
&lt;br /&gt;
Данные хранить как буффер для строки и ее размер. Строку хранить НЕ как нуль-терминированную.&lt;br /&gt;
В приведенном выше ключевое слово const не используется умышленно.&lt;br /&gt;
&lt;br /&gt;
Дополнительное задание - реализовать строку с таким же интерфейсом, но реализующую стратегию Copy On Write (COW)&lt;br /&gt;
&lt;br /&gt;
==Smart FILE==&lt;br /&gt;
==Rational==&lt;br /&gt;
Напишите класс работающий с рациональными числами и определите следующие операторы:&lt;br /&gt;
* ostream &amp;lt;&amp;lt;&lt;br /&gt;
* istream &amp;gt;&amp;gt;&lt;br /&gt;
* +=&lt;br /&gt;
* -=&lt;br /&gt;
* *=&lt;br /&gt;
* /=&lt;br /&gt;
* +&lt;br /&gt;
* - бинарный&lt;br /&gt;
* - унарный&lt;br /&gt;
* *&lt;br /&gt;
* /&lt;br /&gt;
* ++ префиксный&lt;br /&gt;
* ++ постфиксный&lt;br /&gt;
* -- префиксный&lt;br /&gt;
* -- постфиксный&lt;br /&gt;
* ==&lt;br /&gt;
* !=&lt;br /&gt;
* &amp;lt;&lt;br /&gt;
* &amp;gt;&lt;br /&gt;
* &amp;lt;=&lt;br /&gt;
* &amp;gt;=&lt;br /&gt;
&lt;br /&gt;
=Smart pointers=&lt;br /&gt;
Реализовать шаблонный scoped_ptr&lt;br /&gt;
[http://www.boost.org/doc/libs/1_52_0/libs/smart_ptr/scoped_ptr.htm]&lt;/div&gt;</summary>
		<author><name>AM5800</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=%D0%93%D1%80%D1%83%D0%BF%D0%BF%D0%B0_%D0%9C%D0%B8%D1%85%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%D0%B0&amp;diff=2085</id>
		<title>Группа Михайлова</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=%D0%93%D1%80%D1%83%D0%BF%D0%BF%D0%B0_%D0%9C%D0%B8%D1%85%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%D0%B0&amp;diff=2085"/>
				<updated>2012-12-12T20:28:41Z</updated>
		
		<summary type="html">&lt;p&gt;AM5800: /* Smar pointers */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Общее=&lt;br /&gt;
[https://docs.google.com/spreadsheet/ccc?key=0AhBJfSfjgJfGdEw1RlNXeWhlY1M0MGJacXQ1WXM0d2c&amp;amp;pli=1#gid=0 Результаты]&lt;br /&gt;
&lt;br /&gt;
=Интересные ссылки=&lt;br /&gt;
[http://pages.cs.wisc.edu/~driscoll/typename.html O typename]&lt;br /&gt;
&lt;br /&gt;
[http://habrahabr.ru/post/112953/ Об арифметике с плавающей запятой]&lt;br /&gt;
&lt;br /&gt;
=Задания=&lt;br /&gt;
==Компиляция==&lt;br /&gt;
&lt;br /&gt;
Напишите псевдо код на основе ассемблерного кода в который разворачивается инструкция for:&lt;br /&gt;
 for (int i = 0; i &amp;lt; N; ++i) {&lt;br /&gt;
 //body&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Пример псевдокода:&lt;br /&gt;
 if (a == 5) goto mark1&lt;br /&gt;
 something&lt;br /&gt;
 mark1:&lt;br /&gt;
Чем плоха конструкция&lt;br /&gt;
  #define MAX(a, b) a &amp;gt; b ? a : b&lt;br /&gt;
Приведите пример ее некорректного использования. (Возврат не максимального значения, побочные эффекты)&lt;br /&gt;
Как можно ее улучшить?&lt;br /&gt;
&lt;br /&gt;
Как работает линковка? Какую роль в ней играет relocation table&lt;br /&gt;
&lt;br /&gt;
==Сортировка слиянием==&lt;br /&gt;
Реализуйте алгоритм merge sort&lt;br /&gt;
&lt;br /&gt;
==Выделение памяти==&lt;br /&gt;
Создайте двумерный массив двумя способами.&lt;br /&gt;
1) Используя N + 1 аллокацию&lt;br /&gt;
2) Используя 2 аллокации&lt;br /&gt;
Замерьте, при каких значениях размера массива происходит экстерминатус? (Компилируйте 32 разрядную версию. 64 может и не упасть)&lt;br /&gt;
Какой вариант работает быстрее?&lt;br /&gt;
Подумайте, почему это происходит.&lt;br /&gt;
Обращаю внимание, что оба варианта созданных матриц должны иметь тип int**&lt;br /&gt;
&lt;br /&gt;
Усложненное задание - сделать матрицы трегольными и написать процедуру, сливающие 2 такие матрицы в прямоугольную&lt;br /&gt;
&lt;br /&gt;
==Расширяющийся массив==&lt;br /&gt;
Реализуйте класс расширяющегося массива.&lt;br /&gt;
Size - количество элементов в массиве.&lt;br /&gt;
Capacity - вместимость массива.&lt;br /&gt;
Size &amp;lt;= Capacity&lt;br /&gt;
Если при добавлении очередного элемента Size превышает Capacity, то Capacity следует увеличить вдвое&lt;br /&gt;
 struct Array {&lt;br /&gt;
   Array(size_t capacity = 3);&lt;br /&gt;
   Array(Array &amp;amp; array);&lt;br /&gt;
   ~Array();&lt;br /&gt;
   Array &amp;amp; operator=(Array &amp;amp; array);&lt;br /&gt;
   size_t Size();&lt;br /&gt;
   size_t Capacity();&lt;br /&gt;
   void Add(int value);&lt;br /&gt;
   int Get(size_t index);&lt;br /&gt;
   void Set(size_t index, int value);&lt;br /&gt;
   void Swap(Array &amp;amp; array);&lt;br /&gt;
  private:&lt;br /&gt;
   int* myData;&lt;br /&gt;
   size_t mySize;&lt;br /&gt;
   size_t myCapacity;&lt;br /&gt;
 };&lt;br /&gt;
==Обертка над FILE==&lt;br /&gt;
==String==&lt;br /&gt;
Реализовать класс String со следующими методами/требованиями&lt;br /&gt;
 String()&lt;br /&gt;
 String(String &amp;amp;)&lt;br /&gt;
 String(char *)&lt;br /&gt;
 operator=(String &amp;amp;)&lt;br /&gt;
 operator=(char *) //реализовывать не нужно. Объясните, почему?&lt;br /&gt;
 append(String &amp;amp;)&lt;br /&gt;
 char ? at(size_t) // реализовать в двух версиях. Константную и не константную&lt;br /&gt;
 char * c_str() - возвращает обычную нуль-терминированную строку&lt;br /&gt;
&lt;br /&gt;
Данные хранить как буффер для строки и ее размер. Строку хранить НЕ как нуль-терминированную.&lt;br /&gt;
В приведенном выше ключевое слово const не используется умышленно.&lt;br /&gt;
&lt;br /&gt;
Дополнительное задание - реализовать строку с таким же интерфейсом, но реализующую стратегию Copy On Write (COW)&lt;br /&gt;
&lt;br /&gt;
==Smart FILE==&lt;br /&gt;
==Rational==&lt;br /&gt;
Напишите класс работающий с рациональными числами и определите следующие операторы:&lt;br /&gt;
* ostream &amp;lt;&amp;lt;&lt;br /&gt;
* istream &amp;gt;&amp;gt;&lt;br /&gt;
* +=&lt;br /&gt;
* -=&lt;br /&gt;
* *=&lt;br /&gt;
* /=&lt;br /&gt;
* +&lt;br /&gt;
* - бинарный&lt;br /&gt;
* - унарный&lt;br /&gt;
* *&lt;br /&gt;
* /&lt;br /&gt;
* ++ префиксный&lt;br /&gt;
* ++ постфиксный&lt;br /&gt;
* -- префиксный&lt;br /&gt;
* -- постфиксный&lt;br /&gt;
* ==&lt;br /&gt;
* !=&lt;br /&gt;
* &amp;lt;&lt;br /&gt;
* &amp;gt;&lt;br /&gt;
* &amp;lt;=&lt;br /&gt;
* &amp;gt;=&lt;br /&gt;
&lt;br /&gt;
=Smar pointers=&lt;br /&gt;
Реализовать шаблонный scoped_ptr&lt;br /&gt;
[http://www.boost.org/doc/libs/1_52_0/libs/smart_ptr/scoped_ptr.htm]&lt;/div&gt;</summary>
		<author><name>AM5800</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=%D0%93%D1%80%D1%83%D0%BF%D0%BF%D0%B0_%D0%9C%D0%B8%D1%85%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%D0%B0&amp;diff=2084</id>
		<title>Группа Михайлова</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=%D0%93%D1%80%D1%83%D0%BF%D0%BF%D0%B0_%D0%9C%D0%B8%D1%85%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%D0%B0&amp;diff=2084"/>
				<updated>2012-12-12T20:27:10Z</updated>
		
		<summary type="html">&lt;p&gt;AM5800: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Общее=&lt;br /&gt;
[https://docs.google.com/spreadsheet/ccc?key=0AhBJfSfjgJfGdEw1RlNXeWhlY1M0MGJacXQ1WXM0d2c&amp;amp;pli=1#gid=0 Результаты]&lt;br /&gt;
&lt;br /&gt;
=Интересные ссылки=&lt;br /&gt;
[http://pages.cs.wisc.edu/~driscoll/typename.html O typename]&lt;br /&gt;
&lt;br /&gt;
[http://habrahabr.ru/post/112953/ Об арифметике с плавающей запятой]&lt;br /&gt;
&lt;br /&gt;
=Задания=&lt;br /&gt;
==Компиляция==&lt;br /&gt;
&lt;br /&gt;
Напишите псевдо код на основе ассемблерного кода в который разворачивается инструкция for:&lt;br /&gt;
 for (int i = 0; i &amp;lt; N; ++i) {&lt;br /&gt;
 //body&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Пример псевдокода:&lt;br /&gt;
 if (a == 5) goto mark1&lt;br /&gt;
 something&lt;br /&gt;
 mark1:&lt;br /&gt;
Чем плоха конструкция&lt;br /&gt;
  #define MAX(a, b) a &amp;gt; b ? a : b&lt;br /&gt;
Приведите пример ее некорректного использования. (Возврат не максимального значения, побочные эффекты)&lt;br /&gt;
Как можно ее улучшить?&lt;br /&gt;
&lt;br /&gt;
Как работает линковка? Какую роль в ней играет relocation table&lt;br /&gt;
&lt;br /&gt;
==Сортировка слиянием==&lt;br /&gt;
Реализуйте алгоритм merge sort&lt;br /&gt;
&lt;br /&gt;
==Выделение памяти==&lt;br /&gt;
Создайте двумерный массив двумя способами.&lt;br /&gt;
1) Используя N + 1 аллокацию&lt;br /&gt;
2) Используя 2 аллокации&lt;br /&gt;
Замерьте, при каких значениях размера массива происходит экстерминатус? (Компилируйте 32 разрядную версию. 64 может и не упасть)&lt;br /&gt;
Какой вариант работает быстрее?&lt;br /&gt;
Подумайте, почему это происходит.&lt;br /&gt;
Обращаю внимание, что оба варианта созданных матриц должны иметь тип int**&lt;br /&gt;
&lt;br /&gt;
Усложненное задание - сделать матрицы трегольными и написать процедуру, сливающие 2 такие матрицы в прямоугольную&lt;br /&gt;
&lt;br /&gt;
==Расширяющийся массив==&lt;br /&gt;
Реализуйте класс расширяющегося массива.&lt;br /&gt;
Size - количество элементов в массиве.&lt;br /&gt;
Capacity - вместимость массива.&lt;br /&gt;
Size &amp;lt;= Capacity&lt;br /&gt;
Если при добавлении очередного элемента Size превышает Capacity, то Capacity следует увеличить вдвое&lt;br /&gt;
 struct Array {&lt;br /&gt;
   Array(size_t capacity = 3);&lt;br /&gt;
   Array(Array &amp;amp; array);&lt;br /&gt;
   ~Array();&lt;br /&gt;
   Array &amp;amp; operator=(Array &amp;amp; array);&lt;br /&gt;
   size_t Size();&lt;br /&gt;
   size_t Capacity();&lt;br /&gt;
   void Add(int value);&lt;br /&gt;
   int Get(size_t index);&lt;br /&gt;
   void Set(size_t index, int value);&lt;br /&gt;
   void Swap(Array &amp;amp; array);&lt;br /&gt;
  private:&lt;br /&gt;
   int* myData;&lt;br /&gt;
   size_t mySize;&lt;br /&gt;
   size_t myCapacity;&lt;br /&gt;
 };&lt;br /&gt;
==Обертка над FILE==&lt;br /&gt;
==String==&lt;br /&gt;
Реализовать класс String со следующими методами/требованиями&lt;br /&gt;
 String()&lt;br /&gt;
 String(String &amp;amp;)&lt;br /&gt;
 String(char *)&lt;br /&gt;
 operator=(String &amp;amp;)&lt;br /&gt;
 operator=(char *) //реализовывать не нужно. Объясните, почему?&lt;br /&gt;
 append(String &amp;amp;)&lt;br /&gt;
 char ? at(size_t) // реализовать в двух версиях. Константную и не константную&lt;br /&gt;
 char * c_str() - возвращает обычную нуль-терминированную строку&lt;br /&gt;
&lt;br /&gt;
Данные хранить как буффер для строки и ее размер. Строку хранить НЕ как нуль-терминированную.&lt;br /&gt;
В приведенном выше ключевое слово const не используется умышленно.&lt;br /&gt;
&lt;br /&gt;
Дополнительное задание - реализовать строку с таким же интерфейсом, но реализующую стратегию Copy On Write (COW)&lt;br /&gt;
&lt;br /&gt;
==Smart FILE==&lt;br /&gt;
==Rational==&lt;br /&gt;
Напишите класс работающий с рациональными числами и определите следующие операторы:&lt;br /&gt;
* ostream &amp;lt;&amp;lt;&lt;br /&gt;
* istream &amp;gt;&amp;gt;&lt;br /&gt;
* +=&lt;br /&gt;
* -=&lt;br /&gt;
* *=&lt;br /&gt;
* /=&lt;br /&gt;
* +&lt;br /&gt;
* - бинарный&lt;br /&gt;
* - унарный&lt;br /&gt;
* *&lt;br /&gt;
* /&lt;br /&gt;
* ++ префиксный&lt;br /&gt;
* ++ постфиксный&lt;br /&gt;
* -- префиксный&lt;br /&gt;
* -- постфиксный&lt;br /&gt;
* ==&lt;br /&gt;
* !=&lt;br /&gt;
* &amp;lt;&lt;br /&gt;
* &amp;gt;&lt;br /&gt;
* &amp;lt;=&lt;br /&gt;
* &amp;gt;=&lt;br /&gt;
&lt;br /&gt;
=Smar pointers=&lt;/div&gt;</summary>
		<author><name>AM5800</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=%D0%93%D1%80%D1%83%D0%BF%D0%BF%D0%B0_%D0%9C%D0%B8%D1%85%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%D0%B0&amp;diff=2077</id>
		<title>Группа Михайлова</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=%D0%93%D1%80%D1%83%D0%BF%D0%BF%D0%B0_%D0%9C%D0%B8%D1%85%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%D0%B0&amp;diff=2077"/>
				<updated>2012-12-07T13:47:03Z</updated>
		
		<summary type="html">&lt;p&gt;AM5800: /* Интересные ссылки */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Общее=&lt;br /&gt;
[https://docs.google.com/spreadsheet/ccc?key=0AhBJfSfjgJfGdEw1RlNXeWhlY1M0MGJacXQ1WXM0d2c&amp;amp;pli=1#gid=0 Результаты]&lt;br /&gt;
&lt;br /&gt;
=Интересные ссылки=&lt;br /&gt;
[http://pages.cs.wisc.edu/~driscoll/typename.html O typename]&lt;br /&gt;
&lt;br /&gt;
[http://habrahabr.ru/post/112953/ Об арифметике с плавающей запятой]&lt;br /&gt;
&lt;br /&gt;
=Задания=&lt;br /&gt;
==Компиляция==&lt;br /&gt;
&lt;br /&gt;
Напишите псевдо код на основе ассемблерного кода в который разворачивается инструкция for:&lt;br /&gt;
 for (int i = 0; i &amp;lt; N; ++i) {&lt;br /&gt;
 //body&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Пример псевдокода:&lt;br /&gt;
 if (a == 5) goto mark1&lt;br /&gt;
 something&lt;br /&gt;
 mark1:&lt;br /&gt;
Чем плоха конструкция&lt;br /&gt;
  #define MAX(a, b) a &amp;gt; b ? a : b&lt;br /&gt;
Приведите пример ее некорректного использования. (Возврат не максимального значения, побочные эффекты)&lt;br /&gt;
Как можно ее улучшить?&lt;br /&gt;
&lt;br /&gt;
Как работает линковка? Какую роль в ней играет relocation table&lt;br /&gt;
&lt;br /&gt;
==Сортировка слиянием==&lt;br /&gt;
Реализуйте алгоритм merge sort&lt;br /&gt;
&lt;br /&gt;
==Выделение памяти==&lt;br /&gt;
Создайте двумерный массив двумя способами.&lt;br /&gt;
1) Используя N + 1 аллокацию&lt;br /&gt;
2) Используя 2 аллокации&lt;br /&gt;
Замерьте, при каких значениях размера массива происходит экстерминатус? (Компилируйте 32 разрядную версию. 64 может и не упасть)&lt;br /&gt;
Какой вариант работает быстрее?&lt;br /&gt;
Подумайте, почему это происходит.&lt;br /&gt;
Обращаю внимание, что оба варианта созданных матриц должны иметь тип int**&lt;br /&gt;
&lt;br /&gt;
Усложненное задание - сделать матрицы трегольными и написать процедуру, сливающие 2 такие матрицы в прямоугольную&lt;br /&gt;
&lt;br /&gt;
==Расширяющийся массив==&lt;br /&gt;
Реализуйте класс расширяющегося массива.&lt;br /&gt;
Size - количество элементов в массиве.&lt;br /&gt;
Capacity - вместимость массива.&lt;br /&gt;
Size &amp;lt;= Capacity&lt;br /&gt;
Если при добавлении очередного элемента Size превышает Capacity, то Capacity следует увеличить вдвое&lt;br /&gt;
 struct Array {&lt;br /&gt;
   Array(size_t capacity = 3);&lt;br /&gt;
   Array(Array &amp;amp; array);&lt;br /&gt;
   ~Array();&lt;br /&gt;
   Array &amp;amp; operator=(Array &amp;amp; array);&lt;br /&gt;
   size_t Size();&lt;br /&gt;
   size_t Capacity();&lt;br /&gt;
   void Add(int value);&lt;br /&gt;
   int Get(size_t index);&lt;br /&gt;
   void Set(size_t index, int value);&lt;br /&gt;
   void Swap(Array &amp;amp; array);&lt;br /&gt;
  private:&lt;br /&gt;
   int* myData;&lt;br /&gt;
   size_t mySize;&lt;br /&gt;
   size_t myCapacity;&lt;br /&gt;
 };&lt;br /&gt;
==Обертка над FILE==&lt;br /&gt;
==String==&lt;br /&gt;
Реализовать класс String со следующими методами/требованиями&lt;br /&gt;
 String()&lt;br /&gt;
 String(String &amp;amp;)&lt;br /&gt;
 String(char *)&lt;br /&gt;
 operator=(String &amp;amp;)&lt;br /&gt;
 operator=(char *) //реализовывать не нужно. Объясните, почему?&lt;br /&gt;
 append(String &amp;amp;)&lt;br /&gt;
 char ? at(size_t) // реализовать в двух версиях. Константную и не константную&lt;br /&gt;
 char * c_str() - возвращает обычную нуль-терминированную строку&lt;br /&gt;
&lt;br /&gt;
Данные хранить как буффер для строки и ее размер. Строку хранить НЕ как нуль-терминированную.&lt;br /&gt;
В приведенном выше ключевое слово const не используется умышленно.&lt;br /&gt;
&lt;br /&gt;
Дополнительное задание - реализовать строку с таким же интерфейсом, но реализующую стратегию Copy On Write (COW)&lt;br /&gt;
&lt;br /&gt;
==Smart FILE==&lt;br /&gt;
==Rational==&lt;br /&gt;
Напишите класс работающий с рациональными числами и определите следующие операторы:&lt;br /&gt;
* ostream &amp;lt;&amp;lt;&lt;br /&gt;
* istream &amp;gt;&amp;gt;&lt;br /&gt;
* +=&lt;br /&gt;
* -=&lt;br /&gt;
* *=&lt;br /&gt;
* /=&lt;br /&gt;
* +&lt;br /&gt;
* - бинарный&lt;br /&gt;
* - унарный&lt;br /&gt;
* *&lt;br /&gt;
* /&lt;br /&gt;
* ++ префиксный&lt;br /&gt;
* ++ постфиксный&lt;br /&gt;
* -- префиксный&lt;br /&gt;
* -- постфиксный&lt;br /&gt;
* ==&lt;br /&gt;
* !=&lt;br /&gt;
* &amp;lt;&lt;br /&gt;
* &amp;gt;&lt;br /&gt;
* &amp;lt;=&lt;br /&gt;
* &amp;gt;=&lt;/div&gt;</summary>
		<author><name>AM5800</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=%D0%93%D1%80%D1%83%D0%BF%D0%BF%D0%B0_%D0%9C%D0%B8%D1%85%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%D0%B0&amp;diff=2076</id>
		<title>Группа Михайлова</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=%D0%93%D1%80%D1%83%D0%BF%D0%BF%D0%B0_%D0%9C%D0%B8%D1%85%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%D0%B0&amp;diff=2076"/>
				<updated>2012-12-07T13:46:41Z</updated>
		
		<summary type="html">&lt;p&gt;AM5800: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Общее=&lt;br /&gt;
[https://docs.google.com/spreadsheet/ccc?key=0AhBJfSfjgJfGdEw1RlNXeWhlY1M0MGJacXQ1WXM0d2c&amp;amp;pli=1#gid=0 Результаты]&lt;br /&gt;
&lt;br /&gt;
=Интересные ссылки=&lt;br /&gt;
[http://pages.cs.wisc.edu/~driscoll/typename.html O typename]&lt;br /&gt;
[http://habrahabr.ru/post/112953/ Об арифметике с плавающей запятой]&lt;br /&gt;
&lt;br /&gt;
=Задания=&lt;br /&gt;
==Компиляция==&lt;br /&gt;
&lt;br /&gt;
Напишите псевдо код на основе ассемблерного кода в который разворачивается инструкция for:&lt;br /&gt;
 for (int i = 0; i &amp;lt; N; ++i) {&lt;br /&gt;
 //body&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Пример псевдокода:&lt;br /&gt;
 if (a == 5) goto mark1&lt;br /&gt;
 something&lt;br /&gt;
 mark1:&lt;br /&gt;
Чем плоха конструкция&lt;br /&gt;
  #define MAX(a, b) a &amp;gt; b ? a : b&lt;br /&gt;
Приведите пример ее некорректного использования. (Возврат не максимального значения, побочные эффекты)&lt;br /&gt;
Как можно ее улучшить?&lt;br /&gt;
&lt;br /&gt;
Как работает линковка? Какую роль в ней играет relocation table&lt;br /&gt;
&lt;br /&gt;
==Сортировка слиянием==&lt;br /&gt;
Реализуйте алгоритм merge sort&lt;br /&gt;
&lt;br /&gt;
==Выделение памяти==&lt;br /&gt;
Создайте двумерный массив двумя способами.&lt;br /&gt;
1) Используя N + 1 аллокацию&lt;br /&gt;
2) Используя 2 аллокации&lt;br /&gt;
Замерьте, при каких значениях размера массива происходит экстерминатус? (Компилируйте 32 разрядную версию. 64 может и не упасть)&lt;br /&gt;
Какой вариант работает быстрее?&lt;br /&gt;
Подумайте, почему это происходит.&lt;br /&gt;
Обращаю внимание, что оба варианта созданных матриц должны иметь тип int**&lt;br /&gt;
&lt;br /&gt;
Усложненное задание - сделать матрицы трегольными и написать процедуру, сливающие 2 такие матрицы в прямоугольную&lt;br /&gt;
&lt;br /&gt;
==Расширяющийся массив==&lt;br /&gt;
Реализуйте класс расширяющегося массива.&lt;br /&gt;
Size - количество элементов в массиве.&lt;br /&gt;
Capacity - вместимость массива.&lt;br /&gt;
Size &amp;lt;= Capacity&lt;br /&gt;
Если при добавлении очередного элемента Size превышает Capacity, то Capacity следует увеличить вдвое&lt;br /&gt;
 struct Array {&lt;br /&gt;
   Array(size_t capacity = 3);&lt;br /&gt;
   Array(Array &amp;amp; array);&lt;br /&gt;
   ~Array();&lt;br /&gt;
   Array &amp;amp; operator=(Array &amp;amp; array);&lt;br /&gt;
   size_t Size();&lt;br /&gt;
   size_t Capacity();&lt;br /&gt;
   void Add(int value);&lt;br /&gt;
   int Get(size_t index);&lt;br /&gt;
   void Set(size_t index, int value);&lt;br /&gt;
   void Swap(Array &amp;amp; array);&lt;br /&gt;
  private:&lt;br /&gt;
   int* myData;&lt;br /&gt;
   size_t mySize;&lt;br /&gt;
   size_t myCapacity;&lt;br /&gt;
 };&lt;br /&gt;
==Обертка над FILE==&lt;br /&gt;
==String==&lt;br /&gt;
Реализовать класс String со следующими методами/требованиями&lt;br /&gt;
 String()&lt;br /&gt;
 String(String &amp;amp;)&lt;br /&gt;
 String(char *)&lt;br /&gt;
 operator=(String &amp;amp;)&lt;br /&gt;
 operator=(char *) //реализовывать не нужно. Объясните, почему?&lt;br /&gt;
 append(String &amp;amp;)&lt;br /&gt;
 char ? at(size_t) // реализовать в двух версиях. Константную и не константную&lt;br /&gt;
 char * c_str() - возвращает обычную нуль-терминированную строку&lt;br /&gt;
&lt;br /&gt;
Данные хранить как буффер для строки и ее размер. Строку хранить НЕ как нуль-терминированную.&lt;br /&gt;
В приведенном выше ключевое слово const не используется умышленно.&lt;br /&gt;
&lt;br /&gt;
Дополнительное задание - реализовать строку с таким же интерфейсом, но реализующую стратегию Copy On Write (COW)&lt;br /&gt;
&lt;br /&gt;
==Smart FILE==&lt;br /&gt;
==Rational==&lt;br /&gt;
Напишите класс работающий с рациональными числами и определите следующие операторы:&lt;br /&gt;
* ostream &amp;lt;&amp;lt;&lt;br /&gt;
* istream &amp;gt;&amp;gt;&lt;br /&gt;
* +=&lt;br /&gt;
* -=&lt;br /&gt;
* *=&lt;br /&gt;
* /=&lt;br /&gt;
* +&lt;br /&gt;
* - бинарный&lt;br /&gt;
* - унарный&lt;br /&gt;
* *&lt;br /&gt;
* /&lt;br /&gt;
* ++ префиксный&lt;br /&gt;
* ++ постфиксный&lt;br /&gt;
* -- префиксный&lt;br /&gt;
* -- постфиксный&lt;br /&gt;
* ==&lt;br /&gt;
* !=&lt;br /&gt;
* &amp;lt;&lt;br /&gt;
* &amp;gt;&lt;br /&gt;
* &amp;lt;=&lt;br /&gt;
* &amp;gt;=&lt;/div&gt;</summary>
		<author><name>AM5800</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=%D0%93%D1%80%D1%83%D0%BF%D0%BF%D0%B0_%D0%9C%D0%B8%D1%85%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%D0%B0&amp;diff=2012</id>
		<title>Группа Михайлова</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=%D0%93%D1%80%D1%83%D0%BF%D0%BF%D0%B0_%D0%9C%D0%B8%D1%85%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%D0%B0&amp;diff=2012"/>
				<updated>2012-11-23T12:06:57Z</updated>
		
		<summary type="html">&lt;p&gt;AM5800: /* Общее */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Общее=&lt;br /&gt;
[https://docs.google.com/spreadsheet/ccc?key=0AhBJfSfjgJfGdEw1RlNXeWhlY1M0MGJacXQ1WXM0d2c&amp;amp;pli=1#gid=0 Результаты]&lt;br /&gt;
&lt;br /&gt;
=Задания=&lt;br /&gt;
==Компиляция==&lt;br /&gt;
&lt;br /&gt;
Напишите псевдо код на основе ассемблерного кода в который разворачивается инструкция for:&lt;br /&gt;
 for (int i = 0; i &amp;lt; N; ++i) {&lt;br /&gt;
 //body&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Пример псевдокода:&lt;br /&gt;
 if (a == 5) goto mark1&lt;br /&gt;
 something&lt;br /&gt;
 mark1:&lt;br /&gt;
Чем плоха конструкция&lt;br /&gt;
  #define MAX(a, b) a &amp;gt; b ? a : b&lt;br /&gt;
Приведите пример ее некорректного использования. (Возврат не максимального значения, побочные эффекты)&lt;br /&gt;
Как можно ее улучшить?&lt;br /&gt;
&lt;br /&gt;
Как работает линковка? Какую роль в ней играет relocation table&lt;br /&gt;
&lt;br /&gt;
==Сортировка слиянием==&lt;br /&gt;
Реализуйте алгоритм merge sort&lt;br /&gt;
&lt;br /&gt;
==Выделение памяти==&lt;br /&gt;
Создайте двумерный массив двумя способами.&lt;br /&gt;
1) Используя N + 1 аллокацию&lt;br /&gt;
2) Используя 2 аллокации&lt;br /&gt;
Замерьте, при каких значениях размера массива происходит экстерминатус? (Компилируйте 32 разрядную версию. 64 может и не упасть)&lt;br /&gt;
Какой вариант работает быстрее?&lt;br /&gt;
Подумайте, почему это происходит.&lt;br /&gt;
Обращаю внимание, что оба варианта созданных матриц должны иметь тип int**&lt;br /&gt;
&lt;br /&gt;
Усложненное задание - сделать матрицы трегольными и написать процедуру, сливающие 2 такие матрицы в прямоугольную&lt;br /&gt;
&lt;br /&gt;
==Расширяющийся массив==&lt;br /&gt;
Реализуйте класс расширяющегося массива.&lt;br /&gt;
Size - количество элементов в массиве.&lt;br /&gt;
Capacity - вместимость массива.&lt;br /&gt;
Size &amp;lt;= Capacity&lt;br /&gt;
Если при добавлении очередного элемента Size превышает Capacity, то Capacity следует увеличить вдвое&lt;br /&gt;
 struct Array {&lt;br /&gt;
   Array(size_t capacity = 3);&lt;br /&gt;
   Array(Array &amp;amp; array);&lt;br /&gt;
   ~Array();&lt;br /&gt;
   Array &amp;amp; operator=(Array &amp;amp; array);&lt;br /&gt;
   size_t Size();&lt;br /&gt;
   size_t Capacity();&lt;br /&gt;
   void Add(int value);&lt;br /&gt;
   int Get(size_t index);&lt;br /&gt;
   void Set(size_t index, int value);&lt;br /&gt;
   void Swap(Array &amp;amp; array);&lt;br /&gt;
  private:&lt;br /&gt;
   int* myData;&lt;br /&gt;
   size_t mySize;&lt;br /&gt;
   size_t myCapacity;&lt;br /&gt;
 };&lt;br /&gt;
==Обертка над FILE==&lt;br /&gt;
==String==&lt;br /&gt;
Реализовать класс String со следующими методами/требованиями&lt;br /&gt;
 String()&lt;br /&gt;
 String(String &amp;amp;)&lt;br /&gt;
 String(char *)&lt;br /&gt;
 operator=(String &amp;amp;)&lt;br /&gt;
 operator=(char *) //реализовывать не нужно. Объясните, почему?&lt;br /&gt;
 append(String &amp;amp;)&lt;br /&gt;
 char ? at(size_t) // реализовать в двух версиях. Константную и не константную&lt;br /&gt;
 char * c_str() - возвращает обычную нуль-терминированную строку&lt;br /&gt;
&lt;br /&gt;
Данные хранить как буффер для строки и ее размер. Строку хранить НЕ как нуль-терминированную.&lt;br /&gt;
В приведенном выше ключевое слово const не используется умышленно.&lt;br /&gt;
&lt;br /&gt;
Дополнительное задание - реализовать строку с таким же интерфейсом, но реализующую стратегию Copy On Write (COW)&lt;br /&gt;
&lt;br /&gt;
==Smart FILE==&lt;br /&gt;
==Rational==&lt;br /&gt;
Напишите класс работающий с рациональными числами и определите следующие операторы:&lt;br /&gt;
* ostream &amp;lt;&amp;lt;&lt;br /&gt;
* istream &amp;gt;&amp;gt;&lt;br /&gt;
* +=&lt;br /&gt;
* -=&lt;br /&gt;
* *=&lt;br /&gt;
* /=&lt;br /&gt;
* +&lt;br /&gt;
* - бинарный&lt;br /&gt;
* - унарный&lt;br /&gt;
* *&lt;br /&gt;
* /&lt;br /&gt;
* ++ префиксный&lt;br /&gt;
* ++ постфиксный&lt;br /&gt;
* -- префиксный&lt;br /&gt;
* -- постфиксный&lt;br /&gt;
* ==&lt;br /&gt;
* !=&lt;br /&gt;
* &amp;lt;&lt;br /&gt;
* &amp;gt;&lt;br /&gt;
* &amp;lt;=&lt;br /&gt;
* &amp;gt;=&lt;/div&gt;</summary>
		<author><name>AM5800</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=%D0%93%D1%80%D1%83%D0%BF%D0%BF%D0%B0_%D0%9C%D0%B8%D1%85%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%D0%B0&amp;diff=2011</id>
		<title>Группа Михайлова</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=%D0%93%D1%80%D1%83%D0%BF%D0%BF%D0%B0_%D0%9C%D0%B8%D1%85%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%D0%B0&amp;diff=2011"/>
				<updated>2012-11-23T12:03:33Z</updated>
		
		<summary type="html">&lt;p&gt;AM5800: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Общее=&lt;br /&gt;
&lt;br /&gt;
=Задания=&lt;br /&gt;
==Компиляция==&lt;br /&gt;
&lt;br /&gt;
Напишите псевдо код на основе ассемблерного кода в который разворачивается инструкция for:&lt;br /&gt;
 for (int i = 0; i &amp;lt; N; ++i) {&lt;br /&gt;
 //body&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Пример псевдокода:&lt;br /&gt;
 if (a == 5) goto mark1&lt;br /&gt;
 something&lt;br /&gt;
 mark1:&lt;br /&gt;
Чем плоха конструкция&lt;br /&gt;
  #define MAX(a, b) a &amp;gt; b ? a : b&lt;br /&gt;
Приведите пример ее некорректного использования. (Возврат не максимального значения, побочные эффекты)&lt;br /&gt;
Как можно ее улучшить?&lt;br /&gt;
&lt;br /&gt;
Как работает линковка? Какую роль в ней играет relocation table&lt;br /&gt;
&lt;br /&gt;
==Сортировка слиянием==&lt;br /&gt;
Реализуйте алгоритм merge sort&lt;br /&gt;
&lt;br /&gt;
==Выделение памяти==&lt;br /&gt;
Создайте двумерный массив двумя способами.&lt;br /&gt;
1) Используя N + 1 аллокацию&lt;br /&gt;
2) Используя 2 аллокации&lt;br /&gt;
Замерьте, при каких значениях размера массива происходит экстерминатус? (Компилируйте 32 разрядную версию. 64 может и не упасть)&lt;br /&gt;
Какой вариант работает быстрее?&lt;br /&gt;
Подумайте, почему это происходит.&lt;br /&gt;
Обращаю внимание, что оба варианта созданных матриц должны иметь тип int**&lt;br /&gt;
&lt;br /&gt;
Усложненное задание - сделать матрицы трегольными и написать процедуру, сливающие 2 такие матрицы в прямоугольную&lt;br /&gt;
&lt;br /&gt;
==Расширяющийся массив==&lt;br /&gt;
Реализуйте класс расширяющегося массива.&lt;br /&gt;
Size - количество элементов в массиве.&lt;br /&gt;
Capacity - вместимость массива.&lt;br /&gt;
Size &amp;lt;= Capacity&lt;br /&gt;
Если при добавлении очередного элемента Size превышает Capacity, то Capacity следует увеличить вдвое&lt;br /&gt;
 struct Array {&lt;br /&gt;
   Array(size_t capacity = 3);&lt;br /&gt;
   Array(Array &amp;amp; array);&lt;br /&gt;
   ~Array();&lt;br /&gt;
   Array &amp;amp; operator=(Array &amp;amp; array);&lt;br /&gt;
   size_t Size();&lt;br /&gt;
   size_t Capacity();&lt;br /&gt;
   void Add(int value);&lt;br /&gt;
   int Get(size_t index);&lt;br /&gt;
   void Set(size_t index, int value);&lt;br /&gt;
   void Swap(Array &amp;amp; array);&lt;br /&gt;
  private:&lt;br /&gt;
   int* myData;&lt;br /&gt;
   size_t mySize;&lt;br /&gt;
   size_t myCapacity;&lt;br /&gt;
 };&lt;br /&gt;
==Обертка над FILE==&lt;br /&gt;
==String==&lt;br /&gt;
Реализовать класс String со следующими методами/требованиями&lt;br /&gt;
 String()&lt;br /&gt;
 String(String &amp;amp;)&lt;br /&gt;
 String(char *)&lt;br /&gt;
 operator=(String &amp;amp;)&lt;br /&gt;
 operator=(char *) //реализовывать не нужно. Объясните, почему?&lt;br /&gt;
 append(String &amp;amp;)&lt;br /&gt;
 char ? at(size_t) // реализовать в двух версиях. Константную и не константную&lt;br /&gt;
 char * c_str() - возвращает обычную нуль-терминированную строку&lt;br /&gt;
&lt;br /&gt;
Данные хранить как буффер для строки и ее размер. Строку хранить НЕ как нуль-терминированную.&lt;br /&gt;
В приведенном выше ключевое слово const не используется умышленно.&lt;br /&gt;
&lt;br /&gt;
Дополнительное задание - реализовать строку с таким же интерфейсом, но реализующую стратегию Copy On Write (COW)&lt;br /&gt;
&lt;br /&gt;
==Smart FILE==&lt;br /&gt;
==Rational==&lt;br /&gt;
Напишите класс работающий с рациональными числами и определите следующие операторы:&lt;br /&gt;
* ostream &amp;lt;&amp;lt;&lt;br /&gt;
* istream &amp;gt;&amp;gt;&lt;br /&gt;
* +=&lt;br /&gt;
* -=&lt;br /&gt;
* *=&lt;br /&gt;
* /=&lt;br /&gt;
* +&lt;br /&gt;
* - бинарный&lt;br /&gt;
* - унарный&lt;br /&gt;
* *&lt;br /&gt;
* /&lt;br /&gt;
* ++ префиксный&lt;br /&gt;
* ++ постфиксный&lt;br /&gt;
* -- префиксный&lt;br /&gt;
* -- постфиксный&lt;br /&gt;
* ==&lt;br /&gt;
* !=&lt;br /&gt;
* &amp;lt;&lt;br /&gt;
* &amp;gt;&lt;br /&gt;
* &amp;lt;=&lt;br /&gt;
* &amp;gt;=&lt;/div&gt;</summary>
		<author><name>AM5800</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=%D0%93%D1%80%D1%83%D0%BF%D0%BF%D0%B0_%D0%9C%D0%B8%D1%85%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%D0%B0&amp;diff=1742</id>
		<title>Группа Михайлова</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=%D0%93%D1%80%D1%83%D0%BF%D0%BF%D0%B0_%D0%9C%D0%B8%D1%85%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%D0%B0&amp;diff=1742"/>
				<updated>2012-11-03T18:37:04Z</updated>
		
		<summary type="html">&lt;p&gt;AM5800: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Общее=&lt;br /&gt;
&lt;br /&gt;
=Задания=&lt;br /&gt;
==Компиляция==&lt;br /&gt;
&lt;br /&gt;
Напишите псевдо код на основе ассемблерного кода в который разворачивается инструкция for:&lt;br /&gt;
 for (int i = 0; i &amp;lt; N; ++i) {&lt;br /&gt;
 //body&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Пример псевдокода:&lt;br /&gt;
 if (a == 5) goto mark1&lt;br /&gt;
 something&lt;br /&gt;
 mark1:&lt;br /&gt;
Чем плоха конструкция&lt;br /&gt;
  #define MAX(a, b) a &amp;gt; b ? a : b&lt;br /&gt;
Приведите пример ее некорректного использования. (Возврат не максимального значения, побочные эффекты)&lt;br /&gt;
Как можно ее улучшить?&lt;br /&gt;
&lt;br /&gt;
Как работает линковка? Какую роль в ней играет relocation table&lt;br /&gt;
&lt;br /&gt;
==Сортировка слиянием==&lt;br /&gt;
Реализуйте алгоритм merge sort&lt;br /&gt;
&lt;br /&gt;
==Выделение памяти==&lt;br /&gt;
Создайте двумерный массив двумя способами.&lt;br /&gt;
1) Используя N + 1 аллокацию&lt;br /&gt;
2) Используя 2 аллокации&lt;br /&gt;
Замерьте, при каких значениях размера массива происходит экстерминатус? (Компилируйте 32 разрядную версию. 64 может и не упасть)&lt;br /&gt;
Какой вариант работает быстрее?&lt;br /&gt;
Подумайте, почему это происходит.&lt;br /&gt;
Обращаю внимание, что оба варианта созданных матриц должны иметь тип int**&lt;br /&gt;
&lt;br /&gt;
Усложненное задание - сделать матрицы трегольными и написать процедуру, сливающие 2 такие матрицы в прямоугольную&lt;br /&gt;
&lt;br /&gt;
==Расширяющийся массив==&lt;br /&gt;
Реализуйте класс расширяющегося массива.&lt;br /&gt;
Size - количество элементов в массиве.&lt;br /&gt;
Capacity - вместимость массива.&lt;br /&gt;
Size &amp;lt;= Capacity&lt;br /&gt;
Если при добавлении очередного элемента Size превышает Capacity, то Capacity следует увеличить вдвое&lt;br /&gt;
 struct Array {&lt;br /&gt;
   Array(size_t capacity = 3);&lt;br /&gt;
   Array(Array &amp;amp; array);&lt;br /&gt;
   ~Array();&lt;br /&gt;
   Array &amp;amp; operator=(Array &amp;amp; array);&lt;br /&gt;
   size_t Size();&lt;br /&gt;
   size_t Capacity();&lt;br /&gt;
   void Add(int value);&lt;br /&gt;
   int Get(size_t index);&lt;br /&gt;
   void Set(size_t index, int value);&lt;br /&gt;
   void Swap(Array &amp;amp; array);&lt;br /&gt;
  private:&lt;br /&gt;
   int* myData;&lt;br /&gt;
   size_t mySize;&lt;br /&gt;
   size_t myCapacity;&lt;br /&gt;
 };&lt;br /&gt;
==Обертка над FILE==&lt;br /&gt;
==String==&lt;br /&gt;
Реализовать класс String со следующими методами/требованиями&lt;br /&gt;
 String()&lt;br /&gt;
 String(String &amp;amp;)&lt;br /&gt;
 String(char *)&lt;br /&gt;
 operator=(String &amp;amp;)&lt;br /&gt;
 operator=(char *) //реализовывать не нужно. Объясните, почему?&lt;br /&gt;
 append(String &amp;amp;)&lt;br /&gt;
 char ? at(size_t) // реализовать в двух версиях. Константную и не константную&lt;br /&gt;
 char * c_str() - возвращает обычную нуль-терминированную строку&lt;br /&gt;
&lt;br /&gt;
Данные хранить как буффер для строки и ее размер. Строку хранить НЕ как нуль-терминированную.&lt;br /&gt;
В приведенном выше ключевое слово const не используется умышленно.&lt;br /&gt;
&lt;br /&gt;
Дополнительное задание - реализовать строку с таким же интерфейсом, но реализующую стратегию Copy On Write (COW)&lt;br /&gt;
&lt;br /&gt;
==Smart FILE==&lt;/div&gt;</summary>
		<author><name>AM5800</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=%D0%93%D1%80%D1%83%D0%BF%D0%BF%D0%B0_%D0%9C%D0%B8%D1%85%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%D0%B0&amp;diff=1741</id>
		<title>Группа Михайлова</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=%D0%93%D1%80%D1%83%D0%BF%D0%BF%D0%B0_%D0%9C%D0%B8%D1%85%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%D0%B0&amp;diff=1741"/>
				<updated>2012-11-03T18:28:47Z</updated>
		
		<summary type="html">&lt;p&gt;AM5800: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Компиляция==&lt;br /&gt;
&lt;br /&gt;
Напишите псевдо код на основе ассемблерного кода в который разворачивается инструкция for:&lt;br /&gt;
 for (int i = 0; i &amp;lt; N; ++i) {&lt;br /&gt;
 //body&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Пример псевдокода:&lt;br /&gt;
 if (a == 5) goto mark1&lt;br /&gt;
 something&lt;br /&gt;
 mark1:&lt;br /&gt;
Чем плоха конструкция&lt;br /&gt;
  #define MAX(a, b) a &amp;gt; b ? a : b&lt;br /&gt;
Приведите пример ее некорректного использования. (Возврат не максимального значения, побочные эффекты)&lt;br /&gt;
Как можно ее улучшить?&lt;br /&gt;
&lt;br /&gt;
Как работает линковка? Какую роль в ней играет relocation table&lt;br /&gt;
&lt;br /&gt;
==Сортировка слиянием==&lt;br /&gt;
Реализуйте алгоритм merge sort&lt;br /&gt;
&lt;br /&gt;
==Выделение памяти==&lt;br /&gt;
Создайте двумерный массив двумя способами.&lt;br /&gt;
1) Используя N + 1 аллокацию&lt;br /&gt;
2) Используя 2 аллокации&lt;br /&gt;
Замерьте, при каких значениях размера массива происходит экстерминатус? (Компилируйте 32 разрядную версию. 64 может и не упасть)&lt;br /&gt;
Какой вариант работает быстрее?&lt;br /&gt;
Подумайте, почему это происходит.&lt;br /&gt;
Обращаю внимание, что оба варианта созданных матриц должны иметь тип int**&lt;br /&gt;
&lt;br /&gt;
Усложненное задание - сделать матрицы трегольными и написать процедуру, сливающие 2 такие матрицы в прямоугольную&lt;br /&gt;
&lt;br /&gt;
==Расширяющийся массив==&lt;br /&gt;
Реализуйте класс расширяющегося массива.&lt;br /&gt;
Size - количество элементов в массиве.&lt;br /&gt;
Capacity - вместимость массива.&lt;br /&gt;
Size &amp;lt;= Capacity&lt;br /&gt;
Если при добавлении очередного элемента Size превышает Capacity, то Capacity следует увеличить вдвое&lt;br /&gt;
 struct Array {&lt;br /&gt;
   Array(size_t capacity = 3);&lt;br /&gt;
   Array(Array &amp;amp; array);&lt;br /&gt;
   ~Array();&lt;br /&gt;
   Array &amp;amp; operator=(Array &amp;amp; array);&lt;br /&gt;
   size_t Size();&lt;br /&gt;
   size_t Capacity();&lt;br /&gt;
   void Add(int value);&lt;br /&gt;
   int Get(size_t index);&lt;br /&gt;
   void Set(size_t index, int value);&lt;br /&gt;
   void Swap(Array &amp;amp; array);&lt;br /&gt;
  private:&lt;br /&gt;
   int* myData;&lt;br /&gt;
   size_t mySize;&lt;br /&gt;
   size_t myCapacity;&lt;br /&gt;
 };&lt;br /&gt;
==Обертка над FILE==&lt;br /&gt;
==String==&lt;br /&gt;
Реализовать класс String со следующими методами/требованиями&lt;br /&gt;
 String()&lt;br /&gt;
 String(String &amp;amp;)&lt;br /&gt;
 String(char *)&lt;br /&gt;
 operator=(String &amp;amp;)&lt;br /&gt;
 operator=(char *) //реализовывать не нужно. Объясните, почему?&lt;br /&gt;
 append(String &amp;amp;)&lt;br /&gt;
 char ? at(size_t) // реализовать в двух версиях. Константную и не константную&lt;br /&gt;
 char * c_str() - возвращает обычную нуль-терминированную строку&lt;br /&gt;
&lt;br /&gt;
Данные хранить как буффер для строки и ее размер. Строку хранить НЕ как нуль-терминированную.&lt;br /&gt;
В приведенном выше ключевое слово const не используется умышленно.&lt;br /&gt;
&lt;br /&gt;
Дополнительное задание - реализовать строку с таким же интерфейсом, но реализующую стратегию Copy On Write (COW)&lt;br /&gt;
&lt;br /&gt;
==Smart FILE==&lt;/div&gt;</summary>
		<author><name>AM5800</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=%D0%93%D1%80%D1%83%D0%BF%D0%BF%D0%B0_%D0%9C%D0%B8%D1%85%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%D0%B0&amp;diff=1740</id>
		<title>Группа Михайлова</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=%D0%93%D1%80%D1%83%D0%BF%D0%BF%D0%B0_%D0%9C%D0%B8%D1%85%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%D0%B0&amp;diff=1740"/>
				<updated>2012-11-03T18:28:09Z</updated>
		
		<summary type="html">&lt;p&gt;AM5800: /* 6. String */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==1. Компиляция==&lt;br /&gt;
&lt;br /&gt;
Напишите псевдо код на основе ассемблерного кода в который разворачивается инструкция for:&lt;br /&gt;
 for (int i = 0; i &amp;lt; N; ++i) {&lt;br /&gt;
 //body&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Пример псевдокода:&lt;br /&gt;
 if (a == 5) goto mark1&lt;br /&gt;
 something&lt;br /&gt;
 mark1:&lt;br /&gt;
Чем плоха конструкция&lt;br /&gt;
  #define MAX(a, b) a &amp;gt; b ? a : b&lt;br /&gt;
Приведите пример ее некорректного использования. (Возврат не максимального значения, побочные эффекты)&lt;br /&gt;
Как можно ее улучшить?&lt;br /&gt;
&lt;br /&gt;
Как работает линковка? Какую роль в ней играет relocation table&lt;br /&gt;
&lt;br /&gt;
==2. Сортировка слиянием==&lt;br /&gt;
Реализуйте алгоритм merge sort&lt;br /&gt;
&lt;br /&gt;
==3. Выделение памяти==&lt;br /&gt;
Создайте двумерный массив двумя способами.&lt;br /&gt;
1) Используя N + 1 аллокацию&lt;br /&gt;
2) Используя 2 аллокации&lt;br /&gt;
Замерьте, при каких значениях размера массива происходит экстерминатус? (Компилируйте 32 разрядную версию. 64 может и не упасть)&lt;br /&gt;
Какой вариант работает быстрее?&lt;br /&gt;
Подумайте, почему это происходит.&lt;br /&gt;
Обращаю внимание, что оба варианта созданных матриц должны иметь тип int**&lt;br /&gt;
&lt;br /&gt;
Усложненное задание - сделать матрицы трегольными и написать процедуру, сливающие 2 такие матрицы в прямоугольную&lt;br /&gt;
&lt;br /&gt;
==4. Расширяющийся массив==&lt;br /&gt;
Реализуйте класс расширяющегося массива.&lt;br /&gt;
Size - количество элементов в массиве.&lt;br /&gt;
Capacity - вместимость массива.&lt;br /&gt;
Size &amp;lt;= Capacity&lt;br /&gt;
Если при добавлении очередного элемента Size превышает Capacity, то Capacity следует увеличить вдвое&lt;br /&gt;
 struct Array {&lt;br /&gt;
   Array(size_t capacity = 3);&lt;br /&gt;
   Array(Array &amp;amp; array);&lt;br /&gt;
   ~Array();&lt;br /&gt;
   Array &amp;amp; operator=(Array &amp;amp; array);&lt;br /&gt;
   size_t Size();&lt;br /&gt;
   size_t Capacity();&lt;br /&gt;
   void Add(int value);&lt;br /&gt;
   int Get(size_t index);&lt;br /&gt;
   void Set(size_t index, int value);&lt;br /&gt;
   void Swap(Array &amp;amp; array);&lt;br /&gt;
  private:&lt;br /&gt;
   int* myData;&lt;br /&gt;
   size_t mySize;&lt;br /&gt;
   size_t myCapacity;&lt;br /&gt;
 };&lt;br /&gt;
==5. Обертка над FILE==&lt;br /&gt;
==6. String==&lt;br /&gt;
Реализовать класс String со следующими методами/требованиями&lt;br /&gt;
 String()&lt;br /&gt;
 String(String &amp;amp;)&lt;br /&gt;
 String(char *)&lt;br /&gt;
 operator=(String &amp;amp;)&lt;br /&gt;
 operator=(char *) //реализовывать не нужно. Объясните, почему?&lt;br /&gt;
 append(String &amp;amp;)&lt;br /&gt;
 char ? at(size_t) // реализовать в двух версиях. Константную и не константную&lt;br /&gt;
 char * c_str() - возвращает обычную нуль-терминированную строку&lt;br /&gt;
&lt;br /&gt;
Данные хранить как буффер для строки и ее размер. Строку хранить НЕ как нуль-терминированную.&lt;br /&gt;
В приведенном выше ключевое слово const не используется умышленно.&lt;br /&gt;
&lt;br /&gt;
Дополнительное задание - реализовать строку с таким же интерфейсом, но реализующую стратегию Copy On Write (COW)&lt;br /&gt;
&lt;br /&gt;
==7. Smart FILE==&lt;/div&gt;</summary>
		<author><name>AM5800</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=%D0%93%D1%80%D1%83%D0%BF%D0%BF%D0%B0_%D0%9C%D0%B8%D1%85%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%D0%B0&amp;diff=1739</id>
		<title>Группа Михайлова</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=%D0%93%D1%80%D1%83%D0%BF%D0%BF%D0%B0_%D0%9C%D0%B8%D1%85%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%D0%B0&amp;diff=1739"/>
				<updated>2012-11-03T18:27:25Z</updated>
		
		<summary type="html">&lt;p&gt;AM5800: /* 6. String */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==1. Компиляция==&lt;br /&gt;
&lt;br /&gt;
Напишите псевдо код на основе ассемблерного кода в который разворачивается инструкция for:&lt;br /&gt;
 for (int i = 0; i &amp;lt; N; ++i) {&lt;br /&gt;
 //body&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Пример псевдокода:&lt;br /&gt;
 if (a == 5) goto mark1&lt;br /&gt;
 something&lt;br /&gt;
 mark1:&lt;br /&gt;
Чем плоха конструкция&lt;br /&gt;
  #define MAX(a, b) a &amp;gt; b ? a : b&lt;br /&gt;
Приведите пример ее некорректного использования. (Возврат не максимального значения, побочные эффекты)&lt;br /&gt;
Как можно ее улучшить?&lt;br /&gt;
&lt;br /&gt;
Как работает линковка? Какую роль в ней играет relocation table&lt;br /&gt;
&lt;br /&gt;
==2. Сортировка слиянием==&lt;br /&gt;
Реализуйте алгоритм merge sort&lt;br /&gt;
&lt;br /&gt;
==3. Выделение памяти==&lt;br /&gt;
Создайте двумерный массив двумя способами.&lt;br /&gt;
1) Используя N + 1 аллокацию&lt;br /&gt;
2) Используя 2 аллокации&lt;br /&gt;
Замерьте, при каких значениях размера массива происходит экстерминатус? (Компилируйте 32 разрядную версию. 64 может и не упасть)&lt;br /&gt;
Какой вариант работает быстрее?&lt;br /&gt;
Подумайте, почему это происходит.&lt;br /&gt;
Обращаю внимание, что оба варианта созданных матриц должны иметь тип int**&lt;br /&gt;
&lt;br /&gt;
Усложненное задание - сделать матрицы трегольными и написать процедуру, сливающие 2 такие матрицы в прямоугольную&lt;br /&gt;
&lt;br /&gt;
==4. Расширяющийся массив==&lt;br /&gt;
Реализуйте класс расширяющегося массива.&lt;br /&gt;
Size - количество элементов в массиве.&lt;br /&gt;
Capacity - вместимость массива.&lt;br /&gt;
Size &amp;lt;= Capacity&lt;br /&gt;
Если при добавлении очередного элемента Size превышает Capacity, то Capacity следует увеличить вдвое&lt;br /&gt;
 struct Array {&lt;br /&gt;
   Array(size_t capacity = 3);&lt;br /&gt;
   Array(Array &amp;amp; array);&lt;br /&gt;
   ~Array();&lt;br /&gt;
   Array &amp;amp; operator=(Array &amp;amp; array);&lt;br /&gt;
   size_t Size();&lt;br /&gt;
   size_t Capacity();&lt;br /&gt;
   void Add(int value);&lt;br /&gt;
   int Get(size_t index);&lt;br /&gt;
   void Set(size_t index, int value);&lt;br /&gt;
   void Swap(Array &amp;amp; array);&lt;br /&gt;
  private:&lt;br /&gt;
   int* myData;&lt;br /&gt;
   size_t mySize;&lt;br /&gt;
   size_t myCapacity;&lt;br /&gt;
 };&lt;br /&gt;
==5. Обертка над FILE==&lt;br /&gt;
==6. String==&lt;br /&gt;
Реализовать класс String со следующими методами/требованиями&lt;br /&gt;
 String()&lt;br /&gt;
 String(String &amp;amp;)&lt;br /&gt;
 String(char *)&lt;br /&gt;
 operator=(String &amp;amp;)&lt;br /&gt;
 operator=(char *) //реализовывать не нужно. Объясните, почему?&lt;br /&gt;
 append(String &amp;amp;)&lt;br /&gt;
 char ? at(size_t) // реализовать в двух версиях. Константную и не константную&lt;br /&gt;
 char * c_str() - возвращает обычную нуль-терминированную строку&lt;br /&gt;
&lt;br /&gt;
Данные хранить как буффер для строки и ее размер. Строку хранить НЕ как нуль-терминированную.&lt;br /&gt;
В приведенном выше ключевое слово const не используется умышленно.&lt;br /&gt;
&lt;br /&gt;
==7. Smart FILE==&lt;/div&gt;</summary>
		<author><name>AM5800</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=%D0%93%D1%80%D1%83%D0%BF%D0%BF%D0%B0_%D0%9C%D0%B8%D1%85%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%D0%B0&amp;diff=1738</id>
		<title>Группа Михайлова</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=%D0%93%D1%80%D1%83%D0%BF%D0%BF%D0%B0_%D0%9C%D0%B8%D1%85%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%D0%B0&amp;diff=1738"/>
				<updated>2012-11-03T18:25:05Z</updated>
		
		<summary type="html">&lt;p&gt;AM5800: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==1. Компиляция==&lt;br /&gt;
&lt;br /&gt;
Напишите псевдо код на основе ассемблерного кода в который разворачивается инструкция for:&lt;br /&gt;
 for (int i = 0; i &amp;lt; N; ++i) {&lt;br /&gt;
 //body&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Пример псевдокода:&lt;br /&gt;
 if (a == 5) goto mark1&lt;br /&gt;
 something&lt;br /&gt;
 mark1:&lt;br /&gt;
Чем плоха конструкция&lt;br /&gt;
  #define MAX(a, b) a &amp;gt; b ? a : b&lt;br /&gt;
Приведите пример ее некорректного использования. (Возврат не максимального значения, побочные эффекты)&lt;br /&gt;
Как можно ее улучшить?&lt;br /&gt;
&lt;br /&gt;
Как работает линковка? Какую роль в ней играет relocation table&lt;br /&gt;
&lt;br /&gt;
==2. Сортировка слиянием==&lt;br /&gt;
Реализуйте алгоритм merge sort&lt;br /&gt;
&lt;br /&gt;
==3. Выделение памяти==&lt;br /&gt;
Создайте двумерный массив двумя способами.&lt;br /&gt;
1) Используя N + 1 аллокацию&lt;br /&gt;
2) Используя 2 аллокации&lt;br /&gt;
Замерьте, при каких значениях размера массива происходит экстерминатус? (Компилируйте 32 разрядную версию. 64 может и не упасть)&lt;br /&gt;
Какой вариант работает быстрее?&lt;br /&gt;
Подумайте, почему это происходит.&lt;br /&gt;
Обращаю внимание, что оба варианта созданных матриц должны иметь тип int**&lt;br /&gt;
&lt;br /&gt;
Усложненное задание - сделать матрицы трегольными и написать процедуру, сливающие 2 такие матрицы в прямоугольную&lt;br /&gt;
&lt;br /&gt;
==4. Расширяющийся массив==&lt;br /&gt;
Реализуйте класс расширяющегося массива.&lt;br /&gt;
Size - количество элементов в массиве.&lt;br /&gt;
Capacity - вместимость массива.&lt;br /&gt;
Size &amp;lt;= Capacity&lt;br /&gt;
Если при добавлении очередного элемента Size превышает Capacity, то Capacity следует увеличить вдвое&lt;br /&gt;
 struct Array {&lt;br /&gt;
   Array(size_t capacity = 3);&lt;br /&gt;
   Array(Array &amp;amp; array);&lt;br /&gt;
   ~Array();&lt;br /&gt;
   Array &amp;amp; operator=(Array &amp;amp; array);&lt;br /&gt;
   size_t Size();&lt;br /&gt;
   size_t Capacity();&lt;br /&gt;
   void Add(int value);&lt;br /&gt;
   int Get(size_t index);&lt;br /&gt;
   void Set(size_t index, int value);&lt;br /&gt;
   void Swap(Array &amp;amp; array);&lt;br /&gt;
  private:&lt;br /&gt;
   int* myData;&lt;br /&gt;
   size_t mySize;&lt;br /&gt;
   size_t myCapacity;&lt;br /&gt;
 };&lt;br /&gt;
==5. Обертка над FILE==&lt;br /&gt;
==6. String==&lt;br /&gt;
==7. Smart FILE==&lt;/div&gt;</summary>
		<author><name>AM5800</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=%D0%93%D1%80%D1%83%D0%BF%D0%BF%D0%B0_%D0%9C%D0%B8%D1%85%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%D0%B0&amp;diff=1737</id>
		<title>Группа Михайлова</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=%D0%93%D1%80%D1%83%D0%BF%D0%BF%D0%B0_%D0%9C%D0%B8%D1%85%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%D0%B0&amp;diff=1737"/>
				<updated>2012-11-03T18:15:09Z</updated>
		
		<summary type="html">&lt;p&gt;AM5800: /* 3. Выделение памяти */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==1. Компиляция==&lt;br /&gt;
&lt;br /&gt;
Напишите псевдо код на основе ассемблерного кода в который разворачивается инструкция for:&lt;br /&gt;
 for (int i=0; i &amp;lt; N; ++i) {&lt;br /&gt;
 //body&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Пример псевдокода:&lt;br /&gt;
 if (a == 5) goto mark1&lt;br /&gt;
 something&lt;br /&gt;
 mark1:&lt;br /&gt;
Чем плоха конструкция&lt;br /&gt;
  #define MAX(a, b) a &amp;gt; b ? a : b&lt;br /&gt;
Приведите пример ее некорректного использования. (Возврат не максимального значения, побочные эффекты)&lt;br /&gt;
Как можно ее улучшить?&lt;br /&gt;
&lt;br /&gt;
Как работает линковка? Какую роль в ней играет relocation table&lt;br /&gt;
&lt;br /&gt;
==2. Сортировка слиянием==&lt;br /&gt;
Реализуйте алгоритм merge sort&lt;br /&gt;
&lt;br /&gt;
==3. Выделение памяти==&lt;br /&gt;
Создайте двумерный массив двумя способами.&lt;br /&gt;
1) Используя N + 1 аллокацию&lt;br /&gt;
2) Используя 2 аллокации&lt;br /&gt;
Замерьте, при каких значениях размера массива происходит экстерминатус? (Компилируйте 32 разрядную версию. 64 может и не упасть)&lt;br /&gt;
Какой вариант работает быстрее?&lt;br /&gt;
Подумайте, почему это происходит.&lt;br /&gt;
Обращаю внимание, что оба варианта созданных матриц должны иметь тип int**&lt;br /&gt;
&lt;br /&gt;
Усложненное задание - сделать матрицы трегольными и написать процедуру, сливающие 2 такие матрицы в прямоугольную&lt;/div&gt;</summary>
		<author><name>AM5800</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=%D0%93%D1%80%D1%83%D0%BF%D0%BF%D0%B0_%D0%9C%D0%B8%D1%85%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%D0%B0&amp;diff=1736</id>
		<title>Группа Михайлова</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=%D0%93%D1%80%D1%83%D0%BF%D0%BF%D0%B0_%D0%9C%D0%B8%D1%85%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%D0%B0&amp;diff=1736"/>
				<updated>2012-11-03T18:14:13Z</updated>
		
		<summary type="html">&lt;p&gt;AM5800: Новая страница: «==1. Компиляция==  Напишите псевдо код на основе ассемблерного кода в который разворачивает…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==1. Компиляция==&lt;br /&gt;
&lt;br /&gt;
Напишите псевдо код на основе ассемблерного кода в который разворачивается инструкция for:&lt;br /&gt;
 for (int i=0; i &amp;lt; N; ++i) {&lt;br /&gt;
 //body&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Пример псевдокода:&lt;br /&gt;
 if (a == 5) goto mark1&lt;br /&gt;
 something&lt;br /&gt;
 mark1:&lt;br /&gt;
Чем плоха конструкция&lt;br /&gt;
  #define MAX(a, b) a &amp;gt; b ? a : b&lt;br /&gt;
Приведите пример ее некорректного использования. (Возврат не максимального значения, побочные эффекты)&lt;br /&gt;
Как можно ее улучшить?&lt;br /&gt;
&lt;br /&gt;
Как работает линковка? Какую роль в ней играет relocation table&lt;br /&gt;
&lt;br /&gt;
==2. Сортировка слиянием==&lt;br /&gt;
Реализуйте алгоритм merge sort&lt;br /&gt;
&lt;br /&gt;
==3. Выделение памяти==&lt;/div&gt;</summary>
		<author><name>AM5800</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=C_2012&amp;diff=1735</id>
		<title>C 2012</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=C_2012&amp;diff=1735"/>
				<updated>2012-11-03T17:59:46Z</updated>
		
		<summary type="html">&lt;p&gt;AM5800: /* Домашние задания */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Лектор - Смаль Александр Владимирович&lt;br /&gt;
&lt;br /&gt;
== Лекции ==&lt;br /&gt;
&lt;br /&gt;
== Домашние задания ==&lt;br /&gt;
Детали заданий могут различатся в различных группах.&lt;br /&gt;
&lt;br /&gt;
[[Группа Михайлова]]&lt;br /&gt;
&lt;br /&gt;
== Список литературы ==&lt;br /&gt;
&lt;br /&gt;
== Полезные ссылки ==&lt;/div&gt;</summary>
		<author><name>AM5800</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=C_2012&amp;diff=1734</id>
		<title>C 2012</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=C_2012&amp;diff=1734"/>
				<updated>2012-11-03T17:59:25Z</updated>
		
		<summary type="html">&lt;p&gt;AM5800: /* Домашние задания */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Лектор - Смаль Александр Владимирович&lt;br /&gt;
&lt;br /&gt;
== Лекции ==&lt;br /&gt;
&lt;br /&gt;
== Домашние задания ==&lt;br /&gt;
Детали заданий могут различатся в различных группах.&lt;br /&gt;
[[Группа Михайлова]]&lt;br /&gt;
&lt;br /&gt;
== Список литературы ==&lt;br /&gt;
&lt;br /&gt;
== Полезные ссылки ==&lt;/div&gt;</summary>
		<author><name>AM5800</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:AM5800&amp;diff=374</id>
		<title>Участник:AM5800</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:AM5800&amp;diff=374"/>
				<updated>2011-09-16T20:35:42Z</updated>
		
		<summary type="html">&lt;p&gt;AM5800: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Михайлов Александр Владимирович =&lt;br /&gt;
[[Файл:Alexander_Mikhailov.png|200px|right]]&lt;br /&gt;
e-mail: [mailto:AM5800@gmail.com AM5800@gmail.com]&lt;br /&gt;
&lt;br /&gt;
blog: [http://au-student.blogspot.com/ http://au-student.blogspot.com/]&lt;br /&gt;
&lt;br /&gt;
В 2010 году окончил СПбГУ ИТМО, Факультет Информационных Технологий и Программирования, Информатика и вычислительная техника&lt;br /&gt;
&lt;br /&gt;
Работаю в [http://www.jetbrains.com/ IntelliJ Labs (JetBrains)] в проекте [http://www.jetbrains.com/dotcover/ dotCover]&lt;/div&gt;</summary>
		<author><name>AM5800</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=CG_Earth&amp;diff=114</id>
		<title>CG Earth</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=CG_Earth&amp;diff=114"/>
				<updated>2011-03-18T00:31:32Z</updated>
		
		<summary type="html">&lt;p&gt;AM5800: /* Технологии */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Студенты: [[Участник:AM5800|Александр Михайлов]], Артем Бухонов&lt;br /&gt;
* Руководитель: [[Участник:kkv|Кринкин Кирилл Владимирович]]&lt;br /&gt;
[http://www.assembla.com/spaces/cg-earth Страница проекта на assembla.com] &lt;br /&gt;
&lt;br /&gt;
= Концепция =&lt;br /&gt;
Разработка программы для визуализации планеты Земля и некоторых, связанных с ней данных.&lt;br /&gt;
Задача включает в себя:&lt;br /&gt;
* Визуализацию поверхности планеты на основе картографических данных&lt;br /&gt;
* Расчет и визуализация атмосферных эффектов (Рассеяние Рэлея и Ми)&lt;br /&gt;
* Расчет корректного положения Земли в пространстве (т.е. учет времен года, времени суток)&lt;br /&gt;
* Необходимо обеспечить возможность по расчету и визуализации дополнительных, динамически добавляемых объектов (например - спутники, кометы, созвездия итп)&lt;br /&gt;
* Визуализировать реальное положение звезд на небе.&lt;br /&gt;
* Расчет и визуализация погодных эффектов (облака) (опционально)&lt;br /&gt;
 &lt;br /&gt;
Необходимо обеспечить приемлимое качество визуализации поверхности планеты, в диапазоне высот над уровнем моря: 10 км - 30 000 км.&lt;br /&gt;
&lt;br /&gt;
= Технологии =&lt;br /&gt;
* OpenGL 3&lt;br /&gt;
* Qt&lt;br /&gt;
* Visual Studio 2010 (C++0x)&lt;br /&gt;
* Target-os: Windows 7 and Linux&lt;br /&gt;
&lt;br /&gt;
= План работ =&lt;br /&gt;
* 24.03 Проработка технических решений&lt;/div&gt;</summary>
		<author><name>AM5800</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=CG_Earth&amp;diff=109</id>
		<title>CG Earth</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=CG_Earth&amp;diff=109"/>
				<updated>2011-03-17T17:10:05Z</updated>
		
		<summary type="html">&lt;p&gt;AM5800: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Студенты: [[Участник:AM5800|Александр Михайлов]], Артем Бухонов&lt;br /&gt;
* Руководитель: [[Участник:kkv|Кринкин Кирилл Владимирович]]&lt;br /&gt;
[http://www.assembla.com/spaces/cg-earth Страница проекта на assembla.com] &lt;br /&gt;
&lt;br /&gt;
= Концепция =&lt;br /&gt;
Разработка программы для визуализации планеты Земля и некоторых, связанных с ней данных.&lt;br /&gt;
Задача включает в себя:&lt;br /&gt;
* Визуализацию поверхности планеты на основе картографических данных&lt;br /&gt;
* Расчет и визуализация атмосферных эффектов (Рассеяние Рэлея и Ми)&lt;br /&gt;
* Расчет корректного положения Земли в пространстве (т.е. учет времен года, времени суток)&lt;br /&gt;
* Необходимо обеспечить возможность по расчету и визуализации дополнительных, динамически добавляемых объектов (например - спутники, кометы, созвездия итп)&lt;br /&gt;
* Визуализировать реальное положение звезд на небе.&lt;br /&gt;
* Расчет и визуализация погодных эффектов (облака) (опционально)&lt;br /&gt;
 &lt;br /&gt;
Необходимо обеспечить приемлимое качество визуализации поверхности планеты, в диапазоне высот над уровнем моря: 10 км - 30 000 км.&lt;br /&gt;
&lt;br /&gt;
= Технологии =&lt;br /&gt;
* OpenGL 3&lt;br /&gt;
* Qt&lt;br /&gt;
* Visual Studio&lt;br /&gt;
* Target-os: Windows 7 and Linux&lt;br /&gt;
&lt;br /&gt;
= План работ =&lt;br /&gt;
* 24.03 Проработка технических решений&lt;/div&gt;</summary>
		<author><name>AM5800</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=CG_Earth&amp;diff=108</id>
		<title>CG Earth</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=CG_Earth&amp;diff=108"/>
				<updated>2011-03-17T17:07:47Z</updated>
		
		<summary type="html">&lt;p&gt;AM5800: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Студенты: [[Участник:AM5800|Александр Михайлов]], Артем Бухонов&lt;br /&gt;
* Руководитель: [[Участник:kkv|Кринкин Кирилл Владимирович]]&lt;br /&gt;
[http://www.assembla.com/spaces/cg-earth Страница проекта на assembla.com] &lt;br /&gt;
&lt;br /&gt;
Разработка программы для визуализации планеты Земля и некоторых, связанных с ней данных.&lt;br /&gt;
Задача включает в себя:&lt;br /&gt;
* Визуализацию поверхности планеты на основе картографических данных&lt;br /&gt;
* Расчет и визуализация атмосферных эффектов (Рассеяние Рэлея и Ми)&lt;br /&gt;
* Расчет корректного положения Земли в пространстве (т.е. учет времен года, времени суток)&lt;br /&gt;
* Необходимо обеспечить возможность по расчету и визуализации дополнительных, динамически добавляемых объектов (например - спутники, кометы, созвездия итп)&lt;br /&gt;
* Визуализировать реальное положение звезд на небе.&lt;br /&gt;
* Расчет и визуализация погодных эффектов (облака) (опционально)&lt;br /&gt;
 &lt;br /&gt;
Необходимо обеспечить приемлимое качество визуализации поверхности планеты, в диапазоне высот над уровнем моря: 10 км - 30 000 км.&lt;br /&gt;
&lt;br /&gt;
Технологии:&lt;br /&gt;
* OpenGL 3&lt;br /&gt;
* Qt&lt;br /&gt;
* Visual Studio&lt;br /&gt;
* Target-os: Windows 7 and Linux&lt;br /&gt;
&lt;br /&gt;
План:&lt;br /&gt;
* 24.03 Проработка технических решений&lt;/div&gt;</summary>
		<author><name>AM5800</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=%D0%A2%D0%B5%D0%BC%D1%8B_%D0%BF%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%BA&amp;diff=101</id>
		<title>Темы практик</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=%D0%A2%D0%B5%D0%BC%D1%8B_%D0%BF%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%BA&amp;diff=101"/>
				<updated>2011-03-15T18:21:12Z</updated>
		
		<summary type="html">&lt;p&gt;AM5800: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;На этой странице собраны темы индивидуальных и командных проектов. &lt;br /&gt;
&lt;br /&gt;
== Весна 2011 ==&lt;br /&gt;
&lt;br /&gt;
* [[Genome assembler]] (Mariya Fomkina)&lt;br /&gt;
&lt;br /&gt;
* [[Анализ изображений с целью поиска похожих лиц]] (Екатерина Полищук)&lt;br /&gt;
&lt;br /&gt;
* [[The Shortest Path Problem]] (Алексей Гуревич)&lt;br /&gt;
&lt;br /&gt;
* [[Shortest Path Service]] (Евгений Баталов)&lt;br /&gt;
&lt;br /&gt;
* [[Genome Query]] (Андрей Пржибельский)&lt;br /&gt;
&lt;br /&gt;
* [[CG Earth]] (Александр Михайлов, Артем Бухонов)&lt;br /&gt;
&lt;br /&gt;
== Пул свободных тем ==&lt;br /&gt;
&lt;br /&gt;
* [[GeoToDo list]]&lt;/div&gt;</summary>
		<author><name>AM5800</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=%D0%A2%D0%B5%D0%BC%D1%8B_%D0%BF%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%BA&amp;diff=100</id>
		<title>Темы практик</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=%D0%A2%D0%B5%D0%BC%D1%8B_%D0%BF%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%BA&amp;diff=100"/>
				<updated>2011-03-15T18:20:43Z</updated>
		
		<summary type="html">&lt;p&gt;AM5800: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;На этой странице собраны темы индивидуальных и командных проектов. &lt;br /&gt;
&lt;br /&gt;
== Весна 2011 ==&lt;br /&gt;
&lt;br /&gt;
* [[Genome assembler]] (Mariya Fomkina)&lt;br /&gt;
&lt;br /&gt;
* [[Анализ изображений с целью поиска похожих лиц]] (Екатерина Полищук)&lt;br /&gt;
&lt;br /&gt;
* [[The Shortest Path Problem]] (Алексей Гуревич)&lt;br /&gt;
&lt;br /&gt;
* [[Shortest Path Service]] (Евгений Баталов)&lt;br /&gt;
&lt;br /&gt;
* [[Genome Query]] (Андрей Пржибельский)&lt;br /&gt;
&lt;br /&gt;
* [[CG Earth]] (Александр Михайлов, Артем Бухонов]]&lt;br /&gt;
&lt;br /&gt;
== Пул свободных тем ==&lt;br /&gt;
&lt;br /&gt;
* [[GeoToDo list]]&lt;/div&gt;</summary>
		<author><name>AM5800</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=CG_Earth&amp;diff=99</id>
		<title>CG Earth</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=CG_Earth&amp;diff=99"/>
				<updated>2011-03-15T18:11:11Z</updated>
		
		<summary type="html">&lt;p&gt;AM5800: Новая страница: «* Студенты: Александр Михайлов, Артем Бухонов * Руководитель: [[Участник:kkv|К…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Студенты: [[Участник:AM5800|Александр Михайлов]], Артем Бухонов&lt;br /&gt;
* Руководитель: [[Участник:kkv|Кринкин Кирилл Владимирович]]&lt;br /&gt;
 &lt;br /&gt;
Разработка программы для визуализации планеты Земля и некоторых, связанных с ней данных.&lt;br /&gt;
Задача включает в себя:&lt;br /&gt;
* Визуализацию поверхности планеты на основе картографических данных&lt;br /&gt;
* Расчет и визуализация атмосферных эффектов (Рассеяние Рэлея и Ми)&lt;br /&gt;
* Расчет корректного положения Земли в пространстве (т.е. учет времен года, времени суток)&lt;br /&gt;
* Необходимо обеспечить возможность по расчету и визуализации дополнительных, динамически добавляемых объектов (например - спутники, кометы, созвездия итп)&lt;br /&gt;
* Визуализировать реальное положение звезд на небе.&lt;br /&gt;
* Расчет и визуализация погодных эффектов (облака) (опционально)&lt;br /&gt;
 &lt;br /&gt;
Необходимо обеспечить приемлимое качество визуализации поверхности планеты, в диапазоне высот над уровнем моря: 10 км - 30 000 км.&lt;/div&gt;</summary>
		<author><name>AM5800</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:AM5800&amp;diff=97</id>
		<title>Участник:AM5800</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:AM5800&amp;diff=97"/>
				<updated>2011-03-15T17:44:55Z</updated>
		
		<summary type="html">&lt;p&gt;AM5800: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Михайлов Александр Владимирович'''&lt;br /&gt;
&lt;br /&gt;
e-mail: [mailto:AM5800@gmail.com AM5800@gmail.com]&lt;br /&gt;
&lt;br /&gt;
blog: [http://au-student.blogspot.com/ http://au-student.blogspot.com/]&lt;br /&gt;
&lt;br /&gt;
[[Файл:Alexander_Mikhailov.png]]&lt;/div&gt;</summary>
		<author><name>AM5800</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Alexander_Mikhailov.png&amp;diff=96</id>
		<title>Файл:Alexander Mikhailov.png</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Alexander_Mikhailov.png&amp;diff=96"/>
				<updated>2011-03-15T17:37:07Z</updated>
		
		<summary type="html">&lt;p&gt;AM5800: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>AM5800</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=Q%26A&amp;diff=63</id>
		<title>Q&amp;A</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=Q%26A&amp;diff=63"/>
				<updated>2011-03-10T19:17:45Z</updated>
		
		<summary type="html">&lt;p&gt;AM5800: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Предлагаю на этой странице располагать вопросы, связанные с работой SEWiki, и ответы тех, кто может ответить. &lt;br /&gt;
&lt;br /&gt;
'''Q:''' Где можно посмотреть список участников и ссылки на их страницы (кроме своей собственной)?&lt;br /&gt;
&lt;br /&gt;
'''A:''' [http://mit.spbau.ru/sewiki/index.php/Служебная:ListUsers тут]&lt;br /&gt;
&lt;br /&gt;
'''Q:''' А с какой целью у нас на главной странице ссылка на несуществующий раздел по алгоритмам?&lt;br /&gt;
&lt;br /&gt;
'''A:''' Там кто-то хотел постить решения домашних задач. Но дальше создания пустого раздела дело, видимо, не пошло&lt;/div&gt;</summary>
		<author><name>AM5800</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=Q%26A&amp;diff=62</id>
		<title>Q&amp;A</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=Q%26A&amp;diff=62"/>
				<updated>2011-03-10T19:16:19Z</updated>
		
		<summary type="html">&lt;p&gt;AM5800: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Предлагаю на этой странице располагать вопросы, связанные с работой SEWiki, и ответы тех, кто может ответить. &lt;br /&gt;
&lt;br /&gt;
'''Q:''' Где можно посмотреть список участников и ссылки на их страницы (кроме своей собственной)?&lt;br /&gt;
&lt;br /&gt;
'''A:''' [http://mit.spbau.ru/sewiki/index.php/Служебная:ListUsers тут]&lt;br /&gt;
&lt;br /&gt;
'''Q:''' А с какой целью у нас на главной странице ссылка на несуществующий раздел по алгоритмам?&lt;br /&gt;
&lt;br /&gt;
'''A:''' ???&lt;/div&gt;</summary>
		<author><name>AM5800</name></author>	</entry>

	</feed>