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

解決済みの質問

電卓作成(緊急です!!)

電卓作成(緊急です!!)

以下のようなコードで電卓を作りました。これで完成かな?と思いきや1+2=7-8=29、1+2+3=5 となり不具合が出てしまいました。どう直せばこれを解決できますか?(=の所がおかしい?)


Public Class Form電卓
Inherits System.Windows.Forms.Form
Dim R1 As Integer 'レジスタの値
Dim R2 As Integer 'レジスタの保存
Dim Op As Integer '演算子
Dim CL As Integer '数字列の制御

windows フォームデザイナーで生成されたコード

Private Sub Button終了_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button終了.Click
End
End Sub
Private Sub 数字キー(ByVal k As Integer)
If CL Then
R1 = 0
CL = False
End If
R1 = R1 * 10 + k
TextReg.Text = R1
End Sub
Private Sub 演算キー(ByVal o As Integer)
Op = o
R2 = R1
CL = True
End Sub
Private Sub 計算()
Select Case Op
Case 1
R1 = R2 + R1
Case 2
R1 = R2 - R1
Case 3
R1 = R2 * R1
Case 4
R1 = R2 \ R1
End Select
End Sub
Private Sub KeyN0_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles KeyN0.Click
数字キー(0)
End Sub
’(引数が1~9と置き換わったコードがこの下に続きますが長くなるので今は省略します)

Private Sub KeyOA_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles KeyOA.Click
演算キー(1)
End Sub
’(引数が2~4と置き換わったコードがこの下に続きますが長くなるので今は省略します)

Private Sub KeyEg_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles KeyEg.Click
計算()
TextReg.Text = R1
End Sub
Private Sub KeyCl_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles KeyCl.Click
R1 = 0
R2 = 0
Op = 0
CL = True
TextReg.Text = ""
End Sub
Private Sub Form電卓_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
R1 = 0
R2 = 0
Op = 0
CL = True
TextReg.Text = ""
End Sub
End Class

投稿日時 - 2010-06-25 10:13:23

QNo.5993691

すぐに回答ほしいです

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

>もう一度計算()を付け加えるのでしょうか?

そのとおり。

Private Sub KeyOA_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles KeyOA.Click
計算()    ' ← 追加
演算キー(1)
End Sub
(他の演算子も同様)


あと、計算直後にOpをクリアしておく必要があります。

Private Sub 計算()
Select Case Op
Case 1
・・・略・・
End Select
Op = 0    ' ← 追加
End Sub


完璧を期すなら、
-5+7=
のように最初に符号が入る場合も考慮しましょう。
この場合のマイナス(-)は単項演算子と言います。
二項演算子とは区別しなければなりません。

投稿日時 - 2010-07-20 21:57:55

お礼

具体的な解決策ありがとうございます!!

投稿日時 - 2010-07-24 16:28:53

ANo.5

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

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

回答(4)

ANo.3

1+2=7-8=
とクリックした場合は、
1+2=
の時点でR1に3が入りますが、CLをTrueにしていないので、つぎに7をクリックすると、37になってしまいます。
なので、
37-8=29
という結果になっています。

投稿日時 - 2010-06-25 14:58:09

お礼

CLをTrueにしたら解決しました!
ありがとうございます!

投稿日時 - 2010-07-16 16:13:59

ANo.2

KeyEg_Clickのときしか計算をしていませんね。

1+2+3=
とクリックした場合は、2回目の+をクリックした時点で1+2の計算をしなければなりません。

投稿日時 - 2010-06-25 14:45:19

お礼

もう一度計算()を付け加えるのでしょうか?

投稿日時 - 2010-07-16 16:19:21

ANo.1

どのようなdebugをしたのでしょうか?
それぞれの動作において、ステップごとに変数がどんな値になっているのか確認してみましたか?

投稿日時 - 2010-06-25 14:10:39