如何在C中实现3D数组到2D数组的转换

c9x0cxw0  于 2023-03-17  发布在  其他
关注(0)|答案(1)|浏览(215)

此代码成功地将3D数组 * 显示 * 为2D数组,显示相邻的两个层,但它需要集成为单个2D数组?(值1-9显示为一个3x 3块,值10-18显示为另一个3x 3块,但它应该是一个连续的数字块,

  • 当前 * 显示:
  • 所需 * 显示:

一个程序要求用户输入并将其放入arr1[2][3][3]中,然后该程序应该以正确的顺序打印arr2[3][6]中的值,出于演示目的,我使用了1-18

#include <stdio.h>

int main()
{
    int i, j, k;               //variables for nested for loops
    int d1 = 0;
    int d2 = 0;
    int arr1[2][3][3];         //array declaration
    int arr2[3][6];            //array declaration
    printf("enter the values in the array: \n");
    for (i = 0; i < 2; i++)   //represents block
    {
        for (j = 0; j < 3; j++)   //represents rows
        {
            for( k = 0; k < 3; k++)      //represents columns
            {
                printf("the value at arr[%d][%d][%d]: ", i, j, k);
                scanf("%d", &arr1[i][j][k]);
                arr2[d1 + j][d2 + k] = arr1[i][j][k];
            }
        }
        d1 = (d1 + j == 3) ? 0 : d1 + j;
        d2 = (d2 + k == 6) ? 0 : d2 + 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]);
            if (k == 6)
            {
                printf("\n");
            }
        }
        printf("\n");
    }
    return 0;
}

我不知道如何进一步转换

avwztpqn

avwztpqn1#

3D矩阵有2层3行3列。从问题中的文本来看,似乎您要将此对象转换为3x6矩阵,即:3行6列。定义int arr2[3][6]定义了一个6x3矩阵,即:3行6列。
要使用所需的投影填充2D矩阵,请参阅以下修改版本:

#include <stdio.h>

int main() {
    int arr1[2][3][3];                  // 3D array declaration
    int arr2[3][6];                     // 2D array declaration

    printf("enter the values in the array:\n");
    int d1 = 0, d2 = 0;
    for (int i = 0; i < 2; i++) {           // iterate on blocks
        for (int j = 0; j < 3; j++) {       // iterate on rows
            for (int k = 0; k < 3; k++) {   // iterate on columns
                printf("enter the value of arr[%d][%d][%d]: ", i, j, k);
                if (scanf("%d", &arr1[i][j][k]) != 1)
                    return 1;
                // set the value in the 2D matrix,
                // successive rows are combined left to right
                arr2[d1][d2] = arr1[i][j][k];
                if (++d2 == 6) {
                    d1++;
                    d2 = 0;
                }
            }
        }
    }

    printf("printing the values in 2D array:\n");
    for (int j = 0; j < 3; j++) {
        for (int k = 0; k < 6; k++) {
            printf("%d ", arr2[j][k]);
        }
        printf("\n");
    }
    return 0;
}

输出(省略阅读循环):
请注意,上面代码中定义的3D和2D数组具有相同顺序的相同值,您可以在阅读循环后简单地将arr1的内容复制为一个块来初始化arr2

memcpy(arr2, arr1, sizeof arr1);

另一种方法是通过一个指针来访问arr1作为一个2D数组的内容,你可以将arr2定义为一个指向一个3x6 2D数组的指针,这个数组的别名是相同的内存:

int (*arr2)[6] = (int (*)[6])arr1;

这样,3D阵列的任何修改在2D阵列中立即可见,反之亦然。
下面是使用此方法的修改版本。

#include <stdio.h>

int main() {
    int arr1[2][3][3];              // 3D array declaration
    // define arr2 as a pointer to the rows in arr1
    int (*arr2)[6] = (int (*)[6])arr1;

    printf("enter the values in the array:\n");
    for (int i = 0; i < 2; i++) {           // iterate on blocks
        for (int j = 0; j < 3; j++) {       // iterate on rows
            for (int k = 0; k < 3; k++) {   // iterate on columns
                printf("enter the value of arr[%d][%d][%d]: ", i, j, k);
                if (scanf("%d", &arr1[i][j][k]) != 1)
                    return 1;
            }
        }
    }

    printf("printing the values in 2D array:\n");
    for (int j = 0; j < 3; j++) {
        for (int k = 0; k < 6; k++) {
            printf("%d ", arr2[j][k]);
        }
        printf("\n");
    }
    printf("\n");

    printf("arr2[0][5] is %d\n", arr2[0][5]);
    arr1[0][1][2] = 100;
    printf("set arr1[0][1][2] = %d\n", arr1[0][1][2]);
    printf("arr2[0][5] is now %d\n", arr2[0][5]);

    return 0;
}

输出(省略阅读循环):

相关问题