Разработчик C++
Чтобы принять участие в стажировке вам нужно заполнить анкету откликнувшись по ссылке https://forms.gle/YT1aYNDheK2zEKLR8
Последняя часть вопросов в анкете отведена для ответов на задачи, которые описаны ниже на этой странице. Чаще всего в поле ответа нужно указать ссылку на gist с текстом ответа, либо ссылку на репозиторий, обращайте внимание на то, что нужно оставить в анкете в качестве результата. Если вместо требуемой ссылки вы приведете что-то другое, например текст ответа, ваш ответ с высокой вероятностью не будет засчитан.
Обязанности
- Разработка Desktop-приложений на C++, Qt, QML.
- Разработка мобильных приложений на C++, Qt, QML.
Требования
- Знания C++: базовый синтаксис, умение разрабатывать консольные приложения. Приветствуется знакомство с Qt.
- Готовность к изучению множества технологий разработки одновременно в свое личное время.
- Приветствуется владение чем-нибудь из перечисленного: JavaScript (также любые фреймворки), HTML, CSS (также lesscss, sass), Linux CLI, Docker, git, Qt Creator, VS Code (или другие IDE/редакторы).
- Приветствуется базовая грамотность в Computer Science, включая базы данных, сетевые технологии, технологические стеки построения веб-приложений, устройства операционных систем (в первую очередь семейства Linux). Ориентиры: https://yollection.ru/road/backend, https://yollection.ru/road/frontend.
Задание 1. Разработать функцию определения счета в игре
Задача
В примере кода ниже генерируется список фиксаций состояния счета игры в течение матча.
Разработайте функцию getScore(gameStamps, offset), которая вернет счет на момент offset в списке gameStamps.
Нужно суметь понять суть написанного кода, заметить нюансы, разработать функцию вписывающуюся стилем в существующий код, желательно адекватной алгоритмической сложности.
// game.h
#ifndef GAME_H
#define GAME_H
#include <vector>
#include <iostream>
#include <cmath>
struct Score
{
int home;
int away;
};
bool operator==(const Score &score1, const Score &score2) {
return score1.home == score2.home && score1.away == score2.away;
}
struct GameStamp
{
int offset;
Score score;
};
const int TIMESTAMPS_COUNT = 50000;
const double PROBABILITY_SCORE_CHANGED = 0.0001;
const double PROBABILITY_HOME_SCORE = 0.45;
const int OFFSET_MAX_STEP = 3;
float randomFloat() {
float r = static_cast <float> (std::rand()) / static_cast <float> (RAND_MAX);
return r;
}
GameStamp generateGameStamp(const GameStamp &previousValue)
{
bool scoreChanged = randomFloat() > 1 - PROBABILITY_SCORE_CHANGED;
int homeScoreChange = scoreChanged && randomFloat() > 1 - PROBABILITY_HOME_SCORE ? 1 : 0;
int awayScoreChange = scoreChanged && homeScoreChange == 0 ? 1 : 0;
int offsetChange = (int)(std::floor(randomFloat() * OFFSET_MAX_STEP)) + 1;
GameStamp stamp;
stamp.offset = previousValue.offset + offsetChange;
stamp.score.home = previousValue.score.home + homeScoreChange;
stamp.score.away= previousValue.score.away + awayScoreChange;
return stamp;
}
void printGameStamps(const std::vector<GameStamp> &gameStamps)
{
for( int i=0; i < gameStamps.size(); ++i)
{
const GameStamp &stamp = gameStamps[i];
std::cout << stamp.offset << ": " << stamp.score.home << " - " << stamp.score.away << std::endl;
}
}
Score getScore(const std::vector<GameStamp> &gameStamps, int offset) {
// continue the function's implementation
}
#endif // GAME_H
// main.cpp
#include "game.h"
int main(int argc, char *argv[])
{
std::vector<GameStamp> gameStamps;
gameStamps.reserve(TIMESTAMPS_COUNT);
GameStamp currentStamp;
currentStamp.offset = 0;
currentStamp.score.home = 0;
currentStamp.score.away = 0;
for (int i = 0; i < TIMESTAMPS_COUNT; i++)
{
gameStamps.push_back(currentStamp);
currentStamp = generateGameStamp(currentStamp);
}
printGameStamps(gameStamps);
}
Результат
- Ссылка на gist с исходным кодом функции.
Задание 2. Разработать тесты для функции определения счета в игре
Задача
Для разработанной в предыдущем задании функции getScore(gameStamps, offset) разработайте unit-тесты на базе библиотеки QtTest.
Тесты должны учитывать все возможные случаи использования функции, концентрироваться на проверке одного случая, не повторяться, название тестов должно отражать суть выполняемой проверки.
Результат
- Ссылка на gist с исходным кодом тестов.
Задание 3. Разработать Desktop-приложение отображающее график интереса к тегу на stackoverflow
Задача
Разработайте Desktop-приложение, которое будет получать количество вопросов заданных на stackoverflow.com с одним из перечисленных тегов.
Приложение состоит из одного экрана, на котором пользователь может один из тегов и период для построения графика. После выбора этих параметров приложение строит график.
Теги:
- Qt
- Desktop
- cpp
Периоды:
- неделя (шаг - день),
- месяц (шаг - неделя),
- три месяца (шаг - десять дней),
- полгода (шаг месяц)
Пример запроса к API
curl --output - "https://api.stackexchange.com/2.3/questions?order=desc&sort=activity&tagged=qt&site=stackoverflow&filter=total&fromdate=2022-02-01&todate=2022-02-28" | gunzip | jq
Замечания к реализации
В качестве образца можно использовать пример из документации Qt:
https://doc-snapshots.qt.io/qt6-dev/qtdoc-demos-stocqt-example.html
Для построения интерфейса пользователя стоит использовать QML.
Результат
- Ссылка на бинарную сборку приложения, способную запуститься на Ubuntu 22.04 x64.
- Ссылки на git-репозитории с исходными кодами решения.