求达人指教
我这个程序是实现矩阵运算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");
}






