Лабораторная работа № 1 «Основы языка C++ и среда разработки CLion»

Цель работы

Задание для совместной работы под руководством

Необходимо построить гистограмму массива чисел. Гистограмма строится так: диапазон значений делится на несколько интервалов, высоты столбцов пропорциональны количеству значений в каждом интервале. Пример вывода:

 1|*
 3|***
 7|*******
11|***********
 6|******
 4|****
 1|*

Вводится количество чисел, массив чисел и количество столбцов гистограммы. Требования к выводу:

Проверку работы программы (в том числе для демонстрации) требуется осуществлять быстро, без ручного ввода большого объема данных.

Самостоятельная работа

Вариант 1

Дайте пользователю возможность задавать произвольную ширину гистограммы вместо 80 символов. Ширину менее 7, более 80 или менее трети количества чисел считайте некорректной — предлагайте пользователю ввести ее заново в этом случае с указанием причины.

Вариант 2

Если пользователь вводит 0 как число столбцов, рассчитывайте его автоматически по эмпирической формуле K = √N, а если получилось K > 25, пересчитайте по правилу Стёрджеса: для N чисел количество столбцов K = 1 + ⌊log₂N⌋. Печатайте, по какой формуле был сделан выбор и сколько столбцов выбрано.

Вариант 3

Дайте пользователю возможность задавать высоту гистограммы H строк. Если количество столбцов K в C = ⌊H/K⌋ раз меньше H, столбцы должны занимать по C строк, например, для C = 2:

 8|********
  |********
11|***********
  |***********
 6|******
  |******

Вариант 4

Вместо количества элементов сделайте подписью столбца процент элементов, попавших в столбец, как целое двузначное число с % в конце.

Вариант 5

Отображайте гистограмму зеркально, например:

   ********|  8
***********| 11
     ******|  6

Вариант 6

Дайте пользователю возможность выбора символов для столбцов «рисунка», линии оси (| в примерах) и для выравнивания подписей. Например, при выборе соответственно o, пробела и 0:

008 oooooooo
011 ooooooooooo
006 oooooo

Не позволяйте вводить символы табуляции и перевода строк, печатайте любое сообщение со словом «ERROR» и завершайте программу при этом.

Вариант 7

Вычислите среднюю высоту столбца. Если столбец ниже, доведите его высоту до средней символами -. Если столбец выше, выводите часть, превышающую среднюю высоту, символами +. Пример (средняя высота — 8 звездочек):

 8|********
11|********+++
 6|******--

Вариант 8

После подсчета количеств значений в столбцах, замените их нарастающим итогом, начиная с первого столбца. При отображении соблюдайте те же правила, что и ранее. Пример для исходного графика 1-3-7-11-6-4-1:

   1|*
   4|****
  11|***********
  22|**********************
  28|****************************
  32|********************************
  33|*********************************

Примечание. В математической статистике гистограммой называют именно такой график, а исходный — распределением частот.

Вариант 9

В каждом столбце, если предыдущий столбец ниже, вместо * используйте ^ на высоте предыдущего столбца. Аналогично для следующего столбца, но v. Если соседние столбцы оба ниже текущего и равны, используйте N. Пример:

   1|*
   3|^**
   7|**^****
  11|*****v^****
   6|***v**
   4|v***
   1|*

Вариант 10

Отображайте гистограмму вертикально без подписей, например:

*******
 *****
 *****
  ****
  ***
  ***
  **
   *

Указание. Можно воспользоваться следующей логикой: проходить по всем столбцам и печатать *, если высота столбца больше номера строки, или пробел, если нет — и так до тех пор, пока на очередной строке печатается хотя бы одна звездочка.

Вариант 11

Добавьте рамку вокруг гистограммы. Добавьте учет линий рамки, чтобы общая ширина «изображения» не превышала 80 символов. Иллюстрация результата:

+----------------+
|  8|********    |
| 11|*********** |
|  6|******      |
+----------------+

Вариант 12

Добавьте на ось подписей границы столбцов. Например, если в первый столбец отнесены элементы от наименьшего до 1,23, во второй — от 1,23 до 2,34 и т. д., желаемый результат:

     8|********
1.23
    11|***********
2.34
     6|******

Ширину места для подписей столбцов нужно увеличить, как на иллюстрации.

Вариант 13

После вывода гистограммы запрашивайте у пользователя, доволен ли он результатом. Если ответ отрицательный, позвольте ввести новое количество столбцов и перестройте гистограмму. Процесс может повторяться сколько угодно раз.

Вариант 14

Сделайте подписи к столбцам текстовыми. После ввода количества столбцов K пользователь должен ввести K строк (возможно, с пробелами), которые будут подписями к соответствующим столбцам. При выводе гистограммы вместо высоты каждого столбца нужно печатать его подпись. Подписи должны быть выровнены по правому краю на ширину самой длинной из них.

Вариант 15

Добавьте горизонтальную шкалу под гистограммой. Шкалу нужно разбить на интервалы, размер которых от вводит пользователь. Допустимы размеры от 4 до 9, при некорректном вводе печатайте сообщение со словом «ERROR» и завершайте работу программы. Под нулевой, первой и последней отметкой шкалы требуется напечатать соответствующие числа. Шкала должна быть во всю ширину гистограммы. Пример для интервала размером 6:

     8|********
    14|**************
    12|************
      |-----|-----|-----|
       0     6           18

Вариант 16

Перед построением гистограммы удалите из входного массива все повторяющиеся (не обязательно подряд) элементы и напечатайте результат.

Указание. Удалить xs[i] можно так: xs.erase(xs.begin() + i).

Вариант 17

После ввода количества чисел предлагайте пользователю генерировать их. При положительном ответе заполните исходный массив при помощи функции rand(): каждый элемент должен быть суммой 12 ее результатов.

Указание. В начале программы добавьте srand(time(0)), чтобы случайные числа отличались между запусками программы (аналог Randomize() в Pascal).

Вариант 18

Избавьте программу от предположения о наибольшем возможном количестве чисел в столбце. Находите наибольшее и используйте это значение, чтобы выровнять подписи по правому краю, не расходуя при этом лишних знакомест.


Козлюк Д. А., Никитин В. В., Мохов А. С., кафедра Управления и информатики НИУ «МЭИ», 2017 г.

Ответственный за страницу: Козлюк Д. А. Система Orphus