实验内容及要求:
已知两个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 << " ";
}
}
}