From 85bd0ada9363cb1be9c34255cd758180dca4c302 Mon Sep 17 00:00:00 2001 From: ArtyushinaVV Date: Sun, 23 Apr 2023 13:46:43 +0300 Subject: [PATCH] =?UTF-8?q?code:=20=D1=81=D1=82=D1=80=D1=83=D0=BA=D1=82?= =?UTF-8?q?=D1=83=D1=80=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20?= =?UTF-8?q?=D0=BA=D0=BE=D0=B4=D0=B0=20=D0=BF=D1=80=D0=B8=20=D0=BF=D0=BE?= =?UTF-8?q?=D0=BC=D0=BE=D1=89=D0=B8=20=D1=84=D1=83=D0=BD=D0=BA=D1=86=D0=B8?= =?UTF-8?q?=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.cpp | 155 +++++++++++++++++++++++++++++++++---------------------- 1 file changed, 94 insertions(+), 61 deletions(-) diff --git a/main.cpp b/main.cpp index fa680a7..6e978b1 100644 --- a/main.cpp +++ b/main.cpp @@ -1,87 +1,120 @@ #include +#include #include -#include - using namespace std; -int main() +const size_t SCREEN_WIDTH = 80; +const size_t MAX_ASTERISK = SCREEN_WIDTH - 3 - 1; + +struct Input { + vector numbers; + size_t bin_count{}; +}; + +Input +input_data() { - size_t number_count; - cerr << "Enter number count:"; - cin >> number_count; - vector numbers(number_count); - cerr << "Enter numbers"; - for (size_t i = 0; i < number_count; i++) - cin >> numbers[i]; - size_t bin_count; - cerr << "Enter bin count:"; - cin >> bin_count; - if (bin_count == 0) - { - bin_count = sqrt(number_count); - if (bin_count > 25) - { - bin_count = 1 + log2(number_count); - cout << "After Sturges rule bin count is:" << bin_count << endl; - } - else - cout << "After Empirical rule bin count is:" << bin_count << endl; - } - vector bins(bin_count, 0); - double min = numbers[0]; - double max = numbers[0]; +size_t number_count; +cerr << "count="; +cin >> number_count; + +Input in; - for (double number : numbers) +in.numbers.resize(number_count); + +for (size_t i = 0; i < number_count; i++) { + cin >> in.numbers[i]; +} + +cerr << "bin_count= "; +cin >> in.bin_count; + +return in; +} + +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 (min > number) - min = number; - else if (max < number) - max = number; + if (numbers[i] > max) + max = numbers[i]; + if (numbers[i] < min) + min = numbers[i]; } +} + +vector make_histogram (const vector& numbers, size_t &bin_count) +{ + vector bins(bin_count); + + double min, max; + float low, hi; - double bin_size = (max - min) / bin_count; - for (size_t i = 0; i < number_count; i++) + find_minmax(numbers, min, max); + + double bin_size = (max - min) / bin_count; + low = min; + hi = low + bin_size; + + for (size_t i = 0; i < numbers.size(); i++) { bool found = false; - for (size_t j = 0; j < (bin_count - 1) && !found; j++) + + for (size_t j = 0; (j < bin_count - 1) && !found; j++) { - auto lo = min + j * bin_size; - auto hi = min + (j + 1) * bin_size; - if ((numbers[i] >= lo) && (numbers[i] < hi)) + low = min + j * bin_size; + hi = min + (j + 1) * bin_size; + if ((low <= numbers[i]) && (numbers[i] < hi)) { bins[j]++; found = true; } } - if (!found) + if (found==false) { bins[bin_count - 1]++; } } + return bins; +} - const size_t SCREEN_WIDTH = 80; - const size_t MAX_ASTERISK = SCREEN_WIDTH - 3 - 1; +void show_histogram_text(const vector& bins, size_t &bin_count) +{ + +size_t max_bin = bins[0]; +for (size_t bin : bins) +if (bin > max_bin) +max_bin = bin; +for (size_t bin : bins) +{ +int height = bin; +if (max_bin > MAX_ASTERISK) +{ +height = MAX_ASTERISK * (static_cast(bin) / max_bin); +} +if (bin < 100) +cout << " "; +if (bin < 10) +cout << " "; +cout << bin << "|"; +for (int i = 0; i < height; i++) +cout << "*"; +cout << endl; +} +} + + +int main() +{ + + auto in = input_data(); + auto bins = make_histogram(in.numbers, in.bin_count); + show_histogram_text(bins, in.bin_count); - size_t max_bin = bins[0]; - for (size_t bin : bins) - if (bin > max_bin) - max_bin = bin; - for (size_t bin : bins) - { - int height = bin; - if (max_bin > MAX_ASTERISK) - { - height = MAX_ASTERISK * (static_cast(bin) / max_bin); - } - if (bin < 100) - cout << " "; - if (bin < 10) - cout << " "; - cout << bin << "|"; - for (size_t i = 0; i < height; i++) - cout << "*"; - cout << endl; - } return 0; }