VB.NETで電卓にメモリ機能を追加する方法

このQ&Aのポイント
  • VB.NETを使用して、電卓にメモリ機能を追加する方法について教えてください。
  • 要約文2
  • 要約文3
回答を見る
  • ベストアンサー

VB 電卓 メモリー機能

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

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

  • ベストアンサー
  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.2

★それでは補足要求します。 ・まず電卓キーを入力してそれを表示などしますが、その方法(アルゴリズム)と構造体などの  変数について教えてくれますか?→メモリ変数は『curMemory』だと分かりますが…。 ・基本的にボタン・イベントに直接電卓の機能を記述しているのですか?  私は複数の関数に電卓機能を分けて作成しました。このとき、キーをクリックしたらその  関数を呼び出すようにして分かりやすく管理して電卓を実装しました。 ・四則演算の部分だけでよいので、簡略化した(重要な部分)を『この回答への補足』に記述して下さい。  ソースを解読してアルゴリズムを探ります。また、このときにちょっとしたコメントを追加して  下さい。→『txtDisplay.Text』は『電卓の表示用のテキストボックス』などと1行程度でいいので  コメントなどをお願いします。 ・以上。待っています。

very-dou
質問者

補足

何度も申し訳ありません。 仕様はこのサイト様とほぼ同じつくりの 電卓です。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』 →二つ目の数値(演算子の後に入力した数値)を覚えておく変数 これが、演算子を押されたときの処理です。 おいそがしいところ、申し訳ありません。

その他の回答 (3)

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答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除算エラー』には対応しているようですね。忘れがちです。この処理。

  • PED02744
  • ベストアンサー率40% (157/390)
回答No.3

う~ん。。何がわからないのか、わからないんですが(笑) >「メモリー機能をClickしたときにcallで呼び出すようにしました。」 なんて、言っている時点で、私の理解を超えてます(^_^;) ようは「画面に表示されないデータをどこで覚えておけばよいの?」 って話ではないかとおもったんですが、違うでしょうか? もし、そうなら、「Shared」が幸せになれるキーワードかもしれません。

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答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 つの変数を用意して管理すると  演算処理が簡単です。 ・以上。おわり。→電卓作り応援します。頑張って操作性の良い『卓上電気計算機』=電卓を作って下さい。

very-dou
質問者

お礼

ありがとうございます。 メモリー機能をClickしたときに callで呼び出すようにしました。 Mの表示はうまくできました。 私自身変数のつかいかたが理解できていないようです。 私の力不足で解決できませんでした。 申し訳ありません。

