Вы не можете выбрать более 25 тем
			Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
		
		
		
		
		
			
		
			
				
	
	
		
			125 строки
		
	
	
		
			4.6 KiB
		
	
	
	
		
			C++
		
	
			
		
		
	
	
			125 строки
		
	
	
		
			4.6 KiB
		
	
	
	
		
			C++
		
	
| #include <iostream>
 | |
| #include <vector>
 | |
| 
 | |
| using namespace std;
 | |
| 
 | |
| int main()
 | |
| {
 | |
|     // Константы для ограничения ширины вывода
 | |
|     const size_t SCREEN_WIDTH = 80;          // Максимальная ширина экрана
 | |
|     const size_t MAX_ASTERISK = SCREEN_WIDTH - 3 - 1;  // Макс. количество звездочек (80 - 3 цифры - 1 символ '|')
 | |
| 
 | |
|     // Ввод количества элементов массива
 | |
|     size_t number_count;
 | |
|     cerr << "Enter number count: ";  // Вывод приглашения в stderr
 | |
|     cin >> number_count;             // Чтение количества чисел
 | |
| 
 | |
|     // Инициализация и заполнение массива чисел
 | |
|     vector<double> numbers(number_count);  // Создание вектора заданного размера
 | |
|     for (size_t i = 0; i < number_count; i++)
 | |
|     {
 | |
|         cin >> numbers[i];  // Чтение каждого числа в массив
 | |
|     }
 | |
| 
 | |
|     // Ввод количества корзин (столбцов гистограммы)
 | |
|     size_t bin_count;
 | |
|     cerr << "Enter number bin: ";  // Вывод приглашения в stderr
 | |
|     cin >> bin_count;              // Чтение количества корзин
 | |
| 
 | |
|     // Инициализация массива для подсчета чисел в каждой корзине
 | |
|     vector<size_t> 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;         // Обновляем максимум
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         // Расчет размера одной корзины
 | |
|         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]++;  // Добавляем в последнюю корзину
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         // Поиск максимального количества чисел в одной корзине (для масштабирования)
 | |
|         size_t max_count = bins[0];  // Предполагаем, что первая корзина имеет максимум
 | |
|         for (size_t i = 0; i < bin_count; i++)
 | |
|         {
 | |
|             if (bins[i] > max_count)
 | |
|             {
 | |
|                 max_count = bins[i];  // Обновляем максимум
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         // Вывод гистограммы
 | |
|         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<double>(bins[i]) / max_count);
 | |
|             }
 | |
| 
 | |
|             // Вывод звездочек для текущего столбца
 | |
|             for (size_t j = 0; j < height; j++) {
 | |
|                 cout << "*";
 | |
|             }
 | |
|             cout << endl;  // Переход на новую строку для следующей корзины
 | |
|         }
 | |
|     } else {
 | |
|         cout << "No numbers entered." << endl;
 | |
|     }
 | |
| 
 | |
|     return 0;  // Завершение программы
 | |
| }
 |