实验四 稀疏距阵的压缩存储

[实验性质]:验证性实验

[实验目的]:

1、了解数组的两种存储表示方法。

2、掌握数组在作为运行的存储结构中的地址计算方法。

3、掌握稀疏距阵的三元组存储方法。

[实验学时]:4学时

[实验内容]:编写一程序完成距阵的输入、转置、相加和相乘功能。

[实验要求]:

1、设计一功能菜单进行功能选择。

2、用三元组方法来存储稀疏距阵。

[结果测试] :测试距阵自行设计。

 



#include<stdio.h> 
#define M 20 
#define N 20 
float  A[M][N]; 
float  B[M][N]; 
float  C[M][N]; 
int i,j,m,n,p,q,k; 
float  y=1.0; 
void add(){
printf("请输入矩阵A的行数和列数(用逗号隔开):"); 
scanf("%d,%d",&i,&j); 
printf("请输入矩阵B的行数和列数(用逗号隔开):") ; 
scanf("%d,%d",&m,&n); 
if(i!=m||j!=n) 
printf("***对不起,您输入的两个矩阵不能相加,请重试.***\n"); 
else printf("请输入矩阵A:\n"); 
for(p=0;p<i;p++) {
for(q=0;q<j;q++) 
scanf("%f",&A[p][q]); 
}
printf("输出矩阵A:\n"); 
for(p=0;p<i;p++) {
for(q=0;q<j;q++) 
{  
printf("%10.2f",A[p][q]); 
if((q+1)%j==0) 
printf("\n");    

}
printf("请输入矩阵B:\n"); 
for(p=0;p<i;p++) {
for(q=0;q<j;q++) {
scanf("%f",&B[p][q]);
}
}
printf("输出矩阵B:\n"); 
for(p=0;p<i;p++) {
for(q=0;q<j;q++) 
{  
printf("%10.2f",B[p][q]); 
if((q+1)%j==0) 
printf("\n");    

}
printf("矩阵A+矩阵B为:\n");     //计算两个矩阵相加 
for(p=0;p<i;p++) {
for(q=0;q<j;q++) 
C[p][q]=A[p][q]+B[p][q]; 
}
for(p=0;p<i;p++) {
for(q=0;q<j;q++) 

printf("%10.2f",C[p][q]); 
if((q+1)%j==0) 
printf("\n"); 

}


}


void decrease(){
printf("请输入矩阵A的行数和列数(用逗号隔开):"); 
scanf("%d,%d",&i,&j); 
printf("请输入矩阵B的行数和列数(用逗号隔开):") ; 
scanf("%d,%d",&m,&n); 
if(i!=m||j!=n) 
printf("***对不起,您输入的两个矩阵不能相减,请重试.***\n"); 
else printf("请输入矩阵A:\n"); 
for(p=0;p<i;p++) 
for(q=0;q<j;q++) 
scanf("%f",&A[p][q]); 
printf("输出矩阵A:\n"); 
for(p=0;p<i;p++) 
for(q=0;q<j;q++) 
{  
printf("%10.2f",A[p][q]); 
if((q+1)%j==0) 
printf("\n");    

printf("请输入矩阵B:\n"); 
for(p=0;p<i;p++) 
for(q=0;q<j;q++) 
scanf("%f",&B[p][q]); 
printf("输出第矩阵B:\n"); 
for(p=0;p<i;p++) 
for(q=0;q<j;q++) 
{  
printf("%10.2f",B[p][q]); 
if((q+1)%j==0) 
printf("\n");    

printf("矩阵A-矩阵B为:\n");        //计算两个矩阵相减 
for(p=0;p<i;p++) 
for(q=0;q<j;q++) 
C[p][q]=A[p][q]-B[p][q]; 
for(p=0;p<i;p++) 
for(q=0;q<j;q++) 

printf("%10.2f",C[p][q]); 
if((q+1)%j==0) 
printf("\n"); 

}


void matrixMul(){
printf("请输入矩阵A的行数和列数(用逗号隔开):"); 
scanf("%d,%d",&i,&j); 
printf("请输入矩阵B的行数和列数(用逗号隔开):") ; 
scanf("%d,%d",&m,&n); 
if(j!=m) 
printf("***对不起,您输入的两个矩阵不能相乘,请重试.***\n"); 
else printf("请输入矩阵A:\n"); 
for(p=0;p<i;p++) {
for(q=0;q<j;q++) 
scanf("%f",&A[p][q]); 
}
printf("输出矩阵A:\n"); 
for(p=0;p<i;p++) {
for(q=0;q<j;q++) 
{  
printf("%10.2f",A[p][q]); 
if((q+1)%j==0) 
printf("\n");    

}
printf("请输入矩阵B:\n"); 
for(p=0;p<i;p++) {
for(q=0;q<j;q++) {
scanf("%f",&B[p][q]);
}
}
printf("输出矩阵B:\n"); 
for(p=0;p<i;p++) {
for(q=0;q<j;q++) 
{  
printf("%10.2f",B[p][q]); 
if((q+1)%j==0) 
printf("\n");    

}

printf("矩阵A*矩阵B为:\n"); //计算两个矩阵相乘
for(p = 0; p < i; ++p)  
    {
        for(q = 0; q < n; ++q)
        {
            for(k = 0; k < j; ++k)
                C[p][q] += A[p][k] * B[k][q];
        }
    }
for(p=0;p<i;p++) {
for(q=0;q<j;q++) 

printf("%10.2f",C[p][q]); 
if((q+1)%j==0) 
printf("\n"); 

}
}


void multiple(){
float k; 
printf("请输入矩阵A的行数和列数(用逗号隔开):"); 
scanf("%d,%d",&i,&j); 
printf("请输入矩阵A\n"); 
for(p=0;p<i;p++) 
for(q=0;q<j;q++) 
scanf("%f",&A[p][q]); 
printf("输出矩阵A\n"); 
for(p=0;p<i;p++) 
for(q=0;q<j;q++) 
{  
printf("%10.2f",A[p][q]); 
if((q+1)%j==0) 
printf("\n");    
}   
printf("请输入一个实数:\n"); 
scanf("%f",&k); 
for(p=0;p<i;p++)                       //数乘矩阵 

for(q=0;q<j;q++) 
B[p][q]=k*A[p][q]; 
printf("输出k乘矩阵A的结果\n"); 
for(p=0;p<i;p++) 
for(q=0;q<j;q++) 
{  
printf("%10.2f",B[p][q]); 
if((q+1)%j==0) 
printf("\n");    

}


void transpose(){
printf("请输入矩阵A的行数和列数(用逗号隔开):"); 
scanf("%d,%d",&i,&j); 
printf("请输入矩阵A:\n"); 
for(p=0;p<i;p++) 
for(q=0;q<j;q++) 
scanf("%f",&A[p][q]); 
printf("输出矩阵A\n"); 
for(p=0;p<i;p++) 
for(q=0;q<j;q++) 
{  
printf("%10.2f",A[p][q]); 
if((q+1)%j==0) 
printf("\n");    

for(p=0;p<i;p++)                    //转置 
for(q=0;q<j;q++) 
B[q][p]=A[p][q]; 
printf("输出矩阵A的转置矩阵:\n"); 
for(p=0;p<j;p++) 
for(q=0;q<i;q++) 
{  
printf("%10.2f",B[p][q]); 
if((q+1)%i==0) 
printf("\n"); 

}


void inverse(){
float a[M][2*M];  
float b[N][2*N];  
float t,x;  
int k,T;  
printf("输入方阵的维数:\n");     //请输入方阵,即行和列相等的矩阵。 
scanf("%d",&T); 
printf("请输入矩阵:\n"); 
for(i=0;i<T;i++)  
for (j=0;j<T;j++)  
scanf("%f",&b[i][j]);  
printf("原矩阵为:\n");  
for (i=0;i<T;i++)  
{  
for (j=0;j<T;j++)    
printf("%10.3f",b[i][j]);  
printf("\n");  

for(i=0;i<T;i++)  
for(j=0;j<(2*T);j++)  
{ if (j<T)   
a[i][j]=b[i][j];  
else if (j==T+i)   
a[i][j]=1.0;  
else  
a[i][j]=0.0;  

for(i=0;i<T;i++) 

for(k=0;k<T;k++) 

if(k!=i) 

t=a[k][i]/a[i][i]; 
for(j=0;j<(2*T);j++) 

x=a[i][j]*t; 
a[k][j]=a[k][j]-x; 




for(i=0;i<T;i++) 

t=a[i][i]; 
for(j=0;j<(2*T);j++) 
a[i][j]=a[i][j]/t; 


for(i=0;i<T;i++)  
y=y*a[i][i]; 
if(y==0) 
printf("对不起,您输入的矩阵没有逆矩阵,请重新输入。\n"); 
else    

for(i=0;i<T;i++)  
for(j=0;j<T;j++) 
b[i][j]=a[i][j+T]; 
printf("逆矩阵为:\n");  
for (i=0;i<T;i++)  
{  
for (j=0;j<T;j++)    
printf("%10.3f",b[i][j]);  
printf("\n");  
}  
}
}


void main() 

printf("           ###########################################\n"); 
printf("           #####   欢迎您使用矩阵函数包系统。   ######\n"); 
printf("           #####   系统功能:                    ######\n"); 
printf("           #####      计算两个矩阵相加,相减;    ######\n"); 
printf("           #####      数乘矩阵;矩阵转置;求逆   ######\n"); 
printf("           #####      矩阵                      ######\n"); 
printf("           ###########################################\n"); 
printf("请选择您需要的运算,按回车键结束\n"); 
printf("******************************************************************\n"); 
printf("1,矩阵相加\n"); 
printf("2,矩阵相减\n"); 
printf("3,数乘矩阵\n");
printf("4,矩阵相乘\n"); 
printf("5,矩阵转置\n"); 
printf("6,逆矩阵  \n"); 
printf("7,退出    \n"); 
printf("******************************************************************\n"); 
int x; 
scanf("%d",&x); 
switch (x) 

case 1: 

add();

};break;  
case 2: 

decrease();
};break;  
case 3: 


multiple();
};break; 
case 4: 


matrixMul();
};break;  
case 5: 


transpose();

;break;  
case 6: 
{
   inverse();
};break;  
case 7:;break; 
    default: 
printf("\n********您选择错误,请重试.********\n"); 
break; 

printf("#########再次感谢您使用本系统,合作愉快!############"); 
printf("\n"); 
printf("******************************************************************\n"); 
 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值