实验四 数组

一、       实验目的

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];
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值