diff --git a/main.cpp b/main.cpp index dd9f1c9..df8e157 100644 --- a/main.cpp +++ b/main.cpp @@ -1,124 +1,83 @@ #include #include +#include "histogram.h" +#include "histogram.cpp" + using namespace std; -int main() -{ - // Константы для ограничения ширины вывода - const size_t SCREEN_WIDTH = 80; // Максимальная ширина экрана - const size_t MAX_ASTERISK = SCREEN_WIDTH - 3 - 1; // Макс. количество звездочек (80 - 3 цифры - 1 символ '|') +struct Input { + vector numbers; + size_t bin_count{}; +}; + +Input +input_data() { + Input in; - // Ввод количества элементов массива size_t number_count; - cerr << "Enter number count: "; // Вывод приглашения в stderr - cin >> number_count; // Чтение количества чисел - - // Инициализация и заполнение массива чисел - vector numbers(number_count); // Создание вектора заданного размера - for (size_t i = 0; i < number_count; i++) - { - cin >> numbers[i]; // Чтение каждого числа в массив + cerr << "Enter number count: "; + cin >> number_count; + + in.numbers.resize(number_count); + for (size_t i = 0; i < number_count; i++) { + cin >> in.numbers[i]; } - // Ввод количества корзин (столбцов гистограммы) - size_t bin_count; - cerr << "Enter number bin: "; // Вывод приглашения в stderr - cin >> bin_count; // Чтение количества корзин - - // Инициализация массива для подсчета чисел в каждой корзине - vector bins(bin_count); // Создание вектора счетчиков (изначально нули) - - // Поиск минимального и максимального значения в массиве - if (number_count > 0) { // Проверка на пустой массив - double min = numbers[0]; // Предполагаем, что первый элемент - минимум - double max = numbers[0]; // Предполагаем, что первый элемент - максимум - for (double x : numbers) // Цикл по всем элементам массива - { - if (x < min) // Если текущий элемент меньше минимума - { - min = x; // Обновляем минимум - } - else if (x > max) // Если текущий элемент больше максимума - { - max = x; // Обновляем максимум - } + cerr << "Enter number bin: "; + cin >> in.bin_count; + + return in; +} + + +void +show_histogram_text(const vector& bins) { + const size_t SCREEN_WIDTH = 80; + const size_t MAX_ASTERISK = SCREEN_WIDTH - 3 - 1; + + size_t max_count = bins[0]; + for (size_t i = 0; i < bins.size(); i++) { + if (bins[i] > max_count) { + max_count = bins[i]; } + } - // Расчет размера одной корзины - 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; // Верхняя граница корзины - - // Проверка попадания числа в текущую корзину [lo, hi) - if ((lo <= numbers[i]) && (numbers[i] < hi)) - { - bins[j]++; // Увеличиваем счетчик корзины - found = true; // Число найдено в корзине - } - } - - // Если число не попало ни в одну из корзин (особый случай для максимального значения) - if (!found) - { - bins[bin_count - 1]++; // Добавляем в последнюю корзину - } + for (size_t i = 0; i < bins.size(); i++) { + if (bins[i] < 10) { + cout << " " << bins[i] << "|"; + } + else if (bins[i] < 100) { + cout << " " << bins[i] << "|"; + } + else if (bins[i] < 1000) { + cout << bins[i] << "|"; } - // Поиск максимального количества чисел в одной корзине (для масштабирования) - size_t max_count = bins[0]; // Предполагаем, что первая корзина имеет максимум - for (size_t i = 0; i < bin_count; i++) - { - if (bins[i] > max_count) - { - max_count = bins[i]; // Обновляем максимум - } + size_t height; + if (max_count <= MAX_ASTERISK) { + height = bins[i]; + } + else { + height = MAX_ASTERISK * (bins[i] * 1.0 / max_count); } - // Вывод гистограммы - for (size_t i = 0; i < bin_count; i++) // Для каждой корзины - { - // Выравнивание подписи (количества чисел в корзине) до 3 символов - if (bins[i] < 10) { - cout << " " << bins[i] << "|"; // 2 пробела + число + "|" - } - else if (bins[i] < 100) { - cout << " " << bins[i] << "|"; // 1 пробел + число + "|" - } - else { - cout << bins[i] << "|"; // число + "|" - } - - // Расчет высоты столбца (количества звездочек) - size_t height; - if (max_count <= MAX_ASTERISK) { - // Если максимум помещается в ограничение, используем фактическое значение - height = bins[i]; - } - else { - // Масштабирование: пропорционально уменьшаем все столбцы - height = MAX_ASTERISK * (static_cast(bins[i]) / max_count); - } - - // Вывод звездочек для текущего столбца - for (size_t j = 0; j < height; j++) { - cout << "*"; - } - cout << endl; // Переход на новую строку для следующей корзины + for (size_t j = 0; j < height; j++) { + cout << "*"; } - } else { - cout << "No numbers entered." << endl; + cout << endl; } +} + +int +main() { + Input in = input_data(); + + double min, max; + find_minmax(in.numbers, min, max); + + auto bins = make_histogram(in.numbers, in.bin_count, min, max); + show_histogram_text(bins); - return 0; // Завершение программы + return 0; }