Online Compiler C

#include <stdio.h> int main() { int a[10]; int temp; for (int i = 0; i < 5; i++) { scanf("%d", &a[i]); } for (int i = 0; i < 4; i++) { for (int j = 0; j < 4 - i; j++) { if (a[j] > a[j + 1]) { temp = a[j]; a[j] = a[j + 1]; a[j + 1] = temp; } } } for (int i = 0; i < 5; i++) { printf("%d ", a[i]); } for (int i = 5; i < 10; i++) { scanf("%d", &a[i]); } for (int i = 5; i < 9; i++) { for (int q = 0; q < 9 - i; q++) { if (a[q] < a[q + 1]) { temp = a[q + 1]; a[q + 1] = a[q]; a[q] = temp; } } } for (int i = 5; i < 10; i++) { printf("%d ", a[i]); } return 0; }
这段代码的功能是:先输入5个整数存入数组前5个位置,将它们按升序排序并输出;再输入5个整数存入数组后5个位置,将它们按降序排序并输出。但代码中存在逻辑错误。

- 第二个排序循环中,外层循环变量 `i` 从5开始,但内层循环 `for (int q = 0; q < 9 - i; q++)` 中 `9 - i` 的值会变成负数(例如当 `i=5` 时,`9-5=4`,但 `i=8` 时 `9-8=1`),这导致排序范围不正确,实际上只对数组前几个元素进行了部分排序,而不是对后5个元素排序。你需要重新考虑如何正确限定后5个元素的排序范围。

- 第二个排序的冒泡方向是降序,但内层循环的索引 `q` 从0开始,这会导致它错误地访问了前5个已排序的元素。你应该让内层循环只遍历后5个元素的范围,比如从索引5到9。