COMMAND : (= (- 50 25) (SQRT 625)) Result : T
设计一简单程序(名称为AIR),在呼叫程序时,检查传入的数值自变量(为空气污染指数)是否大于200(即严重空气污染)
---- 启动文字编辑器,开启TEST.LSP程序文件,输入下列程序代码 :
(DEFUN AIR (NUM) (> NUM 200)) ---- 输入后存盘(纯文字格式)
---- 在AutoCAD绘图模式的指令行提示符号后,使用LOAD函数重新加载程序文件 COMMAND : (LOAD \
---- 在AutoCAD绘图模式的指令行提示符号后,输入自定函数名称及参数执行 COMMAND : (AIR 175) Result : nil COMMAND : (AIR 215) Result : T 四流程控制 第1节
-------------------------------------------------------------------------------- 条件判断
是利用条件函数,配合关系及逻辑运算所设定的一些准则,令程序自行分析,因应情况作出适当行动.
单一条件
(IF 条件表达式 是表达式 [否表达式] )
函数先检查条件表达式,若其传回值为 T,便会执行其后的是表达式
若有提供否表达式,且条件表达式的传回值为 nil,函数将不会执行(跳过)是表达式而执行否表达式 若没有提供否表达式,且条件表达式的传回值为 nil时,函数将不作任何事情 IF函数可以巢状方式嵌套,即在是或否的表达式中加入另一个IF函数
练习 (Exercises)
判断空气污染指数 : 大于100 = Very High, 51至100 = High, 26至50 = Medium, 25或以下 = Low
---- 启动编辑器,开启C:/TEST.LSP程序文件;新增AIR-1自定函数,程序代码如下 : (DEFUN AIR-1 (NUM) (IF (> NUM 100) (PRINC \ery High\ (IF (AND (> NUM 50) (<= NUM 100)) (PRINC \ (IF (AND (> NUM 25) (<= NUM 50)) (PRINC \ (IF (<= NUM 25)) (PRINC \ (PRINC))
程序说明
1 设定函数名称,并将数据存入自变量NUM内;用IF函数判断变量NUM是否大于100;若是则显示字符串Very High响应
2 用IF函数判断变量NUM是否大于50且(AND)小于或等于100;若是则显示High响应 3 用IF函数判断变量NUM是否大于25且(AND)小于或等于50;若是则显示Medium
4 用IF函数判断变量NUM是否小于或等于25;若是则显示Low
5 是一个没有提供任何自变量的PRINC函数;用以抑制显示答案时尾部符加的 nil 或重复的传回值;而最右一个关括号,是用以对应第1行最左边的开括号
IF函数的巢状练习 : 修改上一课的程序练习,将多个IF函数合并成巢状嵌套
---- 启动文字编辑器,开启C:/TEST.LSP程序文件 ---- 新增程序AIR-2,其程序代码如下 :
(DEFUN AIR-2 (NUM) (IF (> NUM 50) (PRINC (IF (> NUM 100) \ery high\ (PRINC (IF (> NUM 25) \ (PRINC))
程序说明
1 设定函数名称,并将数据存入自变量NUM内;用IF函数判断变量NUM是否大于50; 若条件成立(变量NUM大于50)时,再用另一个IF函数判断变量是否大于100;
若条件成立(变量NUM大于100)时,使用PRINC函数显示字符串Very High,否则显示High 2 若在第1个IF函数判断中,条件不成立(变量NUM不大于50)时; 再用另一个IF函数判断变量是否大于25;
若条件成立(NUM大于25)时,显示字符串Medium,否则显示字符串Low
3 是一个没有提供任何自变量的PRINC函数;用以抑制显示答案时尾部符加的 nil 或重复的传回值;而最右一个关括号,是用以对应第1行最左边的开括号
注意 :
第1行最后一个关括号是对应前面的PRINC函数,尾2的关括号则是对应IF函数 (判断NUM是否大于100)
第2行最后一个关括号是对应第1行的IF函数 (判断NUM是否大于50),尾2的关括号则是对应PRINC函数,尾3的关括号则是对应IF函数 (判断NUM是否大于25) 最右边的关括号是对应第1行最左边的开括号
PROGN 函数
在以上各范例中,执行的表达式均为单一的函数运算;若要在表达式中顺序执行一连串的函数,便要将各函数包含在一个PROGN函数内;函数的传回值会是该PROGN函数中,最后一个表达式的运算结果
---- 修改TEST.LSP程序文件的AIR-1程序,第1个IF函数如下,其余的IF函数请自行修改 e.g. (IF (> NUM 100) (PROGN (SETQ DISP \ery High\
注意 : 最后一个关括号是对应前面的IF函数 (判断变量NUM是否大于100) 尾2的关括号是对应PROGN函数 (用以包含SETQ及PRINC函数) 尾3的关括号是对应PRINC函数的
第2节
--------------------------------------------------------------------------------
条件判断
多重条件
(COND [ (条件表达式 是表达式) ....] )
函数会顺序检查各条件表达式;直到其中一个条件成立(传回 T),即执行该条件式所对应的是表达式
每个条件表达式只对应一个是表达式,而没有否表达式
若条件式成立且执行对应的是表达式后,则不会再对余下的其它条件表达式进行检查
若只有条件表达式而没有对应之是表达式,则只会传回条件表达式的逻辑值
若没有提供任何条件表达式及是表达式,函数传回值恒为 nil
练习 (Exercises)
新增程序AIR-3,以改善上一课AIR-1程序;用一个COND函数判断多个条件表达式
DEFUN AIR-3 (NUM) (COND ((> NUM 200) (PRINC \ ((> NUM 100) (PRINC \ery High\ ((> NUM 50) (PRINC \ ((> NUM 25) (PRINC \ ((> NUM 0) (PRINC \ (T (PRINC \ (PRINC))
程序说明
1 设定函数名称,并将数据存入自变量NUM内;用COND函数进行多重判断
2 判断变量NUM是否大于200,若条件成立,则显示 Severe 讯息;第3至6行依此类推 7 注意条件式为一个 T 字母,表示条件式恒为真(成立),显示讯息 Cannot Check 作用是当以上各条件式均不成立时(变量小于或等于0),即执行此一表达式
第3节
--------------------------------------------------------------------------------
循环 (Loop)
配合条件判断,关系及逻辑运算,令程序不断重复一些动作,以提高效率及减少重复动作时的人为错误
可以多个循环形成巢状(嵌套式)循环,即在一个循环内嵌套另一个(或多个)循环
指定的重复次数必须为正整数,亦可以是储存正整数的变量名称
重复指定次数
(REPEAT 重复次数 [表达式 ....] )
e.g. (REPEAT 10 (PRINC \ ;重复显示David字符串10次
重复
(WHILE 条件表达式 [是表达式 ....] )
若条件表达式的传回值为 T,即会顺序执行函数内各表达式
各表达式顺序执行完后,程序会返回函数的开头,重新检查条件表达式的传回值
若条件表达式的传回值为 nil,函数内各表达式将不会被执行
e.g. (SETQ COUNT 1) ;将1存入变数COUNT
(WHILE (<= COUNT 10) ;WHILE函数并检查变量COUNT是否<=10 (PRINC \ ;若条件成立则以PRINC函数显示David字符串
(SETQ COUNT (1+ COUNT))) ;变量COUNT递增1,并将新值重新存入变量COUNT中取代原值
注意 : 第4行最右边的关括号,是对应第2行WHILE函数的开括号
无限循环
又称为死循环,即循环的条件判断式传回值恒为 T,令循环不断重复而无法结束;在上例中 :
---- 若WHILE函数的条件表达式设定为 (T) ;即条件永远成立
---- 不作SETQ函数,或不将变量COUNT递增 ;变量COUNT储存值恒久不变,导致条件式永远成立
第4节
--------------------------------------------------------------------------------
练习 (Exercises)
编写一程序SUM并将自变量存在NUM变量内,计算1+2+3+4 ....至变数NUM的总和
(DEFUN SUM (NUM) (SETQ COUNT 1 TOTAL 0) (WHILE (<= COUNT NUM)
(SETQ TOTAL (+ TOTAL COUNT) COUNT (1+ COUNT)) )
(PRINC TOTAL) (PRINC))
程序说明
1 设定函数SUM并将自变量存入变量NUM,设定变量COUNT以将数目由1开始递增,变量TOTAL(储存总和)初始值为0
2 WHILE循环函数,并设定进入循环的条件式(变量COUNT小于或等于变量NUM)
3 若条件成立即进入循环内部,先将变量TOTAL加上变量COUNT,再用SETQ函数存回变量TOTAL中,覆盖原值
4 将变量COUNT递增1,存回变数COUNT并覆盖原值 5 关括号与第2行的WHILE函数左边的开括号对应
6 循环结束后,用PRINC函数显示变量TOTAL(总和)的内容
程序流程
假设执行程序时传入变量NUM的数值为10
---- 变数初始值 COUNT = 1 TOTAL = 0
---- 判断变量COUNT是否<=变量NUM COUNT = 1 TOTAL = 0
---- 变量COUNT(现值1)小于NUM,进入循环;将TOTAL(现值0)加上COUNT,存回变数TOTAL COUNT = 1 TOTAL = 1
---- 变数COUNT(现值1)递增1变为2,存回变数COUNT COUNT = 2 TOTAL = 1 ---- 返回WHILE函数的开头,重新判断条件式
---- 变量COUNT(现值2)小于NUM,进入循环;将TOTAL(现值1)加上COUNT,存回变数TOTAL COUNT = 2 TOTAL = 3
---- 变数COUNT(现值2)递增1变为3,存回变数COUNT COUNT = 3 TOTAL = 3
---- 返回WHILE函数的开头,重新判断条件式
---- 变量COUNT(现值3)小于NUM,进入循环;将TOTAL(现值3)加上COUNT,存回变数TOTAL COUNT = 3 TOTAL = 6
部 份 过 程 省 略
---- 返回WHILE函数的开头,重新判断条件式
---- 变量COUNT(现值10)仍等于NUM,进入循环;将TOTAL(现值45)加上COUNT,存回变数TOTAL COUNT = 10 TOTAL = 55
---- 变数COUNT(现值10)递增1变为11,存回变数COUNT COUNT = 11 TOTAL = 55 ---- 返回WHILE函数的开头,重新判断条件式
---- 变量COUNT(现值11)巳大于NUM(本范例假设为10),条件判断不成立,循环结束 COUNT = 11 TOTAL = 55
---- 显示变量TOTAL的现存值,程序结束
尝试用IF函数检查输入的自变量是否小于或等于0;若条件成立则不执行余下的程序
(DEFUN SUM (NUM) (IF (<= NIM 0) (PRINC \ (PROGN
略 过 WHILE 及 PRINC 函数 ) )
(PRINC))
程序说明
1 设定函数SUM并将自变量存入变量NUM,并用IF函数判断是否<=0,若条件成立则显示错误讯息 2 若条件不成立,即以PROGN函数包含上例中的循环及显示答案部份
相关推荐: