1

こんにちは、while(true) を使用して単純な計算機を作成していますが、ループが終了して再び開始すると、最初の行が 2 回繰り返されることを除いて、これに対する解決策はありますか? 前もって感謝します ...

#include <stdio.h>
#include <stdlib.h>

int main()
{
char a,ch;
int x,y,i,n,e,s;
while(1) {
    printf("\nEnter the operation:");
    scanf("%c",&a);
    e=a;
    if (e=='+') {
        printf("\nEnter the first integer:");
        scanf("%d",&x);
        printf("\nEnter the second integer:");
        scanf("%d",&y);
        s=x+y;
        printf("\nThe result of %d+%d is:%d\n",x,y,s);
    } else {
        if (e=='-') {
        printf("\nEnter the first integer:");
        scanf("%d",&x);
        printf("\nEnter the second integer:");
        scanf("%d",&y);
        s=x-y;
        printf("\nThe result of %d-%d is:%d\n",x,y,s);
    } else {
        if (e=='*') {
        printf("\nEnter the first integer:");
        scanf("%d",&x);
        printf("\nEnter the second integer:");
        scanf("%d",&y);
        s=x*y;
        printf("\nThe result of %dx%d is:%d\n",x,y,s);
    } else {
        if (e=='/') {
        printf("\nEnter the first integer:");
        scanf("%d",&x);
        printf("\nEnter the second integer:");
        scanf("%d",&y);
        s=x/y;
        printf("\nThe result of %d/%d is:%d\n",x,y,s);
    } else {
        if (e=='%') {
        printf("\nEnter the first integer:");
        scanf("%d",&x);
        printf("\nEnter the second integer:");
        scanf("%d",&y);
        s=x%y;
        printf("\nThe result of %d%%d is:%d\n",x,y,s);
    } else {
        if (e=='^') {
        printf("\nEnter the first integer:");
        scanf("%d",&x);
        printf("\nEnter the second integer:");
        scanf("%d",&y);
        s=pow(x,y);
        printf("\nThe result of %d^%d is:%d\n",x,y,s);
    }}}}}}
}}
4

4 に答える 4

3

を使用して文字を入力する%cと、入力ストリームに改行文字が残ります。したがって、入力ストリームに残っている改行文字は後続の反復で消費されるため、入力は求められません。

scanf() が残っている改行 (空白) 文字を無視するように、フォーマット文字列に空白を追加します。

変化する:

scanf("%c",&a);

に:

scanf(" %c",&a);

このようにして、scanf() はすべての空白を無視します。

于 2013-05-04T18:33:08.093 に答える
1

これは scanf によるものです。scanf を省略して getchar() で操作コマンドを受信して​​みてください。それは試みに値します。

この種のタスクには switch..case も使用してください。ユーザーに通知するために「デフォルト」句も含めます。

于 2013-05-04T18:45:12.530 に答える
1

scanf() でキーボード入力を読み取る場合、Enter キーが押された後に入力が読み取られますが、Enter キーによって生成された改行は scanf() の呼び出しによって消費されません。つまり、次に標準入力から読み取るときに、改行が待っていることを意味します (これにより、次の scanf() 呼び出しがデータなしで即座に返されます)。

これを回避するには、コードを次のように変更します。

while(1) {
    printf("\nEnter the operation:");
    scanf("%c%*c", &a);
于 2013-05-04T18:35:22.100 に答える
0

現在、予期しないものをループに提供すると、再度実行され、最初のプロンプトが複数回出力されます。これは、処理する計算の 1 つが正常に完了した後にのみ最初のプロンプトを再表示する、プログラムに最小限の変更を加えたソリューションです。

#include <stdio.h>
#include <stdlib.h>

int main()
{
char a,ch;
int x,y,i,n,e,s;
int new_operation = 1;
while(1) {
    if (new_operation) {
        printf("\nEnter the operation:");
        new_operation = 0;
    }
    scanf("%c",&a);
    e=a;
    if (e=='+') {
        printf("\nEnter the first integer:");
        scanf("%d",&x);
        printf("\nEnter the second integer:");
        scanf("%d",&y);
        s=x+y;
        printf("\nThe result of %d+%d is:%d\n",x,y,s);
        new_operation = 1;
    } else {
        if (e=='-') {
        printf("\nEnter the first integer:");
        scanf("%d",&x);
        printf("\nEnter the second integer:");
        scanf("%d",&y);
        s=x-y;
        printf("\nThe result of %d-%d is:%d\n",x,y,s);
        new_operation = 1;
    } else {
        if (e=='*') {
        printf("\nEnter the first integer:");
        scanf("%d",&x);
        printf("\nEnter the second integer:");
        scanf("%d",&y);
        s=x*y;
        printf("\nThe result of %dx%d is:%d\n",x,y,s);
        new_operation = 1;
    } else {
        if (e=='/') {
        printf("\nEnter the first integer:");
        scanf("%d",&x);
        printf("\nEnter the second integer:");
        scanf("%d",&y);
        s=x/y;
        printf("\nThe result of %d/%d is:%d\n",x,y,s);
        new_operation = 1;
    } else {
        if (e=='%') {
        printf("\nEnter the first integer:");
        scanf("%d",&x);
        printf("\nEnter the second integer:");
        scanf("%d",&y);
        s=x%y;
        printf("\nThe result of %d%%d is:%d\n",x,y,s);
        new_operation = 1;
    } else {
        if (e=='^') {
        printf("\nEnter the first integer:");
        scanf("%d",&x);
        printf("\nEnter the second integer:");
        scanf("%d",&y);
        s=pow(x,y);
        printf("\nThe result of %d^%d is:%d\n",x,y,s);
        new_operation = 1;
    }}}}}}
}}

変更には、新しい変数の宣言、最初のプロンプトの周りの if ステートメント、および各操作が完了した後の new_operation 変数のリセットが含まれていることに注意してください。

これにより、余分な改行と、最初のプロンプトに対するその他の未処理の応答が処理されます。

于 2013-05-04T18:43:39.500 に答える