对于判断很多的函数,或者某一段程序(其实这样的一段程序,单单就其复杂程度而言也可以考虑独立成为一个函数了),可以写真值表来帮助解决。简单总结如下:

  首先找出来判断条件的变量。对于判断条件就复杂得需要借助一点外力的程序,参与判断的变量肯定是不少的,需要全部列出来。

  很多情况下,判断条件的变量并不是简单的布尔值,那么最好转换成布尔值,否则真值表本身也太复杂了。比如,l_color变量可能取值有enmu_black, enum_gray, enum_white,那么可以做三个对应的变量is_black, is_gary, is_white。

  判断的结果,也往往未必就是布尔值,那么这时候可以考虑采用中间变量的布尔值代替判断结果。但是关于这一点,只是个人猜测,我的程序结果虽然不是布尔值,但是它的返回值只有两种可能,和布尔值也没什么区别。

  然后,就是写真值表了,这个千变万化不见其宗,只能根据自己程序的需求来写。比如我的代码,写出的真值表有两个:

        DEL     ADD

CO_RE   -       -

CO_TE   X       X

CO_NONE X       X

        DEL     ADD

UN_RE    -       -

UN_TE    -       -

UN_NONE O       -

UN_NH    O       O

UN_WO    O       O

UN_SP    O       O

  圆圈表示返回真,横杠表示返回假,叉表示没有效果。

  下面一步,是化简真值表,这个在网上搜一下,相关的教程还是有的。应该是数字逻辑或者离散数学里的内容,就不献丑了。我自己化简的很没有章法,而且是化简完了才想起来去网上搜一下的:

        DEL     ADD

RE       -       -

NONE     O       -

OTHER    O       O

  

  结果相同的组合,合并成一个判断。本来我是打算完全按照这个真值表来写程序的,就是分别设置RE、NONE、OTHER和DEL、ADD的值,最后做运算。后来发现这样做其实得不偿失,这种做法适合比较复杂的程序,可是本来真值表通过化简就已经把程序的判断简化出来,这样做有点大炮打苍蝇。

  因为真值表的结果已经很简单了,所以代码还是if…else的写出来了。在这里真值表更多的是一个帮助分析的工具。如果是从真值表生成表达式(实际就是从真值表生成程序),那就不简单了,可惜短时间里没找到有用的工具。如果有这样的工具,我们就写一个真值表好了,化简也不化简,丢过去,程序就出来了。

一点链接:

http://zh.wikipedia.org/wiki/真值表

http://en.wikipedia.org/wiki/Truth_table —> 这个我只扫了一眼

http://cs.cup.edu.cn/TeacherHomePages/chenxuelan/lssx/1-34%20真值表与等价公式.ppt

命题公式真值表生成算法研究与程序设计:http://www.queshao.com/docs/31353/ —>这个挺贵的,不知道好不好

    程序不特别复杂,我担心写错,于是才用了真值表。就昨天程序的复杂程度,应该是用不着的。

[原文在百度空间已经关闭]