VB.NETで電卓にメモリ機能をつけたいのですが
ソースがわかりません。
とりあえずメモリ用の変数を一つ用意して、
下記に機能はこのような感じだと思って書いてみました。
M+:メモリ用の変数に現在の値を加算する
MS:メモリーに記録。今までのは消える。
MR:メモリ用の変数の値を現在の値とし、ディスプレイに表示。
MC:メモリ用の変数をゼロクリアする
M+の場合
Dim curmemory As Decimal
Private Sub cmdMemoryPlus_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdMemoryPlus.Click
curMemory = curMemory + txtDisplay.Text
curMemory = curMemory + Val(txtDisplay.Text)
MCは何とかわかりそうなのですが、M+でもあたっているか
わからない上に、MS、MRはまったくわかりません。
申し訳ありませんが、アドバイス等よろしくお願いいたします。
No.2ベストアンサー
- 回答日時:
★それでは補足要求します。
・まず電卓キーを入力してそれを表示などしますが、その方法(アルゴリズム)と構造体などの
変数について教えてくれますか?→メモリ変数は『curMemory』だと分かりますが…。
・基本的にボタン・イベントに直接電卓の機能を記述しているのですか?
私は複数の関数に電卓機能を分けて作成しました。このとき、キーをクリックしたらその
関数を呼び出すようにして分かりやすく管理して電卓を実装しました。
・四則演算の部分だけでよいので、簡略化した(重要な部分)を『この回答への補足』に記述して下さい。
ソースを解読してアルゴリズムを探ります。また、このときにちょっとしたコメントを追加して
下さい。→『txtDisplay.Text』は『電卓の表示用のテキストボックス』などと1行程度でいいので
コメントなどをお願いします。
・以上。待っています。
この回答への補足
何度も申し訳ありません。
仕様はこのサイト様とほぼ同じつくりの
電卓です。http://www.seosoft.net/labo/vbprog/chap_9.html
Private Sub OnOperation(intOp As Integer)
演算子が押されたときの処理
2 : If intPrevOperation = OP_ERROR Then
3 : Exit Sub
4 : End If
5 :
6 : If intLastKey = KEY_NUMBER Or intOp = OP_EQUAL Then
7 : Select Case intPrevOperation
8 : Case OP_PLUS
9 : dblPrevNumber = dblPrevNumber + dblCurrentNumber
10 : txtDisplay.text = CStr(dblPrevNumber)
11 : Case OP_MINUS
12 : dblPrevNumber = dblPrevNumber - dblCurrentNumber
13 : txtDisplay.text = CStr(dblPrevNumber)
14 : Case OP_MULTIPLE
15 : dblPrevNumber = dblPrevNumber * dblCurrentNumber
16 : txtDisplay.Caption = CStr(dblPrevNumber)
17 : Case OP_DIVIDE
18 : If dblCurrentNumber = 0 Then
19 : txtDisplay.text = "E"
20 : intPrevOperation = OP_ERROR
21 : Exit Sub
22 : Else
23 : dblPrevNumber = dblPrevNumber / dblCurrentNumber
24 : txtDisplay.text = CStr(dblPrevNumber)
25 : End If
26 : End Select
27 : End If
『intPrevOperation』→演算子(二つ目の数値の前)を覚えておく変数
『OP_ERROR』→演算子の種類を表す定数(エラー)の定数
同じようにOP_EQUAL → = OP_PLUS → +
『intLastKey』→直前に押されたキーの変数
『KEY_NUMBER 』→直前のキーの種類の定数(数値)
『dblPrevNumber』→ 一つ目の数値(演算子の前に入力した数値)を覚えておく変数
『dblCurrentNumber』 →二つ目の数値(演算子の後に入力した数値)を覚えておく変数
これが、演算子を押されたときの処理です。
おいそがしいところ、申し訳ありません。
No.4
- 回答日時:
★まずはメモリ演算用の定数を増やします。
・very-dou さんの過去の質問も参照しました。
仮に次の定数があるとして説明します。→ご自分で分かりやすい名前に変更なりして下さい。
定数の値は『OP_xxxx』と重複しないように決めます。
『M+』キー機能→『MEM_PLUS』
『M-』キー機能→『MEM_MINUS』
『MS』キー機能→『MEM_STORE』
『MR』キー機能→『MEM_RECALL』
『MC』キー機能→『MEM_CLEAR』
・あと『KEY_NUMBER』と同じ意味合いの『KEY_MEMORY』という定数を付け加えて下さい。
『KEY_MEMORY』は『M+』『M-』『MS』『MR』『MC』キーの押し下げを表します。
・それから『txtMemory.text』がメモリの『M』表示です。ここでの説明の都合上ですよ。
・なお『M+』、『M-』はイコール機能は兼ねないタイプにします。これは、Windows の電卓の
仕様と同じにするためです。多分、very-dou さんは Windows 電卓を参考に作りたいと思う
のでこの仕様に合わせます。
・アルゴリズムは前回の通りです。そのアルゴリズムを元に実装例のサンプルを紹介します。
サンプル:
If (intLastKey = KEY_NUMBER) Or (intOp = OP_EQUAL) Then
:
ここは質問者さんの OP_PLUS ~ OP_DIVIDE の処理です。
:
ElseIf intLastKey = KEY_MEMORY Then
Select Case intPrevOperation
Case MEM_PLUS 'M+
curMemory = curMemory + dblCurrentNumber
txtMemory.text = "M" '[M]表示を出す
Case MEM_MINUS 'M-
curMemory = curMemory - dblCurrentNumber
txtMemory.text = "M" '[M]表示を出す
Case MEM_STORE 'MS
curMemory = dblCurrentNumber
txtMemory.text = "M" '[M]表示を出す
Case MEM_RECALL 'MR
dblCurrentNumber = curMemory
txtDisplay.text = CStr(dblCurrentNumber)
Case MEM_CLEAR 'MC
curMemory = 0
txtMemory.text = " " '[M]表示を消す
End Select
End If
最後に:
・メモリ数値のオーバーフロー処理は省略しています。
『OP_PLUS』~『OP_DIVIDE』と『MEM_PLUS』、『MEM_MINUS』で演算時の桁オーバーも
チェックして電卓画面に『E』または、『OVERFLLOW』などと表示する仕組みも組み込んで
見ましょう。→別のルーチンで処理している場合は『OnOperation』内では必要ありません。
・以上。おわり。→『0除算エラー』には対応しているようですね。忘れがちです。この処理。
No.3
- 回答日時:
う~ん。
。何がわからないのか、わからないんですが(笑)>「メモリー機能をClickしたときにcallで呼び出すようにしました。」
なんて、言っている時点で、私の理解を超えてます(^_^;)
ようは「画面に表示されないデータをどこで覚えておけばよいの?」
って話ではないかとおもったんですが、違うでしょうか?
もし、そうなら、「Shared」が幸せになれるキーワードかもしれません。
No.1
- 回答日時:
★アルゴリズムのアドバイスになります。
・電卓管理の構造が分からないため詳しくはアドバイスできません。念のために。
・昔、私が電卓を作成したときにメモリ機能を作るうえで次の3つの変数を使いました。
(1)入力用の変数(X)⇒キーボードから入力した数字を保管しておくための変数
(2)演算用の変数(Y)⇒演算結果が毎回格納される変数で、最終的にこれが計算結果として表示する変数
(3)メモリの変数(M)⇒これがメモリ機能の変数です
・上記の X、Y、M を使って説明します。
●『M+』
・変数(M)に変数(Y)を加算します。⇒M=M+Y
・このとき『M+』キーが押されたときに『=』イコールもかねる場合は演算する関数を読んだ後に、
(Y)から(M)へ加算します。
●『MS』
・変数(M)に変数(X)を代入します。⇒M=X
・『MS』キーは電卓の表示されている数値を直接代入する必要があるため、変数(Y)ではありません。
●『MR』
・変数(M)を変数(X)、もしくは変数(Y)へ代入します。⇒X=M、Y=M
・『MR』キーは計算中と計算完了(イコールが押された後)で動作が異なります。
計算中では変数(X)をクリアする処理『CE』キーの動作を行ってから、変数(M)を変数(X)へ代入します。
計算完了では変数(Y)にそのまま変数(M)を代入します。
●『MC』
・単純に変数(M)に『0』を代入して表示の『M』を消します。
サンプル:
Select Case ope '0~4でメモリ演算を指定
Case 0: 'MC
M = 0
[M]表示を消す
Case 1: 'MS
M = X
[M]表示を出す
Case 2: 'M+
[=]ボタンの処理を呼び出す
M = M + Y
[M]表示を出す
Case 3: 'M-
[=]ボタンの処理を呼び出す
M = M - Y
[M]表示を出す
Case 4: 'MR
If calcmode=true Then
[CE]ボタンの処理を呼び出す
X = M
電卓入力の数値表示を出す
Else
Y = M
End If
End Select
最後に:
・very-dou さんの電卓アルゴリズムがよく分からないため、私が昔作成した電卓アルゴリズムに
基づき擬似サンプル・コードを載せました。冒頭で紹介した変数(X,Y,M)をちゃんと管理すれば
かなり簡単に電卓は出来ます。→問題はキー操作などのタイミングですね。
・入力用の変数(X)、演算用の変数(Y)、メモリの変数(M)の最低 3 つの変数を用意して管理すると
演算処理が簡単です。
・以上。おわり。→電卓作り応援します。頑張って操作性の良い『卓上電気計算機』=電卓を作って下さい。
ありがとうございます。
メモリー機能をClickしたときに
callで呼び出すようにしました。
Mの表示はうまくできました。
私自身変数のつかいかたが理解できていないようです。
私の力不足で解決できませんでした。
申し訳ありません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 九九の答えの計算 3 2022/12/20 22:13
- Visual Basic(VBA) VBA Userformで一部別シートに転記がしたいのですが 2 2023/05/24 13:08
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- Visual Basic(VBA) ExcelからAccessのテーブルに書き込む時に時間がかかる 1 2022/10/14 20:38
- CPU・メモリ・マザーボード ノートパソコンの値段のからくりについて。メモリーが、 8GBから16GBの場合に、ノートパソコンの値 12 2023/07/27 09:02
- Visual Basic(VBA) Vbaで数式をポーランド記法に変換するコードを作って実行しようとするとフリーズします。 1 2022/05/24 17:53
- Visual Basic(VBA) 正規表現を用いての並び替え 7 2022/04/04 09:27
- Visual Basic(VBA) VBA 別ブックからの転記の高速化について VBA 別ブックからの転記の高速化についてご教授下さい。 19 2022/07/26 13:07
- Visual Basic(VBA) VBA リスト表示していますが 3 2023/05/18 12:12
- Visual Basic(VBA) Visual Basic : ImageListの画像がそろったときにメッセージを表示 1 2023/07/20 13:53
このQ&Aを見た人はこんなQ&Aも見ています
-
性格の違いは生まれた順番で決まる?長男長女・中間子・末っ子・一人っ子の性格の傾向
同じ環境で生まれ育っても、生まれ順で性格は違うものなのだろうか。家庭教育研究家の田宮由美さんに教えてもらった。
-
VBで電卓のメモリー機能はどのように作るのですか。
Visual Basic(VBA)
-
VBでの簡易電卓の作成(減算方法)で困っています。
Visual Basic(VBA)
-
c# 文字列の最後から1文字削除したい
C言語・C++・C#
-
-
4
0での割り算
Visual Basic(VBA)
-
5
visual basic初心者です。 visual studioで電卓を作成しています。 実行時にテ
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Excelでのセル内容の高速消去方法
-
DoEvents関数って何?
-
小数点を含む数値かどうか判断...
-
異なるプログラミング言語を連...
-
win10で、正確な待ち時間の作り方
-
If Not c Is Nothing Then ~延...
-
あっち向いてホイのプログラム...
-
テキストファイルの空行をスキ...
-
EXCELが高速に動く、PCを教えて...
-
VBでの簡易電卓の作成(減算方...
-
ナップザック問題?をエクセル...
-
VB.NETにおける二値化処理の高速化
-
実行時のCPU使用率を増やしたい
-
基本情報技術者試験詳しい方へ...
-
Macターミナルで実行中のプログ...
-
逆コンパイルと逆アセンブルの...
-
緯度、経度の 10進法と 60進法...
-
イラストレーターCS4のシリアル...
-
C言語で、メモリを解放しないで...
-
【C言語】再帰が時間がかかる...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
DoEvents関数って何?
-
win10で、正確な待ち時間の作り方
-
Excelでのセル内容の高速消去方法
-
小数点を含む数値かどうか判断...
-
Chat GPTに、課題として、二と...
-
SQLの速度をあげるには・・・
-
絶対パスの取得について
-
WebBrowserの読み込み待ちの処...
-
実行時のCPU使用率を増やしたい
-
プログラム上のCPU稼働率低減に...
-
ノットイコールを教えて下さい
-
C言語:関数を使うメリットとデ...
-
Excel(VBA)でSetTimer関数を使...
-
あっち向いてホイのプログラム...
-
VC++2010 GDIオブジェクトの解...
-
If Not c Is Nothing Then ~延...
-
Excel VBA での処理時間計測結...
-
符号付きにすべきか、符号なし...
-
ソートにかかった時間を測りたい。
-
プログラミングの授業でPython...
おすすめ情報