Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Жарова Полина Кирилловна тестовое задание КРОК #15

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 14 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,20 @@ a30b4d51-11b4-49b2-b356-466e92a66df7 Иванов Иван Иванович 16.0
Примеры входного и выходного файлов приложены к настоящему техническому заданию.

## Автор решения
Жарова Полина Кирилловна 13.02.2003

## Описание реализации

Программа написана на C++. Суть реализации заключается в том, что
создаются три вектора для хранения id, ФИО и кол-ва списанных часов для каждого ID.
Затем происходит считывание файла "report.txt", откуда информация размещается в векторы.
В обход линейного поиска для определения, производится ли повторное списывание,
в программе используется структурирование с помощью хеш-таблицы, что призвано обеспечить наибольшее
быстродействие, несмотря на то, что расширение в случае коллизий не предусмотрено.
Далее отбираются сотрудники, подходящие под условие для вывода в файл-результат,
записываются в отсортированный контейнер данных по принципу ключ-значение и в сам файл.
## Инструкция по сборке и запуску решения
Решение тестового задания находится в папке launching.
Код представлен в файле СROС-TEST.cpp, запуск решения осуществляется с помощью файла
СROС-TEST.exe.
Для корректной работы файл report.txt должен присутствовать в одной директории с СROС-TEST.exe,
а также иметь кодировку ANSI!
22 changes: 22 additions & 0 deletions launching/report.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
24
a30b4d51-11b4-49b2-b356-466e90a66df7 ������ ���� �������� 06.05.2024 8
a30b4d51-11b4-4912-b156-466e92a66df7 ������ ���� �������� 06.05.2024 8
a30b4d51-11b4-4912-b356-466e92a66df7 ������� ���� �������� 06.05.2024 8
a30b4d51-11b4-49b2-b356-466e92a66df7 ������ ���� �������� 06.05.2024 8
0f0ccd5e-cd46-462a-b92d-69a6ff147465 ������ ������� ��������� 06.05.2024 6
75cd02d8-6b1f-42fb-9c59-7db675b28a2d �������� ���� �������� 06.05.2024 8.5
e5dbc47c-52f6-480a-876d-f97b17cb7cab ��������� ����� ����������� 06.05.2024 9
e5dbc47c-52f6-480a-876d-f97b17cb7cab ��������� ����� ����������� 07.05.2024 9
0f0ccd5e-cd46-462a-b92d-69a6ff147465 ������ ������� ��������� 07.05.2024 7
0f0ccd1e-cd46-462a-b92d-69a6ff147465 ������ ������� ��������� 07.05.2024 7
a30b4d51-11b4-49b2-b356-466e92a66df7 ������ ���� �������� 07.05.2024 8
75cd02d8-6b1f-42fb-9c59-7db675b28a2d �������� ���� �������� 07.05.2024 8.5
75cd02d8-6b1f-42fb-9c59-7db675b28a2d �������� ���� �������� 08.05.2024 8
e5dbc47c-52f6-480a-876d-f97b17cb7cab ��������� ����� ����������� 08.05.2024 10
a30b4d51-11b4-49b2-b356-466e92a66df7 ������ ���� �������� 08.05.2024 8
0f0ccd5e-cd46-462a-b92d-69a6ff147465 ������ ������� ��������� 08.05.2024 8
0f0ccd5e-cd46-462a-b92d-69a6ff147165 ������ ������� �������� 08.05.2024 21
e5dbc47c-52f6-480a-876d-f97b171b7cab ��������� ���� ����������� 08.05.2024 7.5
0f0ccd5e-cd46-462a-b92d-69a6ff147115 ������ ������� �������� 08.05.2024 28
0f0ccd1e-cd46-462a-b92d-69a6ff147115 ������� ������� �������� 08.05.2024 27
0f0ccd3e-cd46-462a-b92d-69a61f347115 ������� ����� �������� 08.05.2024 29
11 changes: 11 additions & 0 deletions launching/result.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
������� �.�. -16
��������� �.�. -16.5
������ �.�. -3
������ �.�. -17
������ �.�. -16
������ �.�. -16
������ �.�. -3
������� �.�. +3
������� �.�. +5
������ �.�. +4
��������� �.�. +4
120 changes: 120 additions & 0 deletions launching/СROС-TEST.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
#include <iostream>
#include <fstream>
#include <vector>
#include <map>

