From 3dffa781185c05dcc5871a12f55c5d47a2f299e2 Mon Sep 17 00:00:00 2001 From: IshutinaYI Date: Mon, 10 Apr 2023 12:11:37 +0300 Subject: [PATCH] =?UTF-8?q?code:=20=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=20=D0=BA=D0=BE=D0=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lab34.cpp | 82 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 lab34.cpp diff --git a/lab34.cpp b/lab34.cpp new file mode 100644 index 0000000..d8e3dcd --- /dev/null +++ b/lab34.cpp @@ -0,0 +1,82 @@ +#include +#include +#include +const size_t WINDOW_WIDTH = 80; +const size_t MAX_VALUE = WINDOW_WIDTH - 3 - 1; +using namespace std; + +struct Input{ + vector numbers; + size_t bin_count = 0; +}; + +Input +input_data(){ + size_t number_count; + cin >> number_count; + Input in; + in.numbers.resize(number_count); + for (size_t i = 0; i < number_count; i++) { + cin >> in.numbers[i]; + } + cin >> in.bin_count; + return in; +} + +void +find_minmax(const vector &numbers, double &min, double &max){ + min = numbers[0]; + max = numbers[0]; + for (float now: numbers){ + if (now < min) {min = now;} + if (now > max) {max = now;} + } + return; +} + +vector +make_histogram(vector numbers, size_t bin_count){ + vector bins(bin_count); + double min = 0, max = 0; + find_minmax(numbers, min, max); + double bin_size = (max - min) / bin_count; + double lo = min, hi = min + bin_size; + for (size_t i = 0; i < bin_count; i++){ + for (auto now : numbers){ + if (i == bin_count - 1) { + if ((now >= lo) && (now <= hi)) {bins[i]++;} + } + else { + if ((now >= lo) && (now < hi)) {bins[i]++;} + } + } + lo = hi; hi += bin_size; + } + return bins; +} + +void show_histogram_text(const vector &bins){ + size_t max_count = 0; + for (auto now: bins) + {if (now > max_count) {max_count = now;}} + cout << "mc = " << max_count << endl; + for (size_t now : bins){ + if (now < 100) {cout << ' ';} if (now < 10) {cout << ' ';} //форматирование строк + cout << now << "|"; + int height; + if (now == max_count) {height = MAX_VALUE * 1.0;} + else {height = MAX_VALUE * (static_cast (now) / max_count);} + for (int i = 0; i < round(height); i++) {cout << "*";} + cout << endl; + } +} + +int +main(){ + double min = 0, max = 0; + Input in = input_data(); + auto bins = make_histogram(in.numbers, in.bin_count); + for (auto now: bins) {cout << now << endl;} + show_histogram_text(bins); + return 0; +}