diff --git a/FileOutput.h b/FileOutput.h new file mode 100644 index 0000000..f3ae0f1 --- /dev/null +++ b/FileOutput.h @@ -0,0 +1,37 @@ +#pragma once + +//функция вывода имён трёх лучших конрибьютеров в конечный файл result + +#include "LagestElement.h" +#include +#include +#include +#include + +int resultOutput(std::vector *CommitsCount, std::unordered_map* Hash_table) { + int iter = 0; + int MAX = searchFirstLargest(CommitsCount); + + std::ofstream out("result.txt"); //проверка на жизнь + if (!out.is_open()) { + std::cout << "File not exist."; + return -1; + } + + while (MAX > 0) { + for (auto i = Hash_table->begin(); i != Hash_table->end(); i++) //работа с итераторoм i и счётчиком iter)) + { + if (i->second == MAX) { + out << i->first << "\t"; //просто продолжаем работать с итераторами + iter++; + i->second; + } + if (iter == 3) break; //условия для 3-х человек + } + MAX--; + if (iter == 3) break; //и здесь так же + } + + out.close(); //закончили + return 1; +} diff --git a/Krok_hash.cpp b/Krok_hash.cpp new file mode 100644 index 0000000..1ec4f23 --- /dev/null +++ b/Krok_hash.cpp @@ -0,0 +1,62 @@ +#include +#include +#include +#include "FileOutput.h" +#include "StringLength.h" + +int main() +{ + + std::unordered_map Hash_table; //задаём хеш-таблицу с парой [имя, кол-во коммитов] + // [key, value ] + std::ifstream in("commits.txt"); //открываем поток на получение данных из commits.txt + if (!in.is_open()) { //проверка на жизнь + std::cout << "File not found."; + return -1; + } + + int lines = countString(in); //кол-во строк в файле + + in.close(); + + in.open("commits.txt"); //заново открываем файлик commits.txt + std::string word; + + for (int i = 0; i < lines; i++) { //цикл на получение первого слова без пробелов(имени) из каждой строки + in >> word; + if(!Hash_table[word]) //если такого нет + { + Hash_table[word] = 1; //создаём + } + else + { + Hash_table[word]++; //если есть, увеличиваем счётчик на 1 + } + + in >> word; //пропускаем два ненужных нам слова в i-той строке + in >> word; + } + + //for (auto elem : Hash_table) { // цикл поэлементно для Hash_table + // std::cout << elem.first /*первый элемент из пары в Hash_table*/ << "\t" << elem.second /*второй элемент из пары в Hash_table*/ << std::endl; + // } + // + //for (int i = 0; i < Hash_table.size(); i++) + //{ + // std::cout << name[i] << "\t" << CommitsCount[i] << std::endl; + //} //существуют для отладки, делают одно и то же, только разными способами + + + + std::vector CommitsCount; //задаём вектор количества коммитов + CommitsCount.reserve(Hash_table.size()); + //и выделяем на них место в памяти + + for (auto data : Hash_table) { //заполение векторов + CommitsCount.push_back(data.second); + } + + resultOutput(&CommitsCount, &Hash_table); //функция из файла FileOutput.h + + return 0; +} diff --git a/LargestElement.h b/LargestElement.h new file mode 100644 index 0000000..81fbff3 --- /dev/null +++ b/LargestElement.h @@ -0,0 +1,16 @@ +#pragma once + +#include + +int searchFirstLargest(std::vector* vct) { //обычная функция для поиска наибольшего элемента в массиве, + int max = 0; //что будет соответствовать наиболшему количеству коммитов + for (int i = 0; i < vct->size(); i++) + { + + if (vct->at(i) > max) + { + max = vct->at(i); + } + } + return max; +} diff --git a/README.md b/README.md index a2bc0aa..cba5967 100644 --- a/README.md +++ b/README.md @@ -24,6 +24,15 @@ CodeKiller777 ## Автор решения +Горст Владислав Александрович. +На постоянке пользуюсь только тг и периодически почтой: @salomolekula и gorstvlad900@gmail.com + ## Описание реализации +За основу была взята хеш-таблица в языке С++, реализуемая с помощью класса unordered_map, с парами значений: имя контрибьютера и кол-во упоминаний в исходном файле, т.е. коммитов. На базе этой таблицы и дополнительных векторов был выполнен далнейших анализ по наибольшему кол-ву коммитов и выводу данных в конечный файлик result.txt. + ## Инструкция по сборке и запуску решения + +Решение разбито на несколько файлов, поэтому можно либо засунуть все функции из них в файл с main, либо реализвать также, как в репозитории. Файлик commits.txt добавить в корневую папку с решением: +![image](https://github.com/salomolekula/school2024-test-task4/assets/145390702/244146e2-843e-4a8d-8038-ab1dcf42aef6) + diff --git a/StringLength.h b/StringLength.h new file mode 100644 index 0000000..3b4dc38 --- /dev/null +++ b/StringLength.h @@ -0,0 +1,21 @@ +#pragma once + +#include +#include + +int countString(std::ifstream& inMyStream) { //подсчёт количества строк в файле + std::string line; + + int c = 0; //переменная колиства строк + + if (inMyStream.is_open()) + { + + while (getline(inMyStream, line)) { //если не дало из потока, значит 0 + + c++; + } + } + inMyStream.close(); + return c; +} diff --git a/commits.txt b/commits.txt new file mode 100644 index 0000000..545a416 --- /dev/null +++ b/commits.txt @@ -0,0 +1 @@ +*Здесь начальные данные, которые по условию прислали на почту diff --git a/result.txt b/result.txt new file mode 100644 index 0000000..b01f533 --- /dev/null +++ b/result.txt @@ -0,0 +1 @@ +*результат обработки файла commits.txt*