C 如何将此注册为出口&;1;是否将编号列表显示为从1开始?
好的,提示是: “编写一个简单的程序(演示数组的使用)这要求用户键入数字并一直键入数字,直到用户输入-1或输入的数字总数达到20。您的程序将根据上述任一条件停止请求新的输入。一旦满足上述任一条件,程序将输出所有输入的数字,如下所示:1.888 2.999 3.4…等等。最后,程序需要显示输入的所有值的总和,不包括用于终止用户输入循环的-1。该数组应用于存储用户的输入,并在程序终止前显示它们。” 现在,我已经完成了大部分提示。它在输入的20个变量处停止,并正确显示它们和总和。然而,无论我怎么努力,我都无法让它注册-1作为出口。我也不能让项目符号列表从1开始。20点结束。其他一切都很好C 如何将此注册为出口&;1;是否将编号列表显示为从1开始?,c,arrays,loops,while-loop,user-input,C,Arrays,Loops,While Loop,User Input,好的,提示是: “编写一个简单的程序(演示数组的使用)这要求用户键入数字并一直键入数字,直到用户输入-1或输入的数字总数达到20。您的程序将根据上述任一条件停止请求新的输入。一旦满足上述任一条件,程序将输出所有输入的数字,如下所示:1.888 2.999 3.4…等等。最后,程序需要显示输入的所有值的总和,不包括用于终止用户输入循环的-1。该数组应用于存储用户的输入,并在程序终止前显示它们。” 现在,我已经完成了大部分提示。它在输入的20个变量处停止,并正确显示它们和总和。然而,无论我怎么努力,
#include <stdio.h>
#define NUMBER_INPUTS 20
int main(void){
double userInput[NUMBER_INPUTS] = { 0 };
int i = 0;
while (i < NUMBER_INPUTS){
printf("Enter number: \n", i);
scanf("%lf", &userInput[i]);
i++;
}
for(i=0; i<NUMBER_INPUTS; i++)
printf("%i. %.1lf \n", i, userInput[i]);
double total=0;
for(i=0; i<NUMBER_INPUTS; i++)
total+=userInput[i];
printf("Total: %.1lf \n", total);
return 0;
}
从1获取列表。到20岁。尝试将i变量增加一个,但由于某种原因,只是将输出列表缩短为仅显示20。总数是多少?我不知道我做错了什么,希望你能给我一些建议。多谢各位 在比较具有精确值的浮点数时要非常小心。(两个链接的要点)。虽然
double
可以准确地表示-1
,但不要养成相信浮点数可以准确地表示任何值的习惯——它们不能。见:和
要在输入-1
时停止读取,您需要保留i
的值(元素数),该值在离开读取循环时存储了有效的双精度
(即填充的数组元素数)<代码>int n=i将起作用(或者只需使用单独的计数器n
并保存i
以用作循环变量)。然后在打印循环中<代码>用于(i=0;iNUMBER\u输入。如果用户在3次输入之后输入-1
,那么这将不起作用
为了正确使用任何输入函数,必须验证返回值。(尤其是scanf
with对于新的C程序员来说包含许多陷阱)否则在匹配失败时,数组元素将不确定,从stdin
提取字符将停止在stdin
中留下未读的违规字符,等待下次尝试输入时再次咬你。相反--验证,验证,验证。恐怕你们违背了。例如:
if (scanf ("%lf", &userInput[n]) != 1) { /* validate input */
fputs ("error: invalid double input.\n", stderr);
return 1;
}
将其余部分放在一起,并给出检查+/-1E-5公差范围内浮点值的示例,您可以执行以下操作:
#include <stdio.h>
#define NUMBER_INPUTS 20
int main (void) {
double userInput[NUMBER_INPUTS] = { 0 }, total = 0;
int i = 0, n = 0;
while (n < NUMBER_INPUTS){
fputs ("Enter number: ", stdout);
if (scanf ("%lf", &userInput[n]) != 1) { /* validate input */
fputs ("error: invalid double input.\n", stderr);
return 1;
}
/* check for -1 (with +/- 1E-5 tolerance) */
if (userInput[n] > -1.00001 && userInput[n] < -0.99998)
break;
total += userInput[n];
n++;
}
putchar ('\n');
for(i = 0; i < n; i++)
printf("%d. %.1lf\n", i + 1, userInput[i]);
printf ("\nTotal: %.1lf \n", total);
return 0;
}
仔细检查一下,如果你还有其他问题,请告诉我。你很接近
编辑-将输出元素指示更新为i+1
,以满足从1
开始显示编号列表的要求“我不知道我做错了什么”。我们也不能,除非您显示的代码没有按预期工作。@kaylum编辑后您知道自己的正确性-您需要检查scanf(“%lf”,&userInput[i])的返回代码>(以及使用的每个输入函数)来验证您收到的输入。你还需要阅读和阅读。@DavidRankin,我想你可能误解了提示,或者可能误解了我,因为总数不是问题。它在20点停止,就像我需要它一样。它输出我输入的所有20个数字,就像我需要它一样。它只是没有显示我想要的方式,也没有在我输入-1时停止。我需要把if(userInput[I]==-1
放在哪里才能正确注册,而不会弄乱我的其余代码?我一开始是这样做的。这就是为什么我删除了那条注释并删除了20
检查。你应该可以,但在比较具有精确值的浮点数时要非常小心。(两个链接的要点)。离开读取循环后,需要保留i
的值(即填充的数组元素数)。int n=i;
将起作用。然后在打印循环中。for(i=0;i
。你每次都在尝试打印数字输入
。如果用户在3次输入后输入-1
,那就行不通了。回答得好!尽管我猜OP可能已经过度阅读了原始需求。没有任何东西表明输入将是浮动的。所有示例都是ints.Ba从问题的层面来看,我想说的是,目的只是读取整数。是的,我只是选择了输入的double
类型。我怀疑他们可能想要整数输入,但printf
格式字符串和userInput
声明表明他们确实想要double
--所以我就用了:)
if (scanf ("%lf", &userInput[n]) != 1) { /* validate input */
fputs ("error: invalid double input.\n", stderr);
return 1;
}
#include <stdio.h>
#define NUMBER_INPUTS 20
int main (void) {
double userInput[NUMBER_INPUTS] = { 0 }, total = 0;
int i = 0, n = 0;
while (n < NUMBER_INPUTS){
fputs ("Enter number: ", stdout);
if (scanf ("%lf", &userInput[n]) != 1) { /* validate input */
fputs ("error: invalid double input.\n", stderr);
return 1;
}
/* check for -1 (with +/- 1E-5 tolerance) */
if (userInput[n] > -1.00001 && userInput[n] < -0.99998)
break;
total += userInput[n];
n++;
}
putchar ('\n');
for(i = 0; i < n; i++)
printf("%d. %.1lf\n", i + 1, userInput[i]);
printf ("\nTotal: %.1lf \n", total);
return 0;
}
$ ./bin/total
Enter number: 10
Enter number: 20
Enter number: 30
Enter number: 40
Enter number: 50
Enter number: -1
1. 10.0
2. 20.0
3. 30.0
4. 40.0
5. 50.0
Total: 150.0