C4GPLT_L1-048_矩阵A乘以B

文章目录


代码

#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函数释放动态分配的存储时,一定要先检查指针是否确实指向动态分配的存储

最后还是要吹嘘一把的:

没有调查,就没有发言权
你对于某个问题没有调查,就停止你对于某个问题的发言权。这不太野蛮了吗?一点也不野蛮,你对那个问题的现实情况和历史情况既然没有调查,不知底里,对于那个问题的发言便一定是瞎说一顿。瞎说一顿之不能解决问题是大家明了的,那末,停止你的发言权有什么不公道呢?许多的同志都成天地闭着眼睛在那里瞎说,这是共产党员的耻辱,岂有共产党员而可以闭着眼睛瞎说一顿的吗?
要不得!要不得!注重调查!反对瞎说!
毛泽东《反对本本主义》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值