让长度跟随数组,
让平均值保留小数
今天从数组占用的空间出发,计算元素数量,再把长度用进循环,最后学习浮点平均值和输出格式的区别。
sizeof 测量字节,不是数元素
sizeof(values) 得到整个数组占用的字节数,sizeof(values[0]) 得到一个元素的字节数。两者相除,才得到数组包含多少个元素。
int values[5] = {2, 4, 6, 8, 10};
size_t count = sizeof(values) / sizeof(values[0]);
printf("数组元素数量 = %zu\n", count);最初把字节数误当成元素数量。订正后用实际运行确认:当前环境中一个 int 占 4 字节,五个元素的数组占 20 字节,20 ÷ 4 得到 5。
我还询问了如何知道不同环境中的 int 大小:可以使用 sizeof(int) 确认,不必猜测,也不能把“64 位环境”直接理解成 int 一定占 8 字节。这里的长度公式用于实际数组,不能直接照搬到以后学习的指针或函数参数上。
让循环使用计算出的长度
sizeof 的结果类型是 size_t,输出时配合 %zu。用 size_t 保存 count 和下标,再让条件写成 index < count,就不必在多个地方手写相同长度。
修改数组长度并重新编译运行后,count 会按新数组大小计算。最终练习把五个元素改成六个元素,循环条件保持不变,仍然正确访问了下标 0—5。
浮点转换必须发生在除法之前
double result = 9 / 4; 的右侧先做整数除法,得到 2,再保存为 2.0。左边用了 double,并不会让右边自动变成浮点除法。
写成 double result = (double)9 / 4;,才会先转换再相除,得到 2.25。同样,平均值使用 (double)total / count;这个转换并不会改变原变量 total 的 int 类型。
计算值与显示格式是两件事
%.2f 控制显示小数点后两位,不改变变量本身。6.2 会显示成 6.20;变量保存 2.375 时,使用 %.2f 显示 2.38 后,仍可用 %.3f 显示 2.375。
本日多次在预测中漏写末尾的 0,也一度认为格式会修改变量。通过补答重新区分:计算决定数值,格式决定显示;4.5 用 %.2f 显示为 4.50,但值没有因此变化。
最终代码:六个负数的平均值
int values[6] = {-2, -4, -6, -8, -10, -3};
size_t count = sizeof(values) / sizeof(values[0]);
int total = 0;
for (size_t index = 0; index < count; index++)
{
total = total + values[index];
printf("下标 %zu,数据 = %d\n", index, values[index]);
}
printf("总和 = %d\n", total);
double average = (double)total / count;
printf("平均值 = %.2f\n", average);三组实际运行结果
- 2、4、6、8、10:数量 5,总和 30,平均值 6.00
- 2、4、6、8、11:数量 5,总和 31,平均值 6.20
- -2、-4、-6、-8、-10、-3:数量 6,总和 -33,平均值 -5.50
前两组数组占 20 字节,最后一组占 24 字节,单个元素均为 4 字节。三组运行都正常退出,代码为 0。
需要继续巩固的地方
除了字节数和显示格式,预测时还漏看过循环外的总和输出;计算平均值时,曾把 31 ÷ 5 误算为 5.2,把 9 ÷ 4 的浮点结果误算为 2.50。这些已逐项订正,但仍需要继续用短题巩固,不能只凭程序运行正确就认为所有概念都已稳固。
下一课先短暂复习长度与输出格式,再学习数组线性查找和目标值出现次数统计。