diff --git a/main.cpp b/main.cpp index 5e6f9fd..a5526cd 100644 --- a/main.cpp +++ b/main.cpp @@ -2,41 +2,56 @@ #include using namespace std; -int main() +struct Input { + vector numbers; + size_t bin_count{}; +}; + +Input +input_data() { - size_t numbers, columns, count; - float minn, maxx, diff, lo, hi; + size_t number_count; + cin >> number_count; - cerr << "Quantity of numbers = "; cin >> numbers; - vector xs(numbers); - cerr << "Enter your numbers: "; + Input in; + in.numbers.resize(number_count); - for (int i = 0; i < numbers; ++i) - { - cin >> xs[i]; + for (size_t i = 0; i < number_count; i++) { + cin >> in.numbers[i]; } - cerr << "Columns = "; cin >> columns; - vector a(columns); + cin >> in.bin_count; + return in; +} - maxx = xs[0]; - minn = xs[0]; - for (int i = 0; i < numbers; i++) +void +find_minmax(const vector& numbers, double& min, double& max) { + min = numbers[0]; max = numbers[0]; + for (double x: numbers) { - if (xs[i] > maxx) - maxx = xs[i]; + if (x > max) + max = x; else { - if (xs[i] < minn) - minn = xs[i]; + if (x < min) + min = x; } } +} +auto +make_histogram(const vector& numbers, size_t bin_count) { + double min, max; + find_minmax(numbers, min, max); - diff = (maxx - minn) / columns; - lo = minn; + size_t columns = bin_count; + double lo, hi, diff; - size_t max_count = 0; + diff = (max - min) / columns; + lo = min; + + vector bins(columns); + size_t max_count = 0, count; for (int i = 0; i < columns; ++i) { count = 0; @@ -47,50 +62,60 @@ int main() } else { - hi = maxx; + hi = max; } - for (int j = 0; j < numbers; j++) + for (double x: numbers) { if (i == 0) { - if ((xs[j] >= lo) && (xs[j] <= hi)) + if ((x >= lo) && (x <= hi)) count++; } else { - if ((xs[j] > lo) && (xs[j] <= hi)) + if ((x > lo) && (x <= hi)) count++; } } - a[i] = count; + bins[i] = count; lo = hi; - - if (max_count < a[i]) - max_count = a[i]; } + return bins; +} + +void +show_histogram_text(vector& bins) { const size_t SCREEN_WIDTH = 80; const size_t MAX_ASTERISK = SCREEN_WIDTH - 3 - 1; size_t height; - for (int i = 0; i < columns; i++) + + size_t max_count = 0; + for (size_t x : bins) + { + if (max_count < x) + max_count = x; + } + + for (size_t x: bins) { - if (a[i] == 0) + if (x == 0) continue; - if (a[i] < 10) + if (x < 10) cout << " "; else - if (a[i] < 100) + if (x < 100) cout << " "; - cout << a[i] << "|"; + cout << x << "|"; if (max_count > MAX_ASTERISK) - height = MAX_ASTERISK * (static_cast(a[i]) / max_count); + height = MAX_ASTERISK * (static_cast(x) / max_count); else - height = a[i]; + height = x; for (int j = 0; j < height; j++) { @@ -98,5 +123,14 @@ int main() } cout << endl; } +} + +int +main() +{ + auto in = input_data(); + + auto bins = make_histogram(in.numbers, in.bin_count); + show_histogram_text(bins); }