用c++将大于和小于30的整数从一个一维数组复制到两个三维数组的程序

bakd9h0s  于 2023-03-07  发布在  其他
关注(0)|答案(1)|浏览(100)

我正在尝试编写一个程序,允许用户将正整数输入到一个12的一维数组中,并捕获小于1的输入,然后程序将值小于30的整数复制到第二个三维数组中,同时将值大于或等于30的整数复制到第三个三维数组中。
它将以表格形式显示三个数组。程序将使用三个数组,1个单数组和2个三维数组。
我是这么做的:

#include <stdio.h>

#define N 12

int main() {

    int a[N], b[2][2][3], c[2][2][3];
    int i, j, k, l;

        for(i = 0; i < N; i++){
            printf("Input %d: ", i);
            scanf("%d", &a[i]);

            if(a[i] < 30){
                for(j = 0; j < 2; j++){
                    for(k = 0; k < 2; k++){
                        for(l = 0; l < 3; l++){
                            b[j][k][l] = a[i];
                        }
                    }
                }
            }

            if(a[i] >= 30){
                for(j = 0; j < 2; j++){
                    for(k = 0; k < 2; k++){
                        for(l = 0; l < 3; l++){
                            c[j][k][l] = a[i];
                        }
                    }
                }
            }

            while(a[i] < 1){
                if (a[i] < 5){
                    printf("\nInvalid Input\nEnter 1 or greater than 1 only\n\n");
                    printf("Input %d: ", i);
                    scanf("%d", &a[i]);

                    if(a[i] < 30){
                        for(j = 0; j < 2; j++){
                            for(k = 0; k < 2; k++){
                                for(l = 0; l < 3; l++){
                                    b[j][k][l] = a[i];
                                }
                            }
                        }
                    }

                    if(a[i] >= 30){
                        for(j = 0; j < 2; j++){
                            for(k = 0; k < 2; k++){
                                for(l = 0; l < 3; l++){
                                    c[j][k][l] = a[i];
                                }
                            }
                        }
                    }
                }
            }

        }

        printf("\nArray 1: \n");

        for(i = 0; i < N; i++)
            printf("a[%d] = %d \n", i, a[i]);

        printf("\n\nArray with less than 30: \n");

        for(j = 0; j < 2; j++){
                    for(k = 0; k < 2; k++){
                        for(l = 0; l < 3; l++){
                            printf("b[%d][%d][%d] = %d \n", j, k, l, b[j][k][l]); 
                        }
                    }
                }

        printf("\n\nArray with greater than or equal to 30: \n");

        for(j = 0; j < 2; j++){
                    for(k = 0; k < 2; k++){
                        for(l = 0; l < 3; l++){
                            printf("c[%d][%d][%d] = %d \n", j, k, l, c[j][k][l]); 
                        }
                    }
                }
}

然而,当我试图运行程序时,它显示了错误的值。有人能告诉我我的代码有什么问题吗?谢谢。
编辑:我已将索引更改为从0而非1开始。
当我试着输入这个的时候:

Input 0: 1
Input 1: 2
Input 2: 3
Input 3: 4
Input 4: 5
Input 5: 6
Input 6: 31
Input 7: 32
Input 8: 33
Input 9: 34
Input 10: 35
Input 11: 36

它显示了数组1中所需的结果:

Array 1:
a[0] = 1
a[1] = 2
a[2] = 3
a[3] = 4
a[4] = 5
a[5] = 6
a[6] = 31
a[7] = 32
a[8] = 33
a[9] = 34
a[10] = 35
a[11] = 36

但是,在这两个三维数组中,它只显示我输入的最后一个符合条件的整数:

Array with less than 30:
b[0][0][0] = 6
b[0][0][1] = 6
b[0][0][2] = 6
b[0][1][0] = 6
b[0][1][1] = 6
b[0][1][2] = 6
b[1][0][0] = 6
b[1][0][1] = 6
b[1][0][2] = 6
b[1][1][0] = 6
b[1][1][1] = 6
b[1][1][2] = 6

