5.4.4 判定表与判定树
判定表与判定树是一种列表设计工具,常用于条件嵌套的复杂判定情况的分析与设计,以及多分支结构代码的设计与实现。
(1)判定表。判定用来描述一些不易用语言表达清楚或需要很大篇幅才能用语言表达清楚的加工逻辑。在某些数据处理问题中,其数据流程图的处理需要依赖于多个逻辑条件的取值,这些取值的组合可能构成多种不同情况,相应地需要执行不同的动作。这种问题用结构化语言来叙述很不方便,使用判定表或判定树作为表示加工说明的工具是最合适的。
一个判定表由四个部分组成,如表5.1所示。
表5.1 判定表的组成

当某个判定结构依赖于较多的条件且有较多的取值时,用判定表能够把所有的条件组合一个不漏地表达出来,相应地可以分析不同的条件组合应该采取什么操作。这可以避免出现在某种条件和取值下可能无相应的操作,或有动作却不依赖某个条件和取值而存在的现象,从而帮助分析人员澄清问题,甚至可以发现用户可能遗漏的、尚未提出的逻辑要求。
例5.4 细化学生成绩的奖励条件:学生每学期已修课程成绩的比率。优秀比率占70%以上,并且中下所占比率小于15%,而且表现优良的学生可以获得一等奖学金,表现一般的学生可以获得二等奖学金;优秀比率占70%以上,中以下所占比率小于20%,表现优良的学生可以获得二等奖学金,表现一般的学生可以获得三等奖学金;中以下所占比率小于20%,表现优良的学生可以获得三等奖学金,表现一般的学生可以获得四等奖学金。
解:
表5.2 用判定表给出学生成绩的奖励的加工逻辑

例5.5 某校的课酬计算方案如下。
(1)基本课酬为每节课10元。
(2)如果班级人数超过40人,课酬增加:基本课酬×0.1。
(3)如果班级人数超过60人,课酬增加:基本课酬×0.2。
(4)如果教师是副教授,课酬增加:基本课酬×0.1。
(5)如果教师是教授,课酬增加:基本课酬×0.2。
(6)讲师,课酬不增加。
(7)助教,课酬减少:基本课酬×0.1。(https://www.daowen.com)
请用判定树表达上述计算方案。
解:
表5.3 用判定表给出课酬的加工逻辑

综合上述例子给出判定表的构造步骤如下。
①列出所有基本条件,填写判定表的左上限。在本例中,奖学金的发放依据三个条件,分别是成绩优秀比率、成绩中下比率、表现情况。
②列出所有的基本操作,填写判定表的左下限。在本例中,奖学金的发放分为4个等级,分别为一、二、三、四等奖学金。
③计算所有可能的、有意义的条件组合,确定组合规则个数,填写判定表的右上限。在本例中3个条件均有2种取值,但因条件1与条件2只有其中一个条件的取值为Y时,条件组合才有意义,所以规则个数应该是2+2=4。
④将每一种组合指定的操作添加到右下限相应的位置。
⑤简化规则,合并及删除等价的操作。合并原则是:找出操作在同一行的,检查上面的每一个条件是否影响该操作的执行,如果条件不起作用,则可以合并等价操作,否则不能简化。例如,在本例中,获得二等奖学金的组合有3个,经过分析,我们发现优秀率70%以上,中下比率小于15%,表现一般的获得二等奖学金;优秀率70%以上,中下比率小于20%,表现优良的获得二等奖学金;优秀率50%以上,中下比率小于15%,表现优良的获得二等奖学金。3个组合中每个条件都起作用所以不能化简。
⑥如果对判定表进行了化简,就需要将化简后的结果重新排列。
判定表的优点在于它能把复杂的情况按各种可能的情况逐一列举出来,简明而且易于理解,也可以避免遗漏。它的不足在于无法表达重复执行的动作,如循环结构等。
(2)判定树。判定树是用一种树图形方式来表示多个条件、多个取值所应采取的动作。判定树分支表示各种不同的条件,随着分支层次结构的扩充,各条件完成自身的取值。判定树的叶子给出应完成的动作。
例5.6 将例5.4的学生成绩的奖励用判定树表示出来。
解:学生成绩的奖励的判定树如图5.9所示。

图5.9 奖学金发放判定树
判定树是判定表的变种,本质完全一样,所有用判定表能表达的问题都能用判定树来表达。判定树比判定表更直观,用判定树来描述具有多个条件的数据处理,更容易被用户接受。