西南交大_数据结构实验:基于压缩存储的半三角矩阵乘法运算的实现

实验内容及要求:

已知两个n阶下半三角矩阵的乘积仍为n阶下半三角矩阵。编程输入两个n阶下半三角矩阵,输出这两个矩阵的乘积。要求n阶下半三角矩阵采用一维数组压缩存储(即只存储下半三角)。

程序先从键盘(或字符文件)输入n值,建立三个矩阵的一维数组动态存储结构,然后从键盘(或字符文件)输入两个半三角矩阵,最后输出计算结果到屏幕上(或另一个字符文件中)。

例如:键盘输入为:

3

1

2 3

4 5 6

-1

-2 -3

-4 -5 -6

则输出为:

-1

-8   -9

-38 -45 -36

实验目的:掌握半三角矩阵的顺序存储结构。

算法设计思路:

编程语言说明:

使用Visual Studio 2022编程。主要代码采用C++实现 ;动态存储分配采用C++的new和delete操作符实现;输入与输出采用C++的cin和cout流;程序注释采用C/C++规范。

主要函数说明:

void minput(int n,int *m1, int* m2);//输入下三角矩阵

void mult(int n, int* m1, int* m2,int *m3);//计算矩阵乘积

void mprint(int n, int* m3);//打印矩阵乘积

程序测试简要报告:

测试1:

代码

#include <iostream>
#define OK true
#define ERROR false
#define N 10

using namespace std;
void minput(int n,int *m1, int* m2);//输入下三角矩阵
void mult(int n, int* m1, int* m2,int *m3);//计算矩阵乘积
void mprint(int n, int* m3);//打印矩阵乘积

static int num[N] = { 1,2,3,4,5,6,7,8,9,10 };
int main()
{
	int n=0;//行数
	int * m1, * m2,*m3;
	cout << "请输入行数" << endl;
	cin >> n;
	int m = ((n + 1) * n) / 2;//下三角元素数目

    m1 = new int[m]{0,0};
	m2 = new int[m]{0,0};
	m3 = new int[m]{0,0};
	if (!m1 || !m2|| !m3)
	{
		exit(0);
	}

	minput(m, m1, m2);
	mult(n,m1,m2,m3);
	mprint(m, m3);

	delete []m1;
	delete []m2;
	return 0;
}
void minput(int n, int* m1, int* m2)//输入下三角矩阵
{
	int i = 0;
	int* k1, * k2;
	k1 = m1; k2 = m2;
	for (i=0; i < n; i++)
	{
		cin >> *k1;
		//cout << *k1 << endl;
		k1++;
	}
	for (i = 0; i < n; i++)
	{
		cin >> *k2;
       // cout << *k2 << endl;
		k2++;
	}

}
void mult(int n, int* m1, int* m2,int *m3)//计算矩阵乘积
{
	int i = 0, m = 0, j = 0;
	int sum = 0;
	for (i = 0; i < n; i++)
	{
		for (j=0;j<=i;j++)
		{
			for (int k =j; k<=i; k++)
			{
				sum += m1[i * (i + 1) / 2 + k] * m2[k * (k + 1) / 2 + j];
				m3[m] = sum;

			}
            sum = 0;
			m++;
		}
	}
}
void mprint(int n, int* m3)//打印矩阵乘积
{
	int i = 0,count=0,j=0;
	cout << "矩阵乘积为:" << endl;
	cout.width(5);
	cout.setf(ios::left);
	for (i = 0; i < n; i++)
	{
		cout << m3[i];
		count++;
		if (count == num[j])
		{
			cout << endl;
			j++;
			count = 0;
		}
		else
		{
			cout << " ";
		}
	}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

guts350

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值