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

CCBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

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


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL c(("C")) -.-> c/ControlFlowGroup(["Control Flow"]) c(("C")) -.-> c/CompoundTypesGroup(["Compound Types"]) c(("C")) -.-> c/FunctionsGroup(["Functions"]) c(("C")) -.-> c/UserInteractionGroup(["User Interaction"]) c/ControlFlowGroup -.-> c/for_loop("For Loop") c/CompoundTypesGroup -.-> c/arrays("Arrays") c/FunctionsGroup -.-> c/math_functions("Math Functions") c/UserInteractionGroup -.-> c/output("Output") subgraph Lab Skills c/for_loop -.-> lab-435160{{"用 C 语言计算四分位距(IQR)"}} c/arrays -.-> lab-435160{{"用 C 语言计算四分位距(IQR)"}} c/math_functions -.-> lab-435160{{"用 C 语言计算四分位距(IQR)"}} c/output -.-> lab-435160{{"用 C 语言计算四分位距(IQR)"}} end

读取并排序数组

在这一步中,你将学习如何读取一组数字数组并对其进行排序,为计算四分位距(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。