2012-08-22 36 views
0

我已被驗證爲一個形式我寫需要以下的(簡化的)條件:efficently並明確評估六個條件

A> B

A> C

一> d

b> C

b> d

C> d

圖形,這可以被看作是:

enter image description here

用戶有自由爲A,B,c和d,這就是爲什麼他們需要進行驗證,以確保輸入值,他們遵守這些規則。我遇到的問題是寫一些能夠清楚而有效地評估每條語句的東西。當然,最明顯的方法是將每個陳述分別作爲if語句進行評估。不幸的是,這佔用了很多代碼行,我寧願避免使用一堆幾乎完全相同的if塊來混淆方法。我使用數組提出了以下嵌套for循環解決方案。我內置的值的數組,並環繞在它的兩倍(在Python樣證明僞代碼):

A = [a, b, c, d] 
for i in range(3): 
    for j in range(i, 4): 
     if i > j and A[i] >= A[j]: 
      print("A[i] must be less than A[j]") 
     else if i < j and A[i] <= A[j]: 
      print("A[j] must be greater than A[i]") 

我有這種解決方案的問題是,它是難以閱讀和理解 - 只是解決方案不清楚。

我有這種嘮叨的感覺,那裏有一個更好,更清晰的答案,但我無法想象它爲我的生活。這不是家庭作業或任何東西 - 我實際上正在研究一個項目,並且這個問題(或其細微的變化)不止一次地出現,所以我想製作一個清晰和高效的可重用解決方案。任何輸入將不勝感激。謝謝!

+0

看來,要求是'A'按降序排列,沒有重複的元素。 –

+0

而不是告訴用戶他們以錯誤的順序輸入了數值,你可以靜靜地對它們進行排序,以便它們按正確的順序排列嗎?或者這些值不能以這種方式互換? – Kevin

+0

在我的特殊問題中,並沒有真正的秩序。你基本上有四個框,a b c和d,你應該知道我上面列出的規則。如果您的輸入無效,我想告訴用戶告訴他們他們應該改變什麼,確切地說。這意味着列出所有失敗的案例。 – ccampo

回答

6
if a > b > c > d: 
    do ok 
else: 
    for x in range(3): 
     if A[i] <= A[i+1]: 
      print A[i], ' not greater than', A[i+1] 
+1

用這個單元格檢查每個單元格之後是不夠的,看看這個例子:'[4,3,2,4]',你的代碼只會打印出'2應該大於4',但這還不夠。 – MostafaR

+0

知道數據有問題就足夠了。 –

+0

'3應該比4'更壞也是一個錯誤的數據。 – MostafaR

2

如果您不能承擔比較及物:

from itertools import combinations 
for x, y in combinations(A, 2): 
    if x <= y: 
     print("{} not greater than {}".format(x, y)) 

否則,在fp的解決方案是最優的。

+0

謝謝,但我其實不是用Python編寫的(C#是精確的)。我只是使用類似Python的僞代碼來清楚地表明問題。 – ccampo

0

您可以爲每個檢查創建委託並將其添加到數組中。創建適當的代表,如bool LargerCheck(a,b,字符串錯誤)並將它們添加到數組中,您可以循環...

儘管很多工作更復雜,但更易讀。我想我只是將雜亂無章的支票隱藏在一個驗證塊中,並在正常的代碼中擁有易於閱讀的單個支票。像這樣的東西;

// Simple readable check in normal code 
if (!ValidationOk(a,b,c,d,response) 
{ 
    ShowResponse(response); 
    Break; 
} 


// messy routine 
private bool ValidationOk(a,b,c,d,List<string> valerrors) 
{ 
    valerrors.Clear(); 
    if (a<b) valerrors.Add("a < b"); 
    if (a<c) valerrors.Add("a < c"); 
    .... 
    return valerrors.Count == 0; 
}