0

我需要编写一个程序来请求两个浮点数并打印它们的差值除以它们的乘积,并让程序循环遍历输入值对,直到用户输入非数字输入。我需要用来scanf接受输入。

所以,我知道 scanf 返回值 0 或 1 表示真/假,所以我虽然测试它以完成问题的最后一部分,但我试图弄清楚如何确保循环返回请求输入。

我的代码是:

int main()    
{        
    double num1, num2, different, product, answer;

    printf("please enter 2 floatig point numbers:\n");
    printf("number one is?\n");
    while (scanf("%lf", &num1) ==1)
    {
        printf("number two is?\n");
        while (scanf("%lf", &num2) ==1)
        {       
            if (num1 > num2)
            {
                different = num1 - num2;
            }

            if (num2 > num1)        
            {
                different = num2 - num1;
            }

            if (num1 == num2)        
            {
                different = 0;
            }

            product = num1*num2;
            answer = different/product;
            printf("%lf", answer);
        }
        printf("you're out!");
    }
    printf("you're out!");
}  

示例输入:

first num 4.5
second num 3.5

输出:

please enter 2 floatig point numbers:
number one is?
4.5
number two is?
3.5
0.063492

我得到了正确的答案并且程序继续运行,但我正在寻找一种解决方案来返回输入请求。

4

3 回答 3

1

它只是一种定义您想要的输入数量的模式。您的代码的更简单版本是

  while( scanf("%d %d", &a,&b) == 2 )
  //

这里scanf返回 2 作为返回值。

所以你正在检查while(2 == 2),输入你想要的数量

while( scanf("%lf %lf", &num1,&numb2) == 2 )
{
    if (num1 > num2)
    {
        different = num1 - num2;
    }

    if (num2 > num1)
    {
        different = num2 - num1;
    }

    if (num1 == num2)
    {
        different = 0;
    }
    product = num1*num2;
}
于 2013-01-24T12:42:07.903 回答
1

你可以简单地这样做:

while(1)
{
     printf("number one is?\n");
     if(scanf("%lf", &num1) != 1)
     {
       break;
     }
     printf("number teo is?\n");
     if(scanf("%lf", &num2) != 1)
     {
       break;
     }

    if (num1 > num2)
    {
        different = num1 - num2;
    }

    if (num2 > num1)

    {
        different = num2 - num1;
    }

    if (num1 == num2)

    {
        different = 0;
    }

    product = num1*num2;

    answer = different/product;

    printf("%lf", answer);

    }
}
于 2013-01-24T12:42:48.070 回答
1

你应该首先注意到,无论什么让你scanf第一次失败,都可能让它第二次失败。所以像这样的循环:

while (scanf("%lf", &a) != 1);

可能变成无限循环

此外,当同时读取两个或多个值时,很难跟踪读取的内容和未读取的内容。因此,我建议以如下形式逐一阅读这些值:

void clear_line()
{
    char c;
    while (scanf("%c", &c) == 1)
        if (c == '\n')
            return;
}

double read_value(const char *message)
{
    double d;

    while (1)
    {
        printf("%s", message);
        if (scanf("%lf", &d) == 1)
            return d;
        if (feof(stdin))
        {
            printf("Unexpected end of file\n");
            return 0;
        }
        printf("Invalid input\n");
        clear_line();
    }
}

...
num1 = read_value("Enter first number: ");
num2 = read_value("Enter second number: ");
if (feof(stdin))
    /* handle error */

这基本上是尝试读取该值,直到用户产生正确的值。如果输入不正确,则消耗并丢弃一行输入,因此用户输入的任何剩余内容都不会影响下一个输入scanf并产生一连串错误。

于 2013-01-24T12:50:43.090 回答