なぜ「×2」のような挙動をするかは理解していますか?
例えば、「2 + 2 = 4」と一回目に計算したとき、txtDisplayに値は結果である「4」が入ります。この時値1には結果である4が入っています。
次に2回目の計算が実行されるとき、この値1に対し、値2、つまり今txtDisplayに表示されている「4」が足され、結果が8になります。
同じ値同士で計算されているのです。なので引き算では「4 - 4 = 0」となるし、「4 / 4 = 1」となります。
ひかり さんが書きました:「9 × 2 = 18」から=を押すと、0になります。
とありますが掛け算割り算は0にはならないかと思います。何かミスがありましたか?
コードの処理としては、
1.もし入力数値を伴う計算処理(isFirstではない)の時は入力した数値を保管しておく
2.もし「=」だけの計算処理(isFirstである)の時は値2に前回の入力値を代入する
のようになると思います。
さらに詳しく説明しますと、
1 + 2 =と入力されたとき、=が押されたときは「2」が入力されていますので、これを保管(1の処理)tmp = 2;
計算が処理されたとき、値1とtxtDisplayは結果の値なので「3」です。
次に「=」だけを押されたとき、結果「3」に前回の値「2」を足したいので、txtDisplayから値を取るのではなく先ほど保管したtmpの値(2)を代入します。(2の処理)
このとき内部では3 + 2の処理が行われますので結果は「5」になります。
以下にコードを書きます。ひとつの答えになりますが、もっといい方法があるかもしれません。
コード:
decimal tmp;
private void calc()
{
decimal 値2;
if (isFirst)
{
値2 = tmp;
}
else
{
値2 = Convert.ToDecimal(txtDisplay.Text);
tmp = 値2;
}
switch (演算)
{
case 四則演算の記号.ADD:
値1 += 値2;
break;
case 四則演算の記号.SUB:
値1 -= 値2;
break;
case 四則演算の記号.MUL:
値1 *= 値2;
break;
case 四則演算の記号.DIV:
値1 /= 値2;
break;
default:
値1 = 値2;
break;
}
txtDisplay.Text = 値1.ToString();
isFirst = true;
}
色々と書きましたがコードは単純でしたね…。