diff --git a/main.cpp b/main.cpp index 3e28734..e00c292 100644 --- a/main.cpp +++ b/main.cpp @@ -4,7 +4,7 @@ using namespace std; struct Input { vector numbers; - size_t bin_count {}; + size_t bin_count{}; }; Input input_data() @@ -24,111 +24,95 @@ Input input_data() return in; } -void find_minmax( const vector& numbers, double& minimum, double& maximum){ +void find_minmax(const vector& numbers, double& minimum, double& maximum) { minimum = numbers[0]; maximum = numbers[1]; - for(double i: numbers){ + for (double i : numbers) { if (i < minimum) minimum = i; if (i > maximum) maximum = i; } } - vector make_histogram(const vector& numbers,size_t bin_count){ - double maximum, minimum; - float LL,LR; - - double bin_size = (maximum - minimum) / bin_count; - find_minmax(numbers,minimum,maximum); - vector bins(bin_count); - LL = minimum; - LR = minimum + bin_size; - for (int i = 0; i < bin_count; i++) { - if (i == 0) { - for (int b = 0; b < numbers.size(); b++) { - if ((LL <= numbers[b]) && (numbers[b] < LR)) - bins[i] += 1; - +vector make_histogram(const vector&numbers, size_t bin_count) { + double maximum, minimum; + float LL, LR; + + find_minmax(numbers, minimum, maximum); + double bin_size = (maximum - minimum) / bin_count; + vector bins(bin_count); + LL = minimum; + LR = minimum + bin_size; + for (int i = 0; i < bin_count; i++) { + if (i == 0) { + for (int b = 0; b < numbers.size(); b++) { + if ((LL <= numbers[b]) && (numbers[b] < LR)) + bins[i] += 1; + + } + LL = LR; + LR = LL + bin_size; } - LL = LR; - LR = LL + bin_size; - } - if (i == (bin_count - 1)) { - LR = maximum; - for (int b = 0; b < numbers.size(); b++) { - if ((LL < numbers[b]) && (numbers[b] <= LR)) - bins[i] += 1; + if (i == (bin_count - 1)) { + LR = maximum; + for (int b = 0; b < numbers.size(); b++) { + if ((LL < numbers[b]) && (numbers[b] <= LR)) + bins[i] += 1; + } + break; + } + if ((i != 0) && (i != (bin_count - 1))) { + for (int b = 0; b < numbers.size(); b++) { + if ((LL < numbers[b]) && (numbers[b] < LR)) + bins[i] += 1; + } + LL = LR; + LR = LL + bin_size; } - break; } - if ((i != 0) && (i != (bin_count - 1))) { - for (int b = 0; b < numbers.size(); b++) { - if ((LL < numbers[b]) && (numbers[b] < LR)) - bins[i] += 1; + return bins; + } +void show_histogram_text(size_t bin_count, const vector&numbers) { + + vector bins = make_histogram(numbers, bin_count); + size_t height; + const size_t SCREEN_WIDTH = 80; + const size_t MAX_ASTERISK = SCREEN_WIDTH - 3 - 1; + int max_count = 0; + for (int i = 0; i < bin_count; i++) { + if (bins[i] > max_count) + max_count = bins[i]; + } + + for (int i = 0; i < bin_count; i++) { + if (bins[i] < 10) { + cout << " "; } - LL = LR; - LR = LL + bin_size; + if (bins[i] < 100) { + cout << " "; + } + cout << bins[i] << "|"; + if (max_count > 76) { + height = MAX_ASTERISK * (static_cast(bins[i]) / max_count); + for (int b = 0; b < height; b++) + cout << "*"; + } + else { + for (int b = 0; b < bins[i]; b++) { + cout << "*"; + } + } + cout << endl; } } - return bins; -} int main() { auto in = input_data(); - auto bins = make_histogram(in.numbers,in.bin_count); - + auto bins = make_histogram(in.numbers, in.bin_count); + show_histogram_text(in.bin_count, in.numbers); - const size_t SCREEN_WIDTH = 80; - const size_t MAX_ASTERISK = SCREEN_WIDTH - 3 - 1; - max_count = 0; - for (int i = 0; i < bin_count; i++) { - if (bins[i] > max_count) - max_count = bins[i]; - } - - for (int i = 0; i < bin_count; i++) { - if ((i + 1) < bin_count) - he_next = bins[i + 1]; - else - he_next = -1; - if (bins[i] < 10) { - cout << " "; - } - if (bins[i] < 100) { - cout << " "; - } - cout << bins[i] << "|"; - if (max_count > 76) { - height = MAX_ASTERISK * (static_cast(bins[i]) / max_count); - if ((i+1) < bin_count) - he2_next = MAX_ASTERISK * (static_cast(bins[i + 1]) / max_count); - else - he2_next = -1; - for (int b = 0; b < height; b++) { - if (b == he2_previous) - cout << "^"; - if (b == he2_next) - cout << "˅"; - if ((b != (he2_previous - 1)) && (b != (he2_next - 1))) - cout << "*"; - } - he2_previous = height; - } - else { - for (int b = 0; b < bins[i]; b++) { - if (b == (he_previous-1)) - cout << "^"; - if (b == (he_next - 1)) - cout << "v"; - if ((b != (he_previous - 1)) && (b != (he_next - 1))) - cout << "*"; - } - } - cout << endl; - he_previous = bins[i]; - } return 0; }