如何将两个2d数组中的整数添加到用户指定长度的新2d数组中?

时间:2017-02-17 00:18:22

标签: c arrays function loops

我在这里相当新,今年是我第一次学习c。我遇到了关于2D数组等问题。问题是:编写一个程序,找到两个二维矩阵的总和。

我可以相当容易地做到这一点但是我遇到了一个问题。例如,我将给第一组数组长度为3x3。

如果我的第一个2D数组和第二个数组有:

  • {1,2,3; 4,5,6; 7,8,9}(第一阵)
  • {0,0,0; 0,0,0; 0,0,0}(第二阵列)

我还按用户给出了行数和列数。 (用户输入3x2)然后它应该显示为

  • {1,2; 3,4; 5,6}(输出)

但我正在

  • {1,2; 3,5; 6,8}

另一个例子

  • 用户输入2x4 OUTPUT应为{1,2,3,4; -5,6,7,8-}

我在这里做错了什么?

#include <stdio.h>
#include <stdlib.h>

#define MAXROW 3
#define MAXCOL 3

int main() {
    int ray1[MAXROW][MAXCOL], ray2[MAXROW][MAXCOL];
    int r, c;
    printf("Enter the number of ROWS: ");
    scanf("%d", &r);
    printf("Enter the number of COLUMNS: ");
    scanf("%d", &c);

    int sumRay[r][c];

    printf("\n");

    printf("Input integers for Array %d.\n", 1);
    arrayIN(ray1);

    printRay(ray1);
    printf("Input integers for Array %d.\n", 2);
    arrayIN(ray2);

    printRay(ray2);
    arraySUM(ray1, ray2, r, c, sumRay);
    printSumRay(r, c, sumRay);

    //printRay(sumRay);
}

void arrayIN(int ray[MAXROW][MAXCOL]) {
    int r, c;
    for (r = 0; r < MAXROW; r++) {
        for (c = 0; c < MAXCOL; c++) {
            printf("Enter Number for [ROW:%d COL:%d]: ", r, c);
            scanf("%d", &ray[r][c]);
        }
    }
}

void arraySUM(int ray1[MAXROW][MAXCOL], int ray2[MAXROW][MAXCOL],
              int r, int c, int sumRay[r][c]) {
    int i, j;
    int x, y;
    i = j = 0;
    int sum;
    for (x = 0; x <= r; x++, i++) {
        if (i < MAXROW) {
            for (y = 0; y <= c; y++, j++) {
                if (j < MAXCOL) {
                    sum = ray1[i][j] + ray2[i][j];
                    sumRay[x][y]= sum;
                } else {
                    j = 0;
                }
            }
        } else {
            i = 0;
        }
    }
    printf("\n");
}

void printSumRay(int r, int c, int sumRay[r][c]) {
    int i, j;
    for (i = 0; i < r; i++) {
        printf("\n");
        for (j = 0; j < c; j++) {
            printf("%d\t", sumRay[i][j]);
        }
    }
}

void printRay(int ray[MAXROW][MAXCOL]) {
    int i, j;
    for (i = 0; i < 3; i++) {
        printf("\n");
        for (j = 0; j < 3; j++) {
            printf("%d\t", ray[i][j]);
        }
    }
    printf("\n");
}

2 个答案:

答案 0 :(得分:0)

首先,您需要在main()之前放置函数原型,或者至少在main()之前移动函数定义。我完全不清楚为什么使用VLA作为sumRay[][],而ray1[][]ray2[][]使用常量维数组。除非你有令人信服的理由这样做,否则最好全面使用VLA。

对于包含数组索引的变量,您应该使用size_t类型。然后,必须修改处理scanf()变量的printf()size_t语句,以使用%zu转换说明符。

arraySum()函数迭代两对重复数组索引,原因不明。这里的逻辑错综复杂,过于复杂。您报告的虚假输出可以追溯到此函数;它很难阅读和理解,这应该是一个需要重写的标志。如果您打算仅部分添加输入数组,则该名称不会反映此意图。我简化了这个功能,收紧逻辑并删除重复。有关进行部分数组添加的版本,请参阅下面的更新。

printSumRay()函数似乎是多余的,因为printRay()函数可以执行相同的工作,因此我将其删除,重写printRay()以使用VLA并收紧代码。原始代码在此处循环的控制表达式中使用幻数3,而不是利用MAXROWMAXCOL。但是,即使不使用VLA,最好将维度传递给任何可以使用数组的函数。

以下是原始代码的修改版本:

#include <stdio.h>
#include <stdlib.h>

void arrayIN(size_t r, size_t c, int ray[r][c]);
void arraySUM(size_t r, size_t c, int ray1[r][c], int ray2[r][c], int sumRay[r][c]);
void printRay(size_t r, size_t c, int ray[r][c]);

int main(void)
{

    size_t r,c;

    printf("Enter the number of ROWS: ");
    scanf("%zu", &r);
    printf("Enter the number of COLUMNS: ");
    scanf("%zu", &c);

    int ray1[r][c], ray2[r][c], sumRay[r][c];

    printf("\n");

    printf("Input integers for Array %d.\n", 1);
    arrayIN(r, c, ray1);
    putchar('\n');

    printRay(r, c, ray1);
    putchar('\n');

    printf("Input integers for Array %d.\n", 2);
    arrayIN(r, c, ray2);
    putchar('\n');

    printRay(r, c, ray2);
    putchar('\n');

    arraySUM(r, c, ray1, ray2, sumRay);
    printRay(r, c, sumRay);
    putchar('\n');

    return 0;
}

void arrayIN(size_t r, size_t c, int ray[r][c])
{
    for(size_t i = 0; i < r; i++) {
        for(size_t j = 0; j < c; j++) {
            printf("Enter Number for [ROW:%zu COL:%zu]: ", i, j);
            scanf("%d", &ray[i][j]);
        }
    }
}

