Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何将此注册为出口&;1;是否将编号列表显示为从1开始?_C_Arrays_Loops_While Loop_User Input - Fatal编程技术网

C 如何将此注册为出口&;1;是否将编号列表显示为从1开始?

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个变量处停止,并正确显示它们和总和。然而,无论我怎么努力,

好的,提示是:

“编写一个简单的程序(演示数组的使用)这要求用户键入数字并一直键入数字,直到用户输入-1或输入的数字总数达到20。您的程序将根据上述任一条件停止请求新的输入。一旦满足上述任一条件,程序将输出所有输入的数字,如下所示:1.888 2.999 3.4…等等。最后,程序需要显示输入的所有值的总和,不包括用于终止用户输入循环的-1。该数组应用于存储用户的输入,并在程序终止前显示它们。”

现在,我已经完成了大部分提示。它在输入的20个变量处停止,并正确显示它们和总和。然而,无论我怎么努力,我都无法让它注册-1作为出口。我也不能让项目符号列表从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;i。现在,您每次都试图打印
NUMBER\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