#include <iostream> // std
#include <algorithm> // std::sort()
#include <cmath> // ceil()
using namespace std;
int main() {
/*
* Выделяем память для переменной dimension, в которой будет храниться размерность массива
*/
int dimension;
/*
* std::cout - класс вывода данных в консоль
* std::endl - перенос на следующую строку, тоже самое, что и \n
*/
cout << "Enter array dimension: " << endl;
/*
* std::cin - класс считывания данных из консоли
* Инициализируем ввод размерности из консоли и сохраняем значение в переменную dimension
*/
cin >> dimension;
/*
* Создаем одномерный динамический массив размерностью dimension
* Звёздочка это указатель
*/
double *array = new double[dimension];
//double array[11] = {3, 6, 7, 8, 8, 9, 10, 13, 15, 16, 20}; пример из википедии
/*
* Цикл от 0 до dimension. Нужен, чтобы поэллементно вводить в массив значения с консоли.
*/
for (int i = 0; i < dimension; ++i) {
cout << "array[" << i << "]: " << endl;
cin >> array[i];
}
/*
* Вывод на экран введенного массива:
*/
cout << "Entered array: [";
for (int i = 0; i < dimension; ++i) {
cout << array[i] << " ";
}
cout << "];" << endl;
/*
* Поиск медианы.
* Определение медианы.
* Медианой ряда чисел называется число, стоящее посередине упорядоченного по возрастанию ряда чисел
* (в случае, если количество чисел нечётное).
* Если же количество чисел в ряду чётно, то медианой ряда
* является полусумма двух стоящих посередине чисел упорядоченногопо возрастанию ряда.
* Значит, первым делом нужно упорядочить массив, сделать это можно с помощью std::sort
*/
sort(array, array + dimension);
/*
* Вывод на экран отсортированного массива:
*/
cout << "Sorted array: [";
for (int i = 0; i < dimension; ++i) {
cout << array[i] << " ";
}
cout << "];" << endl;
/*
* выделяем память для значения медианы.
* Тип данных - double это число с плаваюшей точкой повышенной точности, например: 0.00000000000000000000000001233
*/
double median;
/*
* var % n это остаток от деления, если он равен нулю, значет число var кратно n
* в данном случае, dimension % 2 == 0 означает, что введенная размерность массива кратна двум
*/
if (dimension % 2 == 0) {
/*
* Если кратно, тогда медиана равна полусумме двух средних значения из упорядоченного массива.
*/
median = (array[dimension / 2] + array[dimension / 2 - 1]) / 2;
} else {
/*
* Если не кратно, тогда медиана равна значению среднего эллемента упорядоченного массива.
* ceil(dimension / 2) округление в большую сторону, например ceil(2.5) = 3.f, т.к. результат функции это double тип данных, то нужно преобразовать его в int
* (int) - приведение к целочисленному значению из обычного си. В c++ принято использовать static_cast <int> (value)
*/
median = array[(int) ceil(dimension / 2)];
}
/*
* Вывод медианы в консоль
*/
cout << "Median value: " << median << endl;
/*
* Выделяем память для переменной, в которой будет храниться ранг квантиля, и он же указатель на значение из массива int тип данных (array[pointer])
*/
int rank;
/*
* Выделяем память для переменной, которая будет хранить значение квантиля
*/
double quantile;
/*
* Здесь рассматривается 5 квантилей, хотя официально принято, что их всего 3
* Но все же в википедии сказано, что в специфичных заданиях нужно искать все 5
* https://en.wikipedia.org/wiki/Quantile
* Ниже идет цикл, который вычисляет все 5 квантилей.
* Он начинается от 0 (нулевой квантиль) и до 4 (четвертый квартиль). При желании, изменяя значения в цикле, можно вывести только необходимые квантили
*/
for (int j = 0; j <= 4; ++j) {
rank = (int) ceil(0.25 * j * dimension) - 1; // ранг - 1 / указатель на текуший квантиль
if (j == 0) {
/*
* нулевой квантиль это значение нулевого эллемента массива (первого введенного)
*/
quantile = array[0];
} else if (j == 2 and dimension % 2 == 0) {
/*
* у второго квантиля по формуле в случае, если кол-во элементов в массиве четное - получится четное значение, и в этом случае
* значение этого квантиля - это полусумма средних эллементов, то есть медиана
*/
quantile = median;
} else {
/*
* В остальных 3х случаях просто эллемент с указателем rank
*/
quantile = array[rank];
}
/*
* Вывод на каждой итерации цикла в консоль значение текущего квантиля
*/
cout << j << " - quantile value: " << quantile << endl;
}
/*
* удаление массива из памяти
*/
delete[] array;
return 0;
}