Skip to content

Instantly share code, notes, and snippets.

@MasterAler
Last active December 12, 2019 11:45
Show Gist options
  • Save MasterAler/0ffc5f4bca1877420ed16652c7cd9e0c to your computer and use it in GitHub Desktop.
Save MasterAler/0ffc5f4bca1877420ed16652c7cd9e0c to your computer and use it in GitHub Desktop.
Тестовое задание для стажировки в Kraftway

Тестовое задание

Приветствую тебя, читающий это. Если ты юн, неопытен и желаешь приобщиться к разработке на C++ в славном Kraftway, то ниже описано небольшое испытание, которое следует пройти, чтобы доказать свою преданность Тёмным Искусствам способность с этим самым C++ обращаться. Они несложные.

Тут две части: вопросы, на которые надо дать ответ (в виде кода) и небольшое практическое задание, максимально приближенное к тому, что программисты делают в повседневной работе.

Дисклеймер: наличие целого ряда заданий вовсе не означает, что необходимо выполнить идеально их все до единого, надо просто быть лучше остальных претендентов =)

Как оформить решение

Принимаются любые проекты, которые можно собрать без дополнительных усилий на Windows или Ubuntu (смотря что удобнее решающему, это не принципиально), т.е. проекты QMake / CMake / MSVS. Практическое задание настоятельно рекомендуется выполнить всё-таки в Qt Creator, иначе его решение существенно усложнится.

Вопросы

Напоминаю, ответом является прежде всего код, но не стесняйтесь снабдить его комментариями, если хотите что-то дополнительно пояснить.

Первый

class SomeClass
{
public:
    SomeClass()
    {
        x1 = new char[1024];
        x2 = new char[1024 * 1024];
    }
private:
    char* x1;
    char* x2;
};

Какие проблемы есть в этом коде? Исправьте их и реализуйте для данного класса конструктор копирования, конструктор перемещения, операторы присваивания (lvalue, rvalue).

Второй

Пусть у нас есть std::unordered_map<int, std::string> myMap = { {1, "Vasya"}, {42, "Petya"}, ...} Заполните его 10-20 значениями, так, чтобы были повторяющиеся (можно просто вписать в инициализацию). Продемонстрируйте код, который удалит из этого словаря все элементы с заданным значением. То есть, реализуйте что-то вроде такого:

std::unordered_map<int, std::string> remove_all(std::unordered_map<int, std::string> dict, const std::string& value);

Третий

Пусть есть односвязный список, заполняемый по принципу стека (LIFO), который реализован примерно так:

#include <iostream>

struct Node
{
    int data;
    Node* next;
};

void push(Node*& top, int value)
{
    Node* newNode = new Node{value, nullptr};
    newNode->next = top;
    top = newNode;
}

int pop(Node*& top)
{
    int result = top->data;
    Node* tmp = top;
    top = top->next;
    delete tmp;

    return result;
}

int main()
{
    Node* top = nullptr;

    push(top, 444);
    push(top, 555);
    push(top, 666);

    while(top != nullptr){
        std::cout << pop(top) << std::endl;
    }

    return 0;
}

Напишите функцию, которая разворачивает этот односвязный список, т.е. после её выполнения элементы будут идти в обратном порядке, примерно такую:

void reverse(Node*& top);

Практическое задание

Есть вот такой репозиторий с прототипом клиент-серверного взаимодействия, его усложнённая версия используется в реальном проекте. Открывается в Qt Creator (да, потребуется установить Qt) и собирается на Windows, Linux; чтобы в этом убедиться рекомендуется воспользоваться веткой master, там находится наиболее переносимая версия. После сборки в папке /bin можно обнаружить два исполняемых файла, клиента и сервера соответственно.

Предлагается, воспользовавшись данным прототипом, доработать его до примера клиент-серверного взаимодействия, в котором:

  • сервер поддерживает команду "перемножить два числа", которая принимает их и возвращает ответ
  • сервер поддерживает команду "запиши себе в файл вот эту строчку", которая принимает строку и возвращает, получилось ли
  • сервер поддерживает команду "вычислить тангенс числа", которая принимает угол в градусах и возвращает ответ, если тангенс для данного угла определён, ошибку если тангенс получается бесконечный
  • сервер поддерживает команду "проверить, является ли строка палиндромом", которая принимает строку и возвращает, является ли она им или нет
  • сервер поддерживает команду "найти максимум в данном наборе числе", которая принимает набор чисел и возвращает значение максимума
  • клиент посылает серверу все эти команды с разными аргументами несколько раз, демонстрируя, что всё работает

Задание демонстрирует "умение работать с кривым чужим кодом", решение желательно предоставить в виде ссылки на репозиторий (можно форкнуть этот или не делать этого), в котором будет проект, демонстрирующий всё, что описано выше. Решения в виде архивчика с кодом принимаются, но расцениваются как неумение работать с git.

Факультативно: сумевшие превратить прототип в библиотеку и воспользоваться ею для решения заслужат отдельное внимание и повышенный интерес к себе. Но это строго если такая задача кажется несложной, в противном случае действительно достаточно лишь сделать то, что описано.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment