第五章分支結(jié)構(gòu)_第1頁
第五章分支結(jié)構(gòu)_第2頁
第五章分支結(jié)構(gòu)_第3頁
第五章分支結(jié)構(gòu)_第4頁
第五章分支結(jié)構(gòu)_第5頁
已閱讀5頁,還剩14頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、第五章第五章 分支結(jié)構(gòu)分支結(jié)構(gòu) 分支結(jié)構(gòu)是計(jì)算機(jī)程序中一種主要結(jié)構(gòu),它是進(jìn)行邏輯判斷的主要手段。各種計(jì)算機(jī)語言都提供了實(shí)現(xiàn)分支結(jié)構(gòu)的語句,Auto LISP語言提供了兩個實(shí)現(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í)型數(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 返回值

3、為T,否則為nil。 (= e1 e2 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

4、) 返回值nil 5.2 邏輯運(yùn)算函數(shù)邏輯運(yùn)算函數(shù) 對應(yīng)于一般高級語言的邏輯運(yùn)算符,Auto LISP也相應(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

5、3 () 返回值nil (and (setq e 10) (+ 3 1) 12) 返回值T 5.2.2 邏輯邏輯“或或”函數(shù)函數(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.功

6、用及求值結(jié)果功用及求值結(jié)果 當(dāng)表達(dá)式的值為nil時,該函數(shù)返回T,否則返回nil,例如: (setq a 10 b /(A B C) c nil) (not 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ì)中,根據(jù)其是否滿足某一條件來決定程序走向時常用此函數(shù),執(zhí)行此函數(shù)時,先對測試表達(dá)式進(jìn)行求值,若其值為非nil,即測試式成立,執(zhí)行則表達(dá)式,并把其求值結(jié)

7、果作為if函數(shù)的調(diào)用返回值。否則,若測試表達(dá)式的值為nil,且任選項(xiàng)否則表達(dá)式存在,則執(zhí)行否則表達(dá)式,并返回其求值結(jié)果,若否則表達(dá)式不存在,且測試表達(dá)式為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)

8、 “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ù)字原子、字符原子及字符串亦可以是表。 2.測試表達(dá)式的值不一定必須為T才算成立,因?yàn)閺倪壿嫿嵌葋碚f任何非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á)式。只

9、有測試表達(dá)式的值為nil,如/(),(and ( 3 2)測試不成功,則進(jìn)行否則表達(dá)式。 3.if函數(shù)中的則函數(shù)中的則表達(dá)式或否則表達(dá)式或否則表達(dá)式不能為多個表達(dá)式。否則表達(dá)式不能為多個表達(dá)式。否則必須用順序控制函數(shù)必須用順序控制函數(shù)progn。 例如: (if ( x 0) (progn (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é)果部分可

10、以是多個表達(dá)式。測試式和結(jié)果均可以是任意S表達(dá)式。 5.4.2 功用功用 多分支條件函數(shù),包括多個測試條件。根據(jù)滿足條件的不同,執(zhí)行相應(yīng)的的操作。當(dāng)執(zhí)行cond函數(shù)的函數(shù)時依次測試每一個條件分支,即對每個支表中第一個元素測試式求值。若測試結(jié)果為nil,即測試失敗,則轉(zhuǎn)向下一個條件分支。若某一個條件分支的測試式求值結(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ù)總是對成

11、功分支的結(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用cond函數(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 (con

12、d (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.和if函數(shù)一樣,測試式、結(jié)果可以是任意表達(dá)式。 5.5 其它測試函數(shù)其它測試函數(shù) 除前面介紹的測試函數(shù)外Auto LISP還提供了以下10個測試函數(shù): 判斷數(shù)的性質(zhì)的函數(shù) ZEROP,MINU

13、SP,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 項(xiàng)) (2)功用及求值結(jié)果功用及求值結(jié)果 測試項(xiàng)是否為零。若項(xiàng)為數(shù),此函數(shù)返回T。否則返回nil。例如: (setq a 0.0 b 12.0) (zerop a) 返回T (zerop b) 返回nil 2.MINUSP函數(shù) (1)調(diào)用格式調(diào)用格式 (minusp 項(xiàng)) (2)功用及求

14、值結(jié)果功用及求值結(jié)果 測試項(xiàng)是否為負(fù)值,若項(xiàng)為數(shù)且其值為負(fù),則此函數(shù)返回T,否則返回nil,例如: (minusp (- 2.0 4.0) 返回T (minusp 0) 返回nil 3.NUMBERP函數(shù) (1)調(diào)用格式調(diào)用格式 (numberp 項(xiàng)) 功用及求值結(jié)果功用及求值結(jié)果 測試項(xiàng)是否為數(shù),若項(xiàng)的值為數(shù),則返回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) 返回T 5.5.2判斷

15、數(shù)據(jù)類型的函數(shù)判斷數(shù)據(jù)類型的函數(shù) 1.YYPE函數(shù) (1)調(diào)用格式調(diào)用格式 (type 項(xiàng)) (2)功用及求值結(jié)果功用及求值結(jié)果 該函數(shù)判斷項(xiàng)是什么數(shù)據(jù),返回?cái)?shù)據(jù)類型名,數(shù)據(jù)類型名在ATOMLST原子表中可找到,其表示的意義如表51所示:例如: (type /z) 返回sym (type 16) 返回int (type /(a b c) 返回list (type “w”) 返回str (type =) 返回subrType返回值 意 義 REAL 實(shí)型數(shù) INT 整型數(shù) STR 字符串 SYM 符號原子 LIST 表或用戶定義的函數(shù) SUBR 系統(tǒng)內(nèi)部函數(shù) FILE 文件描述符 PICKSET

16、 Auto CAD選擇集 ENAME Auto CAD實(shí)體名 PAGETB 函數(shù)頁表 表5-1 數(shù)據(jù)類型符號的意義 2.ATOM函數(shù)(1)調(diào)用格式調(diào)用格式 (atom 項(xiàng))(2)功用及求值結(jié)果功用及求值結(jié)果 該函數(shù)測試項(xiàng)是否為原子,若是則返回T,否則返回nil。例如: (atom /a) 返回T (atom /(x y z) 返回nil 3.LISTP函數(shù)(1)調(diào)用格式調(diào)用格式 (listp 項(xiàng))(2)功用及求值結(jié)果功用及求值結(jié)果 該函數(shù)測試項(xiàng)是否為表或用戶自定義的函數(shù),若是則返回T,否則返回nil。例如: (atom /(a b c)) 返回T (atom /a) 返回nil 4.NULL函

17、數(shù)(1)調(diào)用格式調(diào)用格式 (null 項(xiàng))(2)功用及求值結(jié)果功用及求值結(jié)果 該函數(shù)測試項(xiàng)的當(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ù)測試項(xiàng)是否為有無約束值,若原子的值是一個原子,且有一個值約束它,則返回T,否則返回nil,例如: (setq a 2.0 b nil c (1 2 3) d “ss”) (boundp /a) 返回T (boundp /b) 返回nil (b

18、oundp /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)格,即不只是表達(dá)式1、表達(dá)式2的值要相等,而且要占

19、用同一內(nèi)存空間才返回T,否則返回nil。若兩個表達(dá)式為原子,反映不出eq和equal的差異,即兩個函數(shù)是等價(jià)的,但如果二表達(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

20、)返回T,而(eq L1 L2)則返回nil。 因?yàn)檎{(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)表的求值結(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) (initge

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論