Онлайн компилятор C

#include <stdio.h> int main() { int SIZE = 10; int i; int max1, max2; int a[SIZE]; int cymma; for (i = 0; i < SIZE; i++) { scanf("%d", a[i]); if (a[0] > a[1]) { max1 = a[0]; max2 = a[1]; } else { max1 = a[1]; max2 = a[2]; } } for (i = 2; i < SIZE; i++) { if (a[i] > max1) { max1 = a[i]; max2 = max1; } else if (a[i] > max2) { max2 = a[i]; } cymma = max1 + max2; printf("%d", cymma); } } return 0; }
这段代码试图找出数组中的两个最大数并计算它们的和,但存在几个关键问题。

代码的主要逻辑是:先读入10个整数,然后遍历数组找出最大的两个数,最后输出它们的和。但实现中有多处错误。

- 在第一个循环中,`scanf("%d", a[i])` 缺少取地址符 `&`,应该写成 `scanf("%d", &a[i])`。同时,每次读入一个数后都重新比较 `a[0]` 和 `a[1]` 来初始化 `max1` 和 `max2`,这会导致初始化被反复覆盖,而且当 `i=0` 时 `a[1]` 还未被读入,会使用未初始化的值。

- 第二个循环中,当 `a[i] > max1` 时,把 `max1` 赋给 `max2` 的语句写反了,应该是 `max2 = max1` 先保存旧的最大值,再更新 `max1`。另外,`printf` 放在循环内部会导致每次找到新最大值都输出一次,而不是最后输出一次。