今日は、「ExcelVBAで電卓を作ろう」の2回目です。
なお、1回目は、複数のコントロールのイベントを一つのプロシージャにまとめる(ExcelVBA)です。
(タイトルが全然違ってます。すみません)
さて、今回は、どういう方法で電卓の機能をプログラムするかを一緒に考えてみましょう。
これは、非常に重要です。
例えば、「1+1= 」と電卓のボタンを押すと、答の2が画面に表示されなければなりません。
そのためには、どうすればいいのかを考えましょう。
まず、押したボタンの情報をきちんと記憶しておくことが重要です。
どのボタンを押しても、そのボタンの情報をきちんと記憶させておくためには、変数を活用します。
具体的には、「1」「+」「1」「=」の4つのボタンを押していますから、この4つの情報を記憶させる変数が必要です。
それでは、変数は、4つ必要でしょうか?
もし、「1+2-3=」 という計算をしたい場合は、全部で6個の変数が必要ということでしょうか?
すると、長い計算をする場合は、その分変数が必要となります。
なんだか、大変な話になってきましたね。
実は、単純な四則演算ならば、用意する変数は3つあれば何とかなります。
そのうちの2つは、数字を格納する変数です。
もうひとつは、加減乗除のどの演算をおこなうかの情報を格納する変数です。
なぜかというと、長い計算でも、常に、「数字」「記号」「数字」 の構造が続くだけだからです。
つまり、「1 + 1」 は、「数字が1」「記号が+」「数字が1」という構造です。
それでは、「1 + 2 - 3 =」は、どうでしょうか?
まず、「1 + 2」は、「数字が1」「記号が+」「数字が2」ということですから、上記の構造になっています。
その後ですが、「1 + 2」は、3 のことですから、「3 - 3」ということになります。
すると、やはり上記の構造となりますね。
長い計算式は、このように最初から順に計算していくことによって、
常に、「数字」「記号」「数字」 の構造になるのです。
この構造に対応する変数は、3つあればいいことになります。
(補足しておきますが「=」の記号も記号用の変数に格納することになります。)
数字を格納する変数は、好きな名前で結構ですが、今回は、配列を使ってみます。
stack(0) と stack(1) という名前にしてみました。
スタックというのは、アルゴリズムのテキストを見れば必ず出てくるデータ構造の名前です。
「先入れ後出し」 が特徴です。詳しいことは、各自調べてみてください。
計算の処理は、実は、スタック構造なのです。
なお、この配列変数は、まず最初にstack(0) に値を代入し、次にstack(1)に値を代入するものとします。
この順番は、とても重要です。
そして、もうひとつ重要なことがあります。この配列変数から値を取り出す際には、
必ず後に値を入れたstack(1)のほうから取り出すということです。
イメージとしては、机の上に積み重ねられた本です。
本の上にまた本を積み重ねていきます。これは、データをどんどん入れていく過程です。
本を手に取ろうとすると、どうしても最後に積み重ねた本から取らざるを得ません。
これがデータを取り出す作業です。
まさに、「先入れ後出し」 ですよね。
また、記号を格納する変数は、Action という名前にしてみました。
それでは、「1 + 2 - 3 =」 を例にとって、データの処理の流れを追っていきましょう。
なお、処理の流れを理解しやすくするために、数字は、1桁に限るという制約をもうけます。
まず、仕込みをします。
stack(0) と stack(1)には、0を入れておきます。
そして、Action には、「+」を格納しておきます。
理由は、こうしておくと、論理がシンプルになるからです。この仕込みは重要です。
電卓の「1」ボタンを押しました。
その際、プログラムサイドでは、stack(1)に1を格納します。
次に「+」ボタンを押します。
プログラムでは、この時点で計算(演算処理)を行います。
つまり、「数字」「記号」「数字」 の構造に以下のように変数の値を適用します。
「stack(0)」「Action」「stack(1)」
つまり、変数の値で記述すると、
0 + 1
ということになります。
そして、ここが重要ですが、その計算結果である 1 を stack(0)に格納し、stack(1)を0にします。
何をしているかといいますと、スタックの構造を考えると分かりやすいです。
つまり、計算するために、stackという配列変数からデータを取り出します。
その際、最初に、あとから値を代入したstack(1) の中から値を取り出し、次に先に入れておいた
stack(0)の値を取り出します。
これが、スタックの特徴の 「先入れ後出し」 です。
一応確認ですが、この時点で、stack配列には、値が何も入っていません。
この2つの値を、Actionに格納されている記号で演算処理し、その計算結果を、再度stackに入れます。
このとき、配列変数は、空っぽですから、stack(0) に値を入れることになります。
(stack(1)には、まだ値が入っていませんが、それを表現するために0が入っていると考えてください)
そして、今回の記号を Action の中に格納します。
次に「2」ボタンを押したときの処理です。
2 を配列変数に格納します。既にstack(0)には、値が代入されているので、必然的にstack(1)に格納します。
ここまでで、「1+2」までボタンを押しましたね。もう一息です。
次に「-」ボタンを押したときの処理です。
記号のボタンなので、計算をします。
先程説明した通りの処理を行います。
つまり、stack(1)の値を最初に取り出し、次にstack(0)の値を取り出します。
そして、Actionの中に格納されている「+」を使って演算します。
その答えである 3 を、stack変数に入れます。そうです。stack(0)に 3 が入りますね。
stack(1)は、空っぽなので、0 が入っています。
そして、Action に今回の記号である「-」を格納しておきます。
次に「3」ボタンを押したときの処理です。
stack(1)に 3 を入れます。
いよいよ最後のボタンです。
「=」ボタンを押したときの処理です。
これも、記号ボタンの処理と同じですよ。
つまり、stack(1)の値を最初に取り出し、次にstack(0)の値を取り出します。
そして、Actionの中に格納されている「-」を使って演算します。
stack(0)の値 マイナス stack(1)の値 ですから、答は、0 となります。
その答えである 0 を、stack変数に入れます。そうです。stack(0)に 3 が入りますね。
stack(1)は、空っぽなので、0 が入っています。
そして、Action には、「=」を代入しておきます。
「1 + 2 - 3 =」という、たったこれだけの計算なのに、その処理を追っていくと、こんなにも長い説明に
なってしまいました。
でも、これで考え方は整理できましたね。
次回は、コードを記述しましょう。それでは、また。
だい
なお、1回目は、複数のコントロールのイベントを一つのプロシージャにまとめる(ExcelVBA)です。
(タイトルが全然違ってます。すみません)
さて、今回は、どういう方法で電卓の機能をプログラムするかを一緒に考えてみましょう。
これは、非常に重要です。
例えば、「1+1= 」と電卓のボタンを押すと、答の2が画面に表示されなければなりません。
そのためには、どうすればいいのかを考えましょう。
まず、押したボタンの情報をきちんと記憶しておくことが重要です。
どのボタンを押しても、そのボタンの情報をきちんと記憶させておくためには、変数を活用します。
具体的には、「1」「+」「1」「=」の4つのボタンを押していますから、この4つの情報を記憶させる変数が必要です。
それでは、変数は、4つ必要でしょうか?
もし、「1+2-3=」 という計算をしたい場合は、全部で6個の変数が必要ということでしょうか?
すると、長い計算をする場合は、その分変数が必要となります。
なんだか、大変な話になってきましたね。
実は、単純な四則演算ならば、用意する変数は3つあれば何とかなります。
そのうちの2つは、数字を格納する変数です。
もうひとつは、加減乗除のどの演算をおこなうかの情報を格納する変数です。
なぜかというと、長い計算でも、常に、「数字」「記号」「数字」 の構造が続くだけだからです。
つまり、「1 + 1」 は、「数字が1」「記号が+」「数字が1」という構造です。
それでは、「1 + 2 - 3 =」は、どうでしょうか?
まず、「1 + 2」は、「数字が1」「記号が+」「数字が2」ということですから、上記の構造になっています。
その後ですが、「1 + 2」は、3 のことですから、「3 - 3」ということになります。
すると、やはり上記の構造となりますね。
長い計算式は、このように最初から順に計算していくことによって、
常に、「数字」「記号」「数字」 の構造になるのです。
この構造に対応する変数は、3つあればいいことになります。
(補足しておきますが「=」の記号も記号用の変数に格納することになります。)
数字を格納する変数は、好きな名前で結構ですが、今回は、配列を使ってみます。
stack(0) と stack(1) という名前にしてみました。
スタックというのは、アルゴリズムのテキストを見れば必ず出てくるデータ構造の名前です。
「先入れ後出し」 が特徴です。詳しいことは、各自調べてみてください。
計算の処理は、実は、スタック構造なのです。
なお、この配列変数は、まず最初にstack(0) に値を代入し、次にstack(1)に値を代入するものとします。
この順番は、とても重要です。
そして、もうひとつ重要なことがあります。この配列変数から値を取り出す際には、
必ず後に値を入れたstack(1)のほうから取り出すということです。
イメージとしては、机の上に積み重ねられた本です。
本の上にまた本を積み重ねていきます。これは、データをどんどん入れていく過程です。
本を手に取ろうとすると、どうしても最後に積み重ねた本から取らざるを得ません。
これがデータを取り出す作業です。
まさに、「先入れ後出し」 ですよね。
また、記号を格納する変数は、Action という名前にしてみました。
それでは、「1 + 2 - 3 =」 を例にとって、データの処理の流れを追っていきましょう。
なお、処理の流れを理解しやすくするために、数字は、1桁に限るという制約をもうけます。
まず、仕込みをします。
stack(0) と stack(1)には、0を入れておきます。
そして、Action には、「+」を格納しておきます。
理由は、こうしておくと、論理がシンプルになるからです。この仕込みは重要です。
電卓の「1」ボタンを押しました。
その際、プログラムサイドでは、stack(1)に1を格納します。
次に「+」ボタンを押します。
プログラムでは、この時点で計算(演算処理)を行います。
つまり、「数字」「記号」「数字」 の構造に以下のように変数の値を適用します。
「stack(0)」「Action」「stack(1)」
つまり、変数の値で記述すると、
0 + 1
ということになります。
そして、ここが重要ですが、その計算結果である 1 を stack(0)に格納し、stack(1)を0にします。
何をしているかといいますと、スタックの構造を考えると分かりやすいです。
つまり、計算するために、stackという配列変数からデータを取り出します。
その際、最初に、あとから値を代入したstack(1) の中から値を取り出し、次に先に入れておいた
stack(0)の値を取り出します。
これが、スタックの特徴の 「先入れ後出し」 です。
一応確認ですが、この時点で、stack配列には、値が何も入っていません。
この2つの値を、Actionに格納されている記号で演算処理し、その計算結果を、再度stackに入れます。
このとき、配列変数は、空っぽですから、stack(0) に値を入れることになります。
(stack(1)には、まだ値が入っていませんが、それを表現するために0が入っていると考えてください)
そして、今回の記号を Action の中に格納します。
次に「2」ボタンを押したときの処理です。
2 を配列変数に格納します。既にstack(0)には、値が代入されているので、必然的にstack(1)に格納します。
ここまでで、「1+2」までボタンを押しましたね。もう一息です。
次に「-」ボタンを押したときの処理です。
記号のボタンなので、計算をします。
先程説明した通りの処理を行います。
つまり、stack(1)の値を最初に取り出し、次にstack(0)の値を取り出します。
そして、Actionの中に格納されている「+」を使って演算します。
その答えである 3 を、stack変数に入れます。そうです。stack(0)に 3 が入りますね。
stack(1)は、空っぽなので、0 が入っています。
そして、Action に今回の記号である「-」を格納しておきます。
次に「3」ボタンを押したときの処理です。
stack(1)に 3 を入れます。
いよいよ最後のボタンです。
「=」ボタンを押したときの処理です。
これも、記号ボタンの処理と同じですよ。
つまり、stack(1)の値を最初に取り出し、次にstack(0)の値を取り出します。
そして、Actionの中に格納されている「-」を使って演算します。
stack(0)の値 マイナス stack(1)の値 ですから、答は、0 となります。
その答えである 0 を、stack変数に入れます。そうです。stack(0)に 3 が入りますね。
stack(1)は、空っぽなので、0 が入っています。
そして、Action には、「=」を代入しておきます。
「1 + 2 - 3 =」という、たったこれだけの計算なのに、その処理を追っていくと、こんなにも長い説明に
なってしまいました。
でも、これで考え方は整理できましたね。
次回は、コードを記述しましょう。それでは、また。
だい
※コメント投稿者のブログIDはブログ作成者のみに通知されます