tagCANDY CGI VBレスキュー(花ちゃん) - 引数の中で最小の正値を返す関数(VB6.0) - Visual Basic 6.0 VB2005 VB2010
VB2005用トップページへVBレスキュー(花ちゃん)のトップページVB6.0用のトップページ
引数の中で最小の正値を返す関数(VB6.0)
元に戻る スレッド一覧へ 記事閲覧
このページ内の検索ができます。(AND 検索や OR 検索のような複数のキーワードによる検索はできません。)

引数の中で最小の正値を返す関数(VB6.0) [No.92の個別表示]
     サンプル投稿用掲示板  VB2005 〜 用トップページ  VB6.0 用 トップページ
日時: 2009/12/27 12:40
名前: 花ちゃん

***********************************************************************************
* カテゴリー:[基本コード][][]                                               *
* キーワード:プロシージャ,複数の引数,配列処理,コードの簡略化,,                   *
***********************************************************************************

元質問:pMin(i,j,k) - ダンボ  2004/09/07-14:53 No.331

先ほどから30分、下記のような関数を考えているのですがどうも美しく出来ません。
皆さんも、腕に覚えのある方は、美しいアルゴリズムを考えてみませんか?
(と、人にやらせてみる)処理効率は問いません。ステップ数の少ないほうが美しいかな。

関数名:pMin
引数:i,j,k  (いずれも、0または正整数)
戻り値:i,j,kのうち正で一番小さい値。但し、i,j,kのすべてが0ならば0.



-------------------------------------------------------------------
回答の過程にも興味があるし、プログラムを作る上でも色々参考に
なるかと思い取り上げてみました。

回答順に投稿します。

             --- by 花ちゃん ---
--------------------------------------------------------------------
メンテ

Page: 1 |

引数の中で最小の正値を返す関数(VB6.0)_1  (No.1の個別表示) [スレッド一覧へ]
日時: 2011/04/05 13:07
名前: 花ちゃん

***********************************************************************************
* カテゴリー:[基本コード][][]                                               *
* キーワード:プロシージャ,複数の引数,配列処理,コードの簡略化,,                   *
***********************************************************************************

-----------------------------------------------------------------
Re: pMin(i,j,k) - kazuやん  2004/09/07-16:05 No.332
-----------------------------------------------------------------

果たして美しいかは微妙ですが、こんな感じでしょうかね^^

'**********************************************************
'*  pMin        :引数の中で最小の値を返す。但し3つとも0なら0を返す
'*  i,j,k       :いずれも、0または正整数
'*  戻り値      :最小の値、又は0
'**********************************************************
Function pMin(i As Integer, j As Integer, k As Integer) As Integer

    Dim min         As Integer  '最小値

    '全て0の場合
    If (i Or j Or k) = 0 Then
        pMin = 0
    Else
        '最小値初期設定
        min = i
    
        If (min > j) Then min = j
        
        If (min > k) Then min = k
        
        pMin = min
    
    End If

End Function
メンテ
引数の中で最小の正値を返す関数(VB6.0)_2  (No.2の個別表示) [スレッド一覧へ]
日時: 2011/04/05 13:07
名前: 花ちゃん

***********************************************************************************
* カテゴリー:[基本コード][][]                                               *
* キーワード:プロシージャ,複数の引数,配列処理,コードの簡略化,,                   *
***********************************************************************************

----------------------------------------------------------------
Re^2: pMin(i,j,k) - ダンボ  2004/09/07-16:39 No.333
----------------------------------------------------------------

kazuやん さん、どうもありがとうございます。美しいです。
ソートでないのだから「必要最小限の比較にしろ」というところでしょうか。

。。すみません。。前提が間違えていました。
(誤)  pMin        :引数の中で最小の値を返す。但し3つとも0なら0を返す
(正)  pMin        :引数の中で最小の正値を返す。但し3つとも0なら0を返す

kazuやん さんのコーディングを流用してこんなにしてみましたが、pMin(6,0,32)=0
となってしまいましたわ(理由は分かる)。もう少し自分で考えて見ますね。

