使用C函数总结两个矩阵给我一个逻辑错误

时间:2018-02-26 19:48:22

标签: c function multidimensional-array

我试图将这两个矩阵作为键盘的输入,然后尝试使用C函数在屏幕上打印出它们的总和。我一直在用这段代码麻醉了好几个小时,但仍然没有弄到我错的地方。它打印两个矩阵都很完美,但它并没有完美地总结它们。虽然它完美地总结了第一行,但其余部分并不正确。

Output is attached。在屏幕截图中,显示实际输出加上我想要的所需输出用红色进行照片显示。

#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");
    }
}

3 个答案:

答案 0 :(得分: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

这是它存储在2d数组中的方式。其余的位置包含垃圾值,你添加它们。并打印出那些垃圾值。

执行此操作的正确方法是(您还必须对其他功能进行这些更改)。

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);

注意一件事 - 数组数组的2d数组在传递给函数时衰减为指向第一个元素的指针。据说 - 这就是为什么我们可以对传递的数组进行更改并保留这些更改。

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

你利用了这样一个事实:数组元素在传染性中保留在内存中,但你没有将它与a[2][2]不是第6个元素的事实联系起来,因为如果原始数组的大小是你认为的那样5x5因为a[2][2]实际上是2*5+2元素(如果考虑传染性布局)。

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

答案 1 :(得分:0)

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

newUser

前4个元素是2D数组的第0行。

在此行中,您可以在第0行打印元素0和1,在第1行打印元素0和1。

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

选择访问阵列的两种方法之一。 我认为你在各处使用双索引方式都会更好。

答案 2 :(得分:0)

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

因此,如果您通过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);

使得它在1-d矩阵中返回所需的索引

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;