HSP3 プログラミングの基礎W
前へ 目次へ 次へ 

(5) 探索(search)

 探索とは、複数あるデータの中から特定のデータを探し出すことである。例えば、配列に10,40,80,60,50が格納されているとき、80を探すと3番目(配列の添字で2番)にあることがわかる。
 最も単純な方法は、配列の先頭から順に比較して一致するか調べることである。

サンプル配列に格納した整数のデータからあるデータを探す。

    dim data, 10
    data = 4, 2, 8, 6, 1, 10, 7, 9, 3, 5
    ss = 10     ;探したいデータ
    foreach data
        if data(cnt) = ss : num = cnt : break
    loop
    mes num
    stop

実行6番目にある10と一致する。10が格納されているのは配列の5番なので、5と表示される。

 下から2行目の「mes num」を「mes cnt」に変更すると0が表示される。システム変数cntはループを抜け出すと0になるようである。したがって、if文の「num = cnt」が必要になる。

試してみよう探したいデータを変えて実行してみよ。また、配列にないデータを指定してみよ。

 配列にないデータを探したいデータとして指定すると、0と表示される。しかし、配列の0番にあるわけではない。配列の添字は基本的に0番からなので、見つからなかったときは-1が表示されるようにする。
 比較でデータが一致しなかったときは「if ss = data(cnt) : num = cnt : break」の太字部分は一度も実行されないので変数numにあらかじめ-1を格納しておくと良い。

    dim data, 10
    data = 4, 2, 8, 6, 1, 10, 7, 9, 3, 5
    ss = 11     ;探したいデータ
    num = -1
    foreach data
        if data(cnt) = ss : num = cnt : break
    loop
    mes num
    stop

実行配列にないデータ11を探したいデータとして指定しているので-1と表示される。



探索関数(serch)作成

 探索に必要なデータは、探したいデータと配列に格納されたデータである。したがって、この関数が受け取るパラメータは2つである。

サンプル探索関数を作成する。

#module
#defcfunc search array dd, int ss
;
;search(配列, 探したいデータ)
;  返却値=int 一致した配列の番号、一致しないときは-1
;
    num = -1
    foreach dd
        if dd(cnt) = ss : num = cnt : break
    loop
    return num
#global
    dim data, 10
    data = 4, 2, 8, 6, 1, 10, 7, 9, 3, 5
    mes search(data, 10)
    stop

実行10が格納されている配列の番号である5と表示される。

試してみよう格納するデータを次のように実数値に変更する。

data = 4.1, 2.2, 8.3, 6.4, 1.5, 10.6, 7.7, 9.8, 3.9, 5.0
mes search(data, 10.6)

実行10.6を探索するデータと指定しているが、パラメータssは整数(int)型なので10.6ではなく10を受け取る。したがって、一致するデータがないので-1と表示される。

試してみよう 対策として、関数定義のパラメータssを次のようにdouble型に変更する。double型にした場合、整数も正しく受け取れる。

#module
#defcfunc search array dd, double ss
;
;search(配列, 探したいデータ)
;  返却値=int 一致した配列の番号、一致しないときは-1
;
    num = -1
    foreach dd
        if dd(cnt) = ss : num = cnt : break
    loop
    return num
#global
    dim data, 10
    data = 4, 2, 8, 6, 1, 10, 7, 9, 3, 5
    mes search(data, 10)
    stop

実行10.6が格納されている配列の番号である5と表示される。

 

前へ 目次へ 次へ 
2006  © Hiroshi Masuda 

 

 

inserted by FC2 system