diff --git a/lab1.cpp b/lab1.cpp index 19e8e56..0694a6d 100644 --- a/lab1.cpp +++ b/lab1.cpp @@ -35,28 +35,24 @@ void find_minmax(const vector& numbers, double& min, double& max) { } } -int main() +vector make_histogram(vector& numbers, size_t bin_count) { - const size_t SCREEN_WIDTH = 80; - const size_t MAX_ASTERISK = SCREEN_WIDTH - 3 - 1; - int i, j; double min_number, max_number; - Input in = input_data(); - find_minmax(in.numbers, min_number, max_number); - vector bins(in.bin_count); - for (i = 0; i < in.bin_count; i++) + find_minmax(numbers, min_number, max_number); + vector bins(bin_count); + for (int i = 0; i < bin_count; i++) { bins[i] = 0; } - double bin_size = (max_number - min_number) / in.bin_count; - for (size_t i = 0; i < in.numbers.size(); i++) + double bin_size = (max_number - min_number) / bin_count; + for (size_t i = 0; i < numbers.size(); i++) { bool found = false; - for (size_t j = 0; (j < in.bin_count - 1) && !found; j++) + for (size_t j = 0; (j < bin_count - 1) && !found; j++) { auto lo = min_number + j * bin_size; auto hi = min_number + (j + 1) * bin_size; - if ((lo <= in.numbers[i]) && (in.numbers[i] < hi)) + if ((lo <= numbers[i]) && (numbers[i] < hi)) { bins[j]++; found = true; @@ -64,10 +60,15 @@ int main() } if (!found) { - bins[in.bin_count - 1]++; + bins[bin_count - 1]++; } } - size_t max_bin_capacity = bins[0]; + return bins; +} + +void find_max_capacity(vector& bins, size_t& max_bin_capacity) +{ + max_bin_capacity = bins[0]; for (size_t x : bins) { if (x > max_bin_capacity) @@ -75,8 +76,14 @@ int main() max_bin_capacity = x; } } +} + +void show_histogram_text(vector& bins, size_t max_asterisk) +{ + size_t max_bin_capacity{}; + find_max_capacity(bins, max_bin_capacity); size_t height = 0; - for (i = 0; i < in.bin_count; i++) + for (int i = 0; i < bins.size(); i++) { if (bins[i] < 10) { @@ -88,14 +95,30 @@ int main() } if (bins[i] >= 100) { - cout << bins[i] << "|"; + cout << bins[i] << "|"; } - height = MAX_ASTERISK * (static_cast(bins[i]) / max_bin_capacity); - for (j = 0; j < height; j++) + if (max_bin_capacity > max_asterisk) + { + height = max_asterisk * (static_cast(bins[i]) / max_bin_capacity); + } + else + { + height = bins[i]; + } + for (int j = 0; j < height; j++) { cout << "*"; } cout << "\n"; } +} + +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); return 0; }