《第五章分支结构PPT课件》由会员分享,可在线阅读,更多相关《第五章分支结构PPT课件(20页珍藏版)》请在金锄头文库上搜索。
1、第五章第五章 分支结构分支结构 分支结构是计算机程序中一种主要结构,它是进行逻辑判断的主要手段。各种计算机语言都提供了实现分支结构的语句,Auto LISP语言提供了两个实现分支结构的函数if和cond。本章的重点是介绍这两个函数的功能和应用。同时也是分别介绍各种测试函数。 5.1 关系运算函数关系运算函数 关系运算函数就是对数值型表达式的大小进行比较的函数。这些函数的参数即数值表达式可以是两个也可以是多个。关系运算函数的求值结果的返回值不是数值量而是逻辑量,如果成立返回值为T,否则为nil。Auto LISP语言提供了六种关系运算函数: 5.1.1 格式格式 (函数名 数1 数2) 其函数名
2、: = 等于 小于 大于 = 大于或等于 /= 不等于1 参数: 数1数2为数值表达式,其值必须为数,可以是整型数也可以是实型数,如果是字符串,则要按ASC码大小进行比较。函数的参数个数一般不限。 5.1.2 功用及求值结果功用及求值结果 主要 用于比较各数值型表达式的值之间的关系,数值表达式可以是数字原子、变量或表,执行关系运算函数时先对各表达式求值,再对其值进行比较,比较 结果成立,返回值为T,否则为nil。 ( e1 e2 e3 e4en) 只有e1e2e3e4en 返回值为T,否则为nil。 ;e1en为表达式的数值。 (= e1 e2 e3 e4en) 只有e1e2e3e4en 返回
3、值为T,否则为nil。 (= e1 e2 e3 e4en) 只有e1=e2=e3=e4=en 返回值为T,否则为nil。 但/= 函数略有不同 (/= e1 e2 e3 e4en) 只要有任意两个数值表达式不等即返回T,只有全部相等返回nil。 例如: ( 1 2 3 4 5) 返回值为T ( (+ 4 3 2) (sqrt 4) 1) 返回值为T (setq a 3 b 4 c 6) ( a b c) 返回值为T (= a b c) 返回值nil ( “A” “B” “C” “X” “Y” “Z”) 返回值为T(以ASC码进行比较) (/= 1 2 3 4) 返回值为T (/= 1 1 3
4、4) 返回值nil 2 5.2 逻辑运算函数逻辑运算函数 对应于一般高级语言的逻辑运算符,Auto LISP也相应的提供了三种逻辑运算函数,即逻辑“与”and,逻辑“或”or和逻辑“非”not。Auto LISP的三个逻辑运算函数 的参数可以是任意类型的表达式,下面分别介绍: 5.2.1 逻辑逻辑“与与”函数函数AND 1.调用格式调用格式 (and 表达式) 表达式个数不限。 2.功用及求值结果功用及求值结果 执行该函数时对其各表达式依次求值,若求值过程中碰到nil,函数的返回值即为nil,若所有表达式的值均为非nil,该函数返回T。例如: (and 1 2 3 T) 返回值T (and 1
5、 2 3 () 返回值nil (and (setq e 10) (+ 3 1) 12) 返回值T 5.2.2 逻辑逻辑“或或”函数函数OR 1.调用格式调用格式 (or 表达式) 表达式个数不限。 2.功用及求值结果功用及求值结果 执行该函数时对表达式依次求值,只要有一个表达式的值为非nil则返回T。只有全部表达式的值为nil,才返回nil,例如: 3 (or 1 2 3 nil) 返回值T (or ( 3 5) 返回值nil (or a b c d) 返回值nil ;(a b c d均未赋值) 5.2.3 逻辑逻辑“非非”函数函数NOT 1.调用格式调用格式 (not 表达式) 只有一个参数
6、。 2.功用及求值结果功用及求值结果 当表达式的值为nil时,该函数返回T,否则返回nil,例如: (setq a 10 b /(A B C) c nil) (not a) 返回T (not b) 返回nil (not c) 返回T (not /() 返回T 5.3 二分支条件函数二分支条件函数 IF 5.3.1调用格式调用格式 (if测试表达式则表达式否则表达式) 表达式可以是任意表达式,包括原子和表。4 5.3.2功用及求值结果功用及求值结果 在程序设计中,根据其是否满足某一条件来决定程序走向时常用此函数,执行此函数时,先对测试表达式进行求值,若其值为非nil,即测试式成立,执行则表达式,
7、并把其求值结果作为if函数的调用返回值。否则,若测试表达式的值为nil,且任选项否则表达式存在,则执行否则表达式,并返回其求值结果,若否则表达式不存在,且测试表达式为nil,则返回nil。例如: (if (= (+ 2 3) 5) “Yes” “No”) 返回值“Yes” (if ( (- 3 2) 6) “Yes” “No”) 返回值“No” (setq c (if (/= “a” “a”) 3 8) 返回值8 (if (setq pt (getpoint “n p=?”) (print pt) p=? 2,3 ;屏上显示(2.0 3.0)(2.0 3.0) 打印值 返回值 (if (or
8、( 4 3) “Yes” “No”) 返回值“Yes” (if and ( 4 3) “Yes” “No”) 返回值“Yes” (if not (= 2 3) “Yes” “No”) 5.3.3 注意注意 1.if函数的参数可以是任意表达式,即可以是数字原子、字符原子及字符串亦可以是表。 5 2.测试表达式的值不一定必须为T才算成立,因为从逻辑角度来说任何非nil的表达式都与T等效,只要其值为非nil即可,例如测试表达式为1.2.“text”,(List 1 2 3),(setq a 3.0) (+ 13 8),(print “a”),a(已赋值)等,其值虽非T,但为非nil,固测试均成立。并
9、进行则表达式。只有测试表达式的值为nil,如/(),(and ( 3 2)测试不成功,则进行否则表达式。 3.if函函数数中中的的则则表表达达式式或或否否则则表表达达式式不不能能为为多多个个表表达达式式。否否则则必须用顺序控制函数必须用顺序控制函数progn。 例如: (if ( x 0) (progn (setq y 10) (setq z (/ y x) ) ) 5.4 多分支条件函数多分支条件函数COND 5.4.1调用格式调用格式 (cond (测试式1结果1) (测试式2结果2) (测试式n结果n ) cond函数的参数为任意数目的表,而每一个表中第一个元素为测试式,表中其余元素为结
10、果。结果部分可以是多个表达式。测试式和结果均可以是任意S表达式。 6 5.4.2 功用功用 多分支条件函数,包括多个测试条件。根据满足条件的不同,执行相应的的操作。当执行cond函数的函数时依次测试每一个条件分支,即对每个支表中第一个元素测试式求值。若测试结果为nil,即测试失败,则转向下一个条件分支。若某一个条件分支的测试式求值结果为非nil,则该分支便是满足测试条件的分支,其后面的其它分支即不在被求值,cond函数就转向执行该成功分支的结果。cond函数的控制结果见图5.1。测试式1测试式2nil nilnil测试式nnil结果1结果2结果nTTT图 5.17 5.4.3求值结果求值结果
11、cond函数总是对成功分支的结果部分各表达式进行求值并把逻辑上的最后一个表达式的求值结果作为调用cond函数的返回值。 当所有分支的测试结果均为nil,或者一个分支也不存在时,cond函数返回nil。 若成功的分支没有结果部分,那么测试式的求值结果即为cond的返回值。 为了深入理解cond函数的应用、功能、下面举几个例子: 例1用cond函数打印学生某门课的成绩。 (defun M1 () (initget 7) (setq m (getreal “n 分数:”) (cond ( m 60.0) (print “不及格”) ( m 70.0) (print “及格”) (= 0)”) (se
12、tq fx (cond (and (= x 0) (= x 2) (= x 5) (= x 0) (= x 2) (= x 5) ( x 7) (expt x 3) T (exp x) ) 即是错误的。 2.最后一个表的测试式为T,它好象是一个收容器,凡是不能满足上面任一测试式的情况,多收容在这个分支来执行,表示“其它”的意思。 3.每个分支表中的结果可以由多个表达式组成,若该分支条件成立其结果中各表达式依次被求值 。 4.和if函数一样,测试式、结果可以是任意表达式。 5.5 其它测试函数其它测试函数 除前面介绍的测试函数外Auto LISP还提供了以下10个测试函数: 判断数的性质的函数
13、ZEROP,MINUSP,NUMBERP 判断数据类型的函数 TYPE,ATOM,LISTP,NULL,BOUNDP 判断等值函数 EQ,EQUAL 由于这些测试函数,大部分可用前面函数代替,有些函数不常用,故对其功能只作简单介绍。 5.5.1判断性质的函数判断性质的函数 1.ZEROP函数 (1)调用格式调用格式 (zerop 项) (2)功用及求值结果功用及求值结果 测试项是否为零。若项为数,此函数返回T。否则返回nil。例如:10 (setq a 0.0 b 12.0) (zerop a) 返回T (zerop b) 返回nil 2.MINUSP函数 (1)调用格式调用格式 (minus
14、p 项) (2)功用及求值结果功用及求值结果 测试项是否为负值,若项为数且其值为负,则此函数返回T,否则返回nil,例如: (minusp (- 2.0 4.0) 返回T (minusp 0) 返回nil 3.NUMBERP函数 (1)调用格式调用格式 (numberp 项) 功用及求值结果功用及求值结果 测试项是否为数,若项的值为数,则返回T,否则返回nil。 (setq e 1.2 f 3 g /(3 5) h /e) (numberp e) 返回T (numberp f) 返回T (numberp g) 返回nil (numberp h) 返回nil (numberp (eval) h)
15、 返回T11 5.5.2判断数据类型的函数判断数据类型的函数 1.YYPE函数 (1)调用格式调用格式 (type 项) (2)功用及求值结果功用及求值结果 该函数判断项是什么数据,返回数据类型名,数据类型名在ATOMLST原子表中可找到,其表示的意义如表51所示:例如: (type /z) 返回sym (type 16) 返回int (type /(a b c) 返回list (type “w”) 返回str (type =) 返回subrType返回值 意 义 REAL 实型数 INT 整型数 STR 字符串 SYM 符号原子 LIST 表或用户定义的函数 SUBR 系统内部函数 FILE
16、 文件描述符 PICKSET Auto CAD选择集 ENAME Auto CAD实体名 PAGETB 函数页表 表5-1 数据类型符号的意义12 2.ATOM函数(1)调用格式调用格式 (atom 项)(2)功用及求值结果功用及求值结果 该函数测试项是否为原子,若是则返回T,否则返回nil。例如: (atom /a) 返回T (atom /(x y z) 返回nil 3.LISTP函数(1)调用格式调用格式 (listp 项)(2)功用及求值结果功用及求值结果 该函数测试项是否为表或用户自定义的函数,若是则返回T,否则返回nil。例如: (atom /(a b c)) 返回T (atom /
17、a) 返回nil 134.NULL函数(1)调用格式调用格式 (null 项)(2)功用及求值结果功用及求值结果 该函数测试项的当前约束值是否为nil,若是则返回T,否则返回nil,例如: (setq a 1.0 b nil) (null b) 返回T (null a) 返回nil 5.BOUNDP函数(1)调用格式调用格式 (boundp 原子) (2)功用及求值结果功用及求值结果 该函数测试项是否为有无约束值,若原子的值是一个原子,且有一个值约束它,则返回T,否则返回nil,例如: (setq a 2.0 b nil c (1 2 3) d “ss”) (boundp /a) 返回T (b
18、oundp /b) 返回nil (boundp /c) 返回T (boundp c) 返回nil (boundp /d) 返回T 14 5.5.3等值函数等值函数 前面介绍的等值比较函数(=),它只能用于原子和字符串,而不能用于表,下面提供的等值函数EQ和EQUAL,可用于各种S表达式。 1.调用格式调用格式 (eq 表达式1表达式2) (equal 表达式1表达式2) 2.功用及求值结果功用及求值结果 eq和equal都是等值函数,即都是判断表达式1和表达式2是否相等,但两者有区别。equal函数只要它的两个参数表达式1和表达式2的值相等就返回T,否则返回nil,而eq函数的等值更严格,即不
19、只是表达式1、表达式2的值要相等,而且要占用同一内存空间才返回T,否则返回nil。若两个表达式为原子,反映不出eq和equal的差异,即两个函数是等价的,但如果二表达式为表就反映出二者的差异来。 例如: (setq x /a) (setq y /a) (eq x y) 返回T (equal x y) 返回T 又如: (setq L1 (list /a /b /c) 返回 (a b c d) (setq L2 (list /a /b /c) 返回 (a b c d) (setq L3 L2) 返回 (a b c d)15 对equal函数来说,(equal L1 L2)和(equal L3 L2
20、),都返回T,但对eq来说,(eq L3 L2)返回T,而(eq L1 L2)则返回nil。 因为调用cons,list这样函数构成新表时,每调用一次都要从自由存贮表划出一些新的内存单元,用这些内存单元来装配新表,所以虽然(L1和L2)的值是相同的,都是表(a b c d),但两个表都占用了不同的内存单元;另一方面用setq时,只只加一指针,即L3指向L2的值所在的内存单元,所以L3和L2不仅值相等,而且都指向相同的内存单元,所以(eq L3 L2)返回T。 5.6 顺序控制函数顺序控制函数PROGN 5.6.1调用格式调用格式 (progn 标准表) 5.6.2功能及求值结果功能及求值结果
21、该函数按顺序对每一个标准表进行求值,并返回最后一个标准表的求值结果。例如: (if (= x 1) (progn (setq x (+ x 2) (setq y (* x 4.0) (print (list x y) ) )165.7 综合举例综合举例例1.齿轮参数修改的另一程序。 (defun clxg2 () (prompt “齿轮参数:p n i z”) (terpri) (initget “P N I Z”) (setq e (read (getwork “n欲修改的参数:”) (initget 7) (setq el (getreal “n修改值:”) (set e el) (ini
22、tget “Y N”) (setq ch (strcase (getwork “n是否还要修改?”) ;循环修改 (if (= ch “Y”) (clxg2) ) )17例2. 齿轮CAD系统的文本主菜单。 (defun chd (/ ch) (princ “* * * * *齿轮菜单* * * * *”) (print) (princ (strcat “n1设计计算”) (princ (strcat “n2结构选型”) (princ (strcat “n3图形绘制”) (princ (strcat “n4尺寸标注”) (princ (strcat “n5图形输出”) (print) (pri
23、nc “* * * * * * * * * * * * * * * * * *”) (print) (initget “1 2 3 4 5”) (setq ch (atoi (getwork “n输入选项”) ;函数(sjjs),(jgxx),(txhz),(ccbz),(txsc)等源程序省略。 (cond (= ch 1) (sjjs) (= ch 2) (jgxx) (= ch 3) (txhz) (= ch 4) (ccbz) (t (txsc) );cond );defun18例3 限制输入数据范围(2070)的函数。 (defun fw (/ a) (setq a (getreal “n输入一个数(2070):”) (if (or ( 70) (progn (prompt “n输入超界,请从新输入”) (fw) );progn );if ) ;如输入超界从新执行fw函数直至正确为止。 19个人观点供参考,欢迎讨论