代码
#include <stdio.h>
#include <stdlib.h>
#define nullptr 0
typedef struct CMatrix{
int* pMatrixAddr;
int RSize;
int CSize;
}CMatrix;
void InitMatrix(CMatrix* pMatrix);
int* GetElement(CMatrix* pMatrix, int RawNum, int ColumnNum);
void StoreMatrix(CMatrix* pMatrix);
void PrintMatrix(CMatrix* pMatrix);
void MultiplyMatrix(CMatrix* pMatrixA, CMatrix* pMatrixB, CMatrix* pResultMatrix);
void FreeMatrixStore(CMatrix* pMatrix);
int main()
{
CMatrix MatrixA, MatrixB, ResultMatrix;
InitMatrix(&MatrixA);
InitMatrix(&MatrixB);
InitMatrix(&ResultMatrix);
StoreMatrix(&MatrixA);
StoreMatrix(&MatrixB);
MultiplyMatrix(&MatrixA, &MatrixB, &ResultMatrix);
if(ResultMatrix.pMatrixAddr != nullptr)
PrintMatrix(&ResultMatrix);
FreeMatrixStore(&MatrixA);
FreeMatrixStore(&MatrixB);
FreeMatrixStore(&ResultMatrix);
return 0;
}
void InitMatrix(CMatrix* pMatrix)
{
pMatrix->RSize = 0;
pMatrix->CSize = 0;
pMatrix->pMatrixAddr = nullptr;
}
int* GetElement(CMatrix* pMatrix, int RawNum, int ColumnNum)
{
return pMatrix->pMatrixAddr + RawNum * pMatrix->CSize + ColumnNum;
}
void StoreMatrix(CMatrix* pMatrix)
{
int i, j;
scanf("%d %d", &pMatrix->RSize, &pMatrix->CSize);
pMatrix->pMatrixAddr = (int*)malloc(sizeof(int)*(pMatrix->RSize)*(pMatrix->CSize));
for(i=0; i<pMatrix->RSize; i++)
{
for(j=0; j<pMatrix->CSize; j++)
{
scanf("%d", GetElement(pMatrix, i, j));
}
}
return;
}
void PrintMatrix(CMatrix* pMatrix)
{
int i, j;
printf("%d %d\n",pMatrix->RSize, pMatrix->CSize);
for(i=0; i<pMatrix->RSize; i++)
{
for(j=0; j<pMatrix->CSize; j++)
{
printf("%d", *GetElement(pMatrix, i, j));
if(j != pMatrix->CSize - 1){
printf(" ");
}
}
printf("\n");
}
return;
}
void MultiplyMatrix(CMatrix* pMatrixA, CMatrix* pMatrixB, CMatrix* pResultMatrix)
{
int i, j, k;
if(pMatrixA->CSize != pMatrixB->RSize){
printf("Error: %d != %d\n", pMatrixA->CSize, pMatrixB->RSize);
}
else{
pResultMatrix->RSize = pMatrixA->RSize;
pResultMatrix->CSize = pMatrixB->CSize;
pResultMatrix->pMatrixAddr = (int*)malloc(sizeof(int)*(pMatrixA->RSize)*(pMatrixB->CSize));
for(i=0; i<pMatrixA->RSize; i++)
{
for(j=0; j<pMatrixB->CSize; j++)
{
*GetElement(pResultMatrix, i, j) = 0;
for(k=0; k<pMatrixA->CSize; k++)
{
*GetElement(pResultMatrix, i, j) += (*GetElement(pMatrixA, i, k))* (*GetElement(pMatrixB, k, j));
}
}
}
}
return;
}
void FreeMatrixStore(CMatrix* pMatrix)
{
if(pMatrix->pMatrixAddr != nullptr)
free(pMatrix->pMatrixAddr);
return;
}
思路
我对这道题目做了一些扩展,不仅能够对行(列)数在100以内的矩阵可以进行乘法,在内存允许的情况下,可以对任意(列)数的矩阵进行乘除运算。
这道题目要实现的功能大致可以分为以下五个部分:
-
结构体形式存储矩阵
A. 指向矩阵存储位置的指针
B. 矩阵行数
C. 矩阵列数 -
存储输入的矩阵
void StoreMatrix(CMatrix* pMatrix)
接收矩阵的行数、列数,然后通过malloc函数分配相应大小的存储空间,紧接着就可以接收矩阵的各个元素值。
对这一种数据结构,我还是有一些疑问的:使用二维数组来存储矩阵似乎更加接近矩阵的数据构成,不知道有无更好的方式来进行动态存储。 -
打印输出的矩阵
void PrintMatrix(CMatrix* pMatrix)
依次输出矩阵的行数,列数及矩阵内容 -
取得矩阵的元素 A i , j A_{i,j} Ai,j
int* GetElement(CMatrix* pMatrix, int RawNum, int ColumnNum)
根据行序号与列序号输出元素 -
矩阵的乘法
void MultiplyMatrix(CMatrix* pMatrixA, CMatrix* pMatrixB, CMatrix* pResultMatrix)
总结
这道题目本质上考察的其实是如何将malloc分配的一维线性数据转化成二维数组数据,需要注意的有两点:
1.在进行指针运算时,一定要预防越界情况的发生
2.free函数释放动态分配的存储时,一定要先检查指针是否确实指向动态分配的存储
最后还是要吹嘘一把的:
没有调查,就没有发言权
你对于某个问题没有调查,就停止你对于某个问题的发言权。这不太野蛮了吗?一点也不野蛮,你对那个问题的现实情况和历史情况既然没有调查,不知底里,对于那个问题的发言便一定是瞎说一顿。瞎说一顿之不能解决问题是大家明了的,那末,停止你的发言权有什么不公道呢?许多的同志都成天地闭着眼睛在那里瞎说,这是共产党员的耻辱,岂有共产党员而可以闭着眼睛瞎说一顿的吗?
要不得!要不得!注重调查!反对瞎说!
毛泽东《反对本本主义》