diff --git a/main.cpp b/main.cpp index cb379f5..f33be70 100644 --- a/main.cpp +++ b/main.cpp @@ -2,24 +2,33 @@ #include using namespace std; -int main() -{ +struct Input { + vector numbers; + size_t bin_count{}; +}; + +Input +input_data() { + Input in; size_t numbers_count; - cerr << "Enter numbers count: "; + cout << "Enter numbers count: "; cin >> numbers_count; - vector numbers(numbers_count); - cerr << "Enter numbers: "; + in.numbers.resize(numbers_count); - for (int i = 0; i < numbers_count; i++) { - cin >> numbers[i]; + cout << "Enter numbers: "; + for (size_t i = 0; i < numbers_count; i++) { + cin >> in.numbers[i]; } - size_t bin_count; - cerr << "Enter bin count: "; - cin >> bin_count; - vector bins(bin_count); - double min = numbers[0]; - double max = numbers[0]; + cout << "Enter bin count: "; + cin >> in.bin_count; + return in; +} + +void +find_minmax(const vector& numbers, double& min, double& max) { + min = numbers[0]; + max = numbers[0]; for (double x : numbers){ if (x < min) { @@ -29,86 +38,79 @@ int main() max = x; } } +} - double bin_size = (max-min) / bin_count; +vector make_histogram(const vector& numbers, size_t bin_count){ + double min, max; + find_minmax(numbers, min, max); - for (size_t i = 0; i < numbers_count; i++) { - bool found = false; - for (size_t j = 0; (j < bin_count - 1) && !found; j++) { - auto lo = min + j * bin_size; - auto hi = min + (j + 1) * bin_size; - if ((lo <= numbers[i]) && (numbers[i] < hi)) { - bins[j]++; - found = true; - } + vector bins(bin_count); + double bin_size = (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 * bin_size; + auto hi = min + (j + 1) * bin_size; + if ((lo <= numbers[i]) && (numbers[i] < hi)) { + bins[j]++; + found = true; } - if (!found) { - bins[bin_count - 1]++; - } - } - - /* - cout << "Numbers: "; - for (int i=0;i& bins,size_t bin_count){ + const size_t SCREEN_WIDTH = 80; + const size_t MAX_ASTERISK = SCREEN_WIDTH - 6 - 1; - cout << numbers[0] << " "; - cout << bins[1]; - */ + bool scaling = false; size_t max_count = bins[0]; - - for (size_t x : bins) { + for (double x : bins){ if (x > max_count) { max_count = x; } } - /*if (max_count > 76) { - for (size_t i = 0; i < bin_count; i++) { - if (bins[i] == max_count) { - bins[i] = 76 * 1.0; + if (max_count > MAX_ASTERISK){ + scaling = true; + } + + for (size_t i = 0; i < bin_count; i++){ + cout << " "; + if (bins[i] < 100){ + cout << ' '; + } + if (bins[i] < 10){ + cout << ' '; + } + cout << bins[i] << '|'; + + size_t number_of_stars = bins[i]; + + if (scaling){ + if (bins[i] == max_count){ + number_of_stars = MAX_ASTERISK * 1.0; } else { - bins[i] = 76 * (static_cast(bins[i]) / max_count); + number_of_stars = MAX_ASTERISK * (static_cast(bins[i]) / max_count); } } - }*/ - - for (int i = 0; i < bin_count; i++) { - /*if ((bins[i] >= 100) && (bins[i] < 1000)){ - cout << " " << bins[i] << "|"; - }*/ - if ((bins[i] >= 1) && (bins[i] < 10)){ - cout << " " << bins[i] << "|"; + for (size_t j = 0; j < number_of_stars; j++){ + cout << '*'; } - else if ((bins[i] >= 10) && (bins[i] < 100)){ - cout << " " << bins[i] << "|"; - } - else { - cout << bins[i] << "|"; - } - if (max_count > 76) { - if (bins[i] == max_count) { - bins[i] = 76 * 1.0; - } - else { - bins[i] = 76 * (static_cast(bins[i]) / max_count); - } - } - for (int j = 0;j < bins[i]; j++){ - cout << "*"; - } - cout << "\n"; + cout << endl; } +} +int main() +{ + auto in = input_data(); + auto bins = make_histogram(in.numbers, in.bin_count); + show_histogram_text(bins, in.bin_count); return 0; }