意外输出 - 编程练习(C)

时间:2011-06-13 10:58:37

标签: c

来自C Primer Plus 5th Ed: “编写一个程序,创建两个八元素的双精度数组,并使用循环让用户输入第一个数组的八个元素的值。让程序将第二个数组的元素设置为元素的累积总数。第一个数组。例如,第二个数组的第四个元素应该等于第一个数组的前四个元素的总和,第二个数组的第五个元素应该等于第一个数组的前五个元素的总和。 (使用嵌套循环可以做到这一点,但是通过使用第二个数组的第五个元素等于第二个数组的第四个元素加上第一个数组的第五个元素的事实,你可以避免嵌套并只使用一个循环最后,使用循环显示两个数组的内容,第一个数组显示在一行上,第二个数组的每个元素显示在第一个数组的相应元素下面。“

我写过:

#include <stdio.h>

int main(void)
{
double first[8];
double second[8];
int i;
printf("Enter 8 'doubles':\n");
i = 0;
scanf("%lf", &first[i]);
second[i] = first[i];
    i = 1;
while(i < 8)
{
    scanf("%lf", &first[i]);
    second[i] = first[i] + first[i-1];
    i++;
}
for(i = 0; i < 8; i++)
{
    printf("%.2lf ", first[i]);
}
printf("\n");
for(i = 0; i < 8; i++)
{
    printf("%.2lf ", second[i]);
}
}

我的输出是:

Enter 8 'doubles':
1
1
1
1
1
1
1
1
1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00
1.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 Press any key to continue . . .

预期输出的最后一行是1 2 3 6 12 24 48 96。无法弄清楚为什么它只适用于第一次迭代。我错过了什么?

提前致谢。

编辑:不知道为什么它作为'家庭作业',我把它标记为练习......好吧。

EDIT2:

此代码:

#include <stdio.h>

int main(void)
{
double first[8];
double second[8];
int i;
printf("Enter 8 'doubles':\n");
i = 0;
scanf("%lf", &first[i]);
second[i] = first[i];
i = 1;
while(i < 8)
{
    scanf("%lf", &first[i]);
    second[i - 1] = first[i] + first[i-1];
    i++;
}
for(i = 0; i < 8; i++)
{
    printf("%.2lf ", first[i]);
}
printf("\n");
for(i = 0; i < 8; i++)
{
    printf("%.2lf ", second[i]);
}
}

此输出:

1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 
2.00 2.00 2.00 2.00 2.00 2.00 2.00 -925596313493178310000... etc

4 个答案:

答案 0 :(得分:2)

这里有一个问题:

while(i < 8)
{
    scanf("%lf", &first[i]);
    second[i] = first[i] + first[i-1];
    i++;
}

当我为零时会发生什么?

您的新代码在以下位置出现了一个错误:

second[i - 1] = first[i] + first[i-1];

如果你考虑一下,第二个的最后一个元素永远不会被写入。

答案 1 :(得分:0)

第一次进入while (i<8)循环时出现问题:i仍为零,因此您将覆盖first[0]并从first[-1]读取非法。也:

second[i] = first[i] + first[i-1];

second[i]将包含输入的最后两个浮点数的总和。如果您想要累积总和,则应该添加second[i-1]

答案 2 :(得分:0)

second[i] = first[i] + first[i-1];

您为第一个索引输入'1',因此您总是添加1 + 1(第一个元素除外)。看起来很好。

答案 3 :(得分:0)

你需要在循环时对第一个数组的每个值求和,那么为什么不声明一个变量来保存这个值,然后将它分配给第二个变量的相应元素。这使一切变得更加简单。

#include <stdio.h>

int main(void)
{
    double first[8], second[8], sum = 0.0;
    int i = 0;

    printf("Enter 8 'doubles':");
    while(i < 8)
    {
        scanf("%lf", &first[i]);
        sum += first[i];
        second[i] = sum;
        i++;
    }
    printf("\nfirst -  ");
    for(i = 0; i < 8; i++)
    {
        printf("%7.2f ", first[i]);
    }
    printf("\nsecond - ");
    for(i = 0; i < 8; i++)
    {
        printf("%7.2f ", second[i]);
    }

    return 0;
}

另一个小错误是使用%lf作为 printf()格式的字符串 - printf()实际上只对%d和&amp;使用%f。浮