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 |