ページ 1 / 1
一番小さい値を見つける
Posted: 2005年9月17日(土) 18:19
by Mario2
ある変数c,d,eがあります。
それぞれにランダムな値(数字)が入っていて、プログラム側でどれが一番小さいかを見つけ出したいのです。
たとえば、
c=10
d=20
f=16
として、これの場合、cが一番小さいとわかります。
If文を使って判明させるには
コード: 全て選択
If c>d Then
If c>f Then
MessageBox(0,"cが一番",0,0)
End If
ElseIF d>c Then
(略)
と書くのだと思いますが、これではソースが長くなってしまいます。(それに面倒)
何か簡単な方法はないでしょうか?それとも、上記の方法を取って地道にしないと出来ないのでしょうか?
(ちなみに、自分のしたいことでは変数は3つではありません。)
Re: 一番小さい値を見つける
Posted: 2005年9月17日(土) 23:52
by イグトランス
そのように地道にやっていくしかないのではないでしょうか。
ただ、私ならいくつもの中から値を取り出すのであれば、全てのデータを配列にしまい、その中から探し出すようにします。
Re: 一番小さい値を見つける
Posted: 2005年9月17日(土) 23:55
by Mario2
> そのように地道にやっていくしかないのではないでしょうか。
> ただ、私ならいくつもの中から値を取り出すのであれば、全てのデータを配列にしまい、その中から探し出すようにします。
イグトランスさん、回答ありがとうございます。
そうですか・・・・
地道にやってみます。
また、他の人でも別の方法があれはお答えください。
Re: 一番小さい値を見つける
Posted: 2005年9月18日(日) 00:19
by マティ
イグトランスさんからの引用
私ならいくつもの中から値を取り出すのであれば、全てのデータを配列にしまい、その中から探し出すようにします。
の意味は、
c=10: d=20: f=16と値を代入するのでは無く、配列を準備して
a[0]=10: a[1]=20: a[2]=16と代入し、以下のようなロジックで最小値を求めるって事です。
コード: 全て選択
Dim i As Long, n As Long, Min As Long
Min = a[0]: n=0
For i=1 To 2 '最大件数(今回は2)
If Min > a Then Min=a : n=i
Next
これで、最小値 Min と何番目 n が確定します。
Re: 一番小さい値を見つける
Posted: 2005年9月18日(日) 00:51
by Mario2
> イグトランスさんからの引用
>
私ならいくつもの中から値を取り出すのであれば、全てのデータを配列にしまい、その中から探し出すようにします。
> の意味は、
c=10: d=20: f=16と値を代入するのでは無く、配列を準備して
a[0]=10: a[1]=20: a[2]=16と代入し、
ここまでは分かっていましたが
>以下のようなロジックで最小値を求めるって事です。
>
コード: 全て選択
> Dim i As Long, n As Long, Min As Long
> Min = a[0]: n=0
> For i=1 To 2 '最大件数(今回は2)
> If Min > a Then Min=a : n=i
> Next
>
> これで、最小値 Min と何番目 n が確定します。
の方法は思いつきませんでした。
参考にさせてもらいます。
Posted: 2005年9月18日(日) 00:55
by 7
自分も考えたので投稿します。
コード: 全て選択
Dim a[9] As Long
Dim i As Long
Dim min As Long,cnt As Long
a[0]=100
a[1]=125
a[2]=150
a[3]=50
a[4]=300
a[5]=25
a[6]=18
a[7]=111
a[8]=20
a[9]=78
min=a[0]
Do
i=i+1
If min>a Then
min=a
cnt=i
End If
Loop While i<>(Len(a)/4)
Posted: 2005年9月18日(日) 16:38
by NoWest
おまけですが
わざわざIf文で毎回実装するは結構めんどうなので
下のようなマクロ関数を実装しましょう。
コード: 全て選択
Const Min(i,j) = -j*(i=>j) -i*(i<j)
Const Max(i,j) = -i*(i=>j) -j*(i<j)
私のプログラミングには結構、役に立っています。
Posted: 2005年9月18日(日) 18:50
by Mario2
7さん、NoWestさん、サンプルありがとうございます。m(_ _)m
NoWestさんの
コード: 全て選択
Const Min(i,j) = -j*(i=>j) -i*(i<j)
Const Max(i,j) = -i*(i=>j) -j*(i<j)
ですが、どう使えばいいのでしょうか?
すいませんが、教えてください。
直訳した場合のサンプルです。
Posted: 2005年9月19日(月) 02:22
by omasu
いつも皆様には大変お世話になっています。
質問に対して直訳した場合のサンプルを作ってみました。
if文の判定がどの程度長いかは作ってみませんでした。
数字は変数に入っている。
大小比較により、どれが一番小さいか。
判定分は短いほうがよい。
サンプルですので、あしからず。
コード: 全て選択
#prompt ' #include <basic\prompt.sbp> , #N88BASIC でも可
'
Dim c As Long,d As Long,e As Long
Dim kotae As Long
'
kotae=1 ' 答え
c=10
d=20
e=16 ' fでしょうか?
'
'大小比較(変数3つの場合)
'
Select Case kotae
Case Sgn(Sgn(d-c)+Sgn(e-c)) ' cが一番小さいと両方が1あわせて2,絶対値で1(答えと一緒) それ以外だと 0か-1となる
Print"cがちいさい"
Case Sgn(Sgn(c-d)+Sgn(e-d)) ' dが一番小さいと両方が1あわせて2,絶対値で1(答えと一緒) それ以外だと 0か-1となる
Print"dがちいさい"
Case Else
Print"eがちいさい"
End Select
追伸:すいません、すべての変数が同じ数字の試験はしておりません。
Re: 直訳した場合のサンプルです。
Posted: 2005年9月19日(月) 10:35
by マティ
oomasuさん
前提が
(ちなみに、自分のしたいことでは変数は3つではありません。)って事なのでもしかしたら1万件や100万件かもしれません!
そのような場合に、効率的に処理する方法は無いか?と言う質問だったと思います。
NoWestさんの使い方ですが・・・
コード: 全て選択
Const Min(i,j) = -j*(i=>j) -i*(i<j) '最小値の場合に使用する関数
Const Max(i,j) = -i*(i=>j) -j*(i<j) '最大値の場合に使用する関数
Dim i As Long, n As Long, xMin As Long
xMin = a[0]: n=0
For i=1 To 2 '最大件数(今回は2)
''''' If Min > a Then xMin=a : n=i
xMin = Min( xMin, a )
Next
って感じで、Functionと似たように動作を行うと思います。間違っていたらご免なさい
サンプルの提示Ⅱ
Posted: 2005年9月19日(月) 11:50
by omasu
お世話になります。
マティーさんのメッセージは承知しておりました。
「自分のしたいことでは変数は3つではありません。」
が、変数が少数という判断でサンプルを投稿しました。
数万個の配列変数の最小値を求める方法はスタンダードに存在するため、
あえて、投稿はしませんでした。
とりあえず、基本的な使い方も乗せておきます。
コード: 全て選択
#prompt ' #include <basic\prompt.sbp> , #N88BASIC でも可
'
Dim DataTbl[1000] As Long
Dim i As Long,P As Long
'
For i=0 To 1000
DataTbl=Int(Rnd()*90000)+10000 ' 5桁の乱数発生
Next i
'
MinSearch(0,1000) ' プロシージャ呼び出し
Print P;"番目の";DataTbl[P];"が一番最初に見つかった小さい数値です。"
'
Sub MinSearch(ByVal S As Long,ByVal E As Long) ' 最小値検索プロシージャ
P=S
For i=S To E
If DataTbl(P)>DataTbl(i) Then
P=i
EndIf
Next i
End Sub
'05/09/19 16:55 表記に変更があります。
しかし、データが変数で、数個であるならば、
コード: 全て選択
#prompt ' #include <basic\prompt.sbp> , #N88BASIC でも可
'
Dim a As Long,b As Long,c As Long,d As Long,e As Long
Dim kotae As Long
Dim q As Long
'
Do
a=Int(Rnd()*99)+100
b=Int(Rnd()*99)+100
c=Int(Rnd()*99)+100
d=Int(Rnd()*99)+100
e=Int(Rnd()*99)+100
Print "a=";a,"b=";b,"c=";c,"d=";d,"e=";e
'
'大小比較(変数5つの場合)
'
kotae=5 ' 答えは配列の数
Select Case kotae
Case Sgn(a-a+1)+Sgn(b-a+1)+Sgn(c-a+1)+Sgn(d-a+1)+Sgn(e-a+1)
GoSub *a-rtn
Case Sgn(a-b+1)+Sgn(b-b+1)+Sgn(c-b+1)+Sgn(d-b+1)+Sgn(e-b+1)
GoSub *b-rtn
Case Sgn(a-c+1)+Sgn(b-c+1)+Sgn(c-c+1)+Sgn(d-c+1)+Sgn(e-c+1)
GoSub *c-rtn
Case Sgn(a-d+1)+Sgn(b-d+1)+Sgn(c-d+1)+Sgn(d-d+1)+Sgn(e-d+1)
GoSub *d-rtn
Case Else
GoSub *e-rtn
End Select
Print
Print"9=終了";
Input q
Print
Loop Until q=9
End
'
*a-rtn
Print"aがちいさい"
Return
'
*b-rtn
Print"bがちいさい"
Return
'
*c-rtn
Print"cがちいさい"
Return
'
*d-rtn
Print"dがちいさい"
Return
'
*e-rtn
Print"eがちいさい"
Return
'05/09/19 13:26 実用的なコードに変更しました。
'05/09/20 20:53 最小値が2個以上ある場合に対応しました。(最初の数値を表示),変数の追加を楽にしました。
という、記述法もあります、といいたかったのです。
追伸:マティーさんのホームページを拝見・回遊しておりました。
すばらしいの一言です。