一番小さい値を見つける

返信する


答えを正確に入力してください。答えられるかどうかでスパムボットか否かを判定します。

BBCode: ON
[img]: ON
[url]: ON
スマイリー: OFF

トピックのレビュー
   

展開ビュー トピックのレビュー: 一番小さい値を見つける

サンプルの提示Ⅱ

by omasu » 2005年9月19日(月) 11:50

お世話になります。

 マティーさんのメッセージは承知しておりました。
 「自分のしたいことでは変数は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個以上ある場合に対応しました。(最初の数値を表示),変数の追加を楽にしました。
という、記述法もあります、といいたかったのです。

追伸:マティーさんのホームページを拝見・回遊しておりました。
すばらしいの一言です。

Re: 直訳した場合のサンプルです。

by マティ » 2005年9月19日(月) 10:35

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と似たように動作を行うと思います。間違っていたらご免なさい

直訳した場合のサンプルです。

by omasu » 2005年9月19日(月) 02:22

いつも皆様には大変お世話になっています。

 質問に対して直訳した場合のサンプルを作ってみました。
 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
追伸:すいません、すべての変数が同じ数字の試験はしておりません。

by Mario2 » 2005年9月18日(日) 18:50

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)
ですが、どう使えばいいのでしょうか?
すいませんが、教えてください。

by NoWest » 2005年9月18日(日) 16:38

おまけですが

わざわざIf文で毎回実装するは結構めんどうなので
下のようなマクロ関数を実装しましょう。

コード: 全て選択

Const Min(i,j) = -j*(i=>j) -i*(i<j)
Const Max(i,j) = -i*(i=>j) -j*(i<j)
私のプログラミングには結構、役に立っています。

by 7 » 2005年9月18日(日) 00:55

自分も考えたので投稿します。

コード: 全て選択

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)

Re: 一番小さい値を見つける

by Mario2 » 2005年9月18日(日) 00:51

> イグトランスさんからの引用
>
私ならいくつもの中から値を取り出すのであれば、全てのデータを配列にしまい、その中から探し出すようにします。
> の意味は、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: 一番小さい値を見つける

by マティ » 2005年9月18日(日) 00:19

イグトランスさんからの引用
私ならいくつもの中から値を取り出すのであれば、全てのデータを配列にしまい、その中から探し出すようにします。
の意味は、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: 一番小さい値を見つける

by Mario2 » 2005年9月17日(土) 23:55

> そのように地道にやっていくしかないのではないでしょうか。
> ただ、私ならいくつもの中から値を取り出すのであれば、全てのデータを配列にしまい、その中から探し出すようにします。

イグトランスさん、回答ありがとうございます。
そうですか・・・・
地道にやってみます。
また、他の人でも別の方法があれはお答えください。

Re: 一番小さい値を見つける

by イグトランス » 2005年9月17日(土) 23:52

そのように地道にやっていくしかないのではないでしょうか。
ただ、私ならいくつもの中から値を取り出すのであれば、全てのデータを配列にしまい、その中から探し出すようにします。

一番小さい値を見つける

by Mario2 » 2005年9月17日(土) 18:19

ある変数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つではありません。)

ページトップ