类型化程序中省略了小数点

时间:2013-04-03 21:37:09

标签: c floating-point int printf

我已经为高斯消除方法编写了这段代码:

#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;
}

但是,它不会打印正确的输出值。对输出的分析表明价值已经四舍五入。我在某处猜测了2-d数组的整数值,即使我已将数组作为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编译器。

2 个答案:

答案 0 :(得分:0)

问题可能与舍入无关(传递给数组的索引不应该影响数组本身的任何舍入)。

我在主循环中添加了一个print语句,只是为了查看在执行每行减法时使用的系数,并且它们在每列之间看起来不同,所以很可能你的数学已关闭。我怀疑它与您的p变量有关,该变量始终固定为k上方的行,我认为这对您没有帮助。

您希望获取每对行的行系数,然后减去您正在使用的行以消除乘以该系数。对于第二行逐行消除,系数为M(1,0)/M(0,0),对于第三行到第二行消除,系数为M(2,1)/M(1,1),并且通常为M(I,K)/M(K,K)(其中K是用来消除的行,我是你要消除的行。

最终你想做:

For each row K excluding the last row (0 to 1)...
    For each row I after it (K+1 to 2)...
        Get the row factor = M(I, K) / M(K, K).
        For each column J (0 to 3)...
            M(I, J) -= M(K, J) * factor

将(几乎直接)翻译成代码,它应该是:

10.000000  -1.000000  2.000000   4.000000
-0.000000  10.100000  -1.200000  2.600000
-0.000000  -0.000000  19.980198  5.376237

答案 1 :(得分:0)

  1. 使用整数类型声明用于数组索引的所有变量。
  2. 摆脱所有演员阵容。你不需要任何一个。
  3. 将行号和列号的所有常量替换为RowsColumns,您只需定义一次。
  4. 在你的循环范围内保持一致;不要在某些地方使用j < 4,在其他地方使用j <= 3。 (两者都将成为j < Columns。)
  5. 摆脱p
  6. k上的循环遍历源行,即包含将用于取消其他元素的数据的行。它运行for (k = 0; k < Rows-1; ++k)
  7. i中的循环会迭代您为每个k取消的目标行。它运行for (i = k+1; i < Rows; ++i)
  8. 取消时要使用的因素是行kik列中元素之间的比率。计算一次并称之为factor
  9. 对于行i中的每一列,从元素中减去factor次行k中同一列中的元素。
  10. 我编写了如上所述的代码,并打印出您所说的预期结果。