[实验性质]:验证性实验
[实验目的]:
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");
}