【发布时间】:2014-01-20 02:34:35
【问题描述】:
1.我有这个用 C 语言编写的示例程序,它接受用户的正输入并在用户输入负数时停止。它最多接受十个输入。然后它以相反的顺序显示结果。我想知道这是怎么发生的,因为当我尝试映射它时 c 的值为负数,第二个循环只有在满足条件 (c>=0) 时才会起作用。
例如,如果我只输入一个正数,然后我将输入一个负数。
input[0]=2
i=0+1
c=1-2
input[1]=-4
i=1+1
c=2-2
num=2*input[-1]?
#include<stdio.h>
int main()
{
float in;
float input[10];
int i=0;
int c;
printf("Please input a number:");
do{ scanf("%f", &in);
input[i] = in;
i=i+1;
if(i>10)
break;
c=i-1;
}while(in>=0);
do{ float num;
num= 2*input[c];
printf("Input = %.2f. Num= %.2f.\n", input[c], num);
c=c-1;
}while(c>=0);
return 0;
}
使用 do-while 代码的输入:
2
3
-4
输出:
输入:3.00 输出:6.00
输入:2.00 输出:4.00
-
当我尝试使用 for 循环实现它时,它在 gcc 中编译,但当我尝试执行它时显示
segmentation fault (core dumped)。#include<stdio.h>int main() {漂浮; 浮点输入[10]; int i,c;
printf("Please input a number:"); for(i=0; in>=0; ){ scanf("%f", &in); input[i] = in; i=i+1; if(i==10) break; c=i-2; } for(; c>=0;){ float num; num= 2*input[c]; printf("Input = %.2f. Num= %.2f.\n", input[c], num); c=c-1; } return 0;}
【问题讨论】:
-
对于初学者,您的第一个
for-loop正在调用未定义的行为。您使用条件表达式评估in,而无需在第一次迭代之前分配或初始化其值。我不知道你为什么要这样做:c=i-2;。而且...您从不检查scanf()的返回结果,因此无法确定它实际上有效。 -
用'input[i]'替换'in>=0',它只接受1个输入而不管符号。在上面的代码中使用do-while c=i-2 用于反转输出,但我不知道它是如何工作的,因为当我尝试将它映射出来时,c 是负数。使用 do-while 的代码已经运行。
-
这也好不到哪里去。
input[]也未初始化。坦率地说,我仍然不知道这是要做什么。这是否应该从用户那里获取一个浮点列表,并且在达到 10 个条目或负输入数字时,打印数字以相反的顺序成功输入?如果是这样,你做的比你需要的要困难得多。(See it live)。如果不是,则需要更多解释(至少对我而言)。 -
我编辑了这篇文章。使用 for-loop 的代码应该显示与使用 do-while 的第一个代码相同的输出。当输入为负数时停止,达到 10 个输入。
-
您的 for 循环版本在 Windows 上为我运行。但仍然存在您在版本中遇到的问题。