void arraySUM(size_t r, size_t c, int ray1[r][c],int ray2[r][c], int sumRay[r][c])
{
    for(size_t i = 0; i < r; i++) {
        for(size_t j = 0; j < c; j++) {
            sumRay[i][j] = ray1[i][j] + ray2[i][j];
        }
    }
}

void printRay(size_t r, size_t c, int ray[r][c])
{
    for(size_t i = 0; i < r; i++) {
        for(size_t j = 0; j < c; j++) {
            printf("%8d",ray[i][j]);
        }
        putchar('\n');
    }
}

下一步,您可以在输入代码中添加一些错误检查,检查调用scanf()的返回值。并且,实际上,输入数组的数字是尴尬的,提示每个元素。您可以尝试改进此方法。

<强>更新

如果您的真正目标是仅组合数组的初始行和列,则上述代码只需稍作修改即可。您仍应使用VLA,但不是定义全局常量MAXROWMAXCOL,而是在const size_t maxrow的正文中定义const size_t maxcolmain()。您应该将这些数组维度传递给函数,而不是依赖于全局值。

添加了一个功能partArraySUM(),其名称更接近其目的。此函数与arraySUM()之间仅 的区别在于输入数组ray1[][]ray2[][]的维度与保存结果的数组sumRay[][]的维度不同。没有必要为此保留单独的索引。

#include <stdio.h>
#include <stdlib.h>

void arrayIN(size_t r, size_t c, int ray[r][c]);
void arraySUM(size_t r, size_t c, int ray1[r][c], int ray2[r][c], int sumRay[r][c]);
void partArraySUM(size_t r_sz, size_t c_sz, int ray1[r_sz][c_sz], int ray2[r_sz][c_sz], size_t r, size_t c, int sumRay[r][c]);
void printRay(size_t r, size_t c, int ray[r][c]);

int main(void)
{
    const size_t maxrow = 3;
    const size_t maxcol = 3;
    size_t r,c;

    printf("Enter the number of ROWS: ");
    scanf("%zu", &r);
    printf("Enter the number of COLUMNS: ");
    scanf("%zu", &c);

    int ray1[maxrow][maxcol], ray2[maxrow][maxcol], sumRay[r][c];

    printf("\n");
    printf("Input integers for Array %d.\n", 1);
    arrayIN(maxrow, maxcol, ray1);
    putchar('\n');

    printRay(maxrow, maxcol, ray1);
    putchar('\n');

    printf("Input integers for Array %d.\n", 2);
    arrayIN(maxrow, maxcol, ray2);
    putchar('\n');

    printRay(maxrow, maxcol, ray2);
    putchar('\n');

    partArraySUM(maxrow, maxcol, ray1, ray2, r, c, sumRay);
    printRay(r, c, sumRay);
    putchar('\n');

    return 0;
}

void arrayIN(size_t r, size_t c, int ray[r][c])
{
    for(size_t i = 0; i < r; i++) {
        for(size_t j = 0; j < c; j++) {
            printf("Enter Number for [ROW:%zu COL:%zu]: ", i, j);
            scanf("%d", &ray[i][j]);
        }
    }
}

void arraySUM(size_t r, size_t c, int ray1[r][c],int ray2[r][c], int sumRay[r][c])
{
    for(size_t i = 0; i < r; i++) {
        for(size_t j = 0; j < c; j++) {
            sumRay[i][j] = ray1[i][j] + ray2[i][j];
        }
    }
}

void partArraySUM(size_t r_sz, size_t c_sz, int ray1[r_sz][c_sz], int ray2[r_sz][c_sz], size_t r, size_t c, int sumRay[r][c])
{
    for(size_t i = 0; i < r; i++) {
        for(size_t j = 0; j < c; j++) {
            sumRay[i][j] = ray1[i][j] + ray2[i][j];
        }
    }
}

void printRay(size_t r, size_t c, int ray[r][c])
{
    for(size_t i = 0; i < r; i++) {
        for(size_t j = 0; j < c; j++) {
            printf("%8d",ray[i][j]);
        }
        putchar('\n');
    }
}

示例互动:

Enter the number of ROWS: 2
Enter the number of COLUMNS: 2

Input integers for Array 1.
Enter Number for [ROW:0 COL:0]: 1
Enter Number for [ROW:0 COL:1]: 2
Enter Number for [ROW:0 COL:2]: 3
Enter Number for [ROW:1 COL:0]: 4
Enter Number for [ROW:1 COL:1]: 5
Enter Number for [ROW:1 COL:2]: 6
Enter Number for [ROW:2 COL:0]: 7
Enter Number for [ROW:2 COL:1]: 8
Enter Number for [ROW:2 COL:2]: 9

       1       2       3
       4       5       6
       7       8       9

Input integers for Array 2.
Enter Number for [ROW:0 COL:0]: 1
Enter Number for [ROW:0 COL:1]: 1
Enter Number for [ROW:0 COL:2]: 1
Enter Number for [ROW:1 COL:0]: 1
Enter Number for [ROW:1 COL:1]: 1
Enter Number for [ROW:1 COL:2]: 1
Enter Number for [ROW:2 COL:0]: 1
Enter Number for [ROW:2 COL:1]: 1
Enter Number for [ROW:2 COL:2]: 1

       1       1       1
       1       1       1
       1       1       1

       2       3
       5       6

答案 1 :(得分:-1)

只需要做一些小改动。在 arraySUM()中,您已重新初始化的其他部分

  

i = 0且j = 0。

但是在重新初始化之后它们会增加。因此它将变为1,因此在执行时它将读取 ray [1],而不是ray [0]

重新初始化为-1。

  

i = -1且j = -1