数据结构实验一 —— 矩阵相乘算法

数据结构实验一 —— 矩阵相乘算法

实验名称

矩阵相乘算法

实验内容

实现两个矩阵的相乘算法。

实验要求

  1. 输入要求:矩阵大小阶数及元素值可以在程序中固定。但最好不固定矩阵形式,从键盘输入矩阵阶数以及元素值。
  2. 输出要求:在屏幕上显示矩阵相乘的结果。
  3. 严格按照要求的文件命名方式进行命名,如个人文档命名:实验1-班级-学号-名字.doc。
    当然,我们为了让用户更加便捷,我们增加了图片拖拽功能。

问题描述

使用C语言编写代码实现两个矩阵的相乘算法,并将结果输出。

算法描述

在这里插入图片描述

代码

#define true 1
#define false 0
#include <malloc.h>
#include <stdio.h>

int IsAvailable(int line[], int column[]);                                                                     //判断两个矩阵是否可相乘
void input(double *matrix, int line, int column);                                                              //输入矩阵
void output(double *matrix1, int line1, int column1, double *matrix2, int line2, int column2, double *matrix); //输出矩阵
int main()
{
    int line[2], column[2];
    do
    {
        printf("请输入矩阵A的行数和列数,输入完成后请换行以录入系统。\n");
        scanf("%d%d", &line[0], &column[0]);
        double *matrix1 = (double *)malloc(line[0] * column[0] * sizeof(double)); //利用一维数组模拟二维数组
        printf("请输入矩阵A的元素,每行的元素以空格隔开,输入完每行数据后换行输入下一行\n");
        input(matrix1, line[0], column[0]);
        printf("请输入矩阵B的行数和列数,输入完成后请换行以录入系统。\n");
        scanf("%d%d", &line[1], &column[1]);
        double *matrix2 = (double *)malloc(line[1] * column[1] * sizeof(double)); //利用一维数组模拟二维数组
        printf("请输入矩阵B的元素,每行的元素以空格隔开,输入完每行数据后换行输入下一行\n");
        input(matrix2, line[1], column[1]);
        if (IsAvailable(line, column) == false)
        {
            free(matrix1);
            free(matrix2);
            continue;
        }

        double *matrix = (double *)malloc(line[0] * column[1] * sizeof(double)); //矩阵乘积行数和矩阵A相同,列数和矩阵B相同
        output(matrix1, line[0], column[0], matrix2, line[1], column[1], matrix);
        free(matrix1);
        free(matrix2);
        free(matrix);
        system("pause");
        return 0;
    } while (1);
}


int IsAvailable(int line[], int column[])
{
    if (column[0] != line[1])
    {
        printf("矩阵A的列数不等于矩阵B的行数,无法进行相乘,请按任意键重新输入!\n");
        system("pause");
        return false;
    }
    else
        return true;
}
void input(double *matrix, int line, int column)  
{
    for (int i = 0; i < line; ++i)
    {
        for (int j = 0; j < column; ++j)
        {
            scanf("%lf", &matrix[i * column + j]);
        }
    }
}
void output(double *matrix1, int line1, int column1, double *matrix2, int line2, int column2, double *matrix)  
{
    int line = line1;
    int column = column2;
    printf("矩阵A*矩阵B=\n");
    for (int i = 0; i < line; ++i)
    {
        for (int j = 0; j < column; ++j)
        {
            matrix[i * column + j] = 0;
            for (int k = 0; k < column1; ++k)
            {
                matrix[i * column + j] += matrix1[i * column1 + k] * matrix2[k * column2 + j];
            }
            printf("%lf ", matrix[i * column + j]);
        }
        printf("\n");
    }
    printf("程序执行完毕。\n");
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值