#include
#include
#define N 2000
#define maxsize 2000
int system(const char *string);
typedef struct
{
int row;
int col;
int data;
}triple;
typedef struct
{
triple data[maxsize];
int m,n,len;
}matrix;
typedef struct
{
int row;
int col;
float data;
}triple_f;
typedef struct
{
triple_f data[maxsize];
int m,n,len;
}matrix_f;
matrix_f Init_f()
{
int i=0;
matrix_f *A;
A=(matrix_f)malloc(sizeof(matrix_f));
A->len=0;
A->m=0;
A->n=0;
for(i=0;i {
A->data[i].col=0;
A->data[i].row=0;
A->data[i].data=0;
}
return A;
}
matrix Init()
{
int j=0;
matrix *A;
A=(matrix)malloc(sizeof(matrix));
A->len=0;
A->m=0;
A->n=0;
for(j=0;j {
A->data[j].col=0;
A->data[j].row=0;
A->data[j].data=0;
}
return A;
}
void creat(matrix **A)
{
int x,y;
int i;
printf("请输入矩阵的行数,列数,非零元素的个数\n:");
scanf("%d%d%d",&(*A)->m,&(*A)->n,&(*A)->len);
printf("\n");
for(i=0;i<(*A)->len;i++)
{
printf("请输入第%d个非零元素的行: 列: 值:",i+1);
scanf("%d",&x);
(*A)->data[i].row=(x-1);
scanf("%d",&y);
(*A)->data[i].col=(y-1);
scanf("%d",&(*A)->data[i].data);
}
}
int value(matrix *a,int i,int j) //矩阵相乘时 取出一行或一列
{
int k=0;
while(k<(a->len)&&(a->data[k].row!=i||a->data[k].col!=j))
k++;
if(klen)
return a->data[k].data;
else
return 0;
}
void arr(matrix *a,matrix *b,matrix **c)
{
int i=0,j=0,k=0,p=0;
int tem;
if(a->m!=b->n)
{
printf("您输入的两个矩阵不满足相乘条件!");
system("pause");
exit(0);
}
for(i=0;in;i++)
{
for(j=0;jm;j++)
{
tem=0;
for(k=0;km;k++)
{
tem=tem+value(a,i,k)*value(b,k,j);
}
if(tem!=0)
{
(*c)->data[p].row=i;
(*c)->data[p].col=j;
(*c)->data[p].data=tem;
p++;
}
}
(*c)->n=a->n;
(*c)->m=a->m;
(*c)->len=p;
}
}
void add(matrix a,matrix *b,matrix **c)
{
if(a->m==b->m&&a->n==b->n)
{
int i=0,j=0,k=0;
(*c)->m=a->m;
(*c)->n=a->n;
while(ilen||jlen)
{
if(i==a->len&&jlen)
{
(*c)->data[k].col=b->data[j].col;
(*c)->data[k].row=b->data[j].row;
(*c)->data[k++].data=b->data[j].data;
(*c)->len++;
j++;
}
else if(ilen&&j==b->len)
{
(*c)->data[k].col=a->data[i].col;
(*c)->data[k].row=a->data[i].row;
(*c)->data[k++].data=a->data[i].data;
(*c)->len++;
i++;
}
else
{
if(a->data[i].row>b->data[j].row)
{
(*c)->data[k].col=b->data[j].col;
(*c)->data[k].row=b->data[j].row;
(*c)->data[k++].data=b->data[j].data;
(*c)->len++;
j++;
}
else if(a->data[i].rowdata[j].row)
{
(*c)->data[k].col=a->data[i].col;
(*c)->data[k].row=a->data[i].row;
(*c)->data[k++].data=a->data[i].data;
(*c)->len++;
i++;
}
else
{
if(a->data[i].col==b->data[j].col)
{
if(a->data[i].data+b->data[j].data!=0)
{
(*c)->data[k].col=a->data[i].col;
(*c)->data[k].row=a->data[i].row;
(*c)->data[k++].data=a->data[i].data+b->data[j].data;
(*c)->len++;
}
i++;
j++;
}
else if(a->data[i].col>b->data[j].col)
{
(*c)->data[k].col=b->data[j].col;
(*c)->data[k].row=b->data[j].row;
(*c)->data[k++].data=b->data[j].data;
(*c)->len++;
j++;
}
else if(a->data[i].coldata[j].col)
{
(*c)->data[k].col=a->data[i].col;
(*c)->data[k].row=a->data[i].row;
(*c)->data[k++].data=a->data[i].data;
(*c)->len++;
i++;
}
}
}
}
}
else
{
printf("您输入的两个矩阵不满足运算条件!\n");
system("pause");
}
}
int js(int s[][N],int n)
{
int z,j,k,r,total=0;
int b[N][N]; //b[N][N]用于存放,在矩阵s[N][N]中元素s[0]的余子式
if(n>2)
{
for(z=0;z {
for(j=0;j for(k=0;k if(k>=z)
b[j][k]=s[j+1][k+1];
else
b[j][k]=s[j+1][k];
if(z%2==0)
r=s[0][z]*js(b,n-1); //递归调用
else
r=(-1)*s[0][z]*js(b,n-1);
total=total+r;
}
}
else
if(n==2)
total=s[0][0]*s[1][1]-s[0][1]*s[1][0];
return(total);
}
void n_1(int s[][N],float b[][N],int n)
{
int z,j,k,l,m,g,a[N][N];
for(z=0;z {
l=z;
for(j=0;j {
m=j;
for (k=0;k for(g=0;g {
if(g>=m&&k a[k][g]=s[k][g+1];
else
if(k>=l&&g a[k][g]=s[k+1][g];
else
if(k>=l&&g>=m)
a[k][g]=s[k+1][g+1];
else
a[k][g]=s[k][g];
}
b[z][j]=js(a,n-1);
}
}
}
void qiuni(int s[][N],float b[][N],int n)
{
int a[N][N];
int r,z,j;
float temp;
scanf("%d",&n);
printf("Input original data:\n");
for(z=0;z<n;z++)
for(j=0;j<n;j++)
scanf("%d",&a[z][j]);
printf("\nPress Enter continue......");
getchar();
printf("The original matrix is:\n");
for(z=0;z<n;z++)
{
for(j=0;j<n;j++)
printf("%5d",a[z][j]);
printf("\n");
}
r=js(a,n);
printf("\nThe original matrix 行列式 is:|A|==%d\n",r);
if (r==0)
printf("Because |A|==0,the original matrix have no 逆矩阵!");
else
{
n_1(a,b,n);
for(z=0;z<n;z++)
for(j=0;j<n;j++)
if((z+j)%2!=0 && b[z][j]!=0)
b[z][j]=-b[z][j];
for(z=0;z<n;z++)
for(j=z+2;j<n;j++)
{
temp=b[z][j];
b[z][j]=b[j][z];
b[j][z]=temp;
}
printf("Because |A|!=0,the original matrix have 逆矩阵!\n");
printf("The 伴随矩阵 A is:\n");
for(z=0;z<n;z++)
{
for(j=0;j<n;j++)
printf("%4.0f\t",b[z][j]);
printf("\n");
}
for(z=0;z<n;z++)
for(j=0;j<n;j++)
b[z][j]=b[z][j]/r;
printf("\nThe 逆矩阵 is:(A*)/|A|(|A|=%d)\n",r);
for(z=0;z<n;z++)
{
for(j=0;j<n;j++)
printf("%8.3f",b[z][j]);
printf("\n");
}
}
}
void print_role()
{
printf("/************************************************/\n");
printf("/*** 1:输入矩阵A /\n");
printf("/ 2:输入矩阵B /\n");
printf("/ 4:矩阵A+B /\n");
printf("/ 6:矩阵A*B /\n");
printf("/ 7:矩阵A求逆 /\n");
printf("/*********************************************/\n");
}
int main()
{
int n;
matrix *A;
matrix *B;
matrix *C;
A=Init();
B=Init();
C=Init();
print_role();
scanf("%d",&n);
switch(n)
{
case 1:
{
printf("输入矩阵A:\n");
creat(&A);
break;
}
case 2:
{
printf("输入矩阵B: \n");
creat(&B);
break;
}
case 4:
{
printf("A+B: \n");
add(A,B,&C);
break;
}
case 6:
{
printf("A*B: \n");
arr(A,B,&C);
break;
}
case 7:
{
printf("A逆:\n");
qiuni(A,B,C);
break;
}
}
return 0;
}
代码不完整,有好几处这样的代码