程序的流程控制和AutoLISP文件
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
不成立 成立
测试表达式2 结果Biblioteka Baidu达式2
不成立 成立
测试表达式n 结果表达式n
不成立 T(其余)
结果表达式
(setq n(cond ((<= i 1) 1)
((<= i 2) 4)
((<= i 3) 10)
(t 100)
)
)
说明:该函数类似于C语言的switch语句, 最后一个测试表达 式“t(或T)”相当于C语言的“default”,指其余的情况,例如 i 等于5时,n等于100,也可以缺少这个测试表达式。与C语言 switch语句不同的是,若某一测试表达式成立,即返回相应结果 表达式的值,不再向下测试。例如,上述表达式中,若i 等于0 ,已满足第一个测试表达式(<= i 1),返回结果表达式的1,最 后结果是n等于1,运算结束。
2. (while 测试式 表达式 …)
若测试结果不为nil,执行各表达式, 直至测试结果为nil。例如: (setq i 1 a 10) (while (<= i 10)
(setq a(+ a 10)) 其它表达式 … (setq i (1+ i ) ) 执行结果:i等于11,a等于110,返回值为11。
若将该程序段改写为以下代码:
(if (> a 1)
((setq b 2) (print (+ b a))
)
((setq b 4)
(print b)
)
)
用括号将条件成立或不成立的多个表达式括起,虽然变元的 数量改为3个,但会出现“error: bad function: 2”的出错信息。原 因是在计算条件成立的表达式时,首先计算内层表(setq b 2), 将其返回值“2”作为外层表的函数名,显然这是一个坏的函数 名。利用progn函数可以很好地解决了本程序段存在的问题。
例如,定义求解百钱买百鸡的函数。题目是若母鸡每只3个钱 ,公鸡每只2个钱,小鸡每只0.5个钱。用100个钱买100只鸡,有 几个答案,每个答案各有几只母鸡、公鸡和小鸡(不包括0只) ,打印所求的结果。
该例没有合适的计算公式,只能利用枚举,试出合适的结果 。首先分析母鸡数量的范围,如果母鸡等于20,剩余40个钱。用 剩下的钱至少买1只公鸡之后,可以买76只小鸡,但鸡的总数为 97(小于100),所以母鸡的数量应小于20。同样,买了至少1只 母鸡和32只公鸡之后,剩余的33个钱最多买66小鸡,鸡的总数为 99(小于100),所以公鸡的数量应小于32。小鸡的数量只能是 100减去母鸡与公鸡之和。当公鸡的数量和钱数都等于100时,打 印这组解。
3.1 程序的流程控制
AutoLISP程序的流程通过流程控制函数控制。
3.1.1 分支结构
1. (cond (测试表达式1 结果表达式1) [(测试表达式2 结果表达 式2)] …)
该函数从第一个子表起,计算每一个子表的测试表达式, 直至有一个子表的测试表达式成立为止,然后计算该子表的 结果表达式,并返回这个结果表达式的值。
3. (prong 表达式...)
该函数将n个表达式组合起来,作为if函数的一个表达式。在 执行时,按顺序计算n个表达式,返回最后一个表达式的计算结果 。例如: (if (> a 1)
(progn (setq b 2) (print (+ b a))
) (progn (setq b 4)
(print b) ) ) 该程序段的执行过程是,若条件成立,b等于2,然后打印a与 b之和,返回a与b之和;若条件不成立,b等于4,然后打印4,返 回4。
2.(if 测试条件表达式 表达式1 [表达式2])
若测试条件表达式结果为真,执行表达式1,否则,执行表达 式2。例如:
(if (> a 1) (setq b 2) ) 该表达式的含义是;如果a 大于 1,则b等于2,否则不作任何
计算,求值结束。
(if (> a 1) (setq b 2) (setq b 3) ) 该表达式的含义是;如果a 大于 1,则b等于2,否则b等于3,
3.1.2 循环结构
1. (repeat 整数n 表达式 …)
重复执行n次,对所有的表达式求值,返回最后一个表达式的 计算结果。例如: (setq a 1 b 100) (repeat 10
(setq a(1+ a)) 其它表达式 … (setq b(+ 10 b)) ) 执行结果:a等于11,b等于200,返回值为200。
例如,当 i 小于等于1时,n=1;小于等于2时,n=4;小于 等于3时,n=10;其它情况下n=100。用cond函数实现变量n 和i 之间以上关系的源代码如下:
成立 测试表达式1 结果表达式1
不成立 成立
测试表达式2 结果表达式2
不成立 成立
测试表达式n 结果表达式n
不成立
成立 测试表达式1 结果表达式1
求值结束。
注意:该函数最多只有3个变元,即测试条件表达式、表达式1和 表达式2。先分析下列程序代码:
测试条件 表达式
成立 表达式1
测试条件 表达式
成立 表达式1
不成立 表达式2
(if (> a 1)
(setq b 2)
(print (+ b a))
(setq b 4)
(print b)
)
该程序段的本意是,若条件成立,b等于2,然后打印a与b之 和,否则b等于4,然后打印b。但是在执行该程序段时,首先检 查if函数变元的数量,第1个变元是测试条件表达式,它对应表 达式(> a 1),第2个变元是条件成立时执行的表达式,它对应表 达式(setq b 2),第3个变元是条件不成立时执行的表达式,它对 应表达式(print (+ b a)) ,那么后面的两个表达式就是多余的变 元,因此显示“too many arguments(变元太多)”的出错信息 。
【例3-1】解百钱买百鸡程序
(defun chicken( / hen cock chick cost) (setq hen 1) (while (< hen 20);母鸡的数量不超过20 (setq cock 1) (while (< cock 32);公鸡的可能数量不超过32 (setq chick (- 100 hen cock));小鸡的数量 (setq cost (+ (* 3 hen)(* 2 cock)(* 0.5 chick)));3种鸡的钱数 (if (= cost 100) (print (list "母鸡=" hen " 公鸡=" cock " 小鸡=" chick)) ) (setq cock (1+ cock));公鸡的数量加1 ) (setq hen (1+ hen)) ;母鸡的数量加1 )