早教吧作业答案频道 -->其他-->
关于C语言的问题:如何用C语言实现n阶行列式和矩阵的值
题目详情
关于C语言的问题:如何用C语言实现n阶行列式和矩阵的值
▼优质解答
答案和解析
输入:
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;colscanf("%lf",&array[row][col]);
}
}
void showarray(int n)
{
int row,col;
printf("\nA=");
for(row=0;row{
for(col=0;colprintf("\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;rowcontinue; /* 从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;colarray[nextrow][col]+=-temp*array[row][col];/* 化行列式为上三角行列式形式 */
}
}
showarray(n);
for(row=0;rowresult*=array[row][row];
if(switchtime%2)
return -result;
else
return result;
}
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
}
}
void showarray(int n)
{
int row,col;
printf("\nA=");
for(row=0;row
for(col=0;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
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
}
}
showarray(n);
for(row=0;row
if(switchtime%2)
return -result;
else
return result;
}
看了 关于C语言的问题:如何用C语...的网友还看了以下:
a为4×3矩阵,b为3×4矩阵,3阶矩阵c满足c∧2-5c-(ab+7)E=0,求ab.ab为行列 2020-04-12 …
下列有关实验方法的叙述,错误的是()A.用纸层析法分离绿叶中的色素B.用对比实验法探究酵母菌的呼吸 2020-05-15 …
线性代数定理求证明Q为n*n维方阵由(n-q)*n微矩阵D 和q*n维矩阵C构成则C左乘Q逆将图示 2020-05-16 …
数据库的三级模式结构中,模式也称为A.逻辑模式B.物理模式C.用户模式D.系统模式 2020-05-23 …
下列叙述不正确的是A.FTP是交互的B.FTP采用集中式模式C.用户能够使用FTP从远程计算机获取文 2020-05-24 …
下列关于电子邮件的叙述不正确的是()。A.FTP是交互的B.FTP采用集中式模式C.用户能够使用FT 2020-05-24 …
MATLAB矩阵里对于时间变量t的导数应该如何表示?是想输入一个等式,A=B*C+D*E,其中B, 2020-06-27 …
有没有好心的大神原意帮姑凉写代码利用随机数生成两个4*4矩阵A,B(矩阵A的每个数为1-9的数,矩 2020-07-11 …
设A,B,C均为n阶矩阵,若AB=C,且B可逆,则()A.矩阵C的行向量组与矩阵A的行向量组等价B 2020-07-20 …
在MATLAB软件中随机生成一个矩阵A和矩阵B计算(1)AB,(2)对B中各个元素平方后的矩阵C, 2020-07-24 …