数据结构实验七 多维数组和矩阵

实验七 多维数组和矩阵

1、实验目的:
(1)理解数组的特特性和二维数组的存储方式。
(2)了解各种特殊矩阵的压缩存储方法。
2、实验环境与设备:
已安装Visual Studio 2010(或其以上版本)集成开发环境的计算机。
3、实验原理:
(1)三角矩阵的压缩存储。
(2)矩阵的求和运算。
4、实验内容:
矩阵运算:根据两个4阶三角矩阵的压缩存储,计算两个矩阵相加之和,并将结果存入一个新的矩阵C中。
假设两种情况:两个上(下)三角矩阵求和;
一个上(下)三角和一个下(上)三角求和。
(1)如果是两个上(下)三角矩阵求和,依然使用压缩存储求和即可;
(2)如果是一个上(下)三角矩阵和一个下(上)三角矩阵求和,可将两矩阵复原再求和。
5、实验考核:
(1)完成纸质版实验报告
(2)提交电子版作业
6、执行结果示例如下:
在这里插入图片描述
源码

#include<stdio.h>
#include<stdlib.h>
#define M 4
#define N 4
/*
上三角矩阵;

k=(n+(n-i+1))*i/2+(j-i); (i<=j)
k=n*(n+1)/2;         (i>j)
*/
/*
下三角矩阵
k=i*(i+1)/2+j; (i>=j)
k=n*(n+1)/2;   (i<j)
*/
void input(int a[4][4])  //输入矩阵 
{
	for (int i = 0; i < 4; i++)
	{
		for (int j = 0; j < 4; j++)
		{
			scanf_s("%d", &a[i][j]);
		}
	}
}
void yasuo_xia(int z[9], int a[4][4])   //压缩下三角矩阵 
{
	for (int i = 0; i < 4; i++)
	{
		for (int j = 0; j < 4; j++)
		{
			if (i >= j)
			{
				z[i*(i + 1) / 2 + j] = a[i][j];
			}
			else
			{
				z[M*(M + 1) / 2] = a[i][j];
			}
		}
	}
}
void yasuo_shang(int z[11], int a[4][4])  //压缩上三角矩阵 
{
	for (int i = 0; i < 4; i++)
	{
		for (int j = 0; j < 4; j++)
		{
			if (i <= j)
			{
				z[(M + (M - i + 1))*i / 2 + (j - i)] = a[i][j];
			}
			else
			{
				z[M*(M + 1) / 2] = a[i][j];
			}
		}
	}
}
void array1_add(int a[11], int b[11], int c[11])   //把数组a 数组b 相加后结果放入矩阵c中 
{
	for (int i = 0; i < 11; i++)
	{
		c[i] = a[i] + b[i];
	}
}
void array2_add(int a[4][4], int b[4][4], int c[4][4]) //把矩阵a 矩阵b 相加后放入矩阵c中。 
{
	for (int i = 0; i < 4; i++)
	{
		for (int j = 0; j < 4; j++)
		{
			c[i][j] = a[i][j] + b[i][j];
		}
	}
}
void print(int a[4][4])   //打印输出矩阵 
{
	for (int i = 0; i < 4; i++)
	{
		for (int j = 0; j < 4; j++)
		{
			printf("%d\t", a[i][j]);
		}
		printf("\n");
	}
}
//打印输出压缩矩阵
void print_l(int a[11]) {
	for (int i = 0; i < 11; i++)
	{
		printf("%d  ",a[i]);
	}
	printf("\n");
}
void xia_huanyuan(int m[4][4], int n[11])  //把压缩矩阵还原为下三角矩阵
{
	for (int i = 0; i < 4; i++)
	{
		for (int j = 0; j < 4; j++)
		{
			if (i >= j)
			{
				m[i][j] = n[i*(i + 1) / 2 + j];
			}
			else
			{
				m[i][j] = n[M*(M +1) / 2];
			}
		}
	}
}
void shang_huanyuan(int m[4][4], int n[11])  //把压缩矩阵还原为上三角矩阵
{
	for (int i = 0; i < 4; i++)
	{
		for (int j = 0; j < 4; j++)
		{
			if (i <= j)
			{
				m[i][j] = n[(M + (M - i + 1))*i / 2 + (j - i)];
			}
			else
			{
				m[i][j] = n[M*(M + 1) / 2];
			}
		}
	}
}

int main()
{
	int m[4][4], n[4][4];   //两个下三角矩阵的测试 
	int p[11], q[11], k[11];	//压缩矩阵
	int l[4][4];				//还原矩阵
	printf("两个下三角矩阵的测试:\n");
	printf("第一个下三角矩阵:\n"); input(m); printf("****************\n");		//输入矩阵
	printf("第二个下三角矩阵:\n"); input(n); printf("****************\n");
	yasuo_xia(p, m); yasuo_xia(q, n);			//压缩下三角矩阵

	print_l(p);printf("****************\n");	//打印输出压缩矩阵
	print_l(q);printf("****************\n");	//打印输出压缩矩阵
	
	array1_add(p, q, k);		//压缩矩阵a 压缩矩阵b 相加后结果放入压缩矩阵c中 
	xia_huanyuan(l, k);			//把压缩矩阵还原为下三角矩阵
	print(l);					//输出还原矩阵
	printf("****************\n");
	
	//两个上三角的测试 
	printf("两个上三角的测试:\n");
	printf("第一个上三角矩阵:\n"); input(m); printf("****************\n");		//输入矩阵
	printf("第二个上三角矩阵:\n"); input(n); printf("****************\n");

	yasuo_shang(p, m); yasuo_shang(q, n);	//压缩上三角矩阵
	print_l(p);	print_l(q);		//打印输出压缩矩阵
	printf("****************\n");

	array1_add(p, q, k);		//压缩矩阵a 压缩矩阵b 相加后结果放入压缩矩阵c中 
	printf("****************\n");
	shang_huanyuan(l, k);		//把压缩矩阵还原为上三角矩阵
	print(l);					//输出还原矩阵
	printf("****************\n");

	//一上一下三角的测试 
	printf("一上一下三角的测试 :\n");
	printf("第一个三角矩阵:\n"); input(m); printf("****************\n");		//输入矩阵
	printf("第二个三角矩阵:\n"); input(n); printf("****************\n");
	//不压缩了直接求和
	array2_add(m,n,l);

	print(l);

	system("pause");
	return 0;
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

发布了15 篇原创文章 · 获赞 0 · 访问量 240

猜你喜欢

转载自blog.csdn.net/qq_44796882/article/details/105464741