Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在VB6中检测冲突数学运算符的函数_Vb6_Logical Operators_Mathematical Expressions - Fatal编程技术网

在VB6中检测冲突数学运算符的函数

在VB6中检测冲突数学运算符的函数,vb6,logical-operators,mathematical-expressions,Vb6,Logical Operators,Mathematical Expressions,我开发了一个程序,根据州标准使用不同类型的保险范围生成保险报价。现在我想添加指定“规则”的功能。例如,我们可能有3种类型的覆盖范围(我们称之为UM、BI和PD)。有些州不允许PD大于BI,其他州不允许UM在没有BI的情况下存在。因此,我为用户添加了创建这些规则的功能,以便在生成报价时遵循规则,从而在程序生成报价时不会违反任何州的规定 问题 我不希望用户能够选择冲突的规则。用户可以选择任意VB数学运算符(>,=,B B>C C>A 如您所见,最后一条规则与以前设置的规则冲突。我的解决方案是在用户

我开发了一个程序,根据州标准使用不同类型的保险范围生成保险报价。现在我想添加指定“规则”的功能。例如,我们可能有3种类型的覆盖范围(我们称之为UM、BI和PD)。有些州不允许PD大于BI,其他州不允许UM在没有BI的情况下存在。因此,我为用户添加了创建这些规则的功能,以便在生成报价时遵循规则,从而在程序生成报价时不会违反任何州的规定

问题

我不希望用户能够选择冲突的规则。用户可以选择任意VB数学运算符(>,=,B
  • B>C
  • C>A
  • 如您所见,最后一条规则与以前设置的规则冲突。我的解决方案是在用户每次单击“将规则添加到列表”时验证列表

    假设第三个列表项尚未在列表中,但用户已单击“添加规则”将其放入列表中。验证过程首先检查两个传入变量是否已在同一行中使用。如果没有,则只搜索左侧传入变量(在本例中为“C”)在已创建的列表中。如果找到它,则将tmp1设置为匹配的变量(tmp1='B')。然后对右侧的传入变量(在本例中为'A')执行相同操作。然后将tmp2设置为与A的变量相等(tmp2='B')。如果tmp1和tmp2相等,则传入规则要么冲突,要么与使用的运算符无关。我很确定这是给定3个变量的可靠逻辑。但是,我发现添加任何附加变量都可以轻松绕过我的验证。在任何给定状态下,可能有10种以上的覆盖类型,因此这是非常重要的rtant能够验证3个以上

    在给定任何数量的变量时,是否有统一的方法来进行合理的验证?任何想法或想法都值得赞赏。我希望我的解释有意义。
    感谢

    我的最佳选择是某种层次结构的规则树。当用户添加第一条规则(例如A>B)时,应用程序可以创建如下数据结构(LowerValue是一个映射,其键指向一个值列表):

    现在,当用户添加下一个规则(B>C)时,应用程序可以检查B是否已经在任何lowerValues列表中(在本例中为a)。如果出现这种情况,C将添加到lowerValues['a'],并且lowerValues['B']也将被创建:

    lowerValues['A'] = ['B', 'C']
    lowerValues['B'] = ['C']
    
    最后,当用户提供最后一条规则(C>A)时,应用程序检查C是否在任何较低的值列表中。因为它在B和A中,所以该规则无效

    希望有帮助。我不记得VB中是否有某种映射。我想你应该试试Dictionary对象

    为了实现这一想法,所有操作都必须在内部转换为简单类型。例如:

    A > B
    
    可以翻译为

    B <= A
    

    B一般来说,这是一个相当困难的问题。事实上,你想知道的是(显然)某一组算术上的一组命题方程是否为真。要做到这一点,你需要相当于“知道”算术的约束解算器。在VB6中不太可能找到,但你可以将其作为子进程调用

    如果规则是仅在不等式(AA)上的命题方程,请仅用一种方法编写。 第二,尝试解决重言式的命题(看看你可能在VB6中笨拙地暗示什么)


    如果命题不是重言式,那么现在你需要构建不等式链(例如,a>B>C)作为一个图并寻找循环。失败的地方是当命题有析取,例如(“a>B或B>Q”);您必须为每个析取组合生成一个不等式链,并丢弃不一致的析取。如果您丢弃所有析取,则集合是不一致的。请注意“A和B”之类的表达式;根据Demorgan定理,它们等价于“非A或非B”,例如,“A>B和B>Q”与当然,字典可能是我现在所做工作的一个很好的替代品……但是对于4个变量来说,它到底能起到什么作用呢?(*a>=B*bd*D=a)“D”不会出现在“A”下的字典中,因此这将绕过验证,但这是一个冲突。我确实喜欢翻译符号的想法……这可能会增加一些可能性。D已经在较低的[A]中,因此您可以在那里检测到冲突-您可能需要一个equals[]/notequals[]为了跟踪这些操作,@Robson-很喜欢你的想法,但需要更多的工作来充实=这将是一件痛苦的事情,因为它的表达能力像VB6一样有限。一些提示。在相等(=和)之间划分规则还有关系运算符。对于关系重新排列,所以只使用一个运算符,例如:<在这一点上,你有一个顺序BB <= A