Обязанности

  • Разработка 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);
}

Результат

  1. Ссылка на gist с исходным кодом функции.

Задание 2. Разработать тесты для функции определения счета в игре

Задача

Для разработанной в предыдущем задании функции getScore(gameStamps, offset) разработайте unit-тесты на базе библиотеки QtTest.
Тесты должны учитывать все возможные случаи использования функции, концентрироваться на проверке одного случая, не повторяться, название тестов должно отражать суть выполняемой проверки.

Результат

  1. Ссылка на 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.

Результат

  1. Ссылка на бинарную сборку приложения, способную запуститься на Ubuntu 22.04 x64.
  2. Ссылки на git-репозитории с исходными кодами решения.