一番小さい値を見つける

ActiveBasicでのプログラミングでわからないこと、困ったことなどがあったら、ここで質問してみましょう(質問を行う場合は、過去ログやWeb上であらかじめ問題を整理するようにしましょう☆)。
返信する
メッセージ
作成者
Mario2
記事: 205
登録日時: 2005年5月31日(火) 13:31
お住まい: 大阪市
連絡する:

一番小さい値を見つける

#1 投稿記事 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つではありません。)
最後に編集したユーザー Mario2 [ 2005年9月18日(日) 18:36 ], 累計 1 回
イグトランス
記事: 899
登録日時: 2005年5月31日(火) 17:59
お住まい: 東京都
連絡する:

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

#2 投稿記事 by イグトランス »

そのように地道にやっていくしかないのではないでしょうか。
ただ、私ならいくつもの中から値を取り出すのであれば、全てのデータを配列にしまい、その中から探し出すようにします。
Mario2
記事: 205
登録日時: 2005年5月31日(火) 13:31
お住まい: 大阪市
連絡する:

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

#3 投稿記事 by Mario2 »

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

イグトランスさん、回答ありがとうございます。
そうですか・・・・
地道にやってみます。
また、他の人でも別の方法があれはお答えください。
マティ
記事: 161
登録日時: 2005年8月23日(火) 00:15
お住まい: 沖縄県
連絡する:

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

#4 投稿記事 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 が確定します。
Mario2
記事: 205
登録日時: 2005年5月31日(火) 13:31
お住まい: 大阪市
連絡する:

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

#5 投稿記事 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 が確定します。
の方法は思いつきませんでした。
参考にさせてもらいます。
7
記事: 473
登録日時: 2005年5月31日(火) 18:51
お住まい: 新潟県
連絡する:

#6 投稿記事 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)
NoWest
記事: 264
登録日時: 2005年5月31日(火) 10:52
お住まい: 高知
連絡する:

#7 投稿記事 by NoWest »

おまけですが

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

コード: 全て選択

Const Min(i,j) = -j*(i=>j) -i*(i<j)
Const Max(i,j) = -i*(i=>j) -j*(i<j)
私のプログラミングには結構、役に立っています。
Mario2
記事: 205
登録日時: 2005年5月31日(火) 13:31
お住まい: 大阪市
連絡する:

#8 投稿記事 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)
ですが、どう使えばいいのでしょうか?
すいませんが、教えてください。
omasu
記事: 96
登録日時: 2005年9月02日(金) 22:15
連絡する:

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

#9 投稿記事 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
追伸:すいません、すべての変数が同じ数字の試験はしておりません。
マティ
記事: 161
登録日時: 2005年8月23日(火) 00:15
お住まい: 沖縄県
連絡する:

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

#10 投稿記事 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と似たように動作を行うと思います。間違っていたらご免なさい
omasu
記事: 96
登録日時: 2005年9月02日(金) 22:15
連絡する:

サンプルの提示Ⅱ

#11 投稿記事 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個以上ある場合に対応しました。(最初の数値を表示),変数の追加を楽にしました。
という、記述法もあります、といいたかったのです。

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