Введение
В этом лабораторном практикуме вы научитесь вычислять межквартильный размах (IQR) в языке программирования C. Практикум охватывает шаги по чтению и сортировке массива чисел, определению позиций первого и третьего квартилей (Q1 и Q3), а затем вычислению IQR как разницы между Q3 и Q1. По завершении этого практикума вы получите глубокое понимание того, как выполнять этот статистический анализ с помощью языка C.
Чтение и сортировка массива
В этом шаге вы узнаете, как читать массив чисел и сортировать его для последующего вычисления межквартильного размаха (IQR). Мы будем использовать язык программирования C для выполнения этой задачи.
Сначала создадим файл исходного кода C для вычисления IQR:
cd ~/project
nano iqr_calculation.c
Теперь напишем начальный код для чтения и сортировки массива:
#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 100
// Функция сравнения целых чисел для qsort
int compare(const void *a, const void *b) {
return (*(int*)a - *(int*)b);
}
int main() {
int numbers[MAX_SIZE];
int n, i;
// Считывание количества элементов
printf("Введите количество элементов (максимум %d): ", MAX_SIZE);
scanf("%d", &n);
// Ввод элементов массива
printf("Введите %d целых чисел:\n", n);
for (i = 0; i < n; i++) {
scanf("%d", &numbers[i]);
}
// Сортировка массива
qsort(numbers, n, sizeof(int), compare);
// Вывод отсортированного массива
printf("Отсортированный массив: ");
for (i = 0; i < n; i++) {
printf("%d ", numbers[i]);
}
printf("\n");
return 0;
}
Компилируем программу:
gcc -o iqr_calculation iqr_calculation.c
Запускаем программу и вводим пример данных:
./iqr_calculation
Пример вывода:
Введите количество элементов (максимум 100): 6
Введите 6 целых чисел:
45 22 14 65 97 72
Отсортированный массив: 14 22 45 65 72 97
Рассмотрим код:
- Мы определяем максимальный размер массива в 100 элементов
- Функция
compare()используется функциейqsort()для сортировки целых чисел - Мы считываем количество элементов из пользовательского ввода
qsort()используется для сортировки массива в порядке возрастания- Затем выводится отсортированный массив
Поиск позиций Q1 и Q3 и вычисление IQR = Q3 - Q1
В этом шаге мы изменим предыдущую программу для вычисления межквартильного размаха (IQR) путём нахождения позиций Q1 и Q3.
Откройте предыдущий исходный файл:
cd ~/project
nano iqr_calculation.c
Обновите код для вычисления IQR:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define MAX_SIZE 100
// Функция сравнения целых чисел для qsort
int compare(const void *a, const void *b) {
return (*(int*)a - *(int*)b);
}
// Функция для вычисления Q1 и Q3
double calculateQuartile(int *arr, int n, double position) {
int index = floor(position);
double fraction = position - index;
if (fraction == 0) {
return arr[index - 1];
} else {
return arr[index - 1] * (1 - fraction) + arr[index] * fraction;
}
}
int main() {
int numbers[MAX_SIZE];
int n, i;
double q1, q3, iqr;
// Считывание количества элементов
printf("Введите количество элементов (максимум %d): ", MAX_SIZE);
scanf("%d", &n);
// Ввод элементов массива
printf("Введите %d целых чисел:\n", n);
for (i = 0; i < n; i++) {
scanf("%d", &numbers[i]);
}
// Сортировка массива
qsort(numbers, n, sizeof(int), compare);
// Вычисление позиций Q1 и Q3
double q1_pos = 0.25 * (n + 1);
double q3_pos = 0.75 * (n + 1);
// Вычисление Q1 и Q3
q1 = calculateQuartile(numbers, n, q1_pos);
q3 = calculateQuartile(numbers, n, q3_pos);
// Вычисление IQR
iqr = q3 - q1;
// Вывод результатов
printf("Отсортированный массив: ");
for (i = 0; i < n; i++) {
printf("%d ", numbers[i]);
}
printf("\n");
printf("Q1: %.2f\n", q1);
printf("Q3: %.2f\n", q3);
printf("IQR: %.2f\n", iqr);
return 0;
}
Компилируем обновлённую программу:
gcc -o iqr_calculation iqr_calculation.c -lm
Запускаем программу и вводим пример данных:
./iqr_calculation
Пример вывода:
Введите количество элементов (максимум 100): 7
Введите 7 целых чисел:
12 15 18 22 25 30 35
Отсортированный массив: 12 15 18 22 25 30 35
Q1: 15.00
Q3: 30.00
IQR: 15.00
Ключевые моменты в коде:
calculateQuartile()обрабатывает массивы как чётной, так и нечётной длины- Q1 вычисляется в 25-м процентиле
- Q3 вычисляется в 75-м процентиле
- IQR вычисляется как Q3 - Q1
- Мы используем линейную интерполяцию для нецелых позиций
Вывод IQR
В этом заключительном шаге мы сосредоточимся на форматировании и представлении результатов межквартильного размаха (IQR) ясным и информативным способом.
Откройте предыдущий исходный файл:
cd ~/project
nano iqr_calculation.c
Обновите код для улучшения вывода IQR и добавления описательного текста:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define MAX_SIZE 100
// Предыдущие функции остаются без изменений (compare и calculateQuartile)
int main() {
int numbers[MAX_SIZE];
int n, i;
double q1, q3, iqr;
// Очистка экрана для лучшего представления
printf("\033[2J\033[1;1H");
// Введение в IQR
printf("Калькулятор межквартильного размаха (IQR)\n");
printf("=====================================\n\n");
// Ввод количества элементов
printf("Введите количество элементов (максимум %d): ", MAX_SIZE);
scanf("%d", &n);
// Ввод элементов массива
printf("Введите %d целых чисел:\n", n);
for (i = 0; i < n; i++) {
scanf("%d", &numbers[i]);
}
// Сортировка массива
qsort(numbers, n, sizeof(int), compare);
// Вычисление позиций Q1 и Q3
double q1_pos = 0.25 * (n + 1);
double q3_pos = 0.75 * (n + 1);
// Вычисление Q1 и Q3
q1 = calculateQuartile(numbers, n, q1_pos);
q3 = calculateQuartile(numbers, n, q3_pos);
// Вычисление IQR
iqr = q3 - q1;
// Подробный вывод
printf("\nРезультаты анализа данных\n");
printf("--------------------\n");
printf("Исходный набор данных: ");
for (i = 0; i < n; i++) {
printf("%d ", numbers[i]);
}
printf("\n\n");
// Форматированный вывод IQR
printf("Анализ квартилей:\n");
printf("Первый квартиль (Q1): %.2f\n", q1);
printf("Третий квартиль (Q3): %.2f\n", q3);
printf("Межквартильный размах (IQR): %.2f\n", iqr);
// Интерпретация IQR
printf("\nИнтерпретация:\n");
printf("IQR представляет собой разброс средних 50%% данных.\n");
printf("Меньший IQR указывает на более согласованную информацию,\n");
printf("в то время как больший IQR предполагает большую изменчивость.\n");
return 0;
}
Компилируем обновлённую программу:
gcc -o iqr_calculation iqr_calculation.c -lm
Запускаем программу и вводим пример данных:
./iqr_calculation
Пример вывода:
Калькулятор межквартильного размаха (IQR)
=====================================
Введите количество элементов (максимум 100): 7
Введите 7 целых чисел:
12 15 18 22 25 30 35
Результаты анализа данных
--------------------
Исходный набор данных: 12 15 18 22 25 30 35
Анализ квартилей:
Первый квартиль (Q1): 15.00
Третий квартиль (Q3): 30.00
Межквартильный размах (IQR): 15.00
Интерпретация:
IQR представляет собой разброс средних 50%% данных.
Меньший IQR указывает на более согласованную информацию,
в то время как больший IQR предполагает большую изменчивость.
Основные улучшения:
- Добавлена команда очистки экрана для лучшего представления
- Улучшено форматирование вывода
- Включена интерпретация IQR
- Сохранён предыдущий логик вычислений
Резюме
В этом лабораторном практикуме вы сначала изучили, как читать и сортировать массив чисел в программировании на языке C. Вы создали исходный файл на C, написали начальный код для чтения элементов массива и их сортировки с использованием функции qsort(). Затем вы вывели отсортированный массив, чтобы проверить процесс сортировки.
Далее вы измените предыдущую программу для вычисления межквартильного размаха (IQR) путём нахождения позиций первого квартиля (Q1) и третьего квартиля (Q3), а затем вычислите IQR как Q3 - Q1. Наконец, вы выведете вычисленный IQR.



