实验七 多维数组和矩阵
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;
}