こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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には、必ずマイナス
が入ってしまう状態です。

上手く減算処理出来る方法のアドバイスよろしくお願いします。

投稿日時 - 2002-07-10 08:58:40

QNo.310651

困ってます

質問者が選んだベストアンサー

これは、業務用でよく使われる電卓と同じ仕様ですね。
初めてマイナスを押したときに結果がマイナスになるのは正しい動作です。
どういう理由だったか忘れましたが、この方が効率が良い場合があるので
先に数値、その次に演算という入力順序になっているそうです。

それはさておき、普通の電卓と同じ処理をしたいのであれば、
一つ前に押された演算キーを記憶しておいて、新しい演算キーが押されたときに
一つ前の演算を処理する、というような流れになるのではないかと思います。
そうすると、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

といった感じでしょうか?
とりあえず、ぱっと思いついただけなので他にも良い方法があるかもしれません。
がんばってください。

投稿日時 - 2002-07-10 11:58:06

お礼

アドバイスありがとうございます。
「一つ前に押された演算キーを記憶しておく。」と言うお言葉、
大変参考になりました。
本当にありがとうございました。
一様、自分なりにコードを変更してみました。
まだ、プラスとマイナス機能だけですが。(バグもあるかも。(^_^;))

**************************************************************
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

投稿日時 - 2002-07-11 12:04:42

ANo.3

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.2

モードを表す変数を導入する。最後に押した機能キーによってモードを変える。起動直後は、「+」を押した場合と同じにする。

ボタンを押した場合の動作:
 モードにしたがって計算し、その結果をSに記憶する。
 入力欄をクリアする。
 モードを今押したボタンに合わせて変更する。

こんなアルゴリズムにすれば普通の計算機のようになるでしょう。
入力欄が空の時のボタンの動作が不定ですが、空の時は0と見なせばとりあえず大丈夫です。

投稿日時 - 2002-07-10 09:30:18

お礼

wolvさん、アドバイスありがとうございました。m(__)m
初めてマイナスボタンが押された時に、
起動直後に「+」ボタンを押した場合と、同じ処理をしてあげることにより、
解消できました。
そうしないと、マイナス付いてしまいます。

演算ボタンを押した時のモード変数も導入してみました。
なんとか、上手く動いています。

本当に、ありがとうございました。m(__)m
おかげで、とても勉強になりました。

投稿日時 - 2002-07-11 12:11:23

ANo.1

このプログラムは、こういう仕様のようです。つまり、「+」「-」ボタンは、普通の計算機のとちがい、「を足す」「を引く」という動作をします。
(普通の計算機での動作は、「この後入力するデータを足す」「この後…を引く」ですね。)

普通の計算機のようにするなら、アルゴリズムを大幅に変更する必要があります。

投稿日時 - 2002-07-10 09:24:28

あなたにオススメの質問