我为高斯消元法编写了这段代码:
#include <stdio.h>
int main()
{
float arr[3][4]={{0}}, i, j, k, p;
printf("Enter the coefficients:-\n");
for(i=0; i<3;i++)
{
printf("Row #(%d)\n", (int)(i+1));
for(j=0; j<4; j++)
{
scanf("%f", &arr[(int)i][(int)j]);
}
}
for(k=1, p=(k-1); (k<=2); k++, p++)
{
for(i=k; i<=2; i++)
{
for(j=0; j<=3; j++)
{
arr[(int)i][(int)j]-=((arr[(int)i][(int)p]/arr[(int)p][(int)p])*arr[(int)p][(int)j]);
}
}
}
for(i=0; i<3;i++)
{
for(j=0; j<4; j++)
{
printf("%0.3f ", arr[(int)i][(int)j]);
}
printf("\n");
}
return 0;
}
但是,它不会打印正确的输出值。对输出的分析表明这些值已被四舍五入或其他原因。我猜测在某个地方已经考虑了二维数组的整数值,即使我将数组视为 double 并且仅对语法有效的元素地址使用类型转换。您可以通过矩阵来尝试一下:
R1- 10 -1 2 4
R2- 1 10 -1 3
R3- 2 3 20 7
正确的输出应该是:
R1- 10 -1 2 4
R2- 0 10.1 -1.2 2.6
R3- 0 0 19.980 5.376
我正在使用 GNU GCC 编译器。
最佳答案
- 使用整数类型声明用于数组索引的所有变量。
- 摆脱所有 Actor 。您不需要其中任何一个。
- 将行号和列号的所有常量替换为
Rows
和Columns
,您只需定义一次。 - 在循环范围内保持一致;不要使用
j < 4
在某些地方和j <= 3
在其他人中。 (两者都将变为j < Columns
。) - 摆脱
p
. k
上的循环迭代源行,即包含将用于取消其他元素的数据的行。它运行for (k = 0; k < Rows-1; ++k)
.i
中的循环迭代您为每个k
取消的目标行。它运行for (i = k+1; i < Rows; ++i)
.- 取消时要使用的系数是列
k
中元素之间的比率行数i
和k
。计算一次并称其为factor
. - 对于行中的每一列
i
,从那里的元素中减去factor
乘以行中同一列的元素k
.
我如上所述编写了代码,它打印了您所说的预期结果。
关于c - 在类型转换繁重的程序中省略小数点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15798619/