From 585d8779316805e405c4bbfb9f1ea7baf857d796 Mon Sep 17 00:00:00 2001 From: KovalenkoDM Date: Mon, 15 Apr 2024 14:53:12 +0300 Subject: [PATCH] fuction separation --- main_original.cpp | 108 ++++++++++++++++++++++++++++------------------ 1 file changed, 67 insertions(+), 41 deletions(-) diff --git a/main_original.cpp b/main_original.cpp index 3719ded..a679d7a 100644 --- a/main_original.cpp +++ b/main_original.cpp @@ -7,61 +7,87 @@ using namespace std; const size_t SCREEN_WIDTH = 80; const size_t MAX_ASTERISK = SCREEN_WIDTH - 3 - 1; -int main() { - size_t numberCount, binCount, maxCount; - double maxx, minn; - cerr << "Enter number count: "; - cin >> numberCount; - vector numbers(numberCount); - cerr << "Fill array \"numbers\"\n"; - for (int i = 0; i < numberCount; i++) { - cin >> numbers[i]; +struct Input { + vector numbers; + size_t bin_count{}; +}; + +Input input_data() { + Input in; + size_t number_count; + cin >> number_count; + in.numbers.resize(number_count); + for (size_t i = 0; i < number_count; i++) { + cin >> in.numbers[i]; } - maxx = numbers[0]; - minn = numbers[0]; - for (auto el: numbers) { - if (el > maxx) { - maxx = el; + cin >> in.bin_count; + return in; +} + +void +find_minmax(const vector& numbers, double& min, double& max) { + min = numbers[0]; + max = numbers[0]; + for (auto el : numbers) { + if (el > max) { + max = el; } - if (el < minn) { - minn = el; + if (el < min) { + min = el; } } - cerr << "Enter bin count: "; - cin >> binCount; - double binSize = (maxx - minn) / binCount; - vector bins(binCount); - maxCount = 0; - for (size_t i = 0; i < numberCount; i++) { - bool found = false; - for (size_t j = 0; (j < binCount - 1) && !found; j++) { - auto lo = minn + j * binSize; - auto hi = minn + (j + 1) * binSize; - if ((lo <= numbers[i]) && (numbers[i] < hi)) { - bins[j]++; - found = true; - if (bins[j] > maxCount) { - maxCount = bins[j]; +} + +vector make_histogram(const vector& numbers, const size_t& bin_count) { + vector bins(bin_count); + double max, min; + find_minmax(numbers, min, max); + double binSize = (max - min) / bin_count; + for (size_t i = 0; i < numbers.size(); i++) { + bool found = false; + for (size_t j = 0; (j < bin_count - 1) && !found; j++) + { + auto lo = min + j * binSize; + auto hi = min + (j + 1) * binSize; + if ((lo <= numbers[i]) && (numbers[i] < hi)) + { + bins[j]++; + found = true; } } + if (!found) + { + bins[bin_count - 1]++; + } } - if (!found) { - bins[binCount - 1]++; - if (bins[binCount - 1] > maxCount) { - maxCount = bins[binCount - 1]; - } - } + return bins; +} + +void show_histogram_text(const vector& bins) { + size_t maxCount = bins[0]; + for (auto bin : bins) { + if (maxCount < bin) { + maxCount = bin; + } } - for (auto bin: bins) { - if (bin < 100) { + for (auto bin : bins) { + if (bin < 100) + { cout << " "; } - if (bin < 10) { + if (bin < 10) + { cout << " "; } - size_t height = maxCount < MAX_ASTERISK? bin: MAX_ASTERISK * (static_cast(bin) / maxCount); + size_t height = maxCount < MAX_ASTERISK ? bin : MAX_ASTERISK * (static_cast(bin) / maxCount); cout << bin << "|" << string(height, '*'); cout << "\n"; } +} + +int main() { + Input in = input_data(); + auto bins = make_histogram(in.numbers, in.bin_count); + show_histogram_text(bins); return 0; } \ No newline at end of file