From 49d11fa294e6a772612c7553cbf0ca77f8820e48 Mon Sep 17 00:00:00 2001 From: KuybedaAY Date: Thu, 24 Apr 2025 23:34:37 +0300 Subject: [PATCH] rabotaet kak nado --- main.cpp | 119 ++++++++++++++++++++++++++----------------------------- 1 file changed, 56 insertions(+), 63 deletions(-) diff --git a/main.cpp b/main.cpp index 95fa6db..e588c45 100644 --- a/main.cpp +++ b/main.cpp @@ -7,91 +7,82 @@ 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() { + Input in; size_t number_count; + cerr << "Enter number count: "; cin >> number_count; - - vector numbers(number_count); + in.numbers.resize(number_count); cerr << "Enter " << number_count << " numbers: "; for (size_t i = 0; i < number_count; i++) { - cin >> numbers[i]; + cin >> in.numbers[i]; } - size_t bin_count; cerr << "Enter bin count: "; - cin >> bin_count; + cin >> in.bin_count; + return in; +} - double min = numeric_limits::max(); - double max = numeric_limits::lowest(); +// Функция поиска минимума и максимума +void +find_minmax(const vector& numbers, double& min, double& max) { + min = numeric_limits::max(); + max = numeric_limits::lowest(); for (double x : numbers) { - if (x < min) { - min = x; - } - if (x > max) { - max = x; - } + if (x < min) min = x; + if (x > max) max = x; } +} +// Функция создания гистограммы +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; - + if (max == min) { + return vector(bin_count, numbers.size()); + } + double bin_size = (max - min) / bin_count; vector bins(bin_count, 0); - - for (size_t i = 0; i < numbers.size(); i++) { - bool found = false; - for (size_t 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]++; - } + for (double x : numbers) { + size_t bin_index = static_cast((x - min) / bin_size); + if (bin_index >= bin_count) bin_index = bin_count - 1; + bins[bin_index]++; } + return bins; +} + +// Функция вывода гистограммы +void +show_histogram_text(const vector& bins) { size_t max_count = 0; for (size_t count : bins) { - if (count > max_count) { - max_count = count; - } + if (count > max_count) max_count = count; } - cerr << "Bin counts:" << endl; + for (size_t j = 0; j < bins.size(); j++) { + size_t height = (max_count > MAX_ASTERISK) + ? static_cast(MAX_ASTERISK * (static_cast(bins[j]) / max_count)) + : bins[j]; - - - - - - - - - - - - size_t height; - for (size_t j = 0; j < bin_count; j++) { - // Вычисляем высоту гистограммы - if(max_count > 76){ - height = (max_count > 0) ? static_cast(76 * (static_cast(bins[j]) / max_count)) : 0; - } - else{ - height = bins[j]; - } - // Выводим количество в бине с учетом форматирования if (bins[j] < 10) { cout << " " << bins[j] << "|"; } else if (bins[j] < 100) { @@ -100,14 +91,16 @@ int main() { cout << bins[j] << "|"; } - // Выводим символы '*' в соответствии с высотой - for (size_t k = 0; k < height; k++) { - cout << "*"; - } + for (size_t k = 0; k < height; k++) cout << "*"; cout << endl; } - - return 0; } +int +main() { + auto in = input_data(); + auto bins = make_histogram(in.numbers, in.bin_count); + show_histogram_text(bins); + return 0; +}