




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
2023年2月4日第1頁第4講分支語句和編程設計MATLABR2010a基礎教程清華大學出版社自上而下的編程方法簡介關系運算符和邏輯運算符選擇結構(分支語句)在前面的章節中,我們開發了幾個完全運轉的MATLAB程序。但是這些程序都十分簡單,包括一系列的MATLAB語句,這些語句按照固定的順序一個接一個的執行。像這樣的程序我們稱之順序結構程序。它首先讀取輸入,然后運算得到所需結果,打印出結果,并退出。至于要多次重復運算程序的某些部分是沒有辦法的,也不能根據輸入的值,有選擇地執行程序的某些部分。在下面的兩章中,將向大家介紹大量的MATLAB語句,這些語句允許我們來控制語句的執行順序。有兩大類控制順序結構:選擇結構,用選擇執行特定的語句;循環結構,用于重復執行特定部分的代碼。循環結構我們將會在下節課討論。隨著選擇和循環介紹,我們的程序也將變得復雜,對于解決問題來說,將會變得簡單。為了幫助大家避免在編程過程中出現大量的錯誤,我們將向大家介紹正式的編程步驟,即自上而下的編程方法。我們也會向大家介紹一些普通的算法開發工具即偽代碼。2023年2月4日第2頁一自上而下的編程方法簡介當遇到一個新問題時,我們的心里會自然而然的產生這樣的想法:馬上坐在計算機前,開始編程,而不用浪費大量的時間思考我們所要解決的問題是什么?用這種不切實際的想法來編一些非常小的程序可能會成功。但在現實中,問題可能會非常的大,程序員再用這種方法編程將會陷入困境。對于一個大的程序來說,在編寫代碼之前你要通盤的思考你所要面臨的問題和解決的方法。在本節中,我們將向大家介紹正式的編程設計步驟,然后應用這個步驟來編寫所有的大的應用程序。對于我們所遇到一些簡單的例子來說,這個步驟好像有些畫蛇添足。但是當我們解決的問題變得越來越大的時侯,這個步驟將會變得異常重要。2023年2月4日第3頁假設你是在工廠工作的工程師,為了解決某些問題,你要編寫一個程序。你如何開始呢?工作中遇到的大多數困難都是對所要解決問題的理解。一旦你真正理解了問題,你就會把這個問題分解成許多小的問題,更加易于管理的小塊,然后逐一解決某一個小塊。自上而下的編程方法是我們正規編程設計的基礎。我們現在向大家介紹這些在下圖中說明的步驟細節。步驟如下:2023年2月4日第4頁2023年2月4日第5頁1.清晰地陳述你所要解決的問題編寫的程序大多數情況下要滿足一些感覺上的需要,但這種需要不一定能夠被人清晰地表達出來。例如,用戶需要一個解線性方程組的表達式。像這樣的要求就不夠清楚,程序員就很難編出一個使他滿意的程序。他必須弄清楚要有多少問題需要解決?在這些方程式中有沒有對稱的形式使我們的開發變得簡單?程序設計者必須和使用者討論所需的程序,他們必須要對完成的任務有一個精確細致的描述。對問題清晰的描述可以防止誤解,并且能夠幫助程序員合理的組織他的思想。上面的例子對問題合適的陳述應為:設計一個用于解決聯立線性方程組的程序,這些方程中未知數的系數為實數,最多有20個未知數。2023年2月4日第6頁2.定義程序所需的輸入量和程序所產生的輸出量指定輸入量和輸出量,只有這樣新的程序才能適應全過程計劃。在這個例子中方程式的系數可能有其預先存在的順序,我們的新程序必須能按照順序讀取它們。相似地,也需要產生出這個程序所要求的結果,即輸出量,我們還要以一定的格式打印出來。2023年2月4日第7頁3.設計你的程序得以實現的算法算法是指為某個問題找到答案一步接一步的程序。在這個階段自上而下的編程方法發揮了作用。編程設計者開始對這個問題進行邏輯劃分,把它逐步分解為一個又一個子工作。這個過程叫做分解(decomposition)。如果一些子工作還是比較大,設計者還可以把他它分解成更小的塊。這個過程將會繼續到問題被分解成許多簡單且易理解的小塊為止。在問題被分解成小塊之后,每一個小塊要被進一步的求精,這個過程叫做逐步求精(stepwiserefinement)。在這個過程中,設計者開始于對本小塊代碼總括性的描述,然后開始一步一步地定義所需的函數,越來越具體,直到他能夠轉化為MATLAB語句。逐步求精的過程中,我們要用到的偽代碼將會在下節為大家介紹。在算法開發過程中,這個方法是非常有用的。如果設計者真正理解了解決問題這個些步驟,他將會對問題進行分解和逐步求精。2023年2月4日第8頁4.把算法轉化為代碼如果分解和逐步求精的過程已經順利完成,那么這一步將會異常地簡單。所有程序員都會將偽代碼一句一句地轉化為合適地MATLAB語句。2023年2月4日第9頁5檢測產生的MATLAB程序這一步是真正的攔路虎。首先,程序的每一部分將會被單獨地檢測,如果有可能的話,整個程序還要被檢測一遍。在我們檢測程序時,我們必須證明所有合法輸入數據值都能夠正常運行。用標準的輸入值檢測程序,看它是否產生了值。如果在一個程序中執行的算法包含了不同的分支,你必須檢測每一個分支,以保證產生正確的答案。大程序在交付大眾使用之前,必須經過一系列地檢測。檢測的第一步有時被稱為單元檢測(unittesting)。在單元檢測過程中,程序的子程序將會被獨立地檢測以證明它的正確性。當單元檢測結束之后,這個程序將進行一系列的組合,把獨立的子程序聯合產生出最后的程序。程序第一步的聯合通常只包括很少的子程序。通過組合這些子程序,經常用于檢查子程序或函數之間的聯系。在一系列地組合過程中,越來越多的子程序被加了進來,直到整個程序的完成。在每一次組合的過程中,每一個錯誤都會被發現并在進行下一次組合之前糾正過來。2023年2月4日第10頁在整個程序被組合之后,調試繼續進行。程序第一個版本我們通常稱之為“alpha版本”。程序員和其他有機會接近它的人可以想盡一切辦法應用它,以發現其中的漏洞,然后改正之。當許許多多大的錯誤從程序中去除,一個新的版本出現了,我們稱之“beta版本”。beta版本就要公開地發行給天天需要這個程序工作的人。這些用戶使這個程序在不同的環境下,在不同的輸入條件下工作,會發現許多的錯誤,并報告給程序員。當這些錯誤被更正后,這個程序就能夠發行給公眾使用了。因為我們現在一般接觸的程序都比較小,沒有必要進行上述的大規模的檢測。但是我們會遵循基本的調試原則。2023年2月4日第11頁大程序典型地調試過程2023年2月4日第12頁程序設計的基本步驟:1.清晰地陳述出你要解決的問題。2.確定程序所需地輸入量和程序所產生的輸出量。3.為你的程序設計算法4.將算法轉化為MATLAB語句5.調試MATLAB程序2023年2月4日第13頁在大的編程項目中,花在編程序的時間是出奇的少。FrederickPBrooks在他的theMythicalMan-Month書中寫道,對于大的軟件工程來說,三分之一的時間花在計劃如何來做上(第一步到第三步),六分之一的時間花在編寫程序上,近一半的時間用來調試程序。而我們能做的只有壓縮調試用的時間。在計劃階段做好充分的準備和在編程過程使用良好的編程習慣,這樣會大大降低我們調試所用的時間。好的編程習慣能減少出錯的數量,也能使別人迅速地找出其中的錯誤。2023年2月4日第14頁好的編程習慣
遵循上面的步驟編寫可靠,易理解的MATLAB程序。二偽代碼的應用作為我們設計步驟的一部分,描述出你要執行的算法是非常必要的。算法的描述有一種標準形式,能讓你和大家都能理解,這種描述將幫助你的內容轉化為MATLAB代碼。我們用于描述算法的標準形式叫做構造(constructs有時也稱structure)。用這些結構描述出的算法,我們稱之為結構化算法。當在我們在MATLAB程序中執行這個算法時,產生的程序叫做結構化程序。我們可以用偽代碼的形式建立算法的結構。偽代碼是MATLAB和英語的混合體。和MATLAB一樣,它是結構化的,一行表達一個明確的意思或代碼的片段,但每一行的描述用的是英語或其他人類語言。偽代碼的每一行都應用普通簡單且易于理解的英語或中文描述。因為修改簡單靈活,所以偽代碼在開發算法的過程中非常的有用。因為偽代碼給編輯器或字處理器(通常用于編寫MATLAB程序)的,而不需要其他的可視化功能。例如下面是例子的算法偽代碼2023年2月4日第15頁例(溫度轉換)設計一個MATLAB程序,讀取一個華氏溫度的輸入,輸出開爾文溫度。華氏溫度和開爾文溫度的轉換關系式可在物理學課本中找到。其關系式為:
2023年2月4日第16頁注意用向左指的箭頭←替代等號(=)指出一個值將存儲到對應的變量中,這樣就避免了賦值號與等號的混淆。在把它們轉化為MATLAB代碼之前,偽代碼將有助于你思想的組織。2023年2月4日第17頁PromptusertoentertemperatureindegreesFahrenheitReadtemperatureindegreesFahrenheit(temp_f)temp_kinkelvins←(5/9)*(temp_f-32)+273.15Writetemperatureinkelvins我們設計程序的步驟如下1.提示用戶鍵入華氏溫度值2.讀取輸入值3.通過關系式轉換為開氏溫度4.輸出結果,結束三
關系運算符和邏輯運算符選擇結構的運算由一個表達式控制的,這個表達式的結果只有true(1)和false(0)。有兩種形式的運算符可以在MATLAB中關系得到true/false:關系運算符和邏輯運算符。跟C語言一樣,MATLAB沒有布爾型和邏輯數據類型。MATLAB把0值作為結果false,把所有的非0值作為結果ture。2023年2月4日第18頁1關系運算符關系運算符是指兩數值或字符操作數的運算符,這種運算將會根椐兩操作數的關系產生結果true或false。關系運算的基本形式如下a1opa2其中a1和a2是算術表達式,變量或字符串,op代表中的關系運算符中的一個。如果兩者的關系為真(true)時,那么這個運算將會返回1值;否則將會返回0值。2023年2月4日第19頁關系運算符運算符運算==等于~=不等于>
大于>=大于或等于<
小于<=小于或等于2023年2月4日第20頁下面是一些關系運算和它的結果運算結果3<4
3<=4 3==4 3>4 4<=4 'A'<'B' 最后一個運算得到的結果為1,是因為字符之間的求值要按照子母表的順序。2023年2月4日第21頁110011關系運算符也可用于標量與數組的比較如果和b=0,那么表達式a>b將會產生結果
2023年2月4日第22頁關系運算符也可比較兩個關系運算符,只要兩個數組具有相同的大小。表達式a>=b將會產生結果如果這個數組具有不同的大小,那么將會產生運行時錯誤。注意因為字符串實際上是字符的數組,關系運算符也比較兩個相同長度的字符串。如果它們有不同的長度,比較運算將會產生一個錯誤。等于關系運算符由兩個等號組成,而賦值運算符只有一個等號。它們是完全不同的兩個符號,初學者極易混淆。符號==是一個比較運算符,返回一個邏輯數,而符號=是將等號右邊的表達式的值賦給左邊的變量。當進行比較運算的時候,初學者經常用誤用符號=。2023年2月4日第23頁常見編程錯誤小心謹慎不要混淆了等于關系運算符(==)和賦值運算符(=)。在運算的層次中,關系運算在所有數學運算的之后進行。所以下面兩個表達式是等價的,均產生結果1。7+3<2+11(7+3)<(2+11)2023年2月4日第24頁2小心==和~=運算符用這兩個運算符比較兩個字符串他是安全的,不會出現錯誤。但對兩個數字數據的比較,將可能產生異想不到的錯誤。兩個理論上相等的數不能有一絲一毫的差別,而在計算機計算的過程中出現了近似的現象,從而可能在判斷相等與不相等的過程中產生錯誤,這種錯誤叫做roundoff錯誤。例如,考慮下面的兩個數,兩者均應等于0。2023年2月4日第25頁等于運算符(==)如果兩變量值相同將會返回變量值1,如果不同將返回0。不等運算符(~=)如果兩變量值不同則返回1,相則返回0。修正誤差a=0;b=sin(pi);因為這兩個數在理論上相等的,所以關系式a==b應當返回值1。但在事實上,MATLAB計算所產生的結果的是>>a=0;>>b=sin(pi);>>a==bans=0MATLAB報告了a和b不同因為他產生了一個roundoff錯誤,在計算中sin(pi)產生了結果1.2246×10-16而不是0。兩個理論上相等的值因為roundoff錯誤而使之發生了細微的差別。2023年2月4日第26頁我們可以通過檢測兩數之間在一定的范圍內是不是近似相等,在這個精確范圍內可能會產生roundoff錯誤。例如測試>>abs(a-b)<1.0E-14ans=1將會產生正確的結果,不管在a與b的計算中產不產生的roundoff錯誤。2023年2月4日第27頁好的編程習慣在我們檢測兩數值是否相等時一定要小心,由于修正誤差可能會使兩個本來應該相等的值不相等了。這時你可以在修正誤差的范圍內判斷它是不是近似相等。3邏輯運算符邏輯運算符是聯系一個或二個邏輯操作數并能產生一個邏輯結果的運算符。有三個二元運算符:分別為AND,OR和異或運算符,還有一個一元運算符NOT。二元邏輯運算的基本形式l1
opl2一元邏輯運算的基本形式為op
l1l1和l2代表表達式或變量,op代表的邏輯運算符。如果l1和l2的邏輯運算關系為true,那么運算將會返回值1,否則將會產生0。2023年2月4日第28頁邏輯運算符&邏輯與|邏輯或xor邏輯與或~邏輯非2023年2月4日第29頁運算的結果總結在真值表中,它向我們展示每一種運算所有可能的結果。如果一個數的值不為0,那么MATLAB將把看作true,如果它為0,則其為false。所以~5的結果為0,~0的結果為1。2023年2月4日第30頁輸入與或異或非l1l2l1
&l2l1
|l2xor(l1,l2)~l1000001010111100110111100標量和數組之間也可進行邏輯運算如果和b=0,那么表達式a&b將會產生結果
2023年2月4日第31頁兩數組之間也可進行邏輯運算,只要它們具有相同的大小表達式a>=b將會產生結果如果這個數組具有不同的大小,那么將會產生運行時錯誤。2023年2月4日第32頁運算符圓括號()轉置(.’),共軛轉置(‘),乘方(.^),矩陣乘方(^)邏輯非(~)乘法(.*),矩陣乘法(*),右除(./),左除(.\),矩陣右除(/),矩陣左除(\)加法(+),減法(-),冒號運算符(:)小于(<),小于等于(<=),大于(>),大于等于(>=),等于(==),不等于(~=)數組邏輯與(&)數組邏輯或(|)邏輯與(&&)邏輯或(||)例假設下面有三個變量被初始和一些表達式及其運算結果。value1=1value2=0value3=-102023年2月4日第33頁邏輯表達式結果(a)~value10(b)value1|value21(c)value1&value20(d)value1&value2|value31(e)value1&(value2|value3)1(f)~(value1&value3)0因為~運算在其它的邏輯運算之前進行,那么(f)中的括號是必須的。如果去掉括號的話,(f)表達式將等價于(~value1)&value3。4邏輯函數MATLAB中有大量的邏輯函數,在條件滿足時,函數返回1。條件不滿足時,返回0。這些邏輯函數連同關系運算符和邏輯運算符一起實現程序的選擇結構和循環結構。2023年2月4日第34頁MATLAB邏輯函數函數用途ischar(a)a是字符數組返回1,否則返回0isempty(a)a是空數組返回1,否則返回0isinf(a)a是無窮大,則返回1,否則返回0isnan(a)a不是一個數則返1,否則返回0isnumeric(a)a是一個數值數組返回1,否則返回0四選擇結構(分支語句)選擇結構可以使MATLAB選擇性執行指定區域內的代碼(稱之為語句塊blocks),而跳過其他區域的代碼。選擇結構在MATLAB中有三種具體的形式:if結構,switch結構和try/catch結構。2023年2月4日第35頁1if結構if結構的基本形式如下:其中controlexpression控制if結構的運算。如果control_expr_1的值非0,那么程序將會執行語句塊1(block1),然后跳到end后面的第一個可執行語句繼續執行。否則,程序將會檢測control_expr_2的值。如果control_expr_2的值非0,那么程序將會執行語句塊2(block2),然后跳到end后面的第一個可執行語句繼續執行。如果所有的控制表達式(controlexpression)均為0,那么程序將會執行與else相關的語句塊。2023年2月4日第36頁在一個if結構中,可以有任意個elseif語句,但else語句最多有一個。只要上面每一個控制表達式均為0,那么下一個控制表達式將會被檢測。一旦其中的一個表達式的值非0,對應的語句塊就要被執行,然后跳到end后面的第一個可執行語句繼續執行。如果所有的控制表達式(controlexpression)均為0,那么程序將會執行else語句。如果沒有else語句,程序將會執行end后面的語句,而不執行if結構中的部分。2023年2月4日第37頁注意MATLAB在if結構中的關鍵字end與數組中提到的返回已知下標最大值函數end完全不同。matlab通過end在M文件中的上下文來區分開它的兩個用途。在大多數情況下,控制表達式均可以聯合關系運算符和邏輯運算符。正像我們在本章早些時侯學到的,當對應的條件為真時,關系運算和邏輯運算將會產生1,否則產生0。所以當一個運算條件為真時,運算結果為非0,則對應的語句塊,就會被執行。2023年2月4日第38頁例如,一元二次方程的基本形式如下:ax2+bx+c=0
其解為
2023年2月4日第39頁其中b2-4ac是我們熟知的判別式,當b2-4ac>0時,方程式有兩個不同的實數根,當b2-4ac=0,有兩個相同的實數根,當b2-4ac<0時,方程式有兩個不同的復根。假設我們檢測某一元二次根的情況,并告訴使用者這個方程有兩個復根,還是兩個相等的實根和兩個不相等的實根。用偽代碼這個結構的形式如下:if(b^2-4*a*c)<0Writemsgthatequationhastwocomplexroots.elseif(b^2-4*a*c)==0Writemsgthatequationhastwoidenticalrealroots.elseWritemsgthatequationhastwodistinctrealroots.end轉化為MATLAB語言:if(b^2-4*a*c)<0disp('Thisequationhastwocomplexroots.');elseif(b^2-4*a*c)==0disp('Thisequationhastwoidenticalrealroots.');elsedisp('Thisequationhastwodistinctrealroots.');end2023年2月4日第40頁回憶一下,判斷為真時,關系運算符將會返回一個非0值,從而導致對應語句的執行。為增加程序的可讀性,在if結構中的語句塊中最好縮進2到3個空格,而實際上沒有必要。你可以在一行內寫完一個完整的if結構,只需把結構的每一部分后面加上分號或逗號,所以下面的兩個結構是等價的:ifx<0y=abs(x);end和ifx<0;y=abs(x);end但是這種方式只適用于簡單的結構。2023年2月4日第41頁好的編程習慣if結構體經??s進2到3個空格,以增強程序的可讀性。2if結構舉例我們將本章開頭介紹的方法進行編程。1.陳述問題這個問題的陳述非常的簡單,我們要求一元二次方程的根,不管它的根是實根還是復根,有一個根還是兩個根。2.定義輸入和輸出本程序的輸入應為系數a,b,cax2+bx+c=0 輸出量應為兩個不相等的實數。兩個相等的實數或兩個復數。3.寫出算法本程序可分為三大塊,它的函數分別為輸入,運算過程和輸出。我們把每一個大塊分解成更小的,更細微的工作。根據判別式的值,可能有三種計算途徑,2023年2月4日第42頁例求一元二次方程的根設計并編寫一個程序,用來求解一元二次方程的根。2023年2月4日第43頁所以我們要用到有三種選項的if結構。產生的偽代碼如下Prompttheuserforthecoefficientsa,b,andc.Reada,b,andcdiscriminant←b^2-4*a*cifdiscriminat>0x1←(-b+sqrt(discriminant))/(2*a)x2←(-b-sqrt(discriminant))/(2*a)Writemsgthatequationhastwodistinctrealroots.Writeoutthetworoots.elseifdiscriminant==0x1←-b/(2*a)Writemsgthatequationhastwoidenticalrealroots.Writeouttherepeatedroots.elsereal_part←-b/(2*a)imag_part←sqrt(abs(discriminant))/(2*a)Writemsgthatequationhastwocomplexroots.Writeoutthetworoots.end4.把算法轉化為MATLAB語言5.檢測這個程序下一步,我們必須輸入實數來檢測這個程序。因這個程序有三個可能的路徑。所以在我們確信每一人路徑都工作正常之前,必須把這三個路徑檢測一遍。從式子中,我們可以有用下面的方法來驗證程序的正確性。x2+5x+6=0 x=-2,andx=-=3x2+4x+4=0 x=-2x2+2x+5=0 x=-1±i22023年2月4日第44頁編寫一個程序,求以x,y為自變量函數f(x,y)的值。函數f(x,y)的定義如下:2023年2月4日第45頁根據自變量x和y的正負符號的不同,而采取不同的求值表達式。為選取合適的表達式,檢查用戶輸入的x,y的正負符號是必要的。1.陳述問題這個問題的陳述非常簡單:根據用戶輸入的x,y,求函數f(x,y)的值。2.確定輸入輸出量程序的輸入量為函數的自變量x,y。輸出量為函數值f(x,y)。3.設計算法這個問題可以把他分解成三個大塊,即輸入,計算過程,和輸出。我們把這三大塊再分解成小的,精細的工作。在計算f(x,y)時,我們有4種選擇,選哪一種取決于x,y的值。所以邏輯上我們要用4個選擇的if結構來實現。產生的偽代碼如下:PrompttheuserforthevaluesxandyReadxandyifx≥0andy≥0fun←x+yelseifx≥0andy<0fun←x+y^2elseifx<0andy≥0fun←x^2+yelsefun←x^2+y^2endWriteoutf(x,y)2023年2月4日第46頁5.檢測程序下一步,我們必須輸入實數來檢測這個程序。因這個程序有四個可能的路徑。所以在我們確信每一人路徑都工作正常之前,必須把這四個路徑檢測一遍。我們分別取4個象限內的值(2,3),(-2,-3),(-2,3)和(--2,--3)。我們用手工計算可得f(2,3)=2+3=5f(2,-3)=2+(-3)2=11f(-2,3)=(-2)2+3=7f(-2,-3)=(-2)2+(-3)2=132023年2月4日第47頁3關于if結構使用的注意事項if結構是非常靈活的,它必須含有一個if語句和一個end語句。中間可以有任意個elseif語句,也可以有一個else語句。聯合它的這些特性,我們可以創建出我們需要的各種各樣的選擇結構。還有if語句是可以嵌套的。如果if結構完全是另一個if結構的一個語句塊,我們就稱兩者為嵌套關系。下面是兩個if語句的嵌套。ifx>0...ify<0...end...end2023年2月4日第48頁MATLAB翻譯器經常把把已知的end語句和它最近的if語句聯合在一起,所以第一個end語句和ify<0最靠近,而第二個end與ifx>0最接近。對于一個編寫正確的程序,它能工作正常。但如果程序員編寫出錯誤,它將會使編譯器出現混淆性錯誤信息提示。例如,假設我們編寫一個大的程序,包括如下的一個結構:...if(test1)...if(test2)...if(test3)...end...end...end2023年2月4日第49頁這個程序包括了三個嵌套的if結構,在這個結構中可能有上千行的代碼?,F在假設第一個end在編輯區域突然被刪除,那么MATLAB編譯器將會自動將第二個end與最里面的if(test3)結構聯合起來,第三個end將會和中間的if(test2)聯合起來。當編譯器翻譯到達文件結束的時候,那將發現第一個if(test1)結構將永遠沒有結束,然后編譯器就會產生一個錯誤提示信息,即缺少一個end。但是,它不能告訴你問題發生在什么地方,這就使我們必須回過頭去看整個程序,來找問題。在大多數情況下,執行一個算法,即可以用多個elseif語句,也可以用if語句的嵌套。在這種情況下,大家可以選擇自己喜歡的方式。例給出等級分數假設我們要編寫一個程序,輸入一個數值分數,輸出等級分數,即是A級,B級和C級
grade>95 A95≥grade>86 B86≥grade>76 C76≥grade>66 D66≥grade>0 F用兩種方式寫出這個程序,第一種方式用多個elseif語句,第二種方式用if的嵌套。2023年2月4日第50頁(a)用多個elseif語句ifgrade>95.0disp('ThegradeisA.');elseifgrade>86.0disp('ThegradeisB.');elseifgrade>76.0disp('ThegradeisC.');elseifgrade>66.0disp('ThegradeisD.');elsedisp('ThegradeisF.');end2023年2月4日第51頁(b)用if嵌套結構ifgrade>95.0disp('ThegradeisA.');elseifgrade>86.0disp('ThegradeisB.');elseifgrade>76.0disp('ThegradeisC.');elseifgrade>66.0disp('ThegradeisD.');elsedisp('ThegradeisF.');endendendend2023年2月4日第52頁從上面的例子中,我們可以看到如果有多個選項的話,在一個if結構中用到多個elseif語句將會比if的嵌套結構簡單的多。2023年2月4日第53頁好的編程習慣對于有許多選項的選擇結構來說,最好在一個if結構中使用多個elseif語句,盡量不用if的嵌套結構。4switch結構switch結構是另一種形式的選擇結構。程序員可以根據一個單精度整形數,字符或邏輯表達式的值來選擇執行特定的代碼語句塊。2023年2月4日第54頁如果switch_expr的值與case_expr_1相符,那么第一個代碼塊將會被執行,然后程序將會跳到switch結構后的第一個語句。如果switch_expr的值與case_expr_2相符,那么第二個代碼塊將會被執行,然后程序將會跳到switch結構后的第一個語句。在這個結構中,用相同的方法來對待其他的情況。otherwise語句塊是可選的。如果它存在的話,當switch_expr的值與其他所有的選項都不相符時,這個語句塊將會被執行。如果它不存在,且witch_expr的值與其他所有的選項都不相符,那么這個結構中的任何一個語句塊都不會被執行。這種情況下的結果可以看作沒有選擇結構,直接執行MATLAB語言。如果說switch_expr有很多值可以導致相同代碼的執行,那么這些值可以括在同一括號內,如下所示。如果這個switch表達式和表中任何一個表達式相匹配,那么這個語句塊將會被執行。2023年2月4日第55頁switch_expr和每一個case_expr既可以是數值,也可以是字符值。注意在大多情況下只有一個語句塊會被執行。當一個語句塊被執行后,編譯器就會跳到end語句后的第一個語句開始執行。如果switch表達和多個case表達式相對應,那么只有他們中的第一個將會被執行。讓我們看一個簡單的關于switch結構的例子。下面的語句用來判斷1到10之間的數是奇數還是偶數。它用來說明一系列的case選項值的應用和otherwise語塊的應用。switch(value)case{1,3,5,7,9},disp('Thevalueisodd.');case{2,4,6,8,10},disp('Thevalueiseven.');otherwise,disp('Thevalueisoutofrange.');end2023年2月4日第56頁5try/catch結構的應用try/catch結構是選擇結構的一種特殊形式,用于捕捉錯誤。一般地,當一個MATLAB程序在運行時遇到了一個錯誤,這個程序就會中止執行。try/catch結構修改了這個默認行為。如果一個錯誤發生在這個結構的try語句塊中,那么程序將會執行catch語句塊,程序將不會中斷。它將幫助程序員控制程序中的錯誤,而不用使程序中斷。2023年2月4日第57頁Try/catch結構的基本形式如下:2023年2月4日第58頁當程序運行到try/catch語句塊,在try語句塊中的一些語句將會被執行。如果沒有錯誤出現,catch語句塊將會被跳過。另一方面,如果錯誤發生在一個try語句塊,那么程序將中止執行try語句塊,并立即執行catch語句塊。下面有一個包含try/catch結構程序。它能創建一個數組,并詢問用戶顯示數組中的哪一個元素。用戶提供一個下標,那么這個程序將會顯示對應的數組元素,try語句塊一般會在這個程序中執行,只有當try語句塊執行出錯,catch語句塊將會發生錯誤。2023年2月4日第59頁%Initializearraya=[1-325];try%Trytodisplayanelementindex=input('Entersubscriptofelementtodisplay:');disp(['a('int2str(index)')='num2str(a(index))]);catch%Ifwegethereanerroroccurreddisp(['Illegalsubscript:'int2str(index)]);end這個程序的執行結果如下:>>try_catchEntersubscriptofelementtodisplay:3a(3)=2>>try_catchEntersubscriptofelementtodisplay:8Illegalsubscript:82023年2月4日第60頁五
程序調試的進一步說明在含有選擇結構和循環結構的程序出錯的概率要比只含簡單的順序結構的程序出錯的概率大得多。在完成了程序設計的步驟之后,無論多大的一個程序,在第一次運行時都很難通過。假如我們創建了一個程序并調試它,只發現這個程序的輸出是錯誤的。我們怎樣找到這些錯誤并修改它呢?一旦程序包含了循環和選擇結構,找到錯語的最好的方法是應用matlab支持的符號調試器(symbolicdeb
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 《高中化學總復習》課件
- 作品大賽回復函
- 文化和旅游交流合作協議
- 《課件版權問題》課件
- 《智能安防系統介紹》課件
- 尊重勞動 創新未來
- 排球教學課件之防守與攔網
- 《產后護理》課件
- 《生物基因》課件
- 2025抵押擔保合同范本
- 配電網自動化技術學習通超星期末考試答案章節答案2024年
- 套管修復(2010大賽)
- 人居與環境-詩意的棲居 課件-2024-2025學年高中美術人美版(2019)美術鑒賞
- 遼寧省鞍山市(2024年-2025年小學五年級語文)部編版階段練習(下學期)試卷及答案
- 酒店工作安全培訓(共60張課件)
- 歷史人物范仲淹介紹
- 四年級下冊數學方程題100道及答案
- 2024年中證金融研究院事業單位招聘23人歷年高頻難、易錯點500題模擬試題附帶答案詳解
- 2024掛軌式巡檢機器人
- CJJT 182-2014 城鎮供水與污水處理化驗室技術規范
- 排水暗渠施工方案
評論
0/150
提交評論