C Day 18

让输入进入数组,
再从数据中找出两端

今天把输入、数组、循环和条件判断连接起来:先将四个整数逐项保存,再从真实数据出发寻找最大值与最小值。

先确认数组边界

课前复习数组 7、2、9、5,能够完整输出四个元素,区分下标与元素值,并说明长度为 4 的数组最后一个合法下标是 3。若把循环条件写成 index <= 4,就会多访问不合法的下标 4。

把四次输入依次写入数组

day18.c
int numbers[4] = {0};

for (int index = 0; index < 4; index++)
{
    printf("请输入下标 %d 的整数:", index);
    scanf_s("%d", &numbers[index]);
}

numbers[index] 表示当前下标对应的元素,前面的 & 提供这个元素的写入位置。输入 8、3、10、6 后,它们分别保存在下标 0、1、2、3,第二个遍历循环按相同顺序完整输出。

int numbers[4] = {0}; 会先把四个元素都初始化为 0;实际输入随后逐个覆盖这些初始值。

从第一个真实元素开始寻找最值

真实元素 → 暂定答案
int maximum = numbers[0];
int minimum = numbers[0];

for (int index = 1; index < 4; index++)
{
    if (numbers[index] > maximum)
    {
        maximum = numbers[index];
    }

    if (numbers[index] < minimum)
    {
        minimum = numbers[index];
    }
}

第一个元素已经成为初始答案,所以比较从下标 1 开始。对于 8、3、10、6,maximum 从 8 更新为 10,minimum 从 8 更新为 3,最终得到最大值 10、最小值 3。

为什么不能机械地初始化为 0

如果 maximum 初始为 0,而所有输入都是负数,0 会错误地成为最大值;如果 minimum 初始为 0,而所有输入都是正数,0 会错误地成为最小值。使用 numbers[0] 可以保证初始答案一定来自真实输入。

三组实际测试

  • 8、3、10、6:最大值 10,最小值 3
  • -8、-3、-10、-6:最大值 -3,最小值 -10
  • 5、5、5、5:最大值 5,最小值 5

三次运行均正常退出,代码为 0。全负数测试证明首元素初始化可靠;重复值测试证明严格使用 >< 时,相等的数据不会触发更新。

今天订正的细节

第一次描述 8、3、10、6 的变化过程时,把“初始化为 8”和“比较后更新”混在了一起,并一度说 minimum 一直为 3。订正后明确:maximum 初始化为 8,只在遇到 10 时更新;minimum 初始化为 8,在遇到 3 时更新。

边界测试时先直接运行、后补预测过程;补答后能够准确追踪全负数中的 maximum 为 -8 → -3、minimum 为 -8 → -10,也能说明相等时两个条件都不成立。

今天真正完成的内容

  • 在循环中把键盘输入逐项写入整数数组
  • 理解 &numbers[index] 提供当前元素的写入位置
  • 用首个真实元素初始化最大值和最小值
  • 从下标 1 开始遍历并更新最值
  • 完成普通、全负数和重复值三组测试

下一课计划学习使用 sizeof 获取数组元素数量,并计算数组总和与浮点平均值。