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

Pull request в задание для Летней школы Горст Владислав #17

Open
wants to merge 12 commits into
base: master
Choose a base branch
from
37 changes: 37 additions & 0 deletions FileOutput.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
#pragma once

//функция вывода имён трёх лучших конрибьютеров в конечный файл result

#include "LagestElement.h"
#include <fstream>
#include <iostream>
#include <vector>
#include <unordered_map>

int resultOutput(std::vector<int> *CommitsCount, std::unordered_map<std::string, int>* 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;
}
62 changes: 62 additions & 0 deletions Krok_hash.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
#include <unordered_map>
#include <vector>
#include <fstream>
#include "FileOutput.h"
#include "StringLength.h"

int main()
{

std::unordered_map<std::string, int> 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<int> CommitsCount; //задаём вектор количества коммитов
CommitsCount.reserve(Hash_table.size());
//и выделяем на них место в памяти

for (auto data : Hash_table) { //заполение векторов
CommitsCount.push_back(data.second);
}

resultOutput(&CommitsCount, &Hash_table); //функция из файла FileOutput.h

return 0;
}
16 changes: 16 additions & 0 deletions LargestElement.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
#pragma once

#include <vector>

int searchFirstLargest(std::vector<int>* vct) { //обычная функция для поиска наибольшего элемента в массиве,
int max = 0; //что будет соответствовать наиболшему количеству коммитов
for (int i = 0; i < vct->size(); i++)
{

if (vct->at(i) > max)
{
max = vct->at(i);
}
}
return max;
}
9 changes: 9 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,15 @@ CodeKiller777

## Автор решения

Горст Владислав Александрович.
На постоянке пользуюсь только тг и периодически почтой: @salomolekula и [email protected]

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

За основу была взята хеш-таблица в языке С++, реализуемая с помощью класса unordered_map, с парами значений: имя контрибьютера и кол-во упоминаний в исходном файле, т.е. коммитов. На базе этой таблицы и дополнительных векторов был выполнен далнейших анализ по наибольшему кол-ву коммитов и выводу данных в конечный файлик result.txt.

## Инструкция по сборке и запуску решения

Решение разбито на несколько файлов, поэтому можно либо засунуть все функции из них в файл с main, либо реализвать также, как в репозитории. Файлик commits.txt добавить в корневую папку с решением:
![image](https://github.com/salomolekula/school2024-test-task4/assets/145390702/244146e2-843e-4a8d-8038-ab1dcf42aef6)

21 changes: 21 additions & 0 deletions StringLength.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
#pragma once

#include <fstream>
#include <string>

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;
}
1 change: 1 addition & 0 deletions commits.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
*Здесь начальные данные, которые по условию прислали на почту
1 change: 1 addition & 0 deletions result.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
*результат обработки файла commits.txt*