一、 实验目的
1.熟悉数组的结构
2.掌握矩阵的压缩存储
3.能够对数组和矩阵的压缩存储进行运算
二、 实验内容
1. 若在矩阵Am×n中存在一个元素A[i][j],其满足A[i][j]是第i行元素中最小值,且又是第j列元素中最大值,则称此元素为该矩阵的一个马鞍点。用二维数组存储矩阵Am×n ,设计算法求出矩阵中所有马鞍点。(文件夹:找马鞍点)
//找马鞍点程序代码
#include<stdio.h>
#include<malloc.h>
//数组的结构类型定义
const int m=3;
const int n=3;
typedef struct{
int A[m+1][n+1];
int max[m+1],min[n+1];
}array;
void minmax(array*);
void main()
{
array *pa =(array*)malloc(sizeof(array));
int i, j;
for (i=1;i<=m;i++)
for (j=1;j<=n;j++)
scanf("%d",&pa->A[i][j]);
minmax(pa);
}
//找马鞍点
void minmax( array * p)
{
int temp=0;
int i=0,j=0;
for(i=1;i<=m;i++)
{
temp=p->A[i][1];
for(j=1;j<=n;j++)
{
if( temp > p->A[i][j]) temp=p->A[i][j];
}
p->min[i]=temp;
}
for(j=1;j<=3;j++)
{
temp=p->A[1][j];
for(i=1;i<=3;i++)
{
if( temp < p->A[i][j] ) temp=p->A[i][j];
}
p->max[j]=temp;
}
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
if(p->max[i] == p->min[j])
printf("马鞍点是 %d \n " , p->max[i]);
}
}
2. A和B是两个n×n阶的对称矩阵,以行为主序输入对称矩阵的下三角元素,压缩存储存入一维数组A和B,编写一个算法计算对称矩阵A和B的乘积,结果存入二维数组C。(文件夹:对称矩阵相乘)
//对称矩阵相乘的程序代码
#include<stdio.h>
#include<malloc.h>
//数组结构类型的定义.h
const int n=3;
const int size=n*(n+1)/2;
typedef int datatype;
typedef struct{
datatype A[size],B[size],C[n][n];
}array;
void input(datatype[]);
void output(datatype[][n]);
void mult(array*);
int value(int a[],int i,int j);
void main()
{
array*pa;
pa=(array*)malloc(sizeof(array));
printf("以行为主序输入矩阵A的下三角:\n");
input(pa->A);//以行为主序输入矩阵A的下三角
printf("以行为主序输入矩阵B的下三角:\n");
input(pa->B);//以行为主序输入矩阵B的下三角
mult(pa);
output(pa->C);//输出矩阵C
}
//对称矩阵的输入
void input(datatype x[])
{
for(int i=0;i<size;i++)
scanf("%d",&x[i]);
}
//矩阵的输出
void output(datatype x[][n])
{
for(int i=0;i<n;i++){
for(int j=0;j<n;j++)
printf("%5d",x[i][j]);
printf("\n");
}
}
//对称矩阵相乘
void mult(array * p)
{
int i,j,k,s;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
s=0;
for( k=0 ;k<n ;k++)
s=s+value( (p->A),i,k) *value ((p->B),k,j);
p->C[i][j]=s;
}
}
int value(int a[],int i,int j)
{
if( i>= j)
return a[ (i*(i+1)) /2 +j];
else
return a[ (j*(j+1)) /2 +i];
}