- ベストアンサー
VB.NETで電卓にメモリ機能を追加する方法
- VB.NETを使用して、電卓にメモリ機能を追加する方法について教えてください。
- 要約文2
- 要約文3
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
★それでは補足要求します。 ・まず電卓キーを入力してそれを表示などしますが、その方法(アルゴリズム)と構造体などの 変数について教えてくれますか?→メモリ変数は『curMemory』だと分かりますが…。 ・基本的にボタン・イベントに直接電卓の機能を記述しているのですか? 私は複数の関数に電卓機能を分けて作成しました。このとき、キーをクリックしたらその 関数を呼び出すようにして分かりやすく管理して電卓を実装しました。 ・四則演算の部分だけでよいので、簡略化した(重要な部分)を『この回答への補足』に記述して下さい。 ソースを解読してアルゴリズムを探ります。また、このときにちょっとしたコメントを追加して 下さい。→『txtDisplay.Text』は『電卓の表示用のテキストボックス』などと1行程度でいいので コメントなどをお願いします。 ・以上。待っています。
その他の回答 (3)
- Oh-Orange
- ベストアンサー率63% (854/1345)
★まずはメモリ演算用の定数を増やします。 ・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除算エラー』には対応しているようですね。忘れがちです。この処理。
- PED02744
- ベストアンサー率40% (157/390)
う~ん。。何がわからないのか、わからないんですが(笑) >「メモリー機能をClickしたときにcallで呼び出すようにしました。」 なんて、言っている時点で、私の理解を超えてます(^_^;) ようは「画面に表示されないデータをどこで覚えておけばよいの?」 って話ではないかとおもったんですが、違うでしょうか? もし、そうなら、「Shared」が幸せになれるキーワードかもしれません。
- Oh-Orange
- ベストアンサー率63% (854/1345)
★アルゴリズムのアドバイスになります。 ・電卓管理の構造が分からないため詳しくはアドバイスできません。念のために。 ・昔、私が電卓を作成したときにメモリ機能を作るうえで次の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の表示はうまくできました。 私自身変数のつかいかたが理解できていないようです。 私の力不足で解決できませんでした。 申し訳ありません。
補足
何度も申し訳ありません。 仕様はこのサイト様とほぼ同じつくりの 電卓です。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』 →二つ目の数値(演算子の後に入力した数値)を覚えておく変数 これが、演算子を押されたときの処理です。 おいそがしいところ、申し訳ありません。