Function pMin(i As Integer, j As Integer, k As Integer) As Integer
    Dim min         As Integer  '最小値
    '全て0の場合
    If (i Or j Or k) = 0 Then
        pMin = 0
    Else
        '最小値初期設定
        If i > 0 Then
            min = i
            If (min > j) Then min = j
            If (min > k) Then min = k
            pMin = min
        End If
        If j > 0 Then
            min = j
            If (min > i) Then min = i
            If (min > k) Then min = k
            pMin = min
        End If
        If k > 0 Then
            min = k
            If (min > j) Then min = j
            If (min > i) Then min = i
            pMin = min
        End If

End Function
メンテ
引数の中で最小の正値を返す関数(VB6.0)_3  (No.3の個別表示) [スレッド一覧へ]
日時: 2011/04/05 13:07
名前: 花ちゃん

***********************************************************************************
* カテゴリー:[基本コード][][]                                               *
* キーワード:プロシージャ,複数の引数,配列処理,コードの簡略化,,                   *
***********************************************************************************

---------------------------------------------------------------------
Re^3: これは? - kazuやん   2004/09/07-17:27 No.334
---------------------------------------------------------------------
こんなのでしたらどうでしょうか?
さっきよりちょっと美しくなくなってしまいますが^^

ちょっと気になったのが引数は絶対に数値と決まっているのでしょうか?
もしそうでなければ、宣言を以下にして
Function pMin(i, j, k) As Integer
引数それぞれの整数チェックを入れる事をお勧めします。

'**********************************************************
'*  pMin        :引数の中で最小の正値を返す。但し3つとも0なら0を返す
'*  i,j,k       :いずれも、0または正整数
'*  戻り値      :最小の正値、又は0
'**********************************************************
Function pMin(i As Integer, j As Integer, k As Integer) As Integer

    Dim min         As Integer  '最小値

    '全て0の場合
    If (i Or j Or k) = 0 Then
        pMin = 0
    Else
        '最小値初期設定
        If i <> 0 Then
            min = i
        ElseIf k <> 0 Then
            min = k
        ElseIf j <> 0 Then
            min = j
        End If
        
        'Betweenみたいのがあればもっと美しくなるのかな?
        'それとももっと簡略化したif文の書き方があるかもしれません^^
        If (min > j) And (j > 0) Then min = j
        
        If (min > k) And (k > 0) Then min = k
        
        pMin = min
    
    End If

End Function
メンテ
引数の中で最小の正値を返す関数(VB6.0)_4  (No.4の個別表示) [スレッド一覧へ]
日時: 2011/04/05 13:08
名前: 花ちゃん

***********************************************************************************
* カテゴリー:[基本コード][][]                                               *
* キーワード:プロシージャ,複数の引数,配列処理,コードの簡略化,,                   *
***********************************************************************************

-----------------------------------------------------------------------------
Re^4: これはどぉ? - 黒影   2004/09/07-17:49 No.335
-----------------------------------------------------------------------------


こんなのは?
kazuやんさんの最初のコードをちょっぴり改造しただけですが...(^^;)

'**********************************************************
'*  pMin2       :引数の中で最小の正値を返す。但し3つとも0なら0を返す
'*  i,j,k       :いずれも、0または正整数
'*  戻り値      :最小の値、又は0
'**********************************************************
Function pMin2(i As Integer, j As Integer, k As Integer) As Integer

    Dim min         As Integer  '最小値

    '全て0の場合
    If (i Or j Or k) = 0 Then
        pMin2 = 0
    Else
        '最小値初期設定
        min = i
        
        If (min > j) Then
            min = IIf(j = 0, min, j)
        Else
            min = IIf(min = 0, j, min)
        End If
        
        If (min > k) Then
            min = IIf(k = 0, min, k)
        Else
            min = IIf(min = 0, k, min)
        End If
            
        pMin2 = min
    
    End If

End Function
メンテ
引数の中で最小の正値を返す関数(VB6.0)_5  (No.5の個別表示) [スレッド一覧へ]
日時: 2011/04/05 13:08
名前: 花ちゃん

***********************************************************************************
* カテゴリー:[基本コード][][]                                               *
* キーワード:プロシージャ,複数の引数,配列処理,コードの簡略化,,                   *
***********************************************************************************

-----------------------------------------------------------------------------
Re^5: 補填してGood - ダンボ   2004/09/08-09:38 No.339
-----------------------------------------------------------------------------

黒影さん、どうもありがとうございます。
IIfの小技を使って簡略化しましたね。判定と値代入を1命令で実行する。
Elseの後がもっちゃりした感じがあるので、ここの必要性を考えていくと
最初の2命令(全て0の場合)がこちらに吸収されていることが分かりました。

