c语言实验作业在dev蜗居的思路,关于C语言的问题:如何用C语言实现n阶行列式和矩阵的值...

满意答案

dcebd7a0de6265b6ccae5ead692f1eab.png

玻璃鞋syt

2013.06.30

dcebd7a0de6265b6ccae5ead692f1eab.png

采纳率:49%    等级:11

已帮助:4945人

输入:

3---7

2---1

得出错误结果。

而当输入n=3

0---1---3

3---0---2

5---2---0

时也会得出错误结果。

错误的原因有2:

1 是数据类型不对,匿名的程序是设定输入都是整数int,显然按照行列式的定义结果肯定是整数,但是他程序中使用了整型数的除法,结果是取整整数,虽然他使用了类型强制转换,但结果显然不同,有误差而且有时候这个误差很大形成错误。

2 是算法有点问题。小可很欣赏匿名的算法思路,简洁明快。不过有相当缺陷,这在程序中注明。

下面的程序是在匿名的程序思路上改写的。考虑到数据类型和精确度问题,程序中行列式数据使用double型。由于tc和win-tc是16位编辑器,对float型和double型数据支持不好,所以程序是在32位编辑器Dev-c++下调试并通过的。

本题的一个完整的c程序如下,程序在Dev-c++下都调试通过,结果正确。

/* 用C语言解决:求任意阶(n阶)矩阵的行列式值 */

#include

#include

void getarray(int n);

void showarray(int n);

double getresult(int n);

double array[10][10];/*设矩阵不超过10阶,可更改*/

int main()

{

int n;

double result;

printf("\nPlease input the Array size n:");

scanf("%d",&n);

getarray(n);

showarray(n);

result=getresult(n);

printf("\nResult=%f\n",result);

system("pause");

return 0;

}

void getarray(int n)

{

int row,col;

for(row=0;row

{

printf("\nPlease input line %d:",row+1);

for(col=0;col

scanf("%lf",&array[row][col]);

}

}

void showarray(int n)

{

int row,col;

printf("\nA=");

for(row=0;row

{

for(col=0;col

printf("\t%f",array[row][col]);

printf("\n");

}

}

double getresult(int n)

{

double temp,result=1.0;

int switchtime=0,flag=0;

int row,nextrow,col,stemp;

for(row=0;row

{

nextrow=row+1;

if(array[row][row]==0)/* 开始处理第一列,如果行列式第一行第一个数为零,要交换行 */

{ while(array[nextrow][row]==0)

{

nextrow++; /* 如果行列式第二行第一个数为零,行增加继续寻找非零数值的行 */

if(nextrow==n)/* 如果遍历完行列式行列式第一列元素都为零,退出while循环 */

{ flag=1;

break;

}

}

if(flag==1) /* 退出while循环后回到for(row=0;row

continue; /* 从array[row][row]==0知列也相应加1,开始处理第二列 */

switchtime++; /* 每交换一次行,行列式符号变化1次,统计变化次数 */

for(col=0;col

{

stemp=array[row][col];

array[row][col]=array[nextrow][col];

array[nextrow][col]=stemp;

}

}

for(nextrow=row+1;nextrow

{ /* 类似高斯消去法,消第一行下各行第一列数值到零*/

temp=array[nextrow][row]/array[row][row];

for(col=0;col

array[nextrow][col]+=-temp*array[row][col];/* 化行列式为上三角行列式形式 */

}

}

showarray(n);

for(row=0;row

result*=array[row][row];

if(switchtime%2)

return -result;

else

return result;

}

00分享举报

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值