简介
在本实验中,你将学习如何用 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。



