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

#include <stdio.h> int main() { int arr[10]; for (int i = 0; i < 10; i++) { if (scanf("%d", &arr[i]) != 1) { return 0; } } for (int i = 0; i < 5 - 1; i++) { for (int j = 0; j < 5 - i - 1; j++) { if (arr[j] > arr[j + 1]) { int temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } for (int i = 0; i < 5 - 1; i++) { for (int j = 5; j < 5 + (5 - i - 1); j++) { if (arr[j] < arr[j + 1]) { int temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } for (int i = 0; i < 10; i++) { printf("%d", arr[i]); if (i < 9) { printf(" "); } } printf("\n"); return 0; }
这段代码的功能是:读取10个整数,然后对前5个元素进行升序排序,对后5个元素进行降序排序,最后输出整个数组。

代码中存在一个逻辑错误。在第二个排序循环中,内层循环的边界条件 `j < 5 + (5 - i - 1)` 会导致访问数组越界。当 `i=0` 时,`j` 最大会到 `5 + 4 = 9`,但内层循环中比较的是 `arr[j]` 和 `arr[j+1]`,当 `j=9` 时,`arr[10]` 超出了数组范围。

- 检查第二个排序循环的边界条件,确保内层循环不会访问到数组末尾之后的位置。
- 考虑后5个元素的索引范围是5到9,排序时应该只在这个范围内操作。