1

私は C を学んでいて、このプログラムを作成しようとしています。このプログラムは、順番に演算子 (+、-、​​、%)、数値、次に scanf、printf、および getchar() を使用して別の数値を入力するよう求めます。最後にオペレーターに尋ねるとうまくいきますが、最初にオペレーターと一緒に持っていなければなりません。

これが私が思いついたコードです(ただし、順序が正しくありません):

char operator;
int numbers[2];
int result;

printf("Enter the first number:");
scanf("%9d", &numbers[0]);
printf("Enter the second number:");
scanf("%9d", &numbers[1]);
printf("Enter operation:");
getchar();
operator = getchar();
if (operator == '+') {
result = numbers[0] + numbers[1];
} 
else if (operator == '-') {
result = numbers[0] - numbers[1];
}
else if (operator == '*') {
result = numbers[0] * numbers[1];
}
else if (operator == '/') {
result = numbers[0] / numbers[1];
}
else {
result = 0;
}

printf("%d", result);

これは、次のことを行わないコードです。

printf("Enter operation:");
getchar();
char operator = getchar();
if (operator == '+') {
result = numbers[0] + numbers[1];
} 
else if (operator == '-') {
result = numbers[0] - numbers[1];
}
else if (operator == '*') {
result = numbers[0] * numbers[1];
}
else if (operator == '/') {
result = numbers[0] / numbers[1];
}
else {
result = 0;
}
printf("Enter the first number:");
scanf("%9d", &numbers[0]);
printf("Enter the second number:");
scanf("%9d", &numbers[1]);

printf("%d", result);

これは確率変数を与えます。

コードがブロック内にない場合は、ご容赦ください。できる限り指示に従いました。

4

3 に答える 3

3

代入演算子の結果は「その瞬間に」計算されます: 式...

result = a + b;

result...その値を変更したり、値aを変更したりすることはありませんb

これが、最初のスニペットが計画どおりに機能し、2 番目のスニペットがガベージを示している理由です。最初に、いくつかのガベージ値 (有用なものが割り当てられるnumbersに格納されている配列要素) に対するバイナリ操作の結果を計算しようとしてから、ユーザーから何らかの入力を取得します。

キーはresultこの時点ですでに何らかの値を持っており、この値は変更されません-もちろん、2番目の割り当てを行わない限り。)

このプログラムを修正するのは非常に簡単です。実際の計算をその入力部分から分離するだけです。となることによって...

if (operator == '+') {
  result = numbers[0] + numbers[1];
} 
else if (operator == '-') {
  result = numbers[0] - numbers[1];
}
else if (operator == '*') {
  result = numbers[0] * numbers[1];
}
else if (operator == '/') {
  result = numbers[0] / numbers[1];
}
else {
  result = 0;
}

...すべての部分に従いますprintf/scanf(明らかに、結果を出力する部分を除く)。switchところで、同じ目的で使用できます:

switch(operator) {
  case '+':
    result = numbers[0] + numbers[1]; break;
  case '-':
    result = numbers[0] - numbers[1]; break;
  case '*':
    result = numbers[0] * numbers[1]; break;
  case '/':
    result = numbers[0] / numbers[1]; break;
  default:
    result = 0;
}
于 2012-11-12T17:48:52.843 に答える
2

2 番目の部分では、まだ 2 つの数値の値を読み取っていませんが、それらに対して操作を行っています。

ところで:

すべての代わりに

if (operation == '+') 
// etc

switch ステートメントを調べることができます。

switch(operator) {
   case '+'
       number[0] + number[1];
       break;
   // etc
于 2012-11-12T17:49:38.807 に答える
0

への余分な呼び出しがあるようですgetchar()

printf("Enter operation:");
getchar();
char operator = getchar();

する必要があります

printf("Enter operation:");
char operator = getchar();

そうしないと、演算子を見逃す可能性があり、計算を行う前に最初に数字を読む必要があります。

于 2012-11-12T17:48:26.777 に答える