質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VB

VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。

Q&A

解決済

1回答

8681閲覧

VB 電卓 Part2

Strauss

総合スコア32

VB

VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。

0グッド

1クリップ

投稿2015/06/10 05:54

こんにちは。先日はどうもお世話になりました。
現在VBで電卓を作っているものです。

なんとか連続して演算子を入力して計算すると
正しい答えが戻ってこないという問題は解決できました。

ここからなんですがあと実装すべきなのが
小数点とキーボード入力です。

現在小数点に取り組んでいまして、
小数点を押すと点はつくのですが、
そのあとの計算方法がいまだに思いつかない状況です。

ぜひご教授いただければと思います。
よろしくお願いします。

ちなみに私が思いついていた計算方法なのですが

'もし小数点があるならば
if land > 0 then
textans.text &= 1 / (10^land)
land += 1
else
textans.text &= 1
end if

landという変数を用いて
小数点を押してからN回目で押すと
その数字を10のN乗で割ってその数をそのまま電卓の画面上にある数字に
入れていくという方法を考えていました。
ただ、これだとうまくいきませんでした。

ソースコードを一部載せておきます。

数字のボタンクリック処理

'数字ボタン「1」クリック処理
Private Sub BtnOne_Click(sender As Object, e As EventArgs) Handles BtnOne.Click
'エラー表示時の処理
If TextAns.Text = "E:桁数超過" Or TextAns.Text = "0で割ることはできません" Then
Exit Sub
End If

'もし入力されたのが数字だった場合 If beforeIn >= "0" And beforeIn <= "9" Or beforeIn = "." Then '直前で押されたのが数字ボタンだった場合 'かつ、12桁未満の数値が入力されているとき If TextAns.Text.Length < 12 Then TextAns.Text &= "1" Else MsgBox("これ以上入力できません", 48, "警告メッセージ") Exit Sub End If Else TextAns.Text = "1" End If beforeIn = "1" End Sub

演算子ボタンクリック処理

'「+」ボタンクリック処理 Private Sub BtnPlus_Click(sender As Object, e As EventArgs) Handles BtnPlus.Click 'エラー表示時の処理 If TextAns.Text = "E:桁数超過" Or TextAns.Text = "0で割ることはできません" Then Exit Sub End If '12桁以下なら計算可能 If TextAns.Text.Length < 12 Then '前回入力されたのが数字の場合 If beforeIn >= "0" And beforeIn <= "9" Then If ope = "C" Then Ans = CType(TextAns.Text, Double) ElseIf ope = "+" Then 'Ansに保存されている+ボタンクリック前の数値と加算 Num = CType(TextAns.Text, Double) Ans = Ans + Num '電卓の画面に表示 If TextAns.Text.Length >= 13 Then TextAns.Text = "E:桁数超過" Exit Sub Else TextAns.Text = Ans End If ElseIf ope = "-" Then Num = CType(TextAns.Text, Double) Ans = Ans - Num '電卓の画面に表示 If TextAns.Text.Length >= 13 Then TextAns.Text = "E:桁数超過" Exit Sub Else TextAns.Text = Ans End If ElseIf ope = "*" Then Num = CType(TextAns.Text, Double) Ans = Ans * Num '電卓の画面に表示 If TextAns.Text.Length >= 13 Then TextAns.Text = "E:桁数超過" Exit Sub Else TextAns.Text = Ans End If ElseIf ope = "/" Then Num = CType(TextAns.Text, Double) If Num = 0 Then TextAns.Text = "0で割ることはできません" Exit Sub Else Ans = Ans / Num End If '電卓の画面に表示 If TextAns.Text.Length >= 13 Then TextAns.Text = "E:桁数超過" Exit Sub Else TextAns.Text = Ans End If End If Else '前回クリックされたボタンが数値以外の場合 Select Case ope Case "C" '前回がクリアボタン Ans = CType(TextAns.Text, Double) Case "=" '前回がイコールボタン Ans = Ans + Num Case "+" '前回が Num = Ans End Select End If Else MsgBox("これ以上入力できません", 48, "警告メッセージ") Exit Sub End If beforeIn = "+" ope = "+" End Sub

小数点追加ボタンクリック処理

'小数点ボタンクリック処理
Private Sub BtnComma_Click(sender As Object, e As EventArgs) Handles BtnComma.Click
'エラー表示時の処理
If TextAns.Text = "E:桁数超過" Or TextAns.Text = "0で割ることはできません" Then
Exit Sub
End If

If 0 <> InStr(TextAns.Text, ".") Then MsgBox("すでに小数点が存在しています", 48, "警告メッセージ") Exit Sub Else If TextAns.Text = "0" Then TextAns.Text = "0." land += 1 Else TextAns.Text &= "." land += 1 End If End If beforeIn = "." End Sub

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

こんにちは。

またまたWindows標準の電卓を参考にさせて頂きますが、
まずは通常の数値キーと同様に、末尾へ文字として追加していけば良いと思います。
キャストするときに自動で小数点と認識してくれるはずなので、特に小数・整数の分岐を意識しなくても良いと思います。(現時点の機能ではたぶん、おそらく、きっと…)

あとは演算子ボタンを押した時点で入力文字列が小数点で終わっている場合に、
その小数点は無視する(削る)
を実装してやれば良いのではないでしょうか。

投稿2015/06/10 06:03

編集2015/06/10 06:05
Tak1wa

総合スコア4791

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Strauss

2015/06/10 06:16

先ほどよく見たら自分の作っているこのコードでは、文字列から数値に変換しているみたいですね。よく考えもせず参考にしながらつくっていなかったので本当に盲点でした。確かにそれならば各数字のボタンには細かい処理は必要ないですね。ありがとうございました。今のところ(0.238653)と数値を入力し、掛け算と割り算をすると答えがかえってきました。ただ、足し算と引き算はまったくもって小数点より上の数値でないと反応がありません。
Tak1wa

2015/06/10 06:21

参考までに、変数AnsとNumの型は何でしたか?
Strauss

2015/06/10 06:23

型はDoubleでしたが、先ほど正確な数値を出せるというDecimalに置換しました。 結果的には変わらず、+とーだけできないという状況です。
Tak1wa

2015/06/10 06:28

出来ない、反応がない、とは具体的にどのような状況でしょうか?
Strauss

2015/06/10 06:39

例えば0.23 * 2 と入力しイコールを押すと0.46と表示されます。この後連続で演算子を押してもそのまま2をかけていきます。ただ、足し算と割り算だけは、小数点より上の数値しか反応せず、0.23 - 0.20 でイコールボタンを押すと数値は変わらずといった結果になってしまうという状況です。
Tak1wa

2015/06/10 06:41

3.23 - 1.33 とすると結果はどうなります?詳しく見てないのではっきりしてませんが、どこかで整数値に丸められてしまっている印象を受けます。
Strauss

2015/06/10 06:47

正しい結果が多分1.9だと思いますが、2.23と帰ってきました・・・。どこかで型変換がうまくいってないのでしょうか?
Tak1wa

2015/06/10 06:58

きっとそうですね。 現状からみるとOption Strict Offになっていると思うので、ソース先頭行にOption Strict Onを入れてみてください。 DoubleからIntegerに暗黙的に変換しようとしている箇所が浮かび上がりませんか?
Strauss

2015/06/10 07:03

誠に申し訳ございません!見落としていた箇所がありました。イコールボタンのところでCType(TextAns.Text,Long)型変換がlongになっていました・・・。本当お騒がせしました。無事小数点含めても+、-、×、÷ができるようになりました。本当にありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問