Приветствую тебя, читающий это. Если ты юн, неопытен и желаешь приобщиться к разработке на 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.
Факультативно: сумевшие превратить прототип в библиотеку и воспользоваться ею для решения заслужат отдельное внимание и повышенный интерес к себе. Но это строго если такая задача кажется несложной, в противном случае действительно достаточно лишь сделать то, что описано.