# Лабораторная работа № 1 «Основы языка C++ и среда разработки CLion» ## Цель работы * Научиться базовым действиям в среде разработки CLion: созданию проекта, его компиляции и запуску программы. * Изучить структуру программы на языке C++ и языковые конструкции поддержки в нем структурного программирования. * Научиться автоматизировать проверку работы программ по вводу и выводу. ## Задание для совместной работы под руководством Необходимо построить гистограмму массива чисел. Гистограмма строится так: диапазон значений делится на несколько интервалов, высоты столбцов пропорциональны количеству значений в каждом интервале. Пример вывода: 1|* 3|*** 7|******* 11|*********** 6|****** 4|**** 1|* Вводится количество чисел, массив чисел и количество столбцов гистограммы. Требования к выводу: * Гистограмма должна целиком умещаться в 80 символов по ширине. * Наименьший ненулевой столбец должен быть высотой в одну ячейку, если при этом самый высокий столбец умещается в отведенное пространство. * Высоты столбцов ожидаются до 1000. Проверку работы программы (в том числе для демонстрации) требуется осуществлять быстро, без ручного ввода большого объема данных. ## Самостоятельная работа ### Вариант 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 Избавьте программу от предположения о наибольшем возможном количестве чисел в столбце. Находите наибольшее и используйте это значение, чтобы выровнять подписи по правому краю, не расходуя при этом лишних знакомест.