0

2つの浮動小数点数を要求し、それらの差の値をそれらの積で割った値を出力するプログラムを作成し、ユーザーが非数値入力を入力するまで、プログラムに入力値のペアをループさせる必要があります。入力を取得するために使用scanfする必要があります。

したがって、scanfがtrue / falseに対して値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最初に失敗したものは、おそらく 2 回目に失敗することに注意してください。したがって、次のようなループ:

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

無限ループになる可能性があります

また、同時に 2 つ以上の値を読み取る場合、何が読み取られ、何が読み取られないかを追跡するのは困難です。したがって、次のような形式で値を 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 */

これが基本的に行うことは、ユーザーが正しい値を生成するまで値を読み取ろうとすることです。誤った入力の場合、入力の 1 行が消費されて破棄されるため、ユーザーが入力した内容の残りが次の入力に影響を与えずscanf、一連のエラーが発生することはありません。

于 2013-01-24T12:50:43.090 に答える