用 C 语言计算四分位距(IQR)

CBeginner
立即练习

简介

在本实验中,你将学习如何用 C 语言计算四分位距(IQR)。本实验涵盖读取和排序一组数字数组、找到第一四分位数和第三四分位数(Q1 和 Q3)的位置,然后将 IQR 计算为 Q3 与 Q1 之差的步骤。完成本实验后,你将对如何使用 C 语言进行此统计分析有扎实的理解。

读取并排序数组

在这一步中,你将学习如何读取一组数字数组并对其进行排序,为计算四分位距(IQR)做准备。我们将使用 C 语言来完成这项任务。

首先,让我们为 IQR 计算创建一个 C 源文件:

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

在这一步中,我们将修改上一个程序,通过找到 Q1 和 Q3 的位置来计算四分位距(IQR)。

打开上一个源文件:

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()函数对其进行排序。然后你打印了排序后的数组以验证排序过程。

接下来,你将修改上一个程序,通过找到第一四分位数(Q1)和第三四分位数(Q3)的位置来计算四分位距(IQR),然后将 IQR 计算为 Q3 - Q1。最后,你将打印计算出的 IQR。