Online Compiler C

#include <stdio.h> enum { SIZE = 12 }; int main() { int A[SIZE]; for (int i = 0; i < SIZE; i++) { scanf("%d", &A[i]); } for (int i = 0; i < 2; i++) { int temp = A[i]; A[i] = A[3 - i]; A[3 - i] = temp; } for (int i = 4; i < 6; i++) { int temp = A[i]; A[i] = A[11 - i]; A[13 - i] = temp; } for (int i = 8; i < 10; i++) { int temp = A[i]; A[i] = A[19 - i]; A[19 - i] = temp; } for (int i = 0; i < SIZE; i++) { printf("%d ", A[i]); } return 0; }
这段代码的功能是:读取12个整数存入数组A,然后对数组中的某些元素进行交换,最后输出结果。代码试图将数组分成几组进行对称交换,但存在索引计算错误。

- 第一个循环正确交换了A[0]与A[3]、A[1]与A[2],这是对前4个元素进行反转。
- 第二个循环中,`A[13 - i]` 的索引超出了数组范围(最大为11),应该检查索引计算是否正确。当i=4时,13-4=9,当i=5时,13-5=8,这似乎想交换A[4]与A[7]、A[5]与A[6],但写法有误。
- 第三个循环中,`A[19 - i]` 同样超出范围,当i=8时,19-8=11,当i=9时,19-9=10,这似乎想交换A[8]与A[11]、A[9]与A[10],但索引计算需要修正。

提示:
- 检查第二个和第三个循环中交换的索引是否都在0到11范围内,注意对称交换时另一端的索引应该用 `SIZE - 1 - i` 这样的公式。
- 思考每个循环要交换哪两个位置,确保写出的索引表达式不会越界。