Skip to content

Latest commit

 

History

History
100 lines (66 loc) · 4.44 KB

questions.rst

File metadata and controls

100 lines (66 loc) · 4.44 KB

Задачи для собеседований

Custom main

Требуется написать код программы, который будет использовать изменённую точку входа main:

int main(const std::vector<std::string>& args)
{
    cout << "argc = " << args.size() << endl;
    for (auto& arg : args)
        cout << "arg = " << arg << endl;

    return 0;
}

Для тестирования можно использовать online-компилятор http://coliru.stacked-crooked.com.

Ключевые слова: libc, crt0, линковка, RTLD_NEXT, стек, ELF-формат.

Перейти на `решение <custom-main_>`_.

Линеаризация циклов

Задача состоит в написании функции MultipleForLoop, которой передаются функтор действия и интервалы циклов. Пример вложенных циклов:

for (int i = 7; i < 44; ++i)
    for (int j = 0; j < 10; ++j)
        for (int k = 4; k < 50; k += 4)
            func(i, j, k);

То же самое через MultipleForLoop:

template<class Functor, class... Ranges>
void MultipleForLoop(Functor f, const Ranges&... ranges);

MultipleForLoop(func, boost::irange(7, 44), boost::irange(0, 10), boost::irange(4, 50, 4));

Количество вложенных циклов не ограничено.

В процессе задачи следует ответить на вопрос: как подобная операция называется в математике?

Перейти на `решение <loop-linearization_>`_.

Сколько чисел можно составить из 7 единиц и 3 нулей?

Необходимо показать, как именно происходит подсчёт. Полезно будет рассмотреть простой пример: 2 единицы и 2 нуля. В качестве бонуса на собеседовании будет задан долнительный вопрос.

Перейти на `решение <newtons-binom_>`_.

Битовый парсер

Необходимо составить архитектуру, которая будет описывать программу битового парсера любого контейнера. Программе на вход подаётся бинарный файл (медиа контейнер) и описание статического контейнера в каком-либо удобочитаемом формате (например, json). На выходе программа распечатывает те элементы контейнера, которые содержатся в описании.

Пример: распечатать ширину и высоту изображения в формате BMP. Пример описания:

{
    "skip": 144,
    "print": 32,
    "print": 32
}

Пример вызова программы:

$ ./bit_parser -c bmp-description.json picture.bmp

Саму программу не надо писать, только её архитектуру. В архитектуру входят:

  • формат описаний;
  • ограничения на медиа контейнер (какие контейнеры могут быть распарсены, какие нет);
  • какие библиотеки будут использоваться;
  • какие классы/структуры/данные и их функции предлагается написать;
  • связи компонент;
  • глубина описания должна затрагивать методы объектов;
  • можно использовать UML, но он должен быть выполнен в иерархическом виде: каждую компоненту программы можно посмотреть подробно или в составе всей программы целиком.

Ключевые слова: boost.params, boost.iterator, boost.spirit, boost.format, boost.iostreams.mapped_file

Перейти на `решение <bit-parser_>`_.