IGORプログラミング:データの一括処理に至る道②:関数の基本と引数
本稿では全てIGOR pro 8.0を基準にして解説を行いますが、ここで紹介するレベルであればバージョン違いはそれほど大きな問題にならないと思います。
今回の記事はこちらの続きになります。
足し算をする電卓①
前回、変数を定義して表示するところを学習しました。例えばこんな感じでしたね。
function Hensuu3()
variable a, b
a = 10
b = 5
print a
print b
end
さて、このプログラムHensuu3()では、プログラマーが入力した10と5をただ足しているだけで、あまり意味がありません。
そこで、二つの変数aとbの和を表示させるようにプログラムを書き換えてみましょう。
サンプルプログラム
色々な書き方がありますが、例えば次のような感じです。
function sum1()
variable a, b, c
a = 10
b = 5
c = a + b
print c
end
あるいは、表示させるだけでしたら次のような書き方も可能です。
function sum2()
variable a, b
a = 10
b = 5
print a + b
end
関数sum1()では新しく変数cを宣言し、c = a + bのところで和を計算しています。
一方、sum2()ではprintで表示させる値に直接a + bを指定しています。
どちらを実行しても、15と表示されるはずです。簡単ですね。
では、問題をやってみましょう。
課題:電卓①
上のsum1()やsum2()を書き換え、和だけでなく差・積・商を計算するプログラムを作成せよ
(なお、差・積・商を意味する記号はそれぞれ「-」・「*」・「/」である)。
また、作成した関数を利用し、例えば31×19を計算せよ。
課題の解答:電卓①
差・積・商を計算するプログラムは例えば次の通り。
function diff()
variable a, b, c
a = 10
b = 5
c = a - b
print c
end
function mult()
variable a, b, c
a = 10
b = 5
c = a * b
print c
end
function div()
variable a, b, c
a = 10
b = 5
c = a / b
print c
end
31×19を計算するには、関数mult()を次のように書き換えて実行すればよい。
function mult2()
variable a, b, c
a = 31
b = 19
c = a * b
print c
end
これを実行すると、589という計算結果を得る。
足し算をする電卓②:ユーザーから値を受け取る
さて、ここまでで簡単な電卓を作ることができました。ただ、この電卓、色々不便ですね。
不便に感じるポイントは色々あるんですが(四則演算が別々の関数だったりとか)、ここで注目したいのは、例えば31×19を計算したい場合に
プログラム自体に a = 31とか書いてしまっているところです。
このようにプログラムを書いてしまうと、プログラムを使う人(ユーザー)が任意の数字同士の和を計算することができなくなってしまいます。
プログラマーにしか使えない電卓、嫌ですよね。
これを解決するためには、ユーザーから「何と何の和を計算したいのか?」を受け取る必要があります。
特にIGORの場合はこれについても色々なやり方がありますが、まずは最も基礎的なものを学習しましょう。
サンプルプログラム
function sum3(a, b)
variable a,b
print a+b
end
実行するときは、今までのようにsum3(a, b)と打つのではなく、例えばsum3(8, 20)などのように入力します。
実行すると、きちんとその和28が表示されます。
仕組み:引数(ひきすう)
まず、サンプル関数sum3では、今まで関数名の後はただ開いて閉じるだけだったカッコのところが(a, b)となっていることに注目です。
このaとbは、これまでと同じく変数(もちろん名前も自由)です。
ただし、ここ(関数名の直後のカッコ内)に書いた変数の値は関数内で定義するのではなく、ユーザーから受け取ることになります。
このように、プログラムを書いた時点では値がわからず、ユーザーから受け取る変数のことを引数と呼びます。
ユーザーがsum3(8, 20)のようにプログラムを実行すると、プログラム的にはあたかも
function sum3()
variable a = 8
variable b = 20
print a+b
end
と書いてあるかのように動作します。つまり、変数aとbの中身をユーザーから受け取っているわけです。
では、最初の行の
variable a, b
はなぜ必要なのでしょうか?
これは実は、「変数の型」というものに関係しています。詳しくは後述しますが、IGORの変数には
- 数値を入れておく型(variable)
- 文字列を入れておく型(string)
- ウェーブを入れておく(wave)
の三つの型が存在します(他の言語を扱っている人でもWAVE型は珍しいかもしれません)。
ようするに、もし変数aが数値型なら文字列やウェーブを入れておく箱にはなれず、逆にもし文字列型なら数値としての3を入れておくことはできません(stringにも文字列としての”3″は入れておけますが、これはただの文字なので足したり引いたりはできません)。
この「変数の型」というのは関数の動作を決めるうえでかなり重要なのですが、
function sum3(a, b)
と書いただけでは、この引数aとbが何型の変数なのかわかりません。そこで、「このaとbは数値型ですよ」とプログラムに教えてあげているのが次の行の
variable a, b
になります。
これまで関数名の後に開いて閉じるだけのカッコ()をつけていた意味
前回の関数や今回の電卓①では、function diff()のように関数名のあとに意味のないカッコ()をつけていましたね。
これは、「この関数(diff)は引数を一つも受け取らない関数ですよ」ということを意味しています。
引数の型宣言における注意
引数の型宣言は必ず関数の先頭で行わなければなりません。例えば
function Hikisuu1(val1, val2, str1, val3)
variable val1, val2, val3
string str1
print val1
print val2
print str1
print val3
end
はエラーなく実行できます。このように、引数はいくつも同時に持つことができ、また異なる型の引数を組み合わせることも可能です。
しかし、次のように例えば先に別の変数を定義すると、コンパイル時点で
function Hikisuu2(val1, val2, str1, val3)
variable test
variable val1, val2, val3
string str1
print val1
print val2
print str1
print val3
end
このようにFunction Compilation Error; not a parameter name、つまり「先頭にある変数testは引数ではありません」というエラーが出てしまいます。
(なお、コンパイルとはようするにプログラムを実行可能にすることです。
IGORの場合、通常はprocedure window以外のところをクリックすると自動でコンパイルされます。procedure windowの下の方にあるcompileボタンを押してもコンパイルされ、もしその時点でプログラムに文法的な間違いがあればこのようにエラーがでます。)
また、引数の定義前に余計な命令を実行すると、
function Hikisuu3(val1, val2, str1, val3)
print "Hello"
variable val1, val2, val3
string str1
print val1
print val2
print str1
print val3
end
やはりコンパイル時点でエラーが出ます。
「Parameter nod declared」、つまり「引数が宣言されていません」ということですね。
というわけで、引数を使う場合には必ず先頭に変数宣言を書きましょう。
なお、空行があったり、このようにプログラム上無視されるコメントは問題ありません。
function Hikisuu4(val1, val2, str1, val3) //ここはコメント
// ↑ 空行はいくらあっても大丈夫
//このように、「//」よりも右に書いた部分は全てコメントとしてプログラム上無視される。
variable val1, val2, val3 // このように文の途中からコメントにもできるので、活用しよう
string str1
print val1
print val2
print str1
print val3
end
課題:ユーザーから値を受け取る電卓
ユーザーから任意の2つの数を受け取り、和・差・積・商を全て表示させる関数を作成せよ。
課題の解答:電卓②
function Dentaku(val1, val2)
variable val1, val2
print val1 + val2
print val1 - val2
print val1 * val2
print val1 / val2
end
いつまでも変数名がa, bというのもなんなので、値valueからとってval1, val2とつけてみました。
ある程度複雑なプログラムでは、もう少しわかりやすい名前にしたほうがよいです。
今回のまとめ
今回は
- プログラマーが予め値を指定できず、ユーザーが指定する数値は「引数」として受け取る
- 引数はいくつも持つことができ、異なる型の引数を組み合わせて受け取ることもできる
- 関数の先頭で引数の型を宣言する必要がある
ということを学習しました。次回は「繰り返し処理」について解説します。