Array with greater than or equal to 30:
c[0][0][0] = 36
c[0][0][1] = 36
c[0][0][2] = 36
c[0][1][0] = 36
c[0][1][1] = 36
c[0][1][2] = 36
c[1][0][0] = 36
c[1][0][1] = 36
c[1][0][2] = 36
c[1][1][0] = 36
c[1][1][1] = 36
c[1][1][2] = 36

我想得到的是在三维数组中"小于30的数组:"显示小于30的ALL
同样在"大于或等于30的数组:"中显示ALL大于或等于30。
就像这样:

Array with less than 30:
b[0][0][0] = 1
b[0][0][1] = 2
b[0][0][2] = 3
b[0][1][0] = 4
b[0][1][1] = 5
b[0][1][2] = 6
b[1][0][0] = 0
b[1][0][1] = 0
b[1][0][2] = 0
b[1][1][0] = 0
b[1][1][1] = 0
b[1][1][2] = 0

Array with greater than or equal to 30:
c[0][0][0] = 31
c[0][0][1] = 32
c[0][0][2] = 33
c[0][1][0] = 34
c[0][1][1] = 35
c[0][1][2] = 36
c[1][0][0] = 0
c[1][0][1] = 0
c[1][0][2] = 0
c[1][1][0] = 0
c[1][1][1] = 0
c[1][1][2] = 0

是否有可能做到这一点?或者是否有任何类似的替代办法?

ycl3bljg

ycl3bljg1#

下面的例子可以说明如何使用更少的代码来实现你的目标。请注意,b[]c[]的打印可以在一个函数中调用两次(而不是重复的代码)。

#include <stdio.h>

#define N 12

int main( void ) {
    int a[N] = { 0 } // initialise arrays on the stack
    int b[2][2][3] = { 0 };
    int c[2][2][3] = { 0 };
    int i, j, k, l;

    for( i = 0; i < N; i++ ) {
        // localise validation of user input
        do {
            printf("Input %d: ", i);
#if 0
            if( scanf( "%d", &a[i] ) != 1 || a[i] < 1 )
                puts( "Bad input. Repeat..." );
#else // correction to clear the input buffer if user enters "foobar"
            if( scanf( "%d", &a[i] ) != 1 || a[i] < 1 ) {
                scanf( "%*[^\n]" );
                puts( "Bad input. Repeat..." );
            }
#endif
        } while( a[i] < 1 );

        int done = 0; // a flag (to break out of nested loops.
        for(j = 0; j < 2 && !done; j++)
            for(k = 0; k < 2 && !done; k++)
                for(l = 0; l < 3 && !done; l++)
                    if( a[i] < 30 ) {
                        if( b[j][k][l] == 0 ) { // only replace 0's
                            b[j][k][l] = a[i];
                            done = 1;
                        }
                    } else {
                        if( c[j][k][l] == 0 ) {
                            c[j][k][l] = a[i];
                            done = 1;
                        }
                    }
    }
    
    /* then do the printing stuff */
}

不要使用复制/粘贴来编写代码。并且,在停下来编译和测试你所编写/修改的代码之前,不要编写超过几行的代码。"增量开发"。

    • 编辑:**

在迫使操作员编写更少的代码来完成这项工作之后,似乎应该改进上面的产品。这仍然使用3D阵列进行存储。

int *store = NULL;
    for(j = 0; j < 2 && !store; j++)
        for(k = 0; k < 2 && !store; k++)
            for(l = 0; l < 3 && !store; l++)
                if( a[i] < 30 ) {
                    if( b[j][k][l] == 0 )
                        store = &b[j][k][l];
                } else {
                    if( c[j][k][l] == 0 ) {
                        store = &c[j][k][l];
                }
    *store = a[i];

相关问题