C中的高斯 - 乔丹消除

时间:2017-04-19 23:31:13

标签: c

所以,我有一些我无法解决的课堂作业。我可以让代码部分工作,但现在它只是没用。它要么冻结(不完全运行),要么在第一行给我几个inf。

#include <stdio.h>
#include <math.h>

int main()
{

    double a[10][11]={
{3.55618, 5.87317, 7.84934, 5.6951, 3.84642, 9.15038, -1.68539, 5.03067, 7.63384, -1.75626, -1.92193},
{-4.82893, 8.38177, -0.301221, 5.10182, -4.1169,-6.09145, -3.95675, -2.33365, 1.3969, 6.54555, -2.35262},
{-7.64196, 5.66605, 3.20481, 1.55619, -1.19814, 9.79288, 5.35547, 5.86109, 4.95544, -9.35749, 2.27709},
{-2.95914, -9.16958, 7.3216, 2.39876, -8.1302, -7.55135, -2.37718, 7.29694, 5.9867, 8.5401, -2.67493},
{-8.42043, -0.369407, -5.4102, -8.00545, 9.22153, 3.96454, 5.38499, 0.438365, 0.419677, 4.17166, 1.84756},
{6.02952, 4.57728, 5.46424, 3.52915, -1.01135, -3.74686, 8.14264, -8.86961, -2.88114, 1.29821, 4.154126},
{0.519819, -6.16655, 1.13216, 2.75811, -1.05975, 4.20286, -3.45764, 0.763558, -0.281287, -9.76168, -.93387},
{5.15737, -9.67481, 9.29904, -3.93334, 9.12785, -4.25208, -6.1652, 2.5375, 0.139195, 2.00106, -1.28356},
{-4.30784, 1.40711, -6.97966, -9.29715, 5.17234, 2.42634, 1.88818, -2.05526, -3.7679, 3.3708, -3.46841},
{-4.65418, 7.18118, 6.51338, 3.13249, 0.188456, -16.85599, 7.21435, -2.93417, 1.06061, 1.10807, -2.61529}};
    int i, j, k, l;
    double b[10][11];

    i=0;
    while(i<10)
    {
            j=0;
            l=i;
            while(l<10)
            {
                    j=0;
                    l++;
                    while(j<11)
                    {

以下代码运行正常。单独使用时,它会将所有对角线值变为1。

                            b[i][j]=a[i][j]/a[i][i]; 

下面使用此代码部分工作,将第一列设置为0,但现在它没用。我试图通过将0设为k来操纵它来摆脱所有值,在while代码中使用k ++,但如果我将它放在i ++中,它将返回分段代码;或者在j = 0;之前放置一个总线错误,如果我把i放在0中,它就会冻结程序。现在我把它恢复到默认状态是没用的

                            b[l][j]=a[l][j]-b[i][j]*a[l][0];
                            j++;
                    }
            }
            i++;
    }

    j=0;
    i=0;
    while(i<10)
    {
            while(j<11)
            {
                    printf("%lf\t", b[i][j]);
                    j++;
            }
    printf("\n");
    i++;
    j=0;
    }

return 0;
}

如何在C程序中解决所有这些问题?

1 个答案:

答案 0 :(得分:-1)

不是100%确定你的代码是什么,但我看到至少有一个地方,我相信你正在读取阵列的末尾:

while(l<10)
{
    j=0;
    l++;

...

           b[l][j]=a[l][j]-b[i][j]*a[l][0];

因为在检查最大大小后你正在递增,所以你有1次迭代,你可能正在读取传递数组的最大大小。

要进行检查,请在代码中对索引进行一些打印,然后进行分配或断言,或者我认为您会找到困境的来源。

此外,请使用常量来表示您的尺寸而不是整个地方的幻数。稍后您在尝试计算不同大小的矩阵时会感谢我。