2017-08-16 3 views
0

Ich frage mich, was Ihre Meinung der folgenden ist:Was ist der effizienteste Weg, eine Umwandlungstabelle Algorithmus zu programmieren

I 1 bis 3 Werte konvertieren müssen und es in einen einzigen Wert, während er eine Umrechnungstabelle :

Low + High + High = Medium

Medium + Me:

enter image description here

Hier ist ein Beispiel dium + High = Hoch

Was denkst du, ist der effizienteste Weg, diesen Algorithmus zu programmieren? Die Sprache, die ich verwenden werde, ist VBA (Excel)

Ich dachte bereits über eine Menge von verschachtelten If Aussagen, aber meine Programmierung Sinn sagt mir, es gibt einen einfacheren Weg.

Vielen Dank im Voraus!

+1

"Am effizientesten" ist sehr subjektiv. Was tust du? Kompakter Code, schneller Code, ... –

+1

Können Sie das oben genannte verwenden und die Kombination darin finden und nach links verschieben? Schauen Sie sich auch die Gruppierung der Logik an, "also wenn 1,2,3 gleich sind, ist es der Wert, 3 oder 2 Tiefen ist mittel, keine Tiefen ich immer hoch" –

+0

@ LS_ᴅᴇᴠ Kompakt ist in der Tat am meisten erwünscht – Krapton

Antwort

2

Benötigen Sie eine Tabelle?

Wenn Sie die Summe der drei Werte annehmen, erhalten Sie die folgende Korrespondenz:

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

Code:

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

können Sie auch die Summe direkt tabellarisch oder verwenden Sie die Formel

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

(wird kompakter sein, da die drei Variablen irgendwie erscheinen müssen).


Tatsächlich, wie die Werte symmetrisch sind, könnte die Anfangstabelle bereits wurden als

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

Abschließender Hinweis komprimiert:

Wenn die Werte auf dargestellt werden eine (-1, 0, +1) Skala, vereinfacht sich die Formel zu

Sgn(V1 + V2 + V3) 
+0

Schön! Ich habe nicht über die Möglichkeit nachgedacht, den Tisch nicht zu benutzen. Vielen Dank! – Krapton

+0

@Krapton: siehe möglicherweise über Symmetrie aktualisieren. –

+0

@Krapton: Beachten Sie auch, dass meine Beobachtung über die Summe 7 falsch war, so dass das Problem noch einfacher ist. –

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

Sieht gut aus! Danke – Krapton

1

"Am effizientesten" ist sehr subjektiv. Ich würde alle Werte in ein Array (sind nicht so viele) und greifen Sie auf Index basierend auf Ihre Werte.

  1. Erwägen index = FirstValue + SecondValue*3 + ThirdValue*9

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

    Second, ThirdValue: 0 = L1, 1 = L2, 2 = L3, 3 = Unused

    (Dieser Satz ist nicht optimal, wie Sie nicht verwendete zweite gebrauchte dritte kombinieren können, aber Sie können diese Werte gestutzt!)

    Das in 3 * (3 * 4 + 1) = 39 Kombination führt, einen kleinen Schnur!

  2. Setzen Sie alle Ihre Ergebnisse in einer Tabelle und bilden eine Zeichenfolge:

    myData = "000001011001012122011122122001012122012" 0 = Low, 1 = Meddium, 2 = High

  3. Definieren Sie Ihre Funktion (und geben Sie, wenn Sie möchten):

VBA-Code:

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 

Thi s wird schnell und kurz sein. Nur müssen Sie Ihre Daten ein wenig vor der Verwendung arbeiten!

+0

Danke! Ich habe das als Aufgabe bekommen, und das war Teil einer PowerPoint-Präsentation. Ich habe dies noch nicht in eine Excel-Tabelle aufgenommen, weil ich mir nicht sicher war, ob das der beste Weg ist, damit umzugehen, aber Sie antworten, ist interessant! – Krapton

Verwandte Themen