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 

 

 

inserted by FC2 system