diff --git a/fin_lab34.cpp b/fin_lab34.cpp index 7ac292a..83ca543 100644 --- a/fin_lab34.cpp +++ b/fin_lab34.cpp @@ -1,58 +1,82 @@ #include #include -#include #include - const size_t WINDOW_WIDTH = 80; const size_t MAX_VALUE = WINDOW_WIDTH - 3 - 1; using namespace std; -int main() -{ - size_t count, inters; - cerr<< "The amount of numbers is: "; cin >> count; - cerr << endl << "Numbers are: "; - vector numbers (count); - for (int i = 0; i < count; i++){cin >> numbers[i];} - cerr << endl << "The amounts of intervals: "; cin >> inters; +struct Input{ + vector numbers; + size_t bin_count = 0; +}; - float min_number = numbers[0]; - float max_number = numbers[0]; - for (float now: numbers){ - if (now < min_number) {min_number = now;} - if (now > max_number) {max_number = now;} +Input +input_data(){ + size_t number_count; + cin >> number_count; + Input in; + in.numbers.resize(number_count); + for (size_t i = 0; i < number_count; i++) { + cin >> in.numbers[i]; } + cin >> in.bin_count; + return in; +} - float diff = (max_number - min_number) / inters; - vector bins(inters); - float lo = min_number, hi = min_number + diff; - +void +find_minmax(const vector &numbers, double &min, double &max){ + min = numbers[0]; + max = numbers[0]; + for (float now: numbers){ + if (now < min) {min = now;} + if (now > max) {max = now;} + } + return; +} - for (int i = 0; i < inters; i++){ - for (float now : numbers){ - if (i == inters - 1) { +vector +make_histogram(vector numbers, size_t bin_count){ + vector bins(bin_count); + double min = 0, max = 0; + find_minmax(numbers, min, max); + double bin_size = (max - min) / bin_count; + double lo = min, hi = min + bin_size; + for (size_t i = 0; i < bin_count; i++){ + for (auto now : numbers){ + if (i == bin_count - 1) { if ((now >= lo) && (now <= hi)) {bins[i]++;} } else { if ((now >= lo) && (now < hi)) {bins[i]++;} } } - lo = hi; hi += diff; + lo = hi; hi += bin_size; } - float max_count = 0; - for (auto now : bins) {max_count += now;} - int added = 0; - for (size_t now : bins){ - int height = 0; - added += now; - if (added < 100) {cout << ' ';} if (added < 10) {cout << ' ';} //форматирование строк + return bins; +} - cout << added << "|"; - if (added == max_count) {height = MAX_VALUE * 1.0;} - else {height = MAX_VALUE * (static_cast (added) / max_count);} +void show_histogram_text(const vector &bins){ + size_t max_count = 0; + for (auto now: bins) + {if (now > max_count) {max_count = now;}} + cout << "mc = " << max_count << endl; + for (size_t now : bins){ + if (now < 100) {cout << ' ';} if (now < 10) {cout << ' ';} + cout << now << "|"; + int height; + if (now == max_count) {height = MAX_VALUE * 1.0;} + else {height = MAX_VALUE * (static_cast (now) / max_count);} for (int i = 0; i < round(height); i++) {cout << "*";} - cout << endl; + cout << endl; } - return 0; } +int +main(){ + double min = 0, max = 0; + Input in = input_data(); + auto bins = make_histogram(in.numbers, in.bin_count); + for (auto now: bins) {cout << now << endl;} + show_histogram_text(bins); + return 0; +}