Вычисление межквартильного размаха (IQR) на C

CBeginner
Практиковаться сейчас

Введение

В этом лабораторном практикуме вы научитесь вычислять межквартильный размах (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.