高分求助C语言高手,在线等
#include<stdio.h>voidmain(){floatb[10][10],z,zhongjie;inti,j,k,n,l,h,fu;printf("您要计算几...
#include<stdio.h>
void main()
{
float b[10][10],z,zhongjie;
int i,j,k,n,l,h,fu;
printf("您要计算几阶方阵?");
scanf("%d",&n);
printf("请按行输入每个元素的值!");
for(i=1;i<=n;i++) //给行列式的每个元素赋值//
{
for(j=1;j<=n;j++)
{
printf("请输入a%d,%d ",i,j);
scanf("%f",&b[i][j]);
printf("%f ",b[i][j]);
printf("\n");
}
}
printf("原行列式是\n"); //输出原行列式//
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
printf("%f ",b[i][j]);
printf("\n");
}
printf("\n");
printf("\n");
k=1;
i=2;
z=1;
i=2;
fu=0;
l=1;
fuck: for( ;l<n;l++)
{
fuck2: for( ;i<=n;i++)
{
for(j=1;j<=n;j++) //用第k行第k个元素将k~n行第k个元素消为0//
{
if(!(b[k][k]==0)) //如果第k行第k个元素不为0,则能后面行的第k个元素消为0//
b[i][j]=b[i][j]-b[k][j]*(b[i][k]/b[k][k]);
else
{
h=k; //如果第k行第k个元素为0,则后面行的第k个元素不能消为0,这就需要将第k个元素不为0的第h行与第k行对调//
for( ;h<=n;h++)
if(!(b[h][j]==0))
{
for(j=1;j<=n;j++)
{
zhongjie=b[k][j]; b[k][j]=b[h][j]; b[h][j]=zhongjie; //第k行与第h行对应元素相互对调
}
fu++; //fu 是用来判断行与行的对调次数
goto fuck2;
}
else
h++; goto fuck2;
if(h==n+1)
k++; i++; l++; goto fuck;
}
}
}
k++;
}
for(i=1;i<=n;i++) //输出变换后的上三角阵
{
for(j=1;j<=n;j++)
printf("%f ",b[i][j]);
printf("\n");
}
for(i=1;i<=n;i++) //将化简后的上三角阵对角相乘
z=z*b[i][i];
if(fu%2==0) //如果上面的换行次数(fu)为偶数,则z就是行列式的值
printf("行列式的值是%f\n",z);
else //如果fu是奇数 ,则-Z是行列式的值
printf("行列式的值是-%f\n",z);
}
我的思路是将行列式化成上三角镇然后对角求积,但我的程序只能将第2排~n排的1列元素全部消为0,不知道程序错在哪里?? 展开
void main()
{
float b[10][10],z,zhongjie;
int i,j,k,n,l,h,fu;
printf("您要计算几阶方阵?");
scanf("%d",&n);
printf("请按行输入每个元素的值!");
for(i=1;i<=n;i++) //给行列式的每个元素赋值//
{
for(j=1;j<=n;j++)
{
printf("请输入a%d,%d ",i,j);
scanf("%f",&b[i][j]);
printf("%f ",b[i][j]);
printf("\n");
}
}
printf("原行列式是\n"); //输出原行列式//
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
printf("%f ",b[i][j]);
printf("\n");
}
printf("\n");
printf("\n");
k=1;
i=2;
z=1;
i=2;
fu=0;
l=1;
fuck: for( ;l<n;l++)
{
fuck2: for( ;i<=n;i++)
{
for(j=1;j<=n;j++) //用第k行第k个元素将k~n行第k个元素消为0//
{
if(!(b[k][k]==0)) //如果第k行第k个元素不为0,则能后面行的第k个元素消为0//
b[i][j]=b[i][j]-b[k][j]*(b[i][k]/b[k][k]);
else
{
h=k; //如果第k行第k个元素为0,则后面行的第k个元素不能消为0,这就需要将第k个元素不为0的第h行与第k行对调//
for( ;h<=n;h++)
if(!(b[h][j]==0))
{
for(j=1;j<=n;j++)
{
zhongjie=b[k][j]; b[k][j]=b[h][j]; b[h][j]=zhongjie; //第k行与第h行对应元素相互对调
}
fu++; //fu 是用来判断行与行的对调次数
goto fuck2;
}
else
h++; goto fuck2;
if(h==n+1)
k++; i++; l++; goto fuck;
}
}
}
k++;
}
for(i=1;i<=n;i++) //输出变换后的上三角阵
{
for(j=1;j<=n;j++)
printf("%f ",b[i][j]);
printf("\n");
}
for(i=1;i<=n;i++) //将化简后的上三角阵对角相乘
z=z*b[i][i];
if(fu%2==0) //如果上面的换行次数(fu)为偶数,则z就是行列式的值
printf("行列式的值是%f\n",z);
else //如果fu是奇数 ,则-Z是行列式的值
printf("行列式的值是-%f\n",z);
}
我的思路是将行列式化成上三角镇然后对角求积,但我的程序只能将第2排~n排的1列元素全部消为0,不知道程序错在哪里?? 展开
展开全部
你好像不太习惯用数组b[10][10]里边b[n][0],b[0][n]都不用的,不知道问题是不是出在这儿。
我改了一下 ,把数组改过来,去掉了goto语句 只能计算中间没出0的行列式。个人水平有限,也只能到这种程度。遇到b[k][k]=0时候就会出错答案。
另外你的Z有问题,如果z本身是负的,就会出现比如3.8 输出为--3.8的情况。
呵呵 可能没帮多大忙 加油吧。
#include<stdio.h>
void main()
{
float b[10][10],z=1,zhongjie;
int i,j,k=0,n,l,h,fu=1;
printf("您要计算几阶方阵?");
scanf("%d",&n);
printf("请按行输入每个元素的值!");
for(i=0;i<n;i++) //给行列式的每个元素赋值//
{
for(j=0;j<n;j++)
{
printf("请输入a%d,%d ",i+1,j+1);
scanf("%f",&b[i][j]);
printf("%f ",b[i][j]);
printf("\n");
}
}
printf("原行列式是\n"); //输出原行列式//
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
printf("%f ",b[i][j]);
printf("\n");
}
printf("\n");
printf("\n");
for(l=0;l<n;l++)
{
if(b[k][k]!=0)
{
for(i=k+1;i<n;i++)
{
//如果第k行第k个元素不为0,则能后面行的第k个元素消为0//
for(j=0;j<n;j++) //用第k行第k个元素将k~n行第k个元素消为0//
{
b[i][j]=b[i][j]-b[k][j]*(b[i][k]/b[k][k]);
}
}
k++;
}
else
{ //如果第k行第k个元素为0,则后面行的第k个元素不能消为0,这就需要将第k个元素不为0的第h行与第k行对调//
for(h=k;h<=n;h++)
{
if((b[h][j]!=0))
{
for(j=0;j<n;j++)
{
zhongjie=b[k][j]; b[k][j]=b[h][j]; b[h][j]=zhongjie; //第k行与第h行对应元素相互对调
}
fu++;
i--;
break; //fu 是用来判断行与行的对调次数
}
}
}
}
for(i=0;i<n;i++) //输出变换后的上三角阵
{
for(j=0;j<n;j++)
printf("%f ",b[i][j]);
printf("\n");
}
for(i=0;i<n;i++) //将化简后的上三角阵对角相乘
z=z*b[i][i];
if(fu%2==0) //如果上面的换行次数(fu)为偶数,则z就是行列式的值
printf("行列式的值是%f\n",z);
else //如果fu是奇数 ,则-Z是行列式的值
printf("行列式的值是-%f\n",z);
}
我改了一下 ,把数组改过来,去掉了goto语句 只能计算中间没出0的行列式。个人水平有限,也只能到这种程度。遇到b[k][k]=0时候就会出错答案。
另外你的Z有问题,如果z本身是负的,就会出现比如3.8 输出为--3.8的情况。
呵呵 可能没帮多大忙 加油吧。
#include<stdio.h>
void main()
{
float b[10][10],z=1,zhongjie;
int i,j,k=0,n,l,h,fu=1;
printf("您要计算几阶方阵?");
scanf("%d",&n);
printf("请按行输入每个元素的值!");
for(i=0;i<n;i++) //给行列式的每个元素赋值//
{
for(j=0;j<n;j++)
{
printf("请输入a%d,%d ",i+1,j+1);
scanf("%f",&b[i][j]);
printf("%f ",b[i][j]);
printf("\n");
}
}
printf("原行列式是\n"); //输出原行列式//
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
printf("%f ",b[i][j]);
printf("\n");
}
printf("\n");
printf("\n");
for(l=0;l<n;l++)
{
if(b[k][k]!=0)
{
for(i=k+1;i<n;i++)
{
//如果第k行第k个元素不为0,则能后面行的第k个元素消为0//
for(j=0;j<n;j++) //用第k行第k个元素将k~n行第k个元素消为0//
{
b[i][j]=b[i][j]-b[k][j]*(b[i][k]/b[k][k]);
}
}
k++;
}
else
{ //如果第k行第k个元素为0,则后面行的第k个元素不能消为0,这就需要将第k个元素不为0的第h行与第k行对调//
for(h=k;h<=n;h++)
{
if((b[h][j]!=0))
{
for(j=0;j<n;j++)
{
zhongjie=b[k][j]; b[k][j]=b[h][j]; b[h][j]=zhongjie; //第k行与第h行对应元素相互对调
}
fu++;
i--;
break; //fu 是用来判断行与行的对调次数
}
}
}
}
for(i=0;i<n;i++) //输出变换后的上三角阵
{
for(j=0;j<n;j++)
printf("%f ",b[i][j]);
printf("\n");
}
for(i=0;i<n;i++) //将化简后的上三角阵对角相乘
z=z*b[i][i];
if(fu%2==0) //如果上面的换行次数(fu)为偶数,则z就是行列式的值
printf("行列式的值是%f\n",z);
else //如果fu是奇数 ,则-Z是行列式的值
printf("行列式的值是-%f\n",z);
}
展开全部
你的问题表述不是很清晰,你要问哪一方面,这个程序是编程求解行列式的值,要用到线性代数的知识…
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
大哥,头都大了
建议换个思路,一层一层算,用函数
要不用matable 直接就能用det函数
建议换个思路,一层一层算,用函数
要不用matable 直接就能用det函数
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询