'**********************************************************
'*  pMin2       :引数の中で最小の正値を返す。但し3つとも0なら0を返す
'*  i,j,k       :いずれも、0または正整数
'*  戻り値      :最小の値、又は0
'**********************************************************
Function pMin2(i As Integer, j As Integer, k As Integer) As Integer

     Dim min         As Integer  '最小値

         '最小値初期設定
         min = i
        
         If (min > j) Then
             min = IIf(j = 0, min, j)
         Else
             min = IIf(min = 0, j, min)
         End If
        
         If (min > k) Then
             min = IIf(k = 0, min, k)
         Else
             min = IIf(min = 0, k, min)
         End If
            
         pMin2 = min
    
     End If

End Function

で、必要十分のようですよ。
メンテ
引数の中で最小の正値を返す関数(VB6.0)_6  (No.6の個別表示) [スレッド一覧へ]
日時: 2011/04/05 13:08
名前: 花ちゃん

***********************************************************************************
* カテゴリー:[基本コード][][]                                               *
* キーワード:プロシージャ,複数の引数,配列処理,コードの簡略化,,                   *
***********************************************************************************

-----------------------------------------------------------------------------
Re^6: さらに改造 - 黒影   2004/09/08-12:46 No.345
-----------------------------------------------------------------------------

> 最初の2命令(全て0の場合)がこちらに吸収されていることが分かりました。

そうですね。
あまり深く考えなかったもので...(^^;)
それでもまだなんとなく見た目が納得出来ず...
で、さらに改造してこんな風に↓↓↓

'**********************************************************
'*  pMin3       :引数の中で最小の正値を返す。但し3つとも0なら0を返す
'*  i,j,k       :いずれも、0または正整数
'*  戻り値      :最小の値、又は0
'**********************************************************
Function pMin3(i As Integer, j As Integer, k As Integer) As Integer

    Dim min     As Integer  '最小値

    '最小値初期設定
    min = i
    
    min = IIf(min > j, IIf(j = 0, min, j), IIf(min = 0, j, min))
    min = IIf(min > k, IIf(K = 0, min, k), IIf(min = 0, k, min))
        
    pMin3 = min

End Function
メンテ
引数の中で最小の正値を返す関数(VB6.0)_7  (No.7の個別表示) [スレッド一覧へ]
日時: 2011/04/05 13:09
名前: 花ちゃん

***********************************************************************************
* カテゴリー:[基本コード][][]                                               *
* キーワード:プロシージャ,複数の引数,配列処理,コードの簡略化,,                   *
***********************************************************************************

-----------------------------------------------------------------------------
Re^7:完璧です - ダンボ   2004/09/09-11:17 No.358
-----------------------------------------------------------------------------

黒影さん、重ね重ねありがとうございます。美しいです。たった5行にまとめられましたね。

・IIfは処理速度が遅いこと
・アルゴリズムの流れがコーディングからは一目で読み取れない、
の2点が工業製品としてのプログラミングからは排除されるべき欠点でしょうが、今回、
皆さんに提起したのは芸術作品としてのプログラミングですので、これで完成形と思います。

ところで、kazuやん、黒影さんのお2人のアイデアをいただいて、私のコーディングは
下記でFIXしようかと思います。前提条件が少し変わりました。
・3引数では足りない場合もありそうなので4引数、5引数にも対応したい。
・長い文字列のInstr結果ではIntegerではあふれるのでLongとする。
ParamArrayを使う関係上、型宣言がVariantとなりちょっと気持ち悪い。

'**********************************************************
'*  pMin        :引数の中で最小の正値を返す。但しすべて0なら0を返す
'*  i,N(可変)   :いずれも、0または正整数
'*  戻り値      :最小の正値、又は0
'**********************************************************
Private Function pMin(i As Long, ParamArray N() As Variant) As Long

    Dim min As Long  '最小値
    Dim j As Variant

    min = i
    For Each j In N
      min = IIf(min > j, IIf(j = 0, min, j), IIf(min = 0, j, min))
    Next j
        
    pMin = min
End Function
メンテ

Page: 1 |

 投稿フォーム               スレッド一覧へ
題  名 スレッドをトップへソート
名  前
パスワード (記事メンテ時に使用)
投稿キー (投稿時 投稿キー を入力してください)
コメント

   クッキー保存   
スレッド一覧へ