#include #include #include #include "histogram.h" using namespace std; bool find_minmax(const vector& numbers, double& min1, double& max1) { if (numbers.size() == 0) { return false; } else { max1 = numbers[0]; min1 = numbers[0]; } for(size_t i = 0; i < numbers.size(); i++) { if (numbers[i] > max1) max1 = numbers[i]; if (numbers[i] < min1) min1 = numbers[i]; } return true; } vector make_histogram(const vector& numbers, size_t bin_count) { double min1, max1; if (!find_minmax(numbers, min1, max1)) cout << "error in find_minmax: empty vector"; vector bins; bins.resize(bin_count); double cor_size = (max1 - min1)/bin_count; for (size_t i = 0; i < numbers.size(); i++) { bool flag = false; for (size_t j = 0; (j < bin_count) && !flag; j++) { auto L = min1 + j*cor_size; auto H = min1 + (j+1)*cor_size; if ((L <= numbers[i]) && (numbers[i] < H)) { flag = true; bins[j]++; } } if (!flag) bins[bin_count-1]++; } return bins; } void show_histogram_text(vector bins, const vector& numbers, size_t bin_count) { const size_t MAX_ASTERISK = 76; size_t maxb = bins[0]; size_t H, j; for (j = 1; j < bin_count; j++) { if (bins[j] > maxb) maxb = bins[j]; } for (j = 0; j < bin_count; j++) { if (maxb > MAX_ASTERISK) { H = MAX_ASTERISK * (static_cast(bins[j]) / maxb); } else H = bins[j]; if (bins[j] < 100) cout << " "; if (bins[j] < 10) cout << " "; cout << bins[j] << "|"; for (size_t i = 0; i < H; i++) cout << "*"; cout << endl; } return; }