0

对于我正在编写的表单,我有以下(简化的)条件需要验证:

a > b

a > c

a > d

b > c

b > d

c > d

从图形上看,这可以看作:

在此处输入图像描述

用户可以自由输入 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]")

我对这个解决方案的问题是很难阅读和理解 - 解决方案只是不清楚。

我有一种挥之不去的感觉,那就是那里有一个更好、更清晰的答案,但我一生都想不出它。这不是家庭作业或任何东西——我实际上正在做一个项目,这个问题(或它的细微变化)不止一次出现,所以我想制作一个清晰有效的可重用解决方案。任何输入将不胜感激。谢谢!

4

3 回答 3

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]
于 2012-08-22T16:39:52.277 回答
2

如果你不能假设比较的传递性:

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

否则,f p 的解是最优的。

于 2012-08-22T16:46:29.017 回答
0

您可以为每个检查创建委托并将它们添加到数组中。创建适当的委托,例如 bool LargerCheck(a,b, string error) 并将它们添加到您可以循环的数组中......

虽然有很多工作,而且更复杂,如果更具可读性的话。我想我会在单个验证块中隐藏凌乱的检查,并在正常代码中进行易于阅读的单个检查。像这样的东西;

// 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;
}
于 2012-08-28T13:31:52.767 回答