diff --git a/sem2/MakarovNE/homework_4/Numsik.cpp b/sem2/MakarovNE/homework_4/Numsik.cpp new file mode 100644 index 00000000..2aad7330 --- /dev/null +++ b/sem2/MakarovNE/homework_4/Numsik.cpp @@ -0,0 +1,7 @@ +#include "VectorWork.h" + +int main() { + VectorWork vectorWork("output.txt"); + vectorWork.runAllSteps(); + return 0; +} diff --git a/sem2/MakarovNE/homework_4/VectorWork.cpp b/sem2/MakarovNE/homework_4/VectorWork.cpp new file mode 100644 index 00000000..f71c663b --- /dev/null +++ b/sem2/MakarovNE/homework_4/VectorWork.cpp @@ -0,0 +1,100 @@ +#include "VectorWork.h" + +#include +#include +#include +#include + +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& vec, + const std::string& message) { + output_file << message << ":\n"; + std::copy(vec.begin(), vec.end(), + std::ostream_iterator(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 unique_numbers; + + std::unique_copy(numbers.begin(), numbers.end(), + std::back_inserter(unique_numbers)); + writeVectorToFile(unique_numbers, "7. Вектор с уникальными элементами"); +} diff --git a/sem2/MakarovNE/homework_4/output.txt b/sem2/MakarovNE/homework_4/output.txt new file mode 100644 index 00000000..185895f1 --- /dev/null +++ b/sem2/MakarovNE/homework_4/output.txt @@ -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 +