3D数组转2D数组排列问题:实现连续3×6数组输出
修正3D数组转2D数组的排列逻辑,实现连续数值的3×6输出
原代码将arr1[2][3][3](2个3×3的块)转换为arr2[3][6]时,输出是两个3×3块左右并排的形式,但需求是将数值连续填充为3行6列的数组——第一行包含前6个输入值,第二行包含中间6个,第三行包含最后6个。
修正后的代码
#include <stdio.h> int main() { int i, j, k; int arr1[2][3][3]; int arr2[3][6]; printf("enter the values in the array: \n"); for (i = 0; i < 2; i++) { for (j = 0; j < 3; j++) { for( k = 0; k < 3; k++) { printf("the value at arr[%d][%d][%d]: ", i, j, k); scanf("%d", &arr1[i][j][k]); // 计算当前元素在arr2中的行和列索引 int arr2_row = (i * 3 + j) / 2; int arr2_col = ((i * 3 + j) % 2) * 3 + k; arr2[arr2_row][arr2_col] = arr1[i][j][k]; } } } printf("printing the values in 2D array: \n"); for (j = 0; j < 3; j++) { for (k = 0; k < 6; k++) { printf("%d ", arr2[j][k]); } printf("\n"); } return 0; }
关键改动说明
- 移除了原代码中逻辑错误的
d1和d2偏移变量,改用直接计算目标索引的方式,避免块并排的问题。 - 核心映射逻辑:
arr2_row = (i * 3 + j) / 2:3D数组共有6个行(2个块×3行/块),每2行合并为arr2的一行,通过整数除法得到对应的目标行号。arr2_col = ((i * 3 + j) % 2) * 3 + k:判断当前3D行是合并后行的前半段还是后半段,前半段对应arr2的0-2列,后半段对应3-5列,再加上列偏移k得到最终列索引。
- 清理了输出循环中无效的
if(k == 6)判断(k的取值范围是0-5,该条件永远不会触发),简化输出逻辑。
内容的提问来源于stack exchange,提问作者Ally
相关产品推荐
相关产品推荐