関連するQ&A

  • C++電卓 メモリ機能について

    VC++2010で電卓を作っているのですがメモリ機能のところがうまくいきません フォームアプリケーションで作っています M+のところは m/*メモリ用の変数/*=int::Parse(textBox1->Text); です こうしてM+を押して数字を入力するとmが消えずにそのまま数字が入力されてしまいます 同様にM-、MC、MRも教えてください よろしくお願いします!

  • 再 電卓 メモリー機能

    何度も失礼いたします。 VBで電卓を作成しメモリー機能をつけたいのですが うまくいきません。何度か、わかりやすいお答えを いただいたのですが、うまくプログラムできません。 とりあえずは、参考になるサイトを拝見させていただいたところ 普通の電卓は、なんとか作成することができました。 必要なのは、windowsのアクセサリの電卓のようなM+,MS,MR,MC の機能です。 参考にさせていただいたサイト様です ttp://www.seosoft.net/labo/vbprog/chap_10.html#onoperation アドバイスなどありましたら、よろしくお願いいたします。

  • VB電卓作成について

    今、Visual Studio NETを用いて電卓を作ろうとしています。 いろいろ調べてやっているのですが、うまくいきません。 1+2はできるのですが、1+2+3が5になってしまいます。 どうすればいいのか、どなたか教えていただけませんか? 今のコードをキーの設定以外を記載しておきます。 お願いします。 ================================================ Private Sub 数字キー(ByVal n As Integer) If CL Then R1 = 0 CL = False End If R1 = R1 * 10 + n 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 Textreg.Text = R1 End Sub Private Sub keyEQ_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles keyEQ.Click 計算() End Sub Private Sub keyCL_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles keyCL.Click Textreg.Text = "0" R1 = 0 R2 = 0 Op = 0 CL = True End Sub Private Sub Form電卓_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load Textreg.Text = 0 R1 = 0 R2 = 0 Op = 0 CL = True End Sub End Class

  • VS2005の電卓がエラーだらけ。助けて!!

    VS2005で電卓を作ろうとGUI部分はできました。 ただ並べたです。 そしてコードを書くと、変数名の宣言でもうエラー連発です。 クリアボタン(Button17)を押したら、myClear()関数を呼び出すところまで教えてください! Public Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim myInput As String = "" '入力値 Dim myCalc As String = "+" '演算値 Dim myTotal As Decimal = 0 '合計 Dim myFlag As Boolean = True '入力フラグ(False:数値 True:演算子) End Sub myValue(ByVal setData As Decimal){ myFlag = False myInput += setData TextBox1 = myInput } myCalculate(ByVal setData As String){ Private myWork As Decimal = 0 if(myFlag == False){ myFlag = True myWork = myTotal + MyCalc + myInput myTotal = eval(myWork) myInput = "" TextBox1 = myTotal } else if(setData == "="){ myTotal = 0 MyCalc = "+" } else { MyCalc = setData } } myClear(){ MyCalc = "+" myInput = "" myTotal = 0 TextBox1 = myTotal } Private Sub Button17_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button17.Click myClear() End Sub

  • プログラミングVBです

    対数のeの値を出すプログラムをつくりたいのですが Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim m, n, s, k As Double k = 1 s = 1 For n = 1 To 1000 Step 1 For m = 1 To n Step 1 s = s * m Next k = k + 1 / s Next TextBox1.Text = Format(k, "#.################") End Sub 自力でつくったこれだと微妙に値が変わってしまいます どこが違いますか? おしえてください

  • 電卓のメモリボタン使い方

    メモリボタンのMSとM+とMCとMRの使い方がネットで調べてもよくわからないのですがどのように使うのか教えてください。

  • VB、教えてください。

    VB、教えてください。 5つのラベルが縦に並んでいます。 label0 label1 label2 label3 label4 あらかじめ、 Dim m as integer=0 を宣言し、 どうにかして "label"という文字列とmという数字をくっつけ、 label0 label1… という風にできないでしょうか。 そして label"m".text=10*m というような表示を作りたいのですが。 下記のようなイメージです。分かりにくかったらごめんなさい。 Public Class Form1 Dim m As Integer = 0 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click lblmessage(+("m").Text = 10*m m = m + 1 End Sub End Class

  • vbのsavefiledialogについて

    vbで、テキストボックスに、文字を入力し、ボタン2をクリックすると、ユーザーが指定したところに、指定した名前で、txt形式、html形式、doc形式(このうち、txtと、htmlは必須。)で保存するプログラムを作りたいと思っております。 サイトを見てみますが、なかなかよいものが見つかりません。どなたか教えてください。 書きかけのプログラムと、フォーム図を載せておきます。 また、変更した方がよければ、そちらもおしえてください。 Public Class Form1 Dim texta As String Dim a Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Button1.Text = "リセット" Button2.Text = "保存" texta = TextBox1.Text End Sub Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged texta = TextBox1.Text End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click TextBox1.Text = "" End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click a = DialogResult SaveFileDialog1.OverwritePrompt = True SaveFileDialog1.FileName = "" SaveFileDialog1.Filter = "テキストファイル(*.txt)|*.txt|すべてのファイル(*.*)|*.*" a = SaveFileDialog1.ShowDialog If a = Windows.Forms.DialogResult.OK Then Label1.Text = IO.Path.GetDirectoryName(SaveFileDialog1.FileName) Label2.Text = IO.Path.GetFileName(SaveFileDialog1.FileName) Else Label1.Text = "キャンセルされました。" Label2.Text = "" End If End Sub End Class

  • VB初心者です。コードの書き方が分かりません。

    VB初心者です。 VBで(zのn乗)-(xのn乗+yのn乗)の計算が出来るようにしたいのですが、答えが必ず-1になってしまいます。 Option Explicit On Public Class Form1 Dim x As Long Dim y As Long Dim z As Long Dim n As Long Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Me.Close() End Sub Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged End Sub Private Sub TextBox2_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox2.TextChanged End Sub Private Sub TextBox3_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox3.TextChanged End Sub Private Sub TextBox4_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox4.TextChanged End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click TextBox5.Text = (z ^ n) - (x ^ n + y ^ n) End Sub End Class 正しいコードの書き方を教えて下さい。 また特定の答えのときにメッセージを表示したいのですが、どうすればいいですか?

  • VBで倍数を出したい

    VBで倍数を出したい よろしくお願いします。 おそらく基本なんだと思うのですが、さっぱりわかりません。 TextBox Label Buttonと並んでいて、 TextBoxに入った整数に対し、 Buttonを1度押すたびに、 Labelに倍数が表記されていく、 という趣旨なのですが。 まず、前段階として下記を作らされました。 Public Class Form1 Dim i As Integer Dim m As Integer Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click i = TextBox1.Text lblmessage.Text = i + m m = lblmessage.Text End Sub End Class このように、labelの数字がどんどん変わっていくのはできたのですが、問題は、 Text…10 Label…10    20    30    40    50    60    70    80    90    100 となり、しかも一度に出るのではなく、Buttonひと押しにつき一つの解が出ね 次の一押しで改行され解が出る。 かつ、100で打ち止めにすること…だそうです。 いちおうめちゃくちゃですが、みんな風に作りました。 Public Class Form1 Dim a As Integer Dim b As Integer Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim b As Integer = 10 a = TextBox1.Text lblMessage.Text = a & ControlChars.CrLf & a + b End Sub End Class どうかヒントだけでもお願いします。