我试图将这两个矩阵作为键盘的输入,然后尝试使用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");
}
}
答案 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;