From 26ad4bc3cbbcfb2bdb81489518acec16e87f00ea Mon Sep 17 00:00:00 2001 From: OgarkovIA Date: Mon, 3 Jun 2024 07:40:25 +0000 Subject: [PATCH] =?UTF-8?q?=D0=9F=D1=80=D0=BE=D0=B3=D1=80=D0=B0=D0=BC?= =?UTF-8?q?=D0=BC=D0=B0=20=D0=BA=D0=BE=D1=80=D1=80=D0=B5=D0=BA=D1=82=D0=BD?= =?UTF-8?q?=D0=BE=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=B0=D0=B5=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.cpp | 106 ++++++++++++++++++++++++++++++++----------------------- 1 file changed, 61 insertions(+), 45 deletions(-) diff --git a/main.cpp b/main.cpp index 14048c9..44f90ce 100644 --- a/main.cpp +++ b/main.cpp @@ -1,92 +1,108 @@ #include #include using namespace std; + const size_t SCREEN_WIDTH = 80; const size_t MAX_ASTERISK = SCREEN_WIDTH - 3 - 1; -int main() -{ +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); + Input in; + in.numbers.resize(number_count); + cerr << "Enter numbers: "; - for(size_t i = 0; i < number_count; i++){ - cin >> numbers[i]; + for (size_t i = 0; i < number_count; i++) { + cin >> in.numbers[i]; } - size_t bin_count; cerr << "Enter bin count: "; - cin >> bin_count; + cin >> in.bin_count; + + return in; +} - double min = numbers[0]; - double max = numbers[0]; +void find_minmax(const vector& numbers, double& min, double& max) { + min = numbers[0]; + max = numbers[0]; for (double x : numbers) { if (x < min) { min = x; } - else if (x > max) { + if (x > max) { max = x; } } - vector bins(bin_count); - double bin_size = (max-min)/bin_count; - for (size_t i = 0; i < number_count; i++) { - bool found = false; - 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) ) { - bins[j]++; - found = true; - } - } - if (!found) { - bins[bin_count-1]++; - } +} + +vector make_histogram(const vector& numbers, size_t bin_count) { + double min, max; + find_minmax(numbers, min, max); + vector bins(bin_count, 0); + double bin_size = (max - min) / bin_count; + + for (double number : numbers) { + size_t bin_index = bin_count - 1; // default to last bin + if (number < max) { + bin_index = static_cast((number - min) / bin_size); + } + bins[bin_index]++; } + + return bins; +} + +void show_histogram_text(const vector& bins) { size_t max_count = bins[0]; - for(size_t x: bins){ - if(x > max_count){ + for (size_t x : bins) { + if (x > max_count) { max_count = x; } } - if (max_count > MAX_ASTERISK){ - for(size_t count: bins){ - size_t height = MAX_ASTERISK * (static_cast(count) /max_count); - if (count < 10){ + + if (max_count > MAX_ASTERISK) { + for (size_t count : bins) { + size_t height = MAX_ASTERISK * (static_cast(count) / max_count); + if (count < 10) { cout << " " << count << "|"; - } - else if (count < 100){ + } else if (count < 100) { cout << " " << count << "|"; - } - else{ + } else { cout << count << "|"; } - for(size_t i = 0; i < height; i++){ + for (size_t i = 0; i < height; i++) { cout << "*"; } cout << "\n"; } - } - else{ - for(double x : bins){ - if (x < 10){ + } else { + for (size_t x : bins) { + if (x < 10) { cout << " " << x << "|"; - } - else if (x < 100){ + } else if (x < 100) { cout << " " << x << "|"; - } - else{ + } else { cout << x << "|"; } - for(size_t i = 0; i < x; i++){ + for (size_t i = 0; i < x; i++) { cout << "*"; } cout << "\n"; } } +} + +int main() { + auto in = input_data(); + auto bins = make_histogram(in.numbers, in.bin_count); + show_histogram_text(bins); return 0; }