Группа Михайлова — различия между версиями
AM5800 (обсуждение | вклад) (→Smar pointers) |
AM5800 (обсуждение | вклад) (→Интересные ссылки) |
||
Строка 6: | Строка 6: | ||
[http://habrahabr.ru/post/112953/ Об арифметике с плавающей запятой] | [http://habrahabr.ru/post/112953/ Об арифметике с плавающей запятой] | ||
+ | |||
+ | [http://herbsutter.com/2013/01/01/video-you-dont-know-const-and-mutable/ You don't know const and mutable] | ||
=Задания= | =Задания= |
Версия 19:12, 9 января 2013
Содержание
Общее
Интересные ссылки
Об арифметике с плавающей запятой
You don't know const and mutable
Задания
Компиляция
Напишите псевдо код на основе ассемблерного кода в который разворачивается инструкция for:
for (int i = 0; i < N; ++i) { //body }
Пример псевдокода:
if (a == 5) goto mark1 something mark1:
Чем плоха конструкция
#define MAX(a, b) a > b ? a : b
Приведите пример ее некорректного использования. (Возврат не максимального значения, побочные эффекты) Как можно ее улучшить?
Как работает линковка? Какую роль в ней играет relocation table
Сортировка слиянием
Реализуйте алгоритм merge sort
Выделение памяти
Создайте двумерный массив двумя способами. 1) Используя N + 1 аллокацию 2) Используя 2 аллокации Замерьте, при каких значениях размера массива происходит экстерминатус? (Компилируйте 32 разрядную версию. 64 может и не упасть) Какой вариант работает быстрее? Подумайте, почему это происходит. Обращаю внимание, что оба варианта созданных матриц должны иметь тип int**
Усложненное задание - сделать матрицы трегольными и написать процедуру, сливающие 2 такие матрицы в прямоугольную
Расширяющийся массив
Реализуйте класс расширяющегося массива. Size - количество элементов в массиве. Capacity - вместимость массива. Size <= Capacity Если при добавлении очередного элемента Size превышает Capacity, то Capacity следует увеличить вдвое
struct Array { Array(size_t capacity = 3); Array(Array & array); ~Array(); Array & operator=(Array & array); size_t Size(); size_t Capacity(); void Add(int value); int Get(size_t index); void Set(size_t index, int value); void Swap(Array & array); private: int* myData; size_t mySize; size_t myCapacity; };
Обертка над FILE
String
Реализовать класс String со следующими методами/требованиями
String() String(String &) String(char *) operator=(String &) operator=(char *) //реализовывать не нужно. Объясните, почему? append(String &) char ? at(size_t) // реализовать в двух версиях. Константную и не константную char * c_str() - возвращает обычную нуль-терминированную строку
Данные хранить как буффер для строки и ее размер. Строку хранить НЕ как нуль-терминированную. В приведенном выше ключевое слово const не используется умышленно.
Дополнительное задание - реализовать строку с таким же интерфейсом, но реализующую стратегию Copy On Write (COW)
Smart FILE
Rational
Напишите класс работающий с рациональными числами и определите следующие операторы:
- ostream <<
- istream >>
- +=
- -=
- *=
- /=
- +
- - бинарный
- - унарный
- *
- /
- ++ префиксный
- ++ постфиксный
- -- префиксный
- -- постфиксный
- ==
- !=
- <
- >
- <=
- >=
Smart pointers
Реализовать шаблонный scoped_ptr [1]