diff --git a/main.cpp b/main.cpp index 03e6ee8..2d7f59c 100644 --- a/main.cpp +++ b/main.cpp @@ -3,37 +3,45 @@ using namespace std; -int main() -{ +struct Input { + vector numbers; + size_t bin_count{}; +}; + +Input +input_data() { size_t number_count; - cerr << "Enter number count: "; + cout << "Enter number count: "; cin >> number_count; - + Input in; + in.numbers.resize(number_count); vector numbers(number_count); for (size_t i = 0; i < number_count; i++) { - cin >> numbers[i]; + cin >> in.numbers[i]; } size_t bin_count; - cerr << "Enter count bin : "; - cin >> bin_count; - double min = numbers[0]; - double max = numbers[0]; + cout << "Enter count bin : "; + cin >> in.bin_count; + return in; +} +void +find_minmax(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) - { - max = x; - } - } - vector bins(bin_count); + if(x < min){min = x;} + else if (x > max){max = x;} + }} +vector make_histogram(const vector& numbers, size_t bin_count){ + vector bins (bin_count); + double min = 0; + double max = 0; + find_minmax(numbers, min, max); double bin_size = (max - min) / bin_count; - for (size_t i =0; i < number_count; i++) + for (size_t i =0; i < numbers.size(); i++) { bool found = false; for (size_t j = 0; (j < bin_count - 1) && !found; j++) @@ -44,37 +52,44 @@ int main() { bins[j]++; found = true; - } - } - if (!found) - { - bins[bin_count - 1]++; - } + }} + if (!found){bins[bin_count - 1]++;} } - const size_t SCREEN_WIDTH = 80; - const size_t MAX_ASTERISK = SCREEN_WIDTH - 3 - 1; - size_t bin_max = bins[0]; + return bins;} + +show_histogram_text (const vector& bins, size_t MAX_ASTERISK, size_t bin_count){ + size_t bin_max = 0; + size_t height = 0; for (double y : bins) { - if (y > bin_max) - { - bin_max = y; - } + if (y > bin_max){bin_max = y;} } - for (size_t i = bin_max; i > 0; i--) + for (size_t bin: bins) { - for (size_t bin: bins) + size_t height = bin; + height = MAX_ASTERISK * (static_cast(bin) / bin_max); + if (bin < 100) { - if (i <= bin) - { - cout << " * "; - } - else - { - cout << " "; - } + cout << " "; + } + if (bin < 10) + { + cout << " "; + } + cout << bin << "|"; + for (size_t i = 0; i < height; i++) + { + cout << "*"; } cout << endl; } - return 0; +} + +int main(){ + const size_t SCREEN_WIDTH = 80; + const size_t MAX_ASTERISK = SCREEN_WIDTH - 3 - 1; + auto in = input_data(); + auto bins = make_histogram(in.numbers, in.bin_count); + show_histogram_text(bins, MAX_ASTERISK, in.bin_count ); + return 0; }