diff --git a/main.cpp b/main.cpp index c0c4a7c..1e7b47c 100644 --- a/main.cpp +++ b/main.cpp @@ -3,22 +3,25 @@ #include #include using namespace std; -int main(){ - size_t i, j; - size_t number_count; - cerr << "Enter number count: "; +struct Input { + vector numbers; + size_t bin_count{}; +}; +Input +input_data(){ + size_t number_count; cin >> number_count; - vector numbers(number_count); - cerr << "Enter numbers: "; - for (i = 0; i < number_count; i++){ - cin >> numbers[i]; + Input in; + in.numbers.resize(number_count); + for (size_t i = 0; i < number_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]; + 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){ min = x; @@ -27,10 +30,16 @@ int main(){ max = x; } } +} +vector make_histogram(const vector& numbers, size_t& bin_count){ + double min, max; + find_minmax(numbers, min, max); + vector bins(bin_count); double bin_size = (max - min) / bin_count; - for (i = 0; i < number_count; i++){ + size_t number_count; + for (size_t i = 0; i < numbers.size(); i++){ bool found = false; - for (j = 0; (j < bin_count - 1) && !found; j++){ + 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)){ @@ -42,14 +51,17 @@ int main(){ bins[bin_count - 1]++; } } - vector counts(bin_count); - for (i = 0; i < bin_count; i++){ - for (j = 0; j < bins[i]; j++){ + return bins; +} +void show_histogram_text(size_t& bin_count, vector& bins){ + vector counts(bin_count); + for (size_t i = 0; i < bin_count; i++){ + for (size_t j = 0; j < bins[i]; j++){ counts[i]++; } } size_t max_count = counts[0]; - for (i=0; imax_count){ max_count = counts[i]; } @@ -58,7 +70,7 @@ int main(){ const size_t max_asterisk = screen_width - 3 - 1; vector heights(bin_count); size_t height; - for (i=0; i 76){ height = (max_asterisk*(static_cast(counts[i])/max_count)); } @@ -67,7 +79,7 @@ int main(){ } heights[i] = height; } - for (i = 0; i < bin_count; i++){ + for (size_t i = 0; i < bin_count; i++){ if(bins[i]<100){ cout << " "; } @@ -75,11 +87,16 @@ int main(){ cout << " "; } cout << bins[i] << "|"; - for (j = 0; j < heights[i]; j++){ + for (size_t j = 0; j < heights[i]; j++){ cout << "*"; } cout << "\n"; } +} +int main(){ + auto in = input_data(); + auto bins = make_histogram(in.numbers, in.bin_count); + show_histogram_text(in.bin_count, bins); getch(); return 0; }