diff --git a/lab01/lab01.cpp b/lab01/lab01.cpp index b588850..42fff6b 100644 --- a/lab01/lab01.cpp +++ b/lab01/lab01.cpp @@ -1,65 +1,96 @@ -#include -#include +#include +#include + + using namespace std; -int main() { - const size_t SCREEN_WIDTH = 80; - const size_t MAX_ASTERISK = SCREEN_WIDTH - 3 - 1; - int i,j; - string a,b,c; - size_t number_count, bin_count; - cerr << "Enter number count: "; - cin >> number_count; - cerr << "Enter colichestvo corzin: "; - cin >> bin_count; - vector bins(bin_count); - vector numbers(number_count); - for (i = 0; i < number_count; i++) { - cin >> numbers[i]; - } - double min = numbers[0]; - double max = numbers[0]; - for (double x : numbers) { - if (x < min) { - min = x; - } - else if (x > max) { - max = x; - } - } - double bin_size = (max - min) / bin_count; - for (size_t i = 0; i < number_count; i++) { - bool found = false; - for (size_t j = 0; (j < bin_count - 1) && !found; j++) { - double lo = min + j * bin_size; - double hi = min + (j + 1) * bin_size; - if ((lo <= numbers[i]) && (numbers[i] < hi)) { - bins[j]++; - found = true; - } - } - if (!found) { - bins[bin_count - 1]++; - } - } - int maxlen = 0; - for (int j = 0; j < bin_count; j++) - { - if (maxlen < bins[j]) maxlen = bins[j]; - } - for (int j = 0; j < bin_count; j++) - { - if (bins[j] < 100) cout << " "; - if (bins[j] < 10) cout << " "; - cout << bins[j] << "|"; - size_t height = bins[j]; - if (maxlen > MAX_ASTERISK) - { - if (maxlen != bins[j]) height = MAX_ASTERISK * (static_cast(bins[j]) / maxlen); - else if (maxlen == bins[j]) height = MAX_ASTERISK; - } - for (int i = 0; i < height; i++) cout << "*"; - cout << "\n"; - } - return 0; -} \ No newline at end of file +struct Input { + vector numbers; + size_t bucket{}; + size_t number_count{}; +}; + +Input +input_data() { + Input in; + cin >> in.number_count; + cin >> in.bucket; + in.numbers.resize(in.number_count); + for (size_t i = 0; i < in.number_count; i++) { + cin >> in.numbers[i]; + } + 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) min = x; + else if (x > max) max = x; + } +} + +vector +make_histogram(const vector& numbers, size_t bucket, size_t number_count) { + vector stolb(bucket); + double min, max; + find_minmax(numbers, min, max); + float k = (max - min) / bucket; + for (size_t i = 0; i < bucket; i++) stolb[i] = 0; + for (size_t i = 0; i < number_count; i++) + { + bool flag = false; + for (size_t j = 0; (j < bucket && !flag); j++) + { + if (numbers[i] >= (min + k * j) && numbers[i] < (min + k * (1 + j))) + { + stolb[j]++; + flag = true; + + } + } + if (!flag) stolb[bucket - 1]++; + } + return stolb; +} + +void +show_histogram_text(vector stolb, size_t bucket) { + const size_t SCREEN_WIDTH = 80; + const size_t MAX_ASTERISK = SCREEN_WIDTH - 3 - 1; + int maxlen = 0; + + for (int j = 0; j < bucket; j++) + { + if (maxlen < stolb[j]) maxlen = stolb[j]; + } + + for (int j = 0; j < bucket; j++) + { + if (stolb[j] < 100) cout << " "; + if (stolb[j] < 10) cout << " "; + cout << stolb[j] << "|"; + size_t height = stolb[j]; + if (maxlen > MAX_ASTERISK) + { + if (maxlen != stolb[j]) height = MAX_ASTERISK * (static_cast (stolb[j]) / maxlen); + else if (maxlen == stolb[j]) height = MAX_ASTERISK; + } + for (int i = 0; i < height; i++) cout << "*"; + cout << "\n"; + } +} + + +int main() +{ + + auto in = input_data(); + auto stolb = make_histogram(in.numbers, in.bucket, in.number_count); + show_histogram_text(stolb, in.bucket); + + return 0; +}