2017-08-16 105 views
0

我想知道你的意見是什麼的最有效的方法如下:什麼編程轉換表的算法

我需要1轉換爲3個值,使之成爲一個單一的價值,同時利用轉換表:

enter image description here

下面是一個例子:

低+高+高=中等

培養基+我dium +高=高

你們認爲什麼是編程這種算法最有效的方式?我將使用的語言是VBA(Excel)

我已經想過要編寫大量的嵌套If語句,但我的編程感覺告訴我有一個更簡單的方法。

在此先感謝!

+1

「最高效」是非常主觀的。你裝什麼?緊湊的代碼,快速的代碼,... –

+1

你可以使用上面的內容,並在那裏找到組合,並轉移到左邊?也看看分組的邏輯,「所以如果1,2,3相等,它是價值,3或2低中,無低我總是高」 –

+0

@LS_ᴅᴇᴠ緊湊確實是最想要的 – Krapton

回答

2

是否需要一個表?

如果你把三個值的總和,你得到的對應關係如下:

Low: 3, 4 or 5 
Medium: 6 
High: 7, 8, or 9. 

代碼:

 P = V1 + V2 + V3 
     If P < 6 Then 
      R = 1 
     ElseIf P < 7 Then 
      R = 2 
     Else 
      R = 3 
     End If 

您也可以直接製表之和,或用公式

Sgn(V1 + V2 + V3 - 6) + 2 

(將難以做得更緊湊,因爲三個變量必須以某種方式出現)。


其實,分數是對稱的,初始表可能已經被被壓縮爲

111 => 1 
112 => 1 
113 => 1 
122 => 1 
123 => 2 
222 => 2 
223 => 3 
233 => 3 
333 => 3 

最後一點

如果分數都派代表參加一個(-1, 0, +1)規模,該公式簡化爲

Sgn(V1 + V2 + V3) 
+0

美麗!我沒有考慮不使用該表的可能性。謝謝! – Krapton

+0

@Krapton:參見可能會更新關於對稱性。 –

+0

@Krapton:還要注意,我對總和7的觀察是錯誤的,所以問題更加容易。 –

1
Sub heres_an_idea() 

Dim dicLow As New Scripting.Dictionary 
Dim dicMed As New Scripting.Dictionary 
Dim dicHigh As New Scripting.Dictionary 

dicLow.Add "LLL", "" 
dicLow.Add "LLM", "" 
dicLow.Add "LLH", "" 

dicMed.Add "MMM", "" 

dicHigh.Add "HHH", "" 

If dicLow.Exists("MMM") Then 
    'low 
    Debug.Print "low" 
ElseIf dicMed.Exists("MMM") Then 
    'med 
    Debug.Print "med" 
ElseIf dicHigh.Exists("MMM") Then 
    'high 
    Debug.Print "high" 
End If 

End Sub 
+0

看起來不錯!謝謝 – Krapton

1

「最高效」是非常主觀的。我會把所有的值放到一個數組中(並不是那麼多),並用基於你的值的索引訪問它。

  1. 考慮index = FirstValue + SecondValue*3 + ThirdValue*9

    FirstValue:0 = L1,1 = L2,2 = L3

    SecondValue,ThirdValue:0 = L1,1 = L2,2 = L3,3 =未使用

    (這一套並非最優的,因爲你可以與使用的第三結合未使用的第二,但可以截斷這些值!)

    這將導致3 *(3 * 4 + 1)= 39的組合,小串!

  2. 把所有的結果以表格和撰寫的字符串:

    myData = "000001011001012122011122122001012122012"其中0 =低,1 = Meddium,2 =高

  3. 定義你的函數(和類型,如果你願意的話):

VBA代碼:

Enum myType 
    L1 = 0 
    L2 = 1 
    L3 = 2 
End Enum 

Function getValue(ByVal V1 As myType, Optional ByVal V2 As myType = 3, Optional ByVal V3 As myType = 3) 
     getValue = Array("Low", "Meddium", "High")(Mid("000001011001012122011122122001012122012", V1 + V2 * 3 + V3 * 9 + 1, 1)) 
End Function 

氏s會快而短。在使用前只需要處理一些數據!

+0

謝謝!我把它作爲一個任務,這是PowerPoint演示文稿的一部分。我還沒有把它放在excel表格中,因爲我不確定這是處理這個問題的最好方法,但是你的回答很有趣! – Krapton