Skip to content
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
7 changes: 7 additions & 0 deletions sem2/MakarovNE/homework_4/Numsik.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
#include "VectorWork.h"

int main() {
VectorWork vectorWork("output.txt");
vectorWork.runAllSteps();
return 0;
}
100 changes: 100 additions & 0 deletions sem2/MakarovNE/homework_4/VectorWork.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
#include "VectorWork.h"

#include <algorithm>
#include <iterator>
#include <numeric>
#include <random>

VectorWork::VectorWork(const std::string& filename) : output_file(filename) {
mean_value = 0.0;
}

VectorWork::~VectorWork() {
if (output_file.is_open()) {
output_file.close();
}
}

void VectorWork::runAllSteps() {
if (!output_file.is_open()) {
return;
}

generateVector();
findMixMax();
sortAndWrite();
countElements();
calculateMean();
removeBelowMean();
extractUnique();
}

void VectorWork::writeVectorToFile(const std::vector<int>& vec,
const std::string& message) {
output_file << message << ":\n";
std::copy(vec.begin(), vec.end(),
std::ostream_iterator<int>(output_file, " "));
output_file << "\n\n";
}

void VectorWork::generateVector() {
numbers.resize(20);
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_int_distribution<> dist(-50, 100);

std::generate(numbers.begin(), numbers.end(),
[&gen, &dist]() { return dist(gen); });

writeVectorToFile(numbers, "1. Сгенирированный исходный вектор");
}

void VectorWork::findMixMax() {
auto [min_it, max_it] = std::minmax_element(numbers.begin(), numbers.end());
output_file << "2. Минимальный и максимальный элемент:\n";
output_file << "Min: " << *min_it << "\nMax: " << *max_it << "\n\n";
}

void VectorWork::sortAndWrite() {
std::sort(numbers.begin(), numbers.end());
writeVectorToFile(numbers, "3. Отсортированный вектор");
}

void VectorWork::countElements() {
int pos_count = std::count_if(numbers.begin(), numbers.end(),
[](int num) { return num > 0; });
int neg_count = std::count_if(numbers.begin(), numbers.end(),
[](int num) { return num < 0; });
int zero_count = std::count_if(numbers.begin(), numbers.end(),
[](int num) { return num == 0; });

output_file << "4. Подсчет эллементов:\n";
output_file << "Положительные: " << pos_count << "\n";
output_file << "Отрицательные: " << neg_count << "\n";
output_file << "Нули: " << zero_count << "\n\n";
}

void VectorWork::calculateMean() {
double sum = std::accumulate(numbers.begin(), numbers.end(), 0.0);
mean_value = sum / numbers.size();

output_file << "5. Среднее значение:\n";
output_file << "Mean: " << mean_value << "\n\n";
}

void VectorWork::removeBelowMean() {
auto remove_it = std::remove_if(numbers.begin(), numbers.end(),
[this](int num) { return num < mean_value; });
numbers.erase(remove_it, numbers.end());
writeVectorToFile(numbers,
"6. Вектор после удаления элементов ниже среднего");
}

void VectorWork::extractUnique() {
std::sort(numbers.begin(), numbers.end());
std::vector<int> unique_numbers;

std::unique_copy(numbers.begin(), numbers.end(),
std::back_inserter(unique_numbers));
writeVectorToFile(unique_numbers, "7. Вектор с уникальными элементами");
}
24 changes: 24 additions & 0 deletions sem2/MakarovNE/homework_4/output.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
1. Сгенирированный исходный вектор:
-9 -11 37 45 55 86 -23 25 -8 -41 32 38 50 86 52 -28 53 22 -32 -28

2. Минимальный и максимальный элемент:
Min: -41
Max: 86

3. Отсортированный вектор:
-41 -32 -28 -28 -23 -11 -9 -8 22 25 32 37 38 45 50 52 53 55 86 86

4. Подсчет эллементов:
Положительные: 12
Отрицательные: 8
Нули: 0

5. Среднее значение:
Mean: 20.05

6. Вектор после удаления элементов ниже среднего:
22 25 32 37 38 45 50 52 53 55 86 86

7. Вектор с уникальными элементами:
22 25 32 37 38 45 50 52 53 55 86