From 736ee1a015159b7c536c9e9505545e217da72932 Mon Sep 17 00:00:00 2001 From: TabolinIA Date: Tue, 7 May 2024 23:57:20 +0300 Subject: [PATCH] =?UTF-8?q?code:=20=D0=BE=D1=88=D0=B8=D0=B1=D0=BA=D0=B0=20?= =?UTF-8?q?=D0=B2=20=D1=84=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D0=B8=20=D0=B2?= =?UTF-8?q?=D1=8B=D0=B2=D0=BE=D0=B4=D0=B0=20=D0=B3=D0=B8=D1=81=D1=82=D0=BE?= =?UTF-8?q?=D0=B3=D1=80=D0=B0=D0=BC=D0=BC=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- histogram.cpp | 59 +++++++++++++++++++++++++++++++++++++++++ histogram.h | 5 ++++ lab_03.cbp | 41 +++++++++++++++++++++++++++++ main.cpp | 73 +++++++++++++++++++++------------------------------ 4 files changed, 135 insertions(+), 43 deletions(-) create mode 100644 histogram.cpp create mode 100644 histogram.h create mode 100644 lab_03.cbp diff --git a/histogram.cpp b/histogram.cpp new file mode 100644 index 0000000..4a8a75f --- /dev/null +++ b/histogram.cpp @@ -0,0 +1,59 @@ +#include +#include "histogram.h" + +using namespace std; + +static +void +find_minmax(const vector& numbers, double& min, double& max) { + min = numbers[0]; + max = numbers[0]; + for (size_t i = 0; i < numbers.size(); i++){ + if (numbers[i] < min){ + min = numbers[i]; + } + if (numbers[i] > max){ + max = numbers[i]; + } + } +} + +vector make_histogram(const vector numbers, size_t bin_count){ + + double min, max; + find_minmax(numbers, min, max); + double bin_size = (max - min) / bin_count; + vector bins; + bins.resize(bin_count); + + for (std::size_t i = 0; i < numbers.size(); i++) + { + bool found = false; + for (std::size_t j = 0; (j < bin_count - 1) && !found; j++) + { + auto lo = min + j * bin_size; + auto hi = min + (j + 1) * bin_size; + if ((lo <= numbers[i]) && (numbers[i] < hi)) + { + bins[j]++; + found = true; + } + } + if (!found) + { + bins[bin_count - 1]++; + } + } + double out; + for (std::size_t i = 0; i < bin_count-1; i++) + { + if (bins[i] > bins[i+1]) + { + out = bins[i]; + bins[i] = bins[i + 1]; + bins[i + 1] = out; + } + } + return bins; +} + diff --git a/histogram.h b/histogram.h new file mode 100644 index 0000000..6ba6315 --- /dev/null +++ b/histogram.h @@ -0,0 +1,5 @@ +#ifndef HISTOGRAM_H_INCLUDED +#define HISTOGRAM_H_INCLUDED +std::vector +make_histogram(const std::vector& numbers, const std::size_t bin_count); +#endif // HISTOGRAM_H_INCLUDED diff --git a/lab_03.cbp b/lab_03.cbp new file mode 100644 index 0000000..dc7a6a4 --- /dev/null +++ b/lab_03.cbp @@ -0,0 +1,41 @@ + + + + + + diff --git a/main.cpp b/main.cpp index 3616b97..f0d0026 100644 --- a/main.cpp +++ b/main.cpp @@ -1,58 +1,37 @@ #include #include +#include "histogram.h" using namespace std; const int max_length = 80; // максимальная длина const int indent = 4; // отступ -int main() -{ - size_t number_count, bin_count; - cerr << "Enter number count: "; - cin >> number_count; // ввод кол-ва оценок - vector numbers(number_count); +struct Input { + vector numbers; + size_t bin_count{}; +}; + +Input +input_data() { + size_t number_count; + cout << "Enter number count: "; + cin >> number_count; + Input in; + in.numbers.resize(number_count); cerr << "Enter numbers: " << endl; - for (int i = 0; i < number_count; i++) { - cin >> numbers[i]; // ввод оценок + for (size_t i = 0; i < number_count; i++) { + cin >> in.numbers[i]; } cerr << "Enter bin count: "; - cin >> bin_count; // ввод кол-ва корзин - vector bins(bin_count); - for (int i = 0; i < bin_count; i++) { - bins[i] = 0; - } - double min = 5; - double max = 0; - for (int i = 0; i < number_count; i++) { // определение макс и мин оценок - if (numbers[i] > max) { - max = numbers[i]; - } - if (numbers[i] < min) { - min = numbers[i]; - } - } - double bin_size = (max - min) / bin_count; // определение размера корзины и шага - double step = bin_size; - - for (int i = 0; i < number_count; i++) { - bool found = false; // условие вхождения в какой-либо промежуток, кроме последнего - for (int j = 0; (j < bin_count - 1) && !found; j++) { - double lo = min + j * bin_size; // нижняя граница промежутка - double hi = min + (j + 1) * bin_size; // верхняя граница промежутка - if ((lo <= numbers[i]) && (numbers[i] < hi)) { // проверка условия вхождения числа в промежуток - bins[j]++; - found = true; - } - } - if (!found) { - bins[bin_count - 1]++; - } - } + cin >> in.bin_count; + return in; +} - double max_bin = bins[0]; +void show_histogram(const vector bins, size_t bin_count){ +double max_bin = bins[0]; int k; - for (int i = 0; i < bin_count; i++) { // нахождение макс значения bin[] + for (size_t i = 0; i < bin_count; i++) { // нахождение макс значения bin[] if (bins[i] > max_bin) { max_bin = bins[i]; } @@ -66,7 +45,7 @@ int main() cerr << endl; int out; - for (int i = 0; i < bin_count; i++) { + for (size_t i = 0; i < bin_count; i++) { cout.width(3); // выравнивание cout.fill(' '); cout << bins[i] << "|"; @@ -81,5 +60,13 @@ int main() } cout << endl; } +} + +int +main() +{ + auto in = input_data(); + auto bins = make_histogram(in.numbers, in.bin_count); + show_histogram(bins, in.bin_count); return 0; }