数据结构实验--二维数组与矩阵压缩

  • 实验要求:

矩阵运算:根据两个4阶三角矩阵的压缩存储,计算两个矩阵相加之和,并将结果存入一个新的矩阵C中。

假设两种情况:两个(上)下三角矩阵求和

              一个上(下)三角和一个下(上)三角求和

如果是两个上(下)三角矩阵求和,依然使用压缩存储求和即可。

如果是一个上(下)三角矩阵和一个下(上)三角矩阵求和,可将两矩阵复原再求和

  • 实例:

实验代码

#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("%d",&a[i][j]);
		}
	}
}
void yasuo_xia(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[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 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];   //两个下三角矩阵的测试 
	input(m);
	printf("****************\n");
	int n[4][4];
	input(n);
	printf("****************\n");
	int p[11],q[11];
	yasuo_xia(p,m);
	yasuo_xia(q,n);
	int  k[11];
	array1_add(p,q,k);
	int l[4][4];
                xia_huanyuan(l,k); 
	print(l);
	printf("****************\n");
	printf("\n");
	printf("\n");
	printf("\n"); 
	int f[4][4],g[4][4],j[11],x[11]; //一个下三角与一个上三角的测试 
	input(f);
	printf("****************\n");
	input(g);
	printf("****************\n");
	yasuo_shang(j,f);
	yasuo_shang(x,g);
	int y[4][4],z[4][4],s[4][4];
	shang_huanyuan(y,j);
	shang_huanyuan(z,x);
	array2_add(y,z,s);
	print(s);
	printf("****************\n");
	return 0;
}

实验截图:

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值