アプリ版:「スタンプのみでお礼する」機能のリリースについて

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はまったくわかりません。
申し訳ありませんが、アドバイス等よろしくお願いいたします。

A 回答 (4件)

★それでは補足要求します。


・まず電卓キーを入力してそれを表示などしますが、その方法(アルゴリズム)と構造体などの
 変数について教えてくれますか?→メモリ変数は『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』 →二つ目の数値(演算子の後に入力した数値)を覚えておく変数

これが、演算子を押されたときの処理です。

おいそがしいところ、申し訳ありません。

補足日時:2007/03/12 13:38
    • good
    • 0

★まずはメモリ演算用の定数を増やします。


・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除算エラー』には対応しているようですね。忘れがちです。この処理。
    • good
    • 0

う~ん。

。何がわからないのか、わからないんですが(笑)
>「メモリー機能をClickしたときにcallで呼び出すようにしました。」
なんて、言っている時点で、私の理解を超えてます(^_^;)

ようは「画面に表示されないデータをどこで覚えておけばよいの?」
って話ではないかとおもったんですが、違うでしょうか?
もし、そうなら、「Shared」が幸せになれるキーワードかもしれません。
    • good
    • 0

★アルゴリズムのアドバイスになります。


・電卓管理の構造が分からないため詳しくはアドバイスできません。念のために。
・昔、私が電卓を作成したときにメモリ機能を作るうえで次の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 つの変数を用意して管理すると
 演算処理が簡単です。
・以上。おわり。→電卓作り応援します。頑張って操作性の良い『卓上電気計算機』=電卓を作って下さい。
    • good
    • 0
この回答へのお礼

ありがとうございます。
メモリー機能をClickしたときに
callで呼び出すようにしました。

Mの表示はうまくできました。
私自身変数のつかいかたが理解できていないようです。
私の力不足で解決できませんでした。
申し訳ありません。

お礼日時:2007/03/12 02:23

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!