From 36e46ca8cf8302dc87390450c17b9a2308ea61d7 Mon Sep 17 00:00:00 2001 From: alextwix Date: Thu, 24 Apr 2025 23:33:03 +0300 Subject: [PATCH] =?UTF-8?q?=D0=BF=D0=BE=D0=B9=D0=B4=D0=B5=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.cpp | 149 +++++++++++++++++++++++++++++++++---------------------- 1 file changed, 90 insertions(+), 59 deletions(-) diff --git a/main.cpp b/main.cpp index 97fc5eb..e588c45 100644 --- a/main.cpp +++ b/main.cpp @@ -1,75 +1,106 @@ #include #include -#include +#include + using namespace std; -int main(){ - const size_t SCREEN_WIDTH = 80; - const size_t MAX_ASTERISK = SCREEN_WIDTH - 3 - 1; +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() { + Input in; size_t number_count; - cerr << "Enter amount of numbers \n"; + + cerr << "Enter number count: "; cin >> number_count; - vector numbers(number_count); - for (size_t i = 0; i < number_count; i++){ - cerr << "Input number " << i+1 << endl; - cin >> numbers[i]; + + in.numbers.resize(number_count); + cerr << "Enter " << number_count << " numbers: "; + for (size_t i = 0; i < number_count; i++) { + cin >> in.numbers[i]; } - double minc, maxc; - minc = maxc = numbers[0]; - for (size_t i = 1; i < number_count; i++ ){ - if(numbers[i] < minc){ - minc = numbers[i]; - } - else if (numbers[i] > maxc){ - maxc = numbers[i]; - } + + cerr << "Enter bin count: "; + cin >> in.bin_count; + + return in; +} + +// Функция поиска минимума и максимума +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; } - size_t bin_count; - cerr << "Input number of bins \n"; - cin >> bin_count; - vector bins(bin_count); - double bin_size = (maxc - minc) / bin_count; - size_t bin_max_size = 0; - 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 = minc + j * bin_size; - auto hi = minc + (j + 1) * bin_size; - if ((lo <= numbers[i]) && (numbers[i] < hi)) { - bins[j]++; - found = true; - if (bins[j]> bin_max_size){ - bin_max_size = bins[j]; - } - } - } - if (!found) { - bins[bin_count - 1]++; - if (bins[bin_count - 1]> bin_max_size){ - bin_max_size = bins[bin_count - 1]; - } - } +} + +// Функция создания гистограммы +vector +make_histogram(const vector& numbers, size_t bin_count) { + double min, max; + find_minmax(numbers, min, max); + + if (max == min) { + return vector(bin_count, numbers.size()); } - size_t height; - for(int i = 0; i= MAX_ASTERISK){ - height = floor(static_cast(bins[i])*76.0f/static_cast(bin_max_size)); + + double bin_size = (max - min) / bin_count; + vector bins(bin_count, 0); + + 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; + } + + 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]; + + if (bins[j] < 10) { + cout << " " << bins[j] << "|"; + } else if (bins[j] < 100) { + cout << " " << bins[j] << "|"; } else { - height = bins[i]; - } - for(int j = 0; j