diff --git a/TWOPO.cpp b/TWOPO.cpp index 8866b5c..f0650f1 100644 --- a/TWOPO.cpp +++ b/TWOPO.cpp @@ -3,90 +3,90 @@ using namespace std; -int main() -{ - setlocale(LC_ALL, "Russian"); - size_t number_count; size_t bin_count;size_t max_count; +struct Input { + vector numbers; + size_t bin_count{}; +}; - cerr << "Введите количество оценок: "; +//ввод +Input input_data() { + size_t number_count; + cout << "Введите количество оценок: "; cin >> number_count; - vector numbers(number_count); - vector bins(bin_count); - + Input in; // Экземпляр структуры Input + in.numbers.resize(number_count); // Изменяем размер вектора - for(size_t i = 0; i < number_count; i++){ - cerr << "Введите число " << i + 1 << " : "; - cin >> numbers[i]; + cout << "Введите оценки:\n"; + for (size_t i = 0; i < number_count; i++) { + cin >> in.numbers[i]; // Вводим элементы вектора } - cerr << "Введите количество корзин: "; - cin >> bin_count; - //нахожденме интервалов корзин(min и max) - double min = numbers[0]; - double max = numbers[0]; + + cout << "Введите количество корзин: "; + 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; - } - 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++) { - auto lo = min + j * bin_size; - auto hi = min + (j + 1) * bin_size; - if ((lo <= numbers[i]) && (numbers[i] < hi)) { - bins[j]++; - found = true; + if (x < min) { + min = x; } - } - if (!found) { - bins[bin_count - 1]++; - } - } - //maxcount - for(size_t i = 0; i < bin_count; i++){ - if (bins[i] > max_count){ - max_count = bins[i]; + if (x > max) { + max = x; } } +} - //вывод - // - for(size_t i = 0; i < bin_count; i++){ - - size_t count = 0; - //cout << min + i*bin_size<< "|"; - size_t num = bins[i]; - while(num != 0){ - num/=10; - count++;} - size_t z = (3 - count); - while(z > 0){ - cout << " "; - z--; - } +//создание гистограммы +vector make_histogram(const vector& numbers, size_t bin_count) { + double min, max; + find_minmax(numbers, min, max); - cout << bins[i] << "|"; - if(max_count > 76){ - size_t height = 76 * (static_cast(bins[i] / max_count)); - for(size_t j = 0; j < height; j++) { - cout << "*"; - } - cout << endl; + double bin_size = (max - min) / bin_count; + vector bins(bin_count, 0); + + for (double number : numbers) { + size_t bin_index = static_cast((number - min) / bin_size); + if (bin_index >= bin_count) { + bin_index = bin_count - 1; } - else{ - for(size_t j = 0; j < (bins[i]); j++) { + bins[bin_index]++; + } + + return bins; +} + +//вывод +void show_histogram_text(const vector& bins, double min, double bin_size) { + for (size_t i = 0; i < bins.size(); i++) { + double lo = min + i * bin_size; + double up = min + (i + 1) * bin_size; + cout << bins[i] << " | "; + + for (size_t j = 0; j < bins[i]; j++) { cout << "*"; } cout << endl; - } } - cout << "Конец1"; - cout << "Конец2"; +} + +int main() { + setlocale(LC_ALL, "Russian"); + + auto in = input_data(); + + auto bins = make_histogram(in.numbers, in.bin_count); + + double min, max; + + double bin_size = (max - min) / in.bin_count; + + show_histogram_text(bins, min, bin_size); + + return 0; }