HSP3 プログラミングの基礎T | |
(9) 関数
二つの変数x, yがあり、xの値が決まるとそれに対するyの値が一つ決まるという関係があるとき、yはxの「関数(function)」であるという。y
= f(x) という式で表す。
プログラムでは、fを関数名、xを引数(ひきすう)という。例えば、「引数xの2倍を計算して返却する」という処理を関数名fとすると、xが5のときf(x)は10を返却する。式で書くと
ans = f(5) となり、変数ansには10が格納される。
ここでは、HSPに用意されている主な関数を次に示しておく。
関数 | 働き | 返却値 | 関数 | 働き | 返却値 | |
sin | サイン値を返す(角度の単位はラジアン) | 実数 | int | パラメーターを整数に変換する | 整数 | |
cos | コサイン値を返す(角度の単位はラジアン) | 実数 | double | パラメーターを実数に変換する | 実数 | |
tan | タンジェント値を返す(角度の単位はラジアン) | 実数 | str | パラメーターを文字列に変換する | 文字列 | |
atan | アークタンジェント値を返す | 実数 | strlen | 文字列の長さを返す | 整数 | |
sqrt | ルート(平方根)値を返す | 実数 | length | 変数の持つ配列要素数を返す(1次元) 2次元はlength2、3次元はlength3 |
整数 | |
logf | 対数値を返す | 実数 | ||||
expf | 指数値を返す | 実数 | limit | 整数値を範囲内に収める | 整数 | |
absf | 実数の絶対値を返す | 実数 | limitf | 実数値を範囲内に収める | 実数 | |
abs | 整数の絶対値を返す | 整数 | gettime | 日付・時間を返す | 整数 | |
rnd | 0〜(パラメーター-1)の乱数を発生する | 整数 | dirinfo | 特定のディレクトリ情報を返す | 文字列 | |
このほかに vartype(変数の型を返す)、varptr(変数のデータを示すアドレスを返す)、 varuse(変数の使用状況を返す)、peek(バッファから値を取り出す)、wpeek(バッファから値を取り出す)、 lpeek(バッファから値を取り出す)、sysinfo(システム情報を取得する)、 ginfo(ウィンドウに関する情報を取得する)、objinfo(ウィンドウオブジェクトに関する情報を取得する) などがある。 |
0度から180度まで、10度単位でサイン、コサイン、タンジェントを計算する。
mes "角度\tsin\t\tcos\t\ttan" repeat 19 kaku = 10.0 * cnt ;10度単位で rad = kaku * 3.14151 / 180.0 ;角度kakuをラジアンradに変換 ss = sin(rad) cc = cos(rad) tt = tan(rad) mes strf("%5.1f", kaku) + "\t" + ss + "\t" + cc + "\t" + tt loop stop
角度、サイン、コサイン、タンジェントの各値が表示する。
ラジアンは、角度180度をπラジアンとする角度の表し方である。角度とラジアンの関係式は次のように書くことができる。
180(度) = π(ラジアン) 1(度) = π/180(ラジアン) |
strf関数は、C言語のprintfの書式指定文字が使える。%6.1fは全体が6けた、小数が1けたの実数の文字列を返却する。
ほかの関数についてもヘルプなどを参考にして、プログラムを作って試してみよう。
(10) 関数(乱数)
乱数とは、でたらめに現れる数で、それぞれの数は同じ確率で現れるものである。例えば、1から10までの整数の乱数では、それぞれの数字が10%の確率で現れる(はずである)。
いろいろな言語には、この乱数を発生させる命令が用意されている。ただし、言語で用意されている乱数は計算によって求めているので、計算に使用する初期値(シード値という)が同じであれば同じ乱数列が発生する。したがって、正確な意味での乱数ではないので擬似乱数という。
HSP3では、シード値の設定にRandomize命令を使用する。Randomize命令の後にシード値を設定することもできるが、シード値を省略するとシステムタイマー(コンピュータの時計)の値が使用される。乱数の発生にはRnd関数を使用する。この関数は0から引数未満の範囲の整数値を発生する。
0から9までの整数の乱数を10個発生させて表示する。
randomize repeat 10 mes rnd(10) loop stop
10個の整数が表示される。実行するたびに表示される値は変わる。
rnd(10)で0から9までの乱数が返却される。
発生する乱数の個数が少ないので、それぞれの数字が同じ確率で表示されることはない。
乱数を初期化する命令に特定の値123を指定して実行する。 (randomize 5)
randomize 123 repeat 10 mes rnd(10) loop stop
何度実行しても「0, 3, 5, 4, 3, 5, 9, 8, 0, 4」の10個の整数が表示される。
0から9までの整数の乱数を1000個発生させ、各数字の発生回数を表示する。
dim kai, 10 randomize repeat 1000 rr = rnd(10) kai(rr) = kai(rr) + 1 loop repeat 10 mes str(cnt) + " = " + kai(cnt) + " 回" loop stop
0 = 103 1 = 116 2 = 101 3 = 100 4 = 99 5 = 105 6 = 100 7 = 88 8 = 95 9 = 93 |
実行するたびに各数字の発生する回数は変わる。
おおよそ、各数字が100個前後発生している。
キャラクタの進行方向(前進、後進、左折、右折)を乱数で決定する。
進行方向は4つなので、乱数で0から3の値を発生させて、それぞれ0=前進、1=後進、2=左折、3=右折、とする。進行方向の決定を100回したとき、それぞれの進行方向の回数を表示する。
dim kai, 4 randomize repeat 100 rr = rnd(4) kai(rr) = kai(rr) + 1 loop mes "前進 = " + kai(0) + " 回" mes "後進 = " + kai(1) + " 回" mes "左折 = " + kai(2) + " 回" mes "右折 = " + kai(3) + " 回" stop
前進 = 21回 後進 = 22回 左折 = 28回 右折 = 29回 |
実行するたびに各数字の発生する回数は変わる。プログラムは前のサンプルとほぼ同じである。
発生している数字は4種類なので、それぞれの発生する確率は1/4(25%)である。乱数を100回発生しているので、それぞれ25回前後となっている。
進行方向の確率を前進50%、後進10%、左折20%、右折20%となるようにする。
乱数を10種類(0〜9)発生させるとそれぞれの確率は10%となる。乱数の0〜4の5種類を前進、5を後進、6と7を左折、8と9を右折とする。
dim kai, 4 randomize repeat 100 rr = rnd(10) if rr < 5 : kai(0) = kai(0) + 1 if rr = 5 : kai(1) = kai(1) + 1 if rr = 6 | rr = 7 : kai(2) = kai(2) + 1 if rr = 8 | rr = 9 : kai(3) = kai(3) + 1 loop mes "前進 = " + kai(0) + " 回" mes "後進 = " + kai(1) + " 回" mes "左折 = " + kai(2) + " 回" mes "右折 = " + kai(3) + " 回" stop
前進 = 46回 後進 = 8回 左折 = 19回 右折 = 27回 |
実行するたびに各数字の発生する回数は変わる。
おおよそ、目的通りになっている。
乱数を20種類(0〜19)にしたときは、0〜9が前進、10,11が後進、12〜15が左折、16〜19が右折、というように種類にそれぞれの確率をかけて対応を決定すればよい。
2006, 2007 © Hiroshi Masuda |