第五章分支結(jié)構(gòu)
《第五章分支結(jié)構(gòu)》由會員分享,可在線閱讀,更多相關(guān)《第五章分支結(jié)構(gòu)(19頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、第五章第五章 分支結(jié)構(gòu)分支結(jié)構(gòu) 分支結(jié)構(gòu)是計算機(jī)程序中一種主要結(jié)構(gòu),它是進(jìn)行邏輯判斷的主要手段。各種計算機(jī)語言都提供了實現(xiàn)分支結(jié)構(gòu)的語句,Auto LISP語言提供了兩個實現(xiàn)分支結(jié)構(gòu)的函數(shù)if和cond。本章的重點(diǎn)是介紹這兩個函數(shù)的功能和應(yīng)用。同時也是分別介紹各種測試函數(shù)。5.1 關(guān)系運(yùn)算函數(shù)關(guān)系運(yùn)算函數(shù) 關(guān)系運(yùn)算函數(shù)就是對數(shù)值型表達(dá)式的大小進(jìn)行比較的函數(shù)。這些函數(shù)的參數(shù)即數(shù)值表達(dá)式可以是兩個也可以是多個。關(guān)系運(yùn)算函數(shù)的求值結(jié)果的返回值不是數(shù)值量而是邏輯量,如果成立返回值為T,否則為nil。Auto LISP語言提供了六種關(guān)系運(yùn)算函數(shù):5.1.1 格式格式 (函數(shù)名 數(shù)1 數(shù)2)其函數(shù)名:=等
2、于 小于 大于 =大于或等于 /=不等于 參數(shù):數(shù)1數(shù)2為數(shù)值表達(dá)式,其值必須為數(shù),可以是整型數(shù)也可以是實型數(shù),如果是字符串,則要按ASC碼大小進(jìn)行比較。函數(shù)的參數(shù)個數(shù)一般不限。5.1.2 功用及求值結(jié)果功用及求值結(jié)果 主要 用于比較各數(shù)值型表達(dá)式的值之間的關(guān)系,數(shù)值表達(dá)式可以是數(shù)字原子、變量或表,執(zhí)行關(guān)系運(yùn)算函數(shù)時先對各表達(dá)式求值,再對其值進(jìn)行比較,比較 結(jié)果成立,返回值為T,否則為nil。(e1 e2 e3 e4en)只有e1e2e3e4en 返回值為T,否則為nil。;e1en為表達(dá)式的數(shù)值。(=e1 e2 e3 e4en)只有e1e2e3e4en 返回值為T,否則為nil。(=e1 e
3、2 e3 e4en)只有e1=e2=e3=e4=en 返回值為T,否則為nil。但/=函數(shù)略有不同 (/=e1 e2 e3 e4en)只要有任意兩個數(shù)值表達(dá)式不等即返回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碼進(jìn)行比較)(/=1 2 3 4)返回值為T (/=1 1 3 4)返回值nil 5.2 邏輯運(yùn)算函數(shù)邏輯運(yùn)算函數(shù) 對應(yīng)于一般高級語言的邏輯運(yùn)算符,Auto LIS
4、P也相應(yīng)的提供了三種邏輯運(yùn)算函數(shù),即邏輯“與”and,邏輯“或”or和邏輯“非”not。Auto LISP的三個邏輯運(yùn)算函數(shù) 的參數(shù)可以是任意類型的表達(dá)式,下面分別介紹:5.2.1 邏輯邏輯“與與”函數(shù)函數(shù)AND 1.調(diào)用格式調(diào)用格式 (and 表達(dá)式)表達(dá)式個數(shù)不限。2.功用及求值結(jié)果功用及求值結(jié)果 執(zhí)行該函數(shù)時對其各表達(dá)式依次求值,若求值過程中碰到nil,函數(shù)的返回值即為nil,若所有表達(dá)式的值均為非nil,該函數(shù)返回T。例如:(and 1 2 3 T)返回值T (and 1 2 3()返回值nil (and(setq e 10)(+3 1)12)返回值T 5.2.2 邏輯邏輯“或或”函數(shù)
5、函數(shù)OR 1.調(diào)用格式調(diào)用格式 (or 表達(dá)式)表達(dá)式個數(shù)不限。2.功用及求值結(jié)果功用及求值結(jié)果 執(zhí)行該函數(shù)時對表達(dá)式依次求值,只要有一個表達(dá)式的值為非nil則返回T。只有全部表達(dá)式的值為nil,才返回nil,例如:(or 1 2 3 nil)返回值T (or(3 5)返回值nil (or a b c d)返回值nil ;(a b c d均未賦值)5.2.3 邏輯邏輯“非非”函數(shù)函數(shù)NOT 1.調(diào)用格式調(diào)用格式 (not 表達(dá)式)只有一個參數(shù)。2.功用及求值結(jié)果功用及求值結(jié)果 當(dāng)表達(dá)式的值為nil時,該函數(shù)返回T,否則返回nil,例如:(setq a 10 b /(A B C)c nil)(n
6、ot a)返回T (not b)返回nil (not c)返回T (not /()返回T 5.3 二分支條件函數(shù)二分支條件函數(shù) IF 5.3.1調(diào)用格式調(diào)用格式 (if測試表達(dá)式則表達(dá)式否則表達(dá)式)表達(dá)式可以是任意表達(dá)式,包括原子和表。5.3.2功用及求值結(jié)果功用及求值結(jié)果 在程序設(shè)計中,根據(jù)其是否滿足某一條件來決定程序走向時常用此函數(shù),執(zhí)行此函數(shù)時,先對測試表達(dá)式進(jìn)行求值,若其值為非nil,即測試式成立,執(zhí)行則表達(dá)式,并把其求值結(jié)果作為if函數(shù)的調(diào)用返回值。否則,若測試表達(dá)式的值為nil,且任選項否則表達(dá)式存在,則執(zhí)行否則表達(dá)式,并返回其求值結(jié)果,若否則表達(dá)式不存在,且測試表達(dá)式為nil,則
7、返回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 and(4 3)“Yes”“No”)返回值“Yes”(if not(=2 3)“Yes”“No”)5.3.3 注意注意 1.if函數(shù)的參數(shù)可以是任意表達(dá)式,即可以是數(shù)字原子、字符原子及
8、字符串亦可以是表。2.測試表達(dá)式的值不一定必須為T才算成立,因為從邏輯角度來說任何非nil的表達(dá)式都與T等效,只要其值為非nil即可,例如測試表達(dá)式為1.2.“text”,(List 1 2 3),(setq a 3.0)(+13 8),(print“a”),a(已賦值)等,其值雖非T,但為非nil,固測試均成立。并進(jìn)行則表達(dá)式。只有測試表達(dá)式的值為nil,如/(),(and(3 2)測試不成功,則進(jìn)行否則表達(dá)式。3.if函數(shù)中的則函數(shù)中的則表達(dá)式或否則表達(dá)式或否則表達(dá)式不能為多個表達(dá)式。否則表達(dá)式不能為多個表達(dá)式。否則必須用順序控制函數(shù)必須用順序控制函數(shù)progn。例如:(if(x 0)(p
9、rogn(setq y 10)(setq z(/y x)5.4 多分支條件函數(shù)多分支條件函數(shù)COND 5.4.1調(diào)用格式調(diào)用格式 (cond(測試式1結(jié)果1)(測試式2結(jié)果2)(測試式n結(jié)果n )cond函數(shù)的參數(shù)為任意數(shù)目的表,而每一個表中第一個元素為測試式,表中其余元素為結(jié)果。結(jié)果部分可以是多個表達(dá)式。測試式和結(jié)果均可以是任意S表達(dá)式。5.4.2 功用功用 多分支條件函數(shù),包括多個測試條件。根據(jù)滿足條件的不同,執(zhí)行相應(yīng)的的操作。當(dāng)執(zhí)行cond函數(shù)的函數(shù)時依次測試每一個條件分支,即對每個支表中第一個元素測試式求值。若測試結(jié)果為nil,即測試失敗,則轉(zhuǎn)向下一個條件分支。若某一個條件分支的測試式
10、求值結(jié)果為非nil,則該分支便是滿足測試條件的分支,其后面的其它分支即不在被求值,cond函數(shù)就轉(zhuǎn)向執(zhí)行該成功分支的結(jié)果。cond函數(shù)的控制結(jié)果見圖5.1。測試式1測試式2nil nilnil測試式nnil結(jié)果1結(jié)果2結(jié)果nTTT圖 5.1 5.4.3求值結(jié)果求值結(jié)果 cond函數(shù)總是對成功分支的結(jié)果部分各表達(dá)式進(jìn)行求值并把邏輯上的最后一個表達(dá)式的求值結(jié)果作為調(diào)用cond函數(shù)的返回值。當(dāng)所有分支的測試結(jié)果均為nil,或者一個分支也不存在時,cond函數(shù)返回nil。若成功的分支沒有結(jié)果部分,那么測試式的求值結(jié)果即為cond的返回值。為了深入理解cond函數(shù)的應(yīng)用、功能、下面舉幾個例子:例1用co
11、nd函數(shù)打印學(xué)生某門課的成績。(defun M1()(initget 7)(setq m(getreal“n 分?jǐn)?shù):”)(cond(m 60.0)(print“不及格”)(m 70.0)(print“及格”)(=0)”)(setq 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,它好象是一個收容器,凡是不能滿足上面任一測試式的情況,多收容在這個分支來執(zhí)行,表示“其它”的意思。3.每個分支表中的結(jié)果可以由多個表達(dá)式組成,若該分支條件成立其結(jié)果中各表達(dá)式依次被求值。4
12、.和if函數(shù)一樣,測試式、結(jié)果可以是任意表達(dá)式。5.5 其它測試函數(shù)其它測試函數(shù) 除前面介紹的測試函數(shù)外Auto LISP還提供了以下10個測試函數(shù):判斷數(shù)的性質(zhì)的函數(shù) ZEROP,MINUSP,NUMBERP 判斷數(shù)據(jù)類型的函數(shù) TYPE,ATOM,LISTP,NULL,BOUNDP 判斷等值函數(shù) EQ,EQUAL 由于這些測試函數(shù),大部分可用前面函數(shù)代替,有些函數(shù)不常用,故對其功能只作簡單介紹。5.5.1判斷性質(zhì)的函數(shù)判斷性質(zhì)的函數(shù) 1.ZEROP函數(shù) (1)調(diào)用格式調(diào)用格式 (zerop 項)(2)功用及求值結(jié)果功用及求值結(jié)果 測試項是否為零。若項為數(shù),此函數(shù)返回T。否則返回nil。例如
13、:(setq a 0.0 b 12.0)(zerop a)返回T (zerop b)返回nil 2.MINUSP函數(shù)(1)調(diào)用格式調(diào)用格式 (minusp 項)(2)功用及求值結(jié)果功用及求值結(jié)果 測試項是否為負(fù)值,若項為數(shù)且其值為負(fù),則此函數(shù)返回T,否則返回nil,例如:(minusp(-2.0 4.0)返回T (minusp 0)返回nil 3.NUMBERP函數(shù)(1)調(diào)用格式調(diào)用格式 (numberp 項)功用及求值結(jié)果功用及求值結(jié)果 測試項是否為數(shù),若項的值為數(shù),則返回T,否則返回nil。(setq e 1.2 f 3 g/(3 5)h/e)(numberp e)返回T (numberp
14、 f)返回T (numberp g)返回nil (numberp h)返回nil (numberp(eval)h)返回T 5.5.2判斷數(shù)據(jù)類型的函數(shù)判斷數(shù)據(jù)類型的函數(shù) 1.YYPE函數(shù) (1)調(diào)用格式調(diào)用格式 (type 項)(2)功用及求值結(jié)果功用及求值結(jié)果 該函數(shù)判斷項是什么數(shù)據(jù),返回數(shù)據(jù)類型名,數(shù)據(jù)類型名在ATOMLST原子表中可找到,其表示的意義如表51所示:例如:(type/z)返回sym (type 16)返回int (type/(a b c)返回list (type“w”)返回str (type=)返回subrType返回值 意 義 REAL 實型數(shù) INT 整型數(shù) STR 字
15、符串 SYM 符號原子 LIST 表或用戶定義的函數(shù) SUBR 系統(tǒng)內(nèi)部函數(shù) FILE 文件描述符 PICKSET Auto CAD選擇集 ENAME Auto CAD實體名 PAGETB 函數(shù)頁表 表5-1 數(shù)據(jù)類型符號的意義 2.ATOM函數(shù)(1)調(diào)用格式調(diào)用格式 (atom 項)(2)功用及求值結(jié)果功用及求值結(jié)果 該函數(shù)測試項是否為原子,若是則返回T,否則返回nil。例如:(atom/a)返回T (atom/(x y z)返回nil 3.LISTP函數(shù)(1)調(diào)用格式調(diào)用格式 (listp 項)(2)功用及求值結(jié)果功用及求值結(jié)果 該函數(shù)測試項是否為表或用戶自定義的函數(shù),若是則返回T,否則返
16、回nil。例如:(atom/(a b c))返回T (atom/a)返回nil 4.NULL函數(shù)(1)調(diào)用格式調(diào)用格式 (null 項)(2)功用及求值結(jié)果功用及求值結(jié)果 該函數(shù)測試項的當(dāng)前約束值是否為nil,若是則返回T,否則返回nil,例如:(setq a 1.0 b nil)(null b)返回T (null a)返回nil 5.BOUNDP函數(shù)(1)調(diào)用格式調(diào)用格式 (boundp 原子)(2)功用及求值結(jié)果功用及求值結(jié)果 該函數(shù)測試項是否為有無約束值,若原子的值是一個原子,且有一個值約束它,則返回T,否則返回nil,例如:(setq a 2.0 b nil c(1 2 3)d“ss”
17、)(boundp/a)返回T (boundp/b)返回nil (boundp/c)返回T (boundp c)返回nil (boundp/d)返回T 5.5.3等值函數(shù)等值函數(shù) 前面介紹的等值比較函數(shù)(=),它只能用于原子和字符串,而不能用于表,下面提供的等值函數(shù)EQ和EQUAL,可用于各種S表達(dá)式。1.調(diào)用格式調(diào)用格式 (eq 表達(dá)式1表達(dá)式2)(equal 表達(dá)式1表達(dá)式2)2.功用及求值結(jié)果功用及求值結(jié)果 eq和equal都是等值函數(shù),即都是判斷表達(dá)式1和表達(dá)式2是否相等,但兩者有區(qū)別。equal函數(shù)只要它的兩個參數(shù)表達(dá)式1和表達(dá)式2的值相等就返回T,否則返回nil,而eq函數(shù)的等值更嚴(yán)
18、格,即不只是表達(dá)式1、表達(dá)式2的值要相等,而且要占用同一內(nèi)存空間才返回T,否則返回nil。若兩個表達(dá)式為原子,反映不出eq和equal的差異,即兩個函數(shù)是等價的,但如果二表達(dá)式為表就反映出二者的差異來。例如:(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)對equal函數(shù)來說,(equal L1 L2)和(equal L3 L2),都返回T,但對eq來說,(eq L3 L2)
19、返回T,而(eq L1 L2)則返回nil。因為調(diào)用cons,list這樣函數(shù)構(gòu)成新表時,每調(diào)用一次都要從自由存貯表劃出一些新的內(nèi)存單元,用這些內(nèi)存單元來裝配新表,所以雖然(L1和L2)的值是相同的,都是表(a b c d),但兩個表都占用了不同的內(nèi)存單元;另一方面用setq時,只只加一指針,即L3指向L2的值所在的內(nèi)存單元,所以L3和L2不僅值相等,而且都指向相同的內(nèi)存單元,所以(eq L3 L2)返回T。5.6 順序控制函數(shù)順序控制函數(shù)PROGN 5.6.1調(diào)用格式調(diào)用格式 (progn 標(biāo)準(zhǔn)表)5.6.2功能及求值結(jié)果功能及求值結(jié)果 該函數(shù)按順序?qū)γ恳粋€標(biāo)準(zhǔn)表進(jìn)行求值,并返回最后一個標(biāo)準(zhǔn)
20、表的求值結(jié)果。例如:(if(=x 1)(progn (setq x(+x 2)(setq y(*x 4.0)(print(list x y)5.7 綜合舉例綜合舉例例1.齒輪參數(shù)修改的另一程序。(defun clxg2()(prompt“齒輪參數(shù):p n i z”)(terpri)(initget“P N I Z”)(setq e(read(getwork“n欲修改的參數(shù):”)(initget 7)(setq el(getreal“n修改值:”)(set e el)(initget“Y N”)(setq ch(strcase(getwork“n是否還要修改?”);循環(huán)修改 (if(=ch“Y”
21、)(clxg2)例2.齒輪CAD系統(tǒng)的文本主菜單。(defun chd(/ch)(princ“*齒輪菜單*”)(print)(princ(strcat“n1設(shè)計計算”)(princ(strcat“n2結(jié)構(gòu)選型”)(princ(strcat“n3圖形繪制”)(princ(strcat“n4尺寸標(biāo)注”)(princ(strcat“n5圖形輸出”)(print)(princ“*”)(print)(initget“1 2 3 4 5”)(setq ch(atoi(getwork“n輸入選項”);函數(shù)(sjjs),(jgxx),(txhz),(ccbz),(txsc)等源程序省略。(cond(=ch 1)(sjjs)(=ch 2)(jgxx)(=ch 3)(txhz)(=ch 4)(ccbz)(t(txsc);cond );defun例3 限制輸入數(shù)據(jù)范圍(2070)的函數(shù)。(defun fw(/a)(setq a(getreal“n輸入一個數(shù)(2070):”)(if(or(70)(progn(prompt“n輸入超界,請從新輸入”)(fw);progn );if );如輸入超界從新執(zhí)行fw函數(shù)直至正確為止。
- 溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2023年六年級數(shù)學(xué)下冊6整理和復(fù)習(xí)2圖形與幾何第7課時圖形的位置練習(xí)課件新人教版
- 2023年六年級數(shù)學(xué)下冊6整理和復(fù)習(xí)2圖形與幾何第1課時圖形的認(rèn)識與測量1平面圖形的認(rèn)識練習(xí)課件新人教版
- 2023年六年級數(shù)學(xué)下冊6整理和復(fù)習(xí)1數(shù)與代數(shù)第10課時比和比例2作業(yè)課件新人教版
- 2023年六年級數(shù)學(xué)下冊4比例1比例的意義和基本性質(zhì)第3課時解比例練習(xí)課件新人教版
- 2023年六年級數(shù)學(xué)下冊3圓柱與圓錐1圓柱第7課時圓柱的體積3作業(yè)課件新人教版
- 2023年六年級數(shù)學(xué)下冊3圓柱與圓錐1圓柱第1節(jié)圓柱的認(rèn)識作業(yè)課件新人教版
- 2023年六年級數(shù)學(xué)下冊2百分?jǐn)?shù)(二)第1節(jié)折扣和成數(shù)作業(yè)課件新人教版
- 2023年六年級數(shù)學(xué)下冊1負(fù)數(shù)第1課時負(fù)數(shù)的初步認(rèn)識作業(yè)課件新人教版
- 2023年六年級數(shù)學(xué)上冊期末復(fù)習(xí)考前模擬期末模擬訓(xùn)練二作業(yè)課件蘇教版
- 2023年六年級數(shù)學(xué)上冊期末豐收園作業(yè)課件蘇教版
- 2023年六年級數(shù)學(xué)上冊易錯清單十二課件新人教版
- 標(biāo)準(zhǔn)工時講義
- 2021年一年級語文上冊第六單元知識要點(diǎn)習(xí)題課件新人教版
- 2022春一年級語文下冊課文5識字測評習(xí)題課件新人教版
- 2023年六年級數(shù)學(xué)下冊6整理和復(fù)習(xí)4數(shù)學(xué)思考第1課時數(shù)學(xué)思考1練習(xí)課件新人教版