//хеш-функция
int hash_func(std::string str) { return ((int)*str.begin() + (int)*(str.end() - 1)) % 30; }

int main()
{
//создание векторов для помещения данных из файла report.txt
std::vector<std::vector<std::string>> ID(30);
std::vector<std::vector<std::string>> FIO(30);
std::vector<std::vector<double>> taken_hours(30);

std::ifstream in;

//проверка открытия файла
try {
in.open("report.txt");
if (!in.is_open())
throw std::exception("Error!");
}
catch (...) {
return -1;
}

//перенос из первой строчки файла требуемого кол-ва часов в переменную
double MAIN_hours;
in >> MAIN_hours;

//считывание данных из файла, получится устройство данных в виде хеш-таблицы, но она не будет расширяться при коллизиях
while (!in.eof()) {
std::string tmp;
std::string tmp1;

in >> tmp;
//если ячейка вектора не пуста, то проверяем, делается ли списание повторно, или списание осуществляет другой сотрудник
//(проверка по ID!)
if (tmp.size() > 0 && ID[hash_func(tmp)].size() > 0) {
bool is_there = false;
for (int i{ 0 }; i < ID[hash_func(tmp)].size(); i++) {
//если списание повторное, то добавляем часы к уже существующему в векторе сотруднику
if (ID[hash_func(tmp)][i] == tmp) {
is_there = true;
//таким образом пропускаем "лишнюю" информацию из файла
in >> tmp1;
in >> tmp1;
in >> tmp1;
in >> tmp1;
double working;
in >> working;
taken_hours[hash_func(tmp)][i] += working;
break;
}
}
//если сотрудник новый, то добавляем его ID, списанные часы и ФИО
if (!is_there) {
ID[hash_func(tmp)].push_back(tmp);
in >> tmp1;
FIO[hash_func(tmp)].push_back(tmp1);
in >> tmp1;
FIO[hash_func(tmp)].push_back(tmp1);
in >> tmp1;
FIO[hash_func(tmp)].push_back(tmp1);
in >> tmp1;
double working;
in >> working;
taken_hours[hash_func(tmp)].push_back(working);
}
}
//если ячейка, номер которой получен с помощью хеш-функции, пуста, то записываем во все векторы информацию о сотруднике
//tmp.size() > 0 существует для обхода ошибки, возникающей, если файл заканчивается '\n'
else if (tmp.size() > 0) {
ID[hash_func(tmp)].push_back(tmp);
in >> tmp1;
FIO[hash_func(tmp)].push_back(tmp1);
in >> tmp1;
FIO[hash_func(tmp)].push_back(tmp1);
in >> tmp1;
FIO[hash_func(tmp)].push_back(tmp1);
in >> tmp1;
double working;
in >> working;
taken_hours[hash_func(tmp)].push_back(working);
}
}

in.close();

std::ofstream out;
out.open("result.txt");

//два контейнера мультимэп для помещения сотрудников, переработавших или недоработавших > 10% (с сортировкой по алфавиту)
std::multimap<std::string, double> plus_balance;
std::multimap<std::string, double> minus_balance;

for (int i{ 0 }; i < taken_hours.size(); i++) {
for (int j{ 0 }; j < taken_hours[i].size(); j++) {
if (taken_hours[i][j] / MAIN_hours < 0.9) {
//помещаем ключ в требуемом виде
minus_balance.emplace(FIO[i][j * 3] + " " + FIO[i][j * 3 + 1][0] + "." + FIO[i][j * 3 + 2][0] + "." + " -", MAIN_hours - taken_hours[i][j]);
continue;
}
if (taken_hours[i][j] / MAIN_hours > 1.1)
plus_balance.emplace(FIO[i][j * 3] + " " + FIO[i][j * 3 + 1][0] + "." + FIO[i][j * 3 + 2][0] + "." + " +", taken_hours[i][j] - MAIN_hours);
}
}

//запись в результирующий файл
for (const auto& item : minus_balance) {
out << item.first << item.second << std::endl;
}
for (const auto &item : plus_balance) {
out << item.first << item.second << std::endl;
}

out.close();
return 0;
}
Binary file added launching/СROС-TEST.exe
Binary file not shown.