我正在尝试学习二维数组。我偶然发现了一个问题。它表示使用名为 readMatrix() 的函数读取两个阶数 a*b 和 m*n 的矩阵,使用 processMatrix() 将矩阵相乘并使用 showMatrix() 显示结果。
我正在尝试仅使用数组来解决它。
这就是我尝试做的。
#include <stdio.h>
#include<math.h>
void readMatrix();
void processMatrix(int p[][100],int q[][100],int a,int b,int m,int n);
void showMatrix(int c[][100],int a,int n);
int main() {
readMatrix();
}
void readMatrix()
{
int i,j,m,n,a,b;
printf("For matrix 1 \n");
printf("Enter the number of rows: ");
scanf("%d",&a);
printf("Enter the number of columns: ");
scanf("%d",&b);
printf("For matrix 2 \n");
printf("Enter the number of rows: ");
scanf("%d",&m);
printf("Enter the number of columns: ");
scanf("%d",&n);
int p[a] [b];
int q[m] [n];
if (b == m)
{
printf("For 1st Matrix\n");
for(i = 0;i<a;i++)
{
for(j = 0; j < b;j++)
{
printf("%d row %d column: ",i+1,j+1);
scanf("%d",&p[i][j]);
}
}
printf("For 2nd Matrix\n");
for(i = 0;i < m;i++)
{
for(j = 0; j < n;j++)
{
printf("%d row %d column: ",i+1,j+1);
scanf("%d",&q[i][j]);
}
}
}
else
{
printf("Enter a valid dimension. ");
}
processMatrix(p,q,a,b,m,n);
}
void processMatrix(int p[][100],int q[][100],int a,int b,int m,int n)
{
int i,j,k;
int c[a][n];
for(i=0;i < a;i++)
{
for(j = 0; j < n;j++)
{ c[i][j]=0;
for(k = 0; k < b;k++)
{
c[i] [j] = c[i][j] + p[i][k] * q[k][j];
}
}
}
showMatrix(c,a,n);
}
void showMatrix(int c[][100],int a,int n)
{ int i,j;
for(i = 0; i < a; i++)
{for(j = 0; j< n; j++)
printf("%d ",c[i][j]);
}
printf("\n");
}
该程序确实读取元素但显示抓取值。我哪里错了?
我注意到的第一件事是,您正在声明
p
、q
、c
矩阵以及用户插入的运行时维度。这是不可以做的,以这种方式进行的动态分配是不标准的。看看这个问题。
我猜你正在开始你的旅程,所以在这种情况下教授的通常方法是将
p
、q
、c
矩阵定义为:
#define ROWS 100
#define COLS 100
...
void readMatrix()
{
int p[ROWS][COLS];
}
这先验地告诉你矩阵的大小。使用这种方法,您必须检查
a, b, m, n
是否小于 100。
我没有检查矩阵乘法方法,但我认为现在你可以继续没有垃圾值。
最后一件事:请注意,即使用户插入了不兼容的矩阵维度,您也会调用
processMatrix(p,q,a,b,m,n);
:)