【问题标题】:Summing up two Matrices using C functions gives me a logical error使用 C 函数总结两个矩阵会给我一个逻辑错误
【发布时间】:2018-02-26 19:48:21
【问题描述】:

我试图将这两个矩阵作为键盘的输入,然后尝试使用 C 函数在屏幕上打印出它们的总和。我已经对这段代码感到麻木了好几个小时,但仍然不知道我哪里出错了。它打印了两个完美的矩阵,但并没有完美地总结它们。虽然它完美地总结了第一行,但没有正确总结其余的行。

Output is attached。在屏幕截图中,显示了实际输出以及我想要的所需输出用红色进行了 photoshop 处理。

#include <stdio.h>
#include <conio.h>
void main(void)
{
    int i,j,order,a[5][5],b[5][5],sum[5][5];
    clrscr();
    printf("Enter the order of matrix: ");
    scanf("%d",&order);
    inputmatrixA(&a[0][0],order);
    printmatrixA(&a[0][0],order);
    inputmatrixB(&b[0][0],order);
    printmatrixB(&b[0][0],order);
    for (i=0;i<order;i++)
    {
        for(j=0;j<order;j++)
        {
            sum[i][j]=a[i][j]+b[i][j];
        }
    }
    printf("Sum of A & B\n");
    for (i=0;i<order;i++)
    {
        for(j=0;j<order;j++)
        {
            printf("%d\t",sum[i][j]);

        }
        printf("\n");
    }
    getch();
}


inputmatrixA(int *p,int order)
{
    int i,j;
    for (i=0;i<order;i++)
    {
        for (j=0;j<order;j++)
        {
            printf("Enter a[%d][%d]: ",i+1,j+1);
            scanf("%d",p);
            p++;
        }
    }
}


printmatrixA(int *p,int order)
{
    int i,j;
    printf("Matrix A\n");
    for (i=0;i<order;i++)
    {
        for (j=0;j<order;j++)
        {
            printf("%d\t",*p);
            p++;
        }
        printf("\n");
    }
}


inputmatrixB(int *q,int order)
{
    int i,j;
    for (i=0;i<order;i++)
    {
        for (j=0;j<order;j++)
        {
            printf("Enter b[%d][%d]: ",i+1,j+1);
            scanf("%d",q);
            q++;
        }
    }
}


printmatrixB(int *q,int order)
{
    int i,j;
    printf("Matrix B\n");
    for (i=0;i<order;i++)
    {
        for (j=0;j<order;j++)
        {
            printf("%d\t",*q);
            q++;
        }
        printf("\n");
    }
}

【问题讨论】:

  • 您对二维数组衰减为指针类型做出了错误的假设 - 希望有人会详细回答。如果没有,谷歌“二维数组到指针的衰减”。
  • 请显示示例输入、结果输出、所需输出并解释它们的问题。
  • 您是否注意到您的编辑撤销了其他读者的两个有用的(抱歉这么说我的)编辑?请更加小心您的编辑。还请考虑直接在此处提供文本数据作为文本,而不是链接到文本图片...
  • 关于:printf("Enter the order of matrix: "); scanf("%d",&amp;order); 没有什么能阻止用户输入更大的值,比如 10。没有任何东西检查用户输入以确保它在 1...5 的范围内跨度>
  • 强烈建议使用 VLA(可变长度数组)功能,即 I.E.在用户输入“订单”之前不要声明数组的大小

标签: c function multidimensional-array


【解决方案1】:

为了解释,让我们看看发生了什么。

这里当你说订单是2x2然后输入1 2 3 4

1 2 3 4 x
x x x x x
x x x x x
x x x x x
x x x x x

当你进行加法时,你希望它们保持这个顺序,而事实并非如此

1 2 x x x
3 4 x x x
x x x x x
x x x x x
x x x x x

这就是它在二维数组中的存储方式。所以剩下的位置包含垃圾值,你添加它们。并打印那些垃圾值。

正确的做法是(您还必须对其他功能进行这些更改)。

void inputmatrixA(int (*p)[5],int order)
{
    for (int i=0;i<order;i++)
    {
        for (int j=0;j<order;j++)
        {
            printf("Enter a[%d][%d]: ",i+1,j+1);
            scanf("%d",&p[i][j]);
        }
    }
}

然后这样称呼它:-

  inputmatrixA( a , order);

注意一件事 - 二维数组是数组的数组,当它传递给函数时,它会衰减为指向第一个元素的指针。话虽如此 - 这就是为什么我们可以对传递的数组进行更改并保留这些更改。

这也解释了为什么需要括号内的第二个数字。因为这会让编译器计算出你说a[2][2]时想要访问的正确位置。

您利用了数组元素会传染地保留在内存中的事实,但您没有将其与 a[2][2] 不是您认为的第 6 个元素的事实相关联,如果原始数组的大小为 @987654329 @ 因为a[2][2] 确实是2*5+2th 元素(如果您考虑传染性布局)。

您还必须在使用它们之前声明这些函数(并在某处提供定义),否则您可以在使用它们之前放置它们的定义。

【讨论】:

  • @Michi.: 不是那个 - 声明 vs def 我知道 - 我很懒惰,说你必须在使用之前先定义,这是一种方法,但不是唯一的方法。
  • @Michi.: 声明如果我们不放,那么我们也可以编写代码——我希望你也知道那部分。这产生了我的早期。我概括了它 - 在你使用之前你必须定义。定义是必须的。
  • 我不是在想那张照片,但你是对的:))
  • @Michi.: 好的.. 谢谢
【解决方案2】:

在这些行中,您用值填充前 4 个元素(对于订单 2):

scanf("%d",p);
p++;

前 4 个元素是二维数组的 int line 0。

在这一行中,您在第 0 行打印元素 0 和 1,在第 1 行打印元素 0 和 1。

printf("%d\t",sum[i][j]);

选择两种方式之一来访问您的阵列。 我认为在任何地方都使用双索引方式会更好。

【讨论】:

  • 哎呀。我误解了你的回答。对不起,伙计。
【解决方案3】:

您有一个允许选择矩阵大小的输入,但您在软件中布置的矩阵的大小是固定的。

因此,如果您通过 UI 输入一个 2x2 矩阵,它会存储在一个硬编码的 5x5 矩阵中,您将无法获得所需的输入。

我建议您重新编写矩阵代码以采用不同的数据结构。一个看起来像

int rows;
int columns;
int* cells;

像这样初始化单元格的位置

cells = (int*) malloc(sizeof(int)*rows*columns);

然后查找单元格 [4][3],使用转换函数

int linear_index(int column, int row, int columns, int rows);

这样它会在一维矩阵中返回所需的索引

int linear_index(int column, int row, int columns, int rows) {
    return column + row*columns;
}

请注意,上述函数只是一个开始,并没有对其进行溢出检查。你最好想出一些边界检查代码。

那么它可能会被如何使用

int cell_value = cells[linear_index(3, 4)];

最后,别忘了释放你malloc分配的项目。

free cells;

【讨论】:

    猜你喜欢
    • 2018-11-08
    • 1970-01-01
    • 1970-01-01
    • 2016-04-09
    • 2021-06-27
    • 2021-01-13
    • 1970-01-01
    • 2015-06-13
    • 2020-06-14
    相关资源
    最近更新 更多