數據結構實驗--二維數組與矩陣壓縮

  • 實驗要求:

矩陣運算:根據兩個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;
}

實驗截圖:

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章