講義用スタイル
印刷用スタイル
(開いてから、ページを再度更新してください)

「変数」をとりまく、いろいろ

「変数」は初心者にとって不自然なところが結構あって、それが最初に勉強す る人にとっての障壁となってるんじゃないか思っています。この資料で、その 不自然さを少しでも理解して、違和感を解消してもらうことを試みます。

なぜ変数は必要か?

教科書には「…値を一時的に保管しておく箱のような役割を果たします。」と 書いてあります。が、それで納得できていますか?… 中学・高校の数学でも x,y のような 変数 が出てきて いたわけですが、それらとは実はちょっと考え方が違います。この資料では、 ちょっと違った方向から変数の必要性を考えてみます。

プログラムの動作から考える

プログラムの基本的動作は;
  1. 用意された 入力(指示) があり、
  2. それに対してある 処理(動作) をおこない、
  3. 結果を 出力 するものです。
Excel であれば、セルにキーボードで入力したり、メニューをクリックして選 択したり、またゲームであればコントローラのスティック、ボタン等の操作が 入力です。入力された指示に対してプログラムが処理を行ない、コピー&ペー ストしたり、キャラクターを動かしたりして画面に反映させます。

単純な例

もっと単純な例としてたとえば、キャンプにいってバーベキューをして、その 材料の費用の割り勘を計算するプログラムがあるとします。例えば5人で、費 用が1万円かかったとすると、
  1. 入力が 10000 円で、
  2. それに対して 5 で割って、
  3. 結果の 2000 円を表示する。
というような感じになります。ここで入力の「10000円」と「5人」はバーベ キュー をやる時やる時によって変わる値です。次に開催したときには費用が 「20000円」で参加人数は「8人」かもしれません。つまり、『費用』の値と 『参加人数』の値はプログラムからすると人が入力するまで、どんな値が来る のかわからない値なわけです。また、結果の「2000円」も入力が変われば変わっ てしまう値です。

さて、ここで変数という考え方が無いと、プログラムを書くときに少し困った ことがあります。プログラムとしては、

10000 / 5
のような記述になりますが、これでは費用が10000円で参加人数が5人のときの 計算しかできません。割り勘を計算するプログラムで「費用が10000円で参加人 数が5人」のときだけ使えますと言われても、そんなプログラムは使わないです (よね?)要するに、費用と人数は時と場合によって変わるので、それらに対 応できないと使い勝手が悪い(ほぼ使えない?)ということです。

そこでプログラムを書く際には「変数」というものを用意し、プログラムが実 行され、入力が指定されるまで値がわからないものを扱えるようにしています。 実際に書くと以下のようになります。ここではプログラム上で、hiyou と ninzu の値を指定していますが、Range() でセルからとってきたり、 InputBox() でユーザから対話的に入力される値を受け取れるようにできます。

Dim hiyou as Integer
Dim ninzu as Integer
Dim warikan as Integer
hiyou = 10000
ninzu = 5
warikan = hiyou / ninzu
ここで、元の
10000 / 5
という記述に対して、変数を使用したプログラムでは
warikan = hiyou / ninzu
となっていて、10000という数字の代わりに「hiyou」という変数を、5という 数字の代わりに「ninzu」という変数で記述します。また、結果を表現する変 数として「warikan」を用意し、ここに値を格納しています。

このように変数という仕組みを導入することで融通の効く、つまり使い勝手の よいプログラムを記述することができるようになるのです。

もっと、そもそも論でいうと

そもそも、元の
10000 / 5
にしても、10000 とか 5 とかいう数はコンピュータの中の 「どこか」 に保存されて、計算されるわけです。今のコンピュータは、計算対象は かならず 「どこか」=「メモリ」 という電気回路で構成された実 在のもの、に置かれていて、それに対して CPU が事前にプログラミングされた 指示にしたがって処理をするわけですが、その結果も 「どこか」=「メ モリ」 どこか に置かれて、それを出力したり様々な処 理を行なうわけです。

どうせ「どこか」に置かれるのであれば、それをプログラムの中から直接指示 できたほうが便利ですし、いろいろな数値が必要な複雑な処理をこなそうとす ると、きちんと指示してコントロールしないとちゃんと計算できません。じゃ、 そうしましょう=変数という枠組みを用意しましょう、ということです。

…なんとなくは理解できましたか?

なぜ変数に型は必要か?

教科書に書いてあるように、変数には データ型 という 格納 する種類 を事前に指定することができます。実は VBA では指定しない こともでき、その場合はVariant という、なんでも扱える変数になるのですが、 C, Java のようなプログラミング言語ではデータ型の指定は必須です。ここで は、データ型はなぜ必要なのかを考えます。

処理系にとって

教科書に書かれているように、データ型によって、その変数が使用する メモリ量 に違いがあります。たとえば「100」を扱いたいとき、 (コードと して)必要となります。 もし数値としてしか扱わないなら、前者のほう がメモリが少なくてすみますし、処理(計算)も早いわけです。

逆に、ある変数の内容が、2進数表現で

01000001
だったとき、これが何を意味するかは文脈によってかわります。これを数値と してみれば (10進数での) 65 という整数ですが、文字としてみ ると (大文字の) A になります(文字コードの説明は略)。なの で、そのデータが何を表しているかが分かっていないと、つまり 型を指 定しない とプログラムは動けない、ということです。

プログラマにとって

いちいち事前に変数の型を考えてプログラミングしないといけないのは、プロ グラマにとって面倒くさい、と思うかもしれません。しかし、データ型を指定 しておくと、思わぬプログラムの間違い(バグ)を防ぐことができます。例え ば絶対整数しか入らない変数は Integer と指定しておくと、そこに InputBox か何かで数字じゃない文字が入ったときに エラー になります。

エラーになるのは必ずしも悪いことではなく、プログラムが論理的に 間 違っている(バグがある) ことを教えてくれているわけですので、その 間違ったプログラムを直すきっかけになるわけです。授業での練習プログラム ならいざ知らず、業務で使う本番プログラムではバグはあってはならないもの なので、事前に間違いを指摘してもらえるのはありがたいことなのです。

変数への代入の不自然さ

上のほうで、
warikan = hiyou / ninzu
となにげなく(?)書いていますが、この書き方に不自然さを感じる人がいる かもしれません。実は、見方によっては不自然に感じるほうが真っ当とも言え るのです。

数学で、変数を扱うときに「=」が出てくると、その左右の値が等しいことを 意味しています。しかし、プログラミングの世界では

warikan = hiyou / ninzu
とかくと、 「=」は代入 、すなわち右の値を左に入れることを意 味します。例えば変数 a の値を1増やしたいときには、
a = a + 1
と書きますが、これを高校の数学的に見ると a と a+1 が等しいことになって しまって意味不明です。繰り返しになりますが、
a = a + 1
は、あくまでも「=」の右側の 「値」 すなわち変数 a の 中身の値に1を加えた値 を、「=」の左側 の 「変数」(データの入る器) に入れなおす、とい うことですので、最初のうちは慣れないかもしれませんが、気をつけてくださ い。
VBA は比較のための 演算子も「=」 なので、さらにややこしくて 文脈に依存します。ちなみに C,Java 等では、代入は「=」で、比較は 「==」 です。さらにちなみに、Rという統計処理・データマイニ ング用のプログラミング言語では、代入を 「 <- 」 で表すのが個 人的には気に入ってて、2年次配当の「先端技術論」(2021年度からは「AI・ データサイエンス基礎1,2」)ではRを使ったデータサイエンスの授業をしてい ます。興味ある人は履修してみてください。

講義用スタイル
印刷用スタイル (開いてから、ページを再度更新してください)