求达人指教
我这个程序是实现矩阵运算AX=B,求出X,帮我看看错在哪里程序代码:
#include <stdio.h> #include<math.h> #include <malloc.h> float jisuanD(float *p,short int n); //求矩阵的行列式 float jisuanM(float *p, short int m,short int n,short int k); //求代数余子式 float jieguo(float *p,short int n,float *q,short int m); void print( float *p,short int n); //打印n×n的矩阵 void main( void ) { float *buffer,*p,*q,*buffer1; //定义数组首地址指针变量 short int row,num; //定义矩阵行数row及矩阵元素个数 short int i,j,n,m; float determ,deter1; //定义矩阵的行列式 printf("\nPlease input the number of rows: "); scanf("%d",&row); num=2 * row * row; buffer = (float *)calloc(num, sizeof(float)); //分配内存单元 p=buffer; if(p != NULL) { for(i=0;i<row;i++) //输入各单元值 { printf("Input the number of %d row ",i+1); for(j=0;j<row;j++) { scanf("%f",p++); } } } else printf( "Can't allocate memory\n" ); printf("\nThe original matrix is:\n"); print(buffer,row); //打印该矩阵 determ=jisuanD(buffer,row); //求矩阵的行列式 p=buffer + row * row; if (determ != 0) { for (i=0;i<row; i++) //求逆矩阵 for (j=0; j<row; j++) *(p+j*row+i)=jisuanM(buffer,i,j,row)/determ; printf("The determinant is %G\n",determ); p=buffer + row * row; printf("\nThe inverse matrix is:\n"); print(p,row); //打印该矩阵 } else printf("The determnant is 0, and there is no inverse matrix !\n"); printf("\nPlease input the number of rows: "); scanf("%d",&row); num=2 * row * row; buffer1 = (float *)calloc(num, sizeof(float)); //分配内存单元 q=buffer1; if(q!= NULL) { for(i=0;i<row;i++) //输入各单元值 { printf("Input the number of %d row ",i+1); for(j=0;j<row;j++) { scanf("%f",q++); } } } else printf( "Can't allocate memory\n" ); printf("\nThe original matrix is:\n"); q=buffer1 + row * row; print(buffer1,row); //打印该矩阵 deter1=jieguo(buffer,n,buffer1, m); print(buffer1,row); free( buffer ); free(buffer1); } //功能:求矩阵 n X n 的行列式 //入口参数:矩阵首地址 p;矩阵行数 n //返回值:矩阵的行列式值 float jisuanD(float *p,short int n) { short int i,j,m; //i--row; j--column short int lop=0; float result=0; float mid=1; if (n!=1) { lop=(n==2)?1:n; //控制求和循环次数,若为2阶,则循环1次,否则为n次 for(m=0;m<lop;m++) { mid=1; //顺序求和 for(i=0,j=m;i<n;i++,j++) mid=mid*(*(p+i*n+j%n) ); result+=mid; } for(m=0;m<lop;m++) { mid=1; //逆序相减 for(i=0,j=n-1-m+n; i<n; i++,j--) mid=mid*(*(p+i*n+j%n)); //算该元素的相对位置公式为:i*m+j (i,j=0,1,2, ...) result-=mid; } } else result=*p; return(result); } //功能:求k×k矩阵中元素A(mn)的代数余子式 //入口参数:k×k矩阵首地址;元素A的下标m,n; 矩阵行数 k //返回值: k×k矩阵中元素A(mn)的代数余子式 float jisuanM(float *p, short int m,short int n,short int k) { short int len; short int i,j; float mid_result=0; short int quo=1; float *p_jisuan,*p_mid; len=(k-1)*(k-1); p_jisuan = (float *)calloc(len, sizeof(float)); //分配内存单元 p_mid=p_jisuan; for(i=0;i<k;i++) for(j=0;j<k;j++) { if (i!=m && j!=n) *p_mid++ =* (p+i*k+j); } // print(p_jisuan,k-1); quo = (m + n) %2==0 ? 1:-1; mid_result = (float ) quo * jisuanD(p_jisuan,k-1); free(p_jisuan); return(mid_result); } //功能:求逆矩阵a与矩阵b的乘积 //入口参数:矩阵首地址 p,q;矩阵行数 n,m //返回值:矩阵行列式 float jieguo(float *p,short int n,float *q,short int m) { short int i,j,le,z; float *c,e,d; float a[100][100],b[100][100]; c=(float *)calloc(le,sizeof(float)); z=n>m?n:m; for(i=0;i<z;i++) { for(j=0;j<z;j++) { a[i][j]=*(p+i*z+j); b[i][j]=*(q+i*z+j); } } for(i=0;i<z;i++) { for(j=0;j<z;j++) { d=a[i][j]*b[j][i]; e=e+d; *(c+i*z+j)=e; } } return (*c); } //功能:打印n×n的矩阵 //入口参数:n×n矩阵的首地址;该矩阵的行数 n //返回值: 无 void print( float *p,short int n) { int i,j; for (i=0;i<n;i++) { for (j=0; j<n;j++) printf("%10G ",*p++); printf("\n"); } printf("--------------\n"); }