“Average”这个词在C语言中并不是一个内置的关键字或函数,而是我们自己需要实现的一个数学概念,计算平均值的基本公式是:

(图片来源网络,侵删)
平均值 = 所有数值的总和 / 数值的个数
在C语言中实现它,主要就是完成“求和”和“计数”这两个步骤,然后进行除法运算。
下面我们通过几个由浅入深的例子来学习如何使用。
示例1:计算一组固定整数的平均值
这是最基础的情况,我们直接计算几个已知数字的平均值。

(图片来源网络,侵删)
代码:
#include <stdio.h>
int main() {
// 1. 定义变量并初始化
int num1 = 25, num2 = 45, num3 = 65, num4 = 85;
int sum;
float average; // 注意:平均值不一定是整数,所以用 float 或 double 类型
// 2. 计算总和
sum = num1 + num2 + num3 + num4;
// 3. 计算平均值
// 因为 sum 是整数,4 也是整数,直接相除会得到整数结果(截断小数部分)。
// 所以我们需要将其中一个操作数转换为浮点数,以确保结果是浮点数。
// 将 sum 强制转换为 float:(float)sum
average = (float)sum / 4;
// 4. 输出结果
printf("数字分别是: %d, %d, %d, %d\n", num1, num2, num3, num4);
printf("总和是: %d\n", sum);
printf("平均值是: %.2f\n", average); // %.2f 表示输出两位小数
return 0;
}
关键点解析:
- 数据类型:如果所有数字都是整数,它们的和也是整数,平均值通常是带小数的(浮点数),我们必须定义一个
float或double类型的变量来存储平均值。 - 整数除法陷阱:在C语言中,如果两个整数相除,结果会自动舍弃小数部分(
10 / 3的结果是3,而不是33),为了得到正确的浮点数结果,必须将分子或分母至少一个转换为浮点数。(float)sum / 4:将sum强制转换为float,然后除以整数4,计算会按照浮点数规则进行。sum / 4.0:将整数4写成0,它会被自动识别为double类型,计算也会按照浮点数规则进行。sum / 4:错误!这会导致整数除法,结果会不正确。
- 格式化输出:
printf中使用%.2f来格式化输出浮点数,它会保留两位小数,使结果更清晰。
示例2:通过用户输入计算平均值
更常见的情况是,我们让用户自己输入数字,然后计算这些数字的平均值。
代码:
#include <stdio.h>
int main() {
int count, i;
float sum = 0.0, average, number;
// 1. 提示用户输入要计算平均值的数字个数
printf("请输入要计算平均值的数字个数: ");
scanf("%d", &count);
// 2. 检查输入的个数是否合法(大于0)
if (count <= 0) {
printf("输入的个数必须大于0,\n");
return 1; // 非正常退出程序
}
// 3. 使用循环逐个读取用户输入的数字
printf("请输入 %d 个数字,用空格或回车分隔:\n", count);
for (i = 0; i < count; ++i) {
scanf("%f", &number); // 读取一个浮点数
sum += number; // 将读取的数字累加到 sum 中
}
// 4. 计算平均值
average = sum / count;
// 5. 输出结果
printf("这些数字的总和是: %.2f\n", sum);
printf("这些数字的平均值是: %.2f\n", average);
return 0;
}
关键点解析:
- 循环:使用
for循环来重复执行读取和累加的操作,循环次数由用户输入的count决定。 - 累加:
sum += number;是sum = sum + number;的简写,它会把每次输入的数字都加到sum上。 - 用户输入:使用
scanf函数从键盘读取用户输入。%f用于读取浮点数。 - 错误处理:增加了一个简单的
if判断,防止用户输入0或负数,导致程序出错。
示例3:使用数组存储数字并计算平均值
当数字很多时,使用单独的变量会很麻烦,这时,数组就派上用场了。
代码:
#include <stdio.h>
int main() {
int n, i;
float sum = 0.0, average;
// 1. 定义数组并确定其大小
// 假设我们最多计算100个数字的平均值
float numbers[100];
// 2. 提示用户输入数字的个数
printf("请输入要计算平均值的数字个数 (最多100个): ");
scanf("%d", &n);
// 3. 检查输入是否合法
if (n <= 0 || n > 100) {
printf("输入的个数必须在1到100之间,\n");
return 1;
}
// 4. 使用循环将数字存入数组并计算总和
printf("请输入 %d 个数字:\n", n);
for (i = 0; i < n; ++i) {
scanf("%f", &numbers[i]); // 将数字存入数组
sum += numbers[i]; // 同时累加
}
// 5. 计算平均值
average = sum / n;
// 6. 输出结果
printf("计算完成,\n");
printf("平均值是: %.2f\n", average);
return 0;
}
关键点解析:
- 数组:
float numbers[100];定义了一个可以存放100个浮点数的数组。 - 数组索引:数组的索引从
0开始。numbers[0]是第一个元素,numbers[1]是第二个,以此类推。for循环的变量i正好可以作为数组的索引。 - 结合使用:这个例子结合了数组和循环的优点,既方便了数据的存储,又简化了输入和累加的过程。
总结与最佳实践
- 核心公式:
平均值 = 总和 / 数量。 - 数据类型:
- 用于存储总和和平均值的变量,通常使用
float或double类型,以避免整数除法丢失精度。 - 在进行除法运算前,确保至少有一个操作数是浮点数(使用
(float)sum或count * 1.0)。
- 用于存储总和和平均值的变量,通常使用
- 输入处理:
- 使用
for循环来处理多个用户输入。 - 添加基本的输入验证(如检查数量是否为正数),可以使程序更健壮。
- 使用
- 代码复用:如果这个计算功能需要在多个地方使用,最好的方式是将其封装成一个函数。
将计算平均值封装成函数(高级用法)
#include <stdio.h>
// 定义一个函数,用于计算浮点数数组的平均值
// 参数1: arr, 数组
// 参数2: size, 数组的大小
// 返回值: 计算出的平均值
float calculateAverage(float arr[], int size) {
if (size <= 0) {
return 0.0; // 防止除以零
}
float sum = 0.0;
for (int i = 0; i < size; i++) {
sum += arr[i];
}
return sum / size;
}
int main() {
float data[] = {10.5, 20.3, 30.8, 40.1, 50.9};
int n = sizeof(data) / sizeof(data[0]); // 计算数组元素个数
float avg = calculateAverage(data, n);
printf("数组: ");
for (int i = 0; i < n; i++) {
printf("%.1f ", data[i]);
}
printf("\n平均值是: %.2f\n", avg);
return 0;
}
这种方式让代码结构更清晰,也更容易维护和重用。
