Научиться базовым действиям в среде разработки CLion: созданию проекта, его компиляции и запуску программы.
Изучить структуру программы на языке C++ и языковые конструкции поддержки в нем структурного программирования.
Научиться автоматизировать проверку работы программ по вводу и выводу.
Необходимо построить гистограмму массива чисел. Гистограмма строится так: диапазон значений делится на несколько интервалов, высоты столбцов пропорциональны количеству значений в каждом интервале. Пример вывода:
1|*
3|***
7|*******
11|***********
6|******
4|****
1|*
Вводится количество чисел, массив чисел и количество столбцов гистограммы. Требования к выводу:
Проверку работы программы (в том числе для демонстрации) требуется осуществлять быстро, без ручного ввода большого объема данных.
Дайте пользователю возможность задавать произвольную ширину гистограммы вместо 80 символов. Ширину менее 7, более 80 или менее трети количества чисел считайте некорректной — предлагайте пользователю ввести ее заново в этом случае с указанием причины.
Если пользователь вводит 0 как число столбцов, рассчитывайте его автоматически по эмпирической формуле K = √N, а если получилось K > 25, пересчитайте по правилу Стёрджеса: для N чисел количество столбцов K = 1 + ⌊log₂N⌋. Печатайте, по какой формуле был сделан выбор и сколько столбцов выбрано.
Дайте пользователю возможность задавать высоту гистограммы H строк. Если количество столбцов K в C = ⌊H/K⌋ раз меньше H, столбцы должны занимать по C строк, например, для C = 2:
8|********
|********
11|***********
|***********
6|******
|******
Вместо количества элементов сделайте подписью столбца процент элементов, попавших в столбец, как целое двузначное число с %
в конце.
Отображайте гистограмму зеркально, например:
********| 8
***********| 11
******| 6
Дайте пользователю возможность выбора символов для столбцов «рисунка», линии оси (|
в примерах) и для выравнивания подписей. Например, при выборе соответственно o
, пробела и 0
:
008 oooooooo
011 ooooooooooo
006 oooooo
Не позволяйте вводить символы табуляции и перевода строк, печатайте любое сообщение со словом «ERROR» и завершайте программу при этом.
Вычислите среднюю высоту столбца. Если столбец ниже, доведите его высоту до средней символами -
. Если столбец выше, выводите часть, превышающую среднюю высоту, символами +
. Пример (средняя высота — 8 звездочек):
8|********
11|********+++
6|******--
После подсчета количеств значений в столбцах, замените их нарастающим итогом, начиная с первого столбца. При отображении соблюдайте те же правила, что и ранее. Пример для исходного графика 1-3-7-11-6-4-1:
1|*
4|****
11|***********
22|**********************
28|****************************
32|********************************
33|*********************************
Примечание. В математической статистике гистограммой называют именно такой график, а исходный — распределением частот.
В каждом столбце, если предыдущий столбец ниже, вместо *
используйте ^
на высоте предыдущего столбца. Аналогично для следующего столбца, но v
. Если соседние столбцы оба ниже текущего и равны, используйте N
. Пример:
1|*
3|^**
7|**^****
11|*****v^****
6|***v**
4|v***
1|*
Отображайте гистограмму вертикально без подписей, например:
*******
*****
*****
****
***
***
**
*
Указание. Можно воспользоваться следующей логикой: проходить по всем столбцам и печатать *
, если высота столбца больше номера строки, или пробел, если нет — и так до тех пор, пока на очередной строке печатается хотя бы одна звездочка.
Добавьте рамку вокруг гистограммы. Добавьте учет линий рамки, чтобы общая ширина «изображения» не превышала 80 символов. Иллюстрация результата:
+----------------+
| 8|******** |
| 11|*********** |
| 6|****** |
+----------------+
Добавьте на ось подписей границы столбцов. Например, если в первый столбец отнесены элементы от наименьшего до 1,23, во второй — от 1,23 до 2,34 и т. д., желаемый результат:
8|********
1.23
11|***********
2.34
6|******
Ширину места для подписей столбцов нужно увеличить, как на иллюстрации.
После вывода гистограммы запрашивайте у пользователя, доволен ли он результатом. Если ответ отрицательный, позвольте ввести новое количество столбцов и перестройте гистограмму. Процесс может повторяться сколько угодно раз.
Сделайте подписи к столбцам текстовыми. После ввода количества столбцов K пользователь должен ввести K строк (возможно, с пробелами), которые будут подписями к соответствующим столбцам. При выводе гистограммы вместо высоты каждого столбца нужно печатать его подпись. Подписи должны быть выровнены по правому краю на ширину самой длинной из них.
Добавьте горизонтальную шкалу под гистограммой. Шкалу нужно разбить на интервалы, размер которых от вводит пользователь. Допустимы размеры от 4 до 9, при некорректном вводе печатайте сообщение со словом «ERROR» и завершайте работу программы. Под нулевой, первой и последней отметкой шкалы требуется напечатать соответствующие числа. Шкала должна быть во всю ширину гистограммы. Пример для интервала размером 6:
8|********
14|**************
12|************
|-----|-----|-----|
0 6 18
Перед построением гистограммы удалите из входного массива все повторяющиеся (не обязательно подряд) элементы и напечатайте результат.
Указание. Удалить xs[i]
можно так: xs.erase(xs.begin() + i)
.
После ввода количества чисел предлагайте пользователю генерировать их. При положительном ответе заполните исходный массив при помощи функции rand()
: каждый элемент должен быть суммой 12 ее результатов.
Указание. В начале программы добавьте srand(time(0))
, чтобы случайные числа отличались между запусками программы (аналог Randomize()
в Pascal).
Избавьте программу от предположения о наибольшем возможном количестве чисел в столбце. Находите наибольшее и используйте это значение, чтобы выровнять подписи по правому краю, не расходуя при этом лишних знакомест.
Козлюк Д. А., Никитин В. В., Мохов А. С., кафедра Управления и информатики НИУ «МЭИ», 2017 г.
Ответственный за страницу: Козлюк Д. А.