- ベストアンサー
VBでの簡易電卓の作成(減算方法)で困っています。
技術評論社のVisual Basic5.0入門編という、 参考書を見ながら、作成したのですが。 どうも、参考書のコードが間違っているみたいでした 良かったら、お知恵をお貸しください。 とりあえず、足し算と引き算処理の作成です。 ※使用コントロール 0から9までのコマンドボタンをコントロール配列と、 足し算、引き算、クリアーのコマンドボタンが3つ、 後、数字入力用のテキストボックスが1つです。 コード **************************************************** Option Explicit Dim EnterFlag As Boolean 'プラス、マイナスキーが押された直後ならTrueを示すフラグ。 Dim S As Long Private Sub Command3_Click() 'クリアーボタン Text1.Text = "" S = 0 End Sub Private Sub Plas_Click() '加算処理 S = S + Val(Text1.Text) Text1.Text = S EnterFlag = True End Sub Private Sub Mainas_Click() '減算処理 S = S - Val(Text1.Text) Text1.Text = S EnterFlag = True End Sub Private Sub Form_Load() Text1.Text = "" S = 0 End Sub Private Sub key_Click(Index As Integer) If EnterFlag Then Text1.Text = "" EnterFlag = False End If If Len(Text1.Text) < 10 Then '10桁以内のとき Text1.Text = Text1.Text & Index End If End Sub ********************************************************* とこんな感じです。 加算処理は、上手くできますが。 減算処理は、明らかにコードが間違っていると思いました。 初めて(1回目)マイナスボタンを押した時に、変数Sには、必ずマイナス が入ってしまう状態です。 上手く減算処理出来る方法のアドバイスよろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
これは、業務用でよく使われる電卓と同じ仕様ですね。 初めてマイナスを押したときに結果がマイナスになるのは正しい動作です。 どういう理由だったか忘れましたが、この方が効率が良い場合があるので 先に数値、その次に演算という入力順序になっているそうです。 それはさておき、普通の電卓と同じ処理をしたいのであれば、 一つ前に押された演算キーを記憶しておいて、新しい演算キーが押されたときに 一つ前の演算を処理する、というような流れになるのではないかと思います。 そうすると、Plas_Click、Mainas_Clickも変更が必要で、演算自体は 一つ前の演算処理、演算子を新しく自分のものに更新する。 Private Sub Plas_Click() '加算処理 select case <演算子> case 1 S = S + Val(Text1.Text) Text1.Text = S case 2 S = S - Val(Text1.Text) Text1.Text = S end select EnterFlag = True <演算子>=1 End Sub といった感じでしょうか? とりあえず、ぱっと思いついただけなので他にも良い方法があるかもしれません。 がんばってください。
その他の回答 (2)
- wolv
- ベストアンサー率37% (376/1001)
モードを表す変数を導入する。最後に押した機能キーによってモードを変える。起動直後は、「+」を押した場合と同じにする。 ボタンを押した場合の動作: モードにしたがって計算し、その結果をSに記憶する。 入力欄をクリアする。 モードを今押したボタンに合わせて変更する。 こんなアルゴリズムにすれば普通の計算機のようになるでしょう。 入力欄が空の時のボタンの動作が不定ですが、空の時は0と見なせばとりあえず大丈夫です。
お礼
wolvさん、アドバイスありがとうございました。m(__)m 初めてマイナスボタンが押された時に、 起動直後に「+」ボタンを押した場合と、同じ処理をしてあげることにより、 解消できました。 そうしないと、マイナス付いてしまいます。 演算ボタンを押した時のモード変数も導入してみました。 なんとか、上手く動いています。 本当に、ありがとうございました。m(__)m おかげで、とても勉強になりました。
- wolv
- ベストアンサー率37% (376/1001)
このプログラムは、こういう仕様のようです。つまり、「+」「-」ボタンは、普通の計算機のとちがい、「を足す」「を引く」という動作をします。 (普通の計算機での動作は、「この後入力するデータを足す」「この後…を引く」ですね。) 普通の計算機のようにするなら、アルゴリズムを大幅に変更する必要があります。
お礼
アドバイスありがとうございます。 「一つ前に押された演算キーを記憶しておく。」と言うお言葉、 大変参考になりました。 本当にありがとうございました。 一様、自分なりにコードを変更してみました。 まだ、プラスとマイナス機能だけですが。(バグもあるかも。(^_^;)) ************************************************************** Option Explicit Dim EnterFlag As Boolean 'プラス、マイナスボタンが押された時にテキストを空白にする。 Dim Ans As Long '計算結果の退避変数 Dim Enzan As Integer '演算処理変数 Private Sub Keisan() Select Case Enzan Case 1 '加算処理と、始めてマイナスボタンが押された時 Ans = Ans + Val(Text1.Text) Text1.Text = Ans EnterFlag = True Case 2 '減算処理 Ans = Ans - Val(Text1.Text) Text1.Text = Ans EnterFlag = True End Select End Sub Private Sub Clear_Click() Text1.Text = "" Ans = 0 Enzan = 1 End Sub Private Sub Plas_Click() Call Keisan 'プラスボタンが押された時、前回の計算結果を算出するプロシージャへ Enzan = 1 End Sub Private Sub Mainas_Click() Call Keisan '演算フラグを変更する前に、計算結果算出プロシージャへ。ポイント(自分なりの) Enzan = 2 End Sub Private Sub Form_Load() Text1.Text = "" Ans = 0 Enzan = 1 '初めてマイナスボタンが押された時、加算処理を実行するための初期設定 End Sub Private Sub key_Click(Index As Integer) If EnterFlag Then Text1.Text = "" EnterFlag = False End If If Len(Text1.Text) < 10 Then Text1.Text = Text1.Text & Index End If End Sub **************************************************************** もし、時間等がありましたら、バグあったら教えてくれると嬉しいです。 本当に、ありがとうございました。m(__)m