第五章--分支结构PPT课件_第1页
第五章--分支结构PPT课件_第2页
第五章--分支结构PPT课件_第3页
第五章--分支结构PPT课件_第4页
第五章--分支结构PPT课件_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1,第五章 分支结构 分支结构是计算机程序中一种主要结构,它是进行逻辑判断的主要手段。各种计算机语言都提供了实现分支结构的语句,Auto LISP语言提供了两个实现分支结构的函数if和cond。本章的重点是介绍这两个函数的功能和应用。同时也是分别介绍各种测试函数。 5.1 关系运算函数 关系运算函数就是对数值型表达式的大小进行比较的函数。这些函数的参数即数值表达式可以是两个也可以是多个。关系运算函数的求值结果的返回值不是数值量而是逻辑量,如果成立返回值为T,否则为nil。Auto LISP语言提供了六种关系运算函数: 5.1.1 格式 (函数名 数1 数2) 其函数名: = 等于 大于 = 大

2、于或等于 /= 不等于,2,参数: 数1数2为数值表达式,其值必须为数,可以是整型数也可以是实型数,如果是字符串,则要按ASC码大小进行比较。函数的参数个数一般不限。 5.1.2 功用及求值结果 主要 用于比较各数值型表达式的值之间的关系,数值表达式可以是数字原子、变量或表,执行关系运算函数时先对各表达式求值,再对其值进行比较,比较 结果成立,返回值为T,否则为nil。 ( (+ 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

3、(以ASC码进行比较) (/= 1 2 3 4) 返回值为T (/= 1 1 3 4) 返回值nil,3,5.2 逻辑运算函数 对应于一般高级语言的逻辑运算符,Auto LISP也相应的提供了三种逻辑运算函数,即逻辑“与”and,逻辑“或”or和逻辑“非”not。Auto LISP的三个逻辑运算函数 的参数可以是任意类型的表达式,下面分别介绍: 5.2.1 逻辑“与”函数AND 1.调用格式 (and 表达式) 表达式个数不限。 2.功用及求值结果 执行该函数时对其各表达式依次求值,若求值过程中碰到nil,函数的返回值即为nil,若所有表达式的值均为非nil,该函数返回T。例如: (and 1

4、 2 3 T) 返回值T (and 1 2 3 () 返回值nil (and (setq e 10) (+ 3 1) 12) 返回值T 5.2.2 逻辑“或”函数OR 1.调用格式 (or 表达式) 表达式个数不限。 2.功用及求值结果 执行该函数时对表达式依次求值,只要有一个表达式的值为非nil则返回T。只有全部表达式的值为nil,才返回nil,例如,4,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 表达式) 只有一个参数。 2.功用及求

5、值结果 当表达式的值为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测试表达式则表达式否则表达式) 表达式可以是任意表达式,包括原子和表,5,5.3.2功用及求值结果 在程序设计中,根据其是否满足某一条件来决定程序走向时常用此函数,执行此函数时,先对测试表达式进行求值,若其值为非nil,即测试式成立,执行则表达式,并把其求值结果作为if函数的调用返回值。否则,若测试表达式的值为n

6、il,且任选项否则表达式存在,则执行否则表达式,并返回其求值结果,若否则表达式不存在,且测试表达式为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 ( 4 3) “Yes” “No”) 返回值“Yes” (if a

7、nd ( 4 3) “Yes” “No”) 返回值“Yes” (if not (= 2 3) “Yes” “No”) 5.3.3 注意 1.if函数的参数可以是任意表达式,即可以是数字原子、字符原子及字符串亦可以是表,6,2.测试表达式的值不一定必须为T才算成立,因为从逻辑角度来说任何非nil的表达式都与T等效,只要其值为非nil即可,例如测试表达式为1.2.“text”,(List 1 2 3),(setq a 3.0) (+ 13 8),(print “a”),a(已赋值)等,其值虽非T,但为非nil,固测试均成立。并进行则表达式。只有测试表达式的值为nil,如/(),(and ( 3 2

8、)测试不成功,则进行否则表达式。 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函数的参数为任意数目的表,而每一个表中第一个元素为测试式,表中其余元素为结果。结果部分可以是多个表达式。测试式和结果均可以是任意S表达式,7,5.4.2 功用 多分支条件函数,包括多个测试条件。根据满足条件的不同,执行相应的的操作。当

9、执行cond函数的函数时依次测试每一个条件分支,即对每个支表中第一个元素测试式求值。若测试结果为nil,即测试失败,则转向下一个条件分支。若某一个条件分支的测试式求值结果为非nil,则该分支便是满足测试条件的分支,其后面的其它分支即不在被求值,cond函数就转向执行该成功分支的结果。cond函数的控制结果见图5.1,测试式1,测试式2,nil,nil,nil,测试式n,nil,结果1,结果2,结果n,T,T,T,图 5.1,8,5.4.3求值结果 cond函数总是对成功分支的结果部分各表达式进行求值并把逻辑上的最后一个表达式的求值结果作为调用cond函数的返回值。 当所有分支的测试结果均为ni

10、l,或者一个分支也不存在时,cond函数返回nil。 若成功的分支没有结果部分,那么测试式的求值结果即为cond的返回值。 为了深入理解cond函数的应用、功能、下面举几个例子: 例1用cond函数打印学生某门课的成绩。 (defun M1 () (initget 7) (setq m (getreal “n 分数:”) (cond ( m 60.0) (print “不及格”) ( m 70.0) (print “及格”) ( m 80.0) (pront “良好”) (T (print “优秀”),9,F(x),x 0 x2 x2 2x5 x3 5x7 ex x7,例2.用cond函数来描

11、述下列计算式,程序为: (initget 7) (setq x (getreal “Enter x=? (x = 0)”) (setq fx (cond (and (= x 0) (= x 2) (= x 5) (= x 0) ( x 2) x,10,and (= x 2) (= x 5) ( x 7) (expt x 3) T (exp x) ) 即是错误的。 2.最后一个表的测试式为T,它好象是一个收容器,凡是不能满足上面任一测试式的情况,多收容在这个分支来执行,表示“其它”的意思。 3.每个分支表中的结果可以由多个表达式组成,若该分支条件成立其结果中各表达式依次被求值 。 4.和if函数

12、一样,测试式、结果可以是任意表达式。 5.5 其它测试函数 除前面介绍的测试函数外Auto LISP还提供了以下10个测试函数: 判断数的性质的函数 ZEROP,MINUSP,NUMBERP 判断数据类型的函数 TYPE,ATOM,LISTP,NULL,BOUNDP 判断等值函数 EQ,EQUAL 由于这些测试函数,大部分可用前面函数代替,有些函数不常用,故对其功能只作简单介绍。 5.5.1判断性质的函数 1.ZEROP函数 (1)调用格式 (zerop 项) (2)功用及求值结果 测试项是否为零。若项为数,此函数返回T。否则返回nil。例如,11,setq a 0.0 b 12.0) (ze

13、rop a) 返回T (zerop b) 返回nil 2.MINUSP函数 (1)调用格式 (minusp 项) (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 (n

14、umberp h) 返回nil (numberp (eval) h) 返回T,12,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 =) 返回subr,表5-1 数据类型符号的意义,13,2.ATOM函数 (1)调用格式 (atom 项) (2)功用及求值结果 该函

15、数测试项是否为原子,若是则返回T,否则返回nil。例如: (atom /a) 返回T (atom /(x y z) 返回nil 3.LISTP函数 (1)调用格式 (listp 项) (2)功用及求值结果 该函数测试项是否为表或用户自定义的函数,若是则返回T,否则返回nil。例如: (atom /(a b c)) 返回T (atom /a) 返回nil,14,4.NULL函数 (1)调用格式 (null 项) (2)功用及求值结果 该函数测试项的当前约束值是否为nil,若是则返回T,否则返回nil,例如: (setq a 1.0 b nil) (null b) 返回T (null a) 返回n

16、il 5.BOUNDP函数 (1)调用格式 (boundp 原子) (2)功用及求值结果 该函数测试项是否为有无约束值,若原子的值是一个原子,且有一个值约束它,则返回T,否则返回nil,例如: (setq a 2.0 b nil c (1 2 3) d “ss”) (boundp /a) 返回T (boundp /b) 返回nil (boundp /c) 返回T (boundp c) 返回nil (boundp /d) 返回T,15,5.5.3等值函数 前面介绍的等值比较函数(=),它只能用于原子和字符串,而不能用于表,下面提供的等值函数EQ和EQUAL,可用于各种S表达式。 1.调用格式 (

17、eq 表达式1表达式2) (equal 表达式1表达式2) 2.功用及求值结果 eq和equal都是等值函数,即都是判断表达式1和表达式2是否相等,但两者有区别。equal函数只要它的两个参数表达式1和表达式2的值相等就返回T,否则返回nil,而eq函数的等值更严格,即不只是表达式1、表达式2的值要相等,而且要占用同一内存空间才返回T,否则返回nil。若两个表达式为原子,反映不出eq和equal的差异,即两个函数是等价的,但如果二表达式为表就反映出二者的差异来。 例如: (setq x /a) (setq y /a) (eq x y) 返回T (equal x y) 返回T 又如: (setq

18、 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,16,对equal函数来说,(equal L1 L2)和(equal L3 L2),都返回T,但对eq来说,(eq L3 L2)返回T,而(eq L1 L2)则返回nil。 因为调用cons,list这样函数构成新表时,每调用一次都要从自由存贮表划出一些新的内存单元,用这些内存单元来装配新表,所以虽然(L1和L2)的值是相同的,都是表(a b c d),但两个表都占用了不同的内存单元;另一方面用setq时

19、,只只加一指针,即L3指向L2的值所在的内存单元,所以L3和L2不仅值相等,而且都指向相同的内存单元,所以(eq L3 L2)返回T。 5.6 顺序控制函数PROGN 5.6.1调用格式 (progn 标准表) 5.6.2功能及求值结果 该函数按顺序对每一个标准表进行求值,并返回最后一个标准表的求值结果。例如: (if (= x 1) (progn (setq x (+ x 2) (setq y (* x 4.0) (print (list x y) ),17,5.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) (initget “Y N”) (setq ch (strcase (getwork “n是否还要修改?”) ;循环修改 (if (=

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论