第三章MATLAB程序設(shè)計_第1頁
第三章MATLAB程序設(shè)計_第2頁
第三章MATLAB程序設(shè)計_第3頁
第三章MATLAB程序設(shè)計_第4頁
第三章MATLAB程序設(shè)計_第5頁
已閱讀5頁,還剩107頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第3章matlab程序設(shè)計1M文件程序控制結(jié)構(gòu)程序調(diào)試程序舉例21.1MATLAB的工作模式①指令驅(qū)動模式

通常matlab以指令驅(qū)動模式工作,即在matlab窗口下當(dāng)用戶輸入單行指令時,matlab立即處理這條指令,并顯示結(jié)果,這就是matlab命令行方式。

命令行操作時,matlab窗口只允許一次執(zhí)行一行上的一個或幾個語句。一、M文件3命令行驅(qū)動,一行多條指令>>x1=0:10,x2=0:3:11,x3=11.5:-3:0>>x1=012345678910x2=0369x3=11.50008.50005.50002.5000在matlab窗口輸入數(shù)據(jù)和命令進行計算時,當(dāng)處理復(fù)雜問題和大量數(shù)據(jù)時是不方便的。命令行方式程序可讀性差,而且不能存儲,對于復(fù)雜的問題,應(yīng)編寫成能存儲的程序文件。4②M文件模式將matlab語句構(gòu)成的程序存儲成以m為擴展名的文件,然后再執(zhí)行該程序文件,這種工作模式稱為程序文件模式。程序文件不能在命令窗口下建立,因為命令窗口只允許一次執(zhí)行一行上的一個或幾個語句。5腳本文件:將原本要在MATLAB環(huán)境下直接輸入的多條語句,存放為.m后綴的文件,在命令行鍵入文件名,替代多條語句,一次執(zhí)行成批命令。函數(shù)文件:以固定格式書寫的程序代碼,

第一行是函數(shù)定義行。和C語言,F(xiàn)ortran等語言程序一樣。用MATLAB語言編寫的程序,稱為M文件。M文件可以根據(jù)調(diào)用方式的不同分為兩類:腳本文件(命令文件)(ScriptFile)和函數(shù)文件(FunctionFile)1.2M文件6

兩種文件對比7將函數(shù)文件去掉其第一行的定義行就轉(zhuǎn)變成了腳本文件,但這樣一來,原先在函數(shù)內(nèi)部使用的局部變量也就變成了基本工作空間中的變量,這會帶來以下幾個問題:●基本工作空間與腳本文件中同名的變量會引起沖突。●使基本工作空間中變量數(shù)急劇增加,造成內(nèi)存緊張?!窬幊虝r要細心考慮各個腳本文件所用到的變量。

這些問題在函數(shù)文件中不復(fù)存在,MATLAB通過實參與形參一一對應(yīng)的方式來實現(xiàn)函數(shù)的調(diào)用,這極大地方便了程序設(shè)計。

8例如,編寫出求取平均值的腳本文件stat1.m,再編寫出求取標(biāo)準(zhǔn)差的函數(shù)文件stat2.m。程序如下:腳本文件stat1.m%腳本文件%求陣列x的平均值和標(biāo)準(zhǔn)差%[m,n]=size(x);ifm==1

m=n;ends1=sum(x);s2=sum(x.^2);9mean1=s1/m;stdev=sqrt(s2/m-mean1.^2);函數(shù)文件stat2.mfunction[mean1,stdev]=stat2(x)%函數(shù)文件%求陣列x的平均值和標(biāo)準(zhǔn)差%調(diào)用格式為%[mean,stdev]=stat2(x)%[m,n]=size(x);ifm==1m=n;ends1=sum(x);s2=sum(x.^2);mean1=s1/m;stdev=sqrt(s2/m-mean1.^2);10然后,在MATLAB下執(zhí)行這兩個文件,從而對腳本文件和函數(shù)文件有一個基本的了解。在MATLAB中輸入>>clearall>>x=rand(4,4)+2;>>stat111執(zhí)行后檢查基本工作空間中的變量情況:>>whosName SizeBytesClassm 1x1 8 doublearraymean1 1x4 32 doublearrayn 1x1 8 doublearrays1 1x4 32 doublearrays2 1x4 32 doublearraystdev 1x4 32 doublearrayx 4x4 128 doublearrayGrandtotalis34elementsusing272bytes12這說明,在腳本文件中產(chǎn)生的所有變量都保存在基本工作空間。檢查執(zhí)行結(jié)果>>disp([mean1;stdev])2.56852.53212.66842.56050.25870.33590.15130.2888另一方面,通過函數(shù)文件來進行同樣的操作,這時輸入>>clearmns1s2mean1stdev[m1,st]=stat2(x);13執(zhí)行后,同樣檢查基本工作空間的變量情況:>>whosName SizeBytesClassm1 1x4 32 doublearrayst 1x4 32 doublearrayx 4x4 128 doublearrayGrandtotalis24elementsusing192bytes這說明,在基本工作空間中,除了原本產(chǎn)生的x矩陣,調(diào)用函數(shù)stat2.m后,只增加了由函數(shù)返回的結(jié)果。通過disp([m1;st])可得到與statl.m相同的結(jié)果。

141.3M文件的創(chuàng)建m文件的類型是普通的文本文件,我們可以使用系統(tǒng)認(rèn)可的文本文件編輯器來建立m文件。如MATLAB下的m文件編輯器、windows的記事本和word等。具體的創(chuàng)建方法:1、edit——用matlab自帶的編輯器編制m文件。

15啟動MATLAB文本編輯器有3種方法:(1)菜單操作。從MATLAB主窗口的File菜單中選擇New菜單項,再選擇M-file命令,屏幕上將出現(xiàn)MATLAB文本編輯器窗口。

16(2)命令操作。在MATLAB命令窗口輸入命令edit,啟動MATLAB文本編輯器后,輸入M文件的內(nèi)容并存盤。(3)命令按鈕操作。單擊MATLAB主窗口工具欄上的NewM-File命令按鈕,啟動MATLAB文本編輯器后,輸入M文件的內(nèi)容并存盤。172.利用WINDOWS下的記事本創(chuàng)建m文件183.點擊file—SaveWorkspaceAs

將工作空間中的內(nèi)容存入文件。4.word——用word編輯m文件。

注意:所創(chuàng)建的m文件必須納入matlab搜索路徑后,才能在matlab命令窗口運行。M文件創(chuàng)建之后以.m文件后綴形式保存到硬盤目錄下191.3.1命令文件—簡單的m文件命令文件實際上是一串指令的集合,與在命令窗口逐行執(zhí)行文件中的所有指令,其結(jié)果是一樣的。沒有輸入輸出參數(shù)。1.3M文件的格式20(1)命令文件格式包括兩部分:注釋文件和程序文件%RANK Numberoflinearlyindependentrowsorcolumns.% K=RANK(X)isthenumberofsingularvaluesofX% thatarelargerthanMAX(SIZE(X))*NORM(X)*EPS.% K=RANK(X,tol)isthenumberofsingularvaluesofXthat% arelargerthantol.% Copyright(c)1984-94byTheMathWorks,Inc.s=svd(x);if(nargin==1)tol=max(size(x))*max(s)*eps;endr=sum(s>tol);程序部分21(2)命令m文件建立及其運行建立包括以下步驟:進入m文件編輯器輸入程序定義文件名,保存程序命令M文件的運行方式:直接在命令窗口輸入該文件的文件名在m文件編輯器中打開該文件后點擊工具條中的“運行”按鈕22例2:將兩個矩陣相加1、輸入程序:%對兩個矩陣相加clccleara=[1,2,3];b=[4,5,6];c=a+b2、保存到當(dāng)前工作路徑為myadd.m3、在命令窗口輸入myadd,回車或打開文件,點擊運行按鈕給出結(jié)果:c=57923打開已有的M文件,也有3種方法:(1)菜單操作。從MATLAB主窗口的File菜單中選擇Open命令,則屏幕出現(xiàn)Open對話框,在Open對話框中選中所需打開的M文件。在文檔窗口可以對打開的M文件進行編輯修改,編輯完成后,將M文件存盤。(2)命令操作。在MATLAB命令窗口輸入命令:edit文件名,則打開指定的M文件。(3)命令按鈕操作。單擊MATLAB主窗口工具欄上的OpenFile命令按鈕,再從彈出的對話框中選擇所需打開的M文件。241.3.2matlab函數(shù)文件(1)函數(shù)(和C語言既有相同又有不同之處)

函數(shù)工作空間:在函數(shù)運行時,在內(nèi)存中開辟一塊存儲空間,存儲函數(shù)命令和運行中間結(jié)果,運行完就釋放。與workspace對應(yīng)。函數(shù)變量:形參為輸入變量,返回值為輸出變量。可以有多個返回值。

25

(2)matlab函數(shù)內(nèi)置文件matlab自定義的函數(shù)文件稱內(nèi)置函數(shù)文件調(diào)用內(nèi)置函數(shù)的方法:使用函數(shù)名并給出相應(yīng)的入口、出口參數(shù)即可。例:sin.m函數(shù)——用type指令顯示其m文件內(nèi)容

typesinsinisabuilt-infunction.例3輸入程序:x=0:2*pi/180:2*pi;y=sin(x)plot(x,y)保存為mymfile.m后運行26matlab擁有大量的內(nèi)置數(shù)學(xué)函數(shù),供我們在數(shù)值運算和符號運算中調(diào)用。如sqrt(x)——求x的平方根abs(x)——求x的絕對值det(a)——求行列式的值等等。27matlab用戶可以根據(jù)需要編輯自己的m文件,它們可以像庫函數(shù)一樣方便的調(diào)用,從而極大地擴展了matlab的能力。對于某一類特殊問題,如創(chuàng)建了許多m函數(shù)文件,則可形成新的工具箱。這種用matlab語言創(chuàng)建定義新的matlab函數(shù)的功能,正體現(xiàn)了matlab語言強大的擴展功能。(3).用戶定義函數(shù)m文件—需要輸入變量,返回輸出變量

28函數(shù)m文件的格式:function返回變量=函數(shù)名(輸入變量)注釋說明語句段程序語句段

例4編寫函數(shù)文件求半徑為r的圓的面積和周長。函數(shù)文件如下:function[s,p]=fcircle(r)%calculatetheareaandperimeterofacircleofradiir%r,s,p分別為圓的半徑、面積以及周長%2004年7月30日編s=pi*r*r;p=2*pi*r;29函數(shù)m文件第一行必須以單詞function作為引導(dǎo)詞,表示該M文件是一個函數(shù)文件,必須遵循如下形式:function<因變量>=<函數(shù)名>(<自變量>)函數(shù)名的命名規(guī)則與變量名相同,m文件的文件名必須是<函數(shù)名>.m。輸入形參為函數(shù)的輸入?yún)?shù),輸出形參為函數(shù)的輸出參數(shù)。當(dāng)輸出形參多于一個時,則應(yīng)該用方括號括起來。程序中的變量均為局部變量,不保存在工作空間中。其變量只在函數(shù)運行期間有效。特定規(guī)則:30(4).函數(shù)m文件的調(diào)用函數(shù)調(diào)用的一般格式是:[輸出實參表]=函數(shù)名(輸入實參表)要注意的是,函數(shù)調(diào)用時各實參出現(xiàn)的順序、個數(shù),應(yīng)與函數(shù)定義時形參的順序、個數(shù)一致,否則會出錯。函數(shù)調(diào)用時,先將實參傳遞給相應(yīng)的形參,從而實現(xiàn)參數(shù)傳遞,然后再執(zhí)行函數(shù)的功能。31例5利用函數(shù)文件,實現(xiàn)直角坐標(biāo)(x,y)與極坐標(biāo)(ρ,θ)之間的轉(zhuǎn)換。1、建立函數(shù)文件function[rho,theta]=tran(x,y)rho=sqrt(x*x+y*y);theta=atan(y/x);2、保存為tran.m3、編寫命令文件main1.m調(diào)用tran.m:x=input('Pleaseinputx=:');y=input('Pleaseinputy=:');[rho,the]=tran(x,y);rhothe32

MATLAB中,函數(shù)可以嵌套調(diào)用,即一個函數(shù)可以調(diào)用別的函數(shù),甚至調(diào)用它自身。一個函數(shù)調(diào)用它自身稱為函數(shù)的遞歸調(diào)用。例6分別建立命令文件和函數(shù)文件,將華氏溫度f轉(zhuǎn)換為攝氏溫度c。程序1:首先建立命令文件并以文件名f2c.m存盤。clear;%清除工作空間中的變量f=input('InputFahrenheittemperature:');c=5*(f-32)/9然后在MATLAB的命令窗口中輸入f2c,將會執(zhí)行該命令文件,執(zhí)行情況為:InputFahrenheittemperature:73c=22.777833程序2:首先建立函數(shù)文件f2c.m。functionc=f2c(f)c=5*(f-32)/9然后在MATLAB的命令窗口調(diào)用該函數(shù)文件。clear;y=input('InputFahrenheittemperature:');x=f2c(y)輸出情況為:InputFahrenheittemperature:70c=21.1111x=21.111134①局部變量和全局變量:局部變量只存在于單個函數(shù)工作空間,全局變量通過global定義,可穿行于不同函數(shù)工作空間,包括基本工作空間workspace。

(5).函數(shù)文件的其他相關(guān)概念35函數(shù)文件的內(nèi)部變量是局部的,與其他函數(shù)及MATLAB內(nèi)存相互隔離;而如果在若干函數(shù)中把某一變量定義為全局變量,那么這些函數(shù)將公用這個變量,全局變量的作用域是整個MATLAB的工作區(qū),即全程有效,所有函數(shù)都可以對其存取和修改。全局變量是函數(shù)之間傳遞數(shù)據(jù)的一個方式全局變量用global命令定義,格式為:global變量名

36我們編寫出相應(yīng)的函數(shù)文件,其中α和β采用全局變量進行參數(shù)傳遞。M函數(shù)文件為

functionz=fun1(x,y)globalalphabeta%全局變量宣稱

m=length(x);n=length(y);x1=x'*ones(1,n);y1=(y'*ones(1,m))';

z=alpha*(x1-1).^2+beta*(y1+1).^2;

例全局變量應(yīng)用示例37然后可通過調(diào)用函數(shù)fun1計算出z,并利用mesh繪制出網(wǎng)格曲線。編寫出的腳本文件為globalalphabetax=[0:.02:2];y=[-2:.02:0];figure(1)subplot(2,2,1),alpha=1;beta=1;z=fun1(x,y);mesh(z)title(['\alpha=',num2str(alpha),'and\beta=',num2str(beta)])subplot(2,2,2),alpha=2;beta=1;z=fun1(x,y);mesh(z)38title(['\alpha=',num2str(alpha),'and\beta=',num2str(beta)])subplot(2,2,3),alpha=1;beta=2;z=fun1(x,y);mesh(z)title(['\alpha=',num2str(alpha),'and\beta=',num2str(beta)])subplot(2,2,4),alpha=.8;beta=.5;z=fun1(x,y);mesh(z)title(['\alpha=',num2str(alpha),'and\beta=',num2str(beta)])

這里α和β通過全局變量傳遞,因此在函數(shù)調(diào)用語句z=fun1(x,y)中,每次的x、y都不變,但得到的結(jié)果z卻不同,這是因為α和β已發(fā)生了變化。腳本文件執(zhí)行后可得到如圖4.1所示的結(jié)果。

3940值得指出的是:程序設(shè)計中,全局變量固然可帶來某些方便,但卻破壞了函數(shù)對變量的封裝,降低了程序的可讀性和可靠性;當(dāng)設(shè)計程序較大,子函數(shù)較多時,全局變量給程序調(diào)試和維護帶來不便,如果一定要用全局變量,要起一個特別的名字,以免誤被修改41②子函數(shù):在一個m文件中可以有多個函數(shù),其中和文件名同名的函數(shù)為主函數(shù),其余為子函數(shù),只存在于主函數(shù)工作空間。③私人函數(shù):存放于private目錄中的函數(shù)(m文件)。為其父目錄中的多個函數(shù)所共享。42④函數(shù)參數(shù)的可調(diào)性

在調(diào)用函數(shù)時,MATLAB用兩個永久變量nargin和nargout分別記錄調(diào)用該函數(shù)時的輸入實參和輸出實參的個數(shù)。只要在函數(shù)文件中包含這兩個變量,就可以準(zhǔn)確地知道該函數(shù)文件被調(diào)用時的輸入輸出參數(shù)個數(shù),從而決定函數(shù)如何進行處理。43例19nargin用法示例函數(shù)文件charray.m:functionfout=charray(a,b,c)ifnargin==1fout=a;elseifnargin==2fout=a+b;elseifnargin==3fout=(a*b*c)/2;end

命令文件mydemo.m:x=[1:3];y=[1;2;3];charray(x)charray(x,y')charray(x,y,3)ans=123ans=246ans=2144二、程序控制結(jié)構(gòu)順序結(jié)構(gòu)選擇結(jié)構(gòu)循環(huán)結(jié)構(gòu)451.?dāng)?shù)據(jù)的輸入輸出1.1數(shù)據(jù)的輸入從鍵盤輸入數(shù)據(jù),則可以使用input函數(shù)來進行,該函數(shù)的調(diào)用格式為:A=input(提示信息,選項);其中提示信息為一個字符串,用于提示用戶輸入什么樣的數(shù)據(jù)。如果在input函數(shù)調(diào)用時采用's'選項,則允許用戶輸入一個字符串。例如,想輸入一個人的姓名,可采用命令:xm=input('What''syourname?','s');461.2.?dāng)?shù)據(jù)的輸出

MATLAB提供的命令窗口輸出函數(shù)主要有disp函數(shù),其調(diào)用格式為disp(輸出項)其中輸出項既可以為字符串,也可以為矩陣。47例7輸入x,y的值,并將它們的值互換后輸出。程序如下:

x=input('Inputxplease.');y=input('Inputyplease.');z=x;x=y;y=z;disp(x);disp(y);Inputxplease.23Inputyplease.662348例8求一元二次方程ax2+bx+c=0的根。程序如下:a=input('a=?');b=input('b=?');c=input('c=?');d=b*b-4*a*c;x=[(-b+sqrt(d))/(2*a),(-b-sqrt(d))/(2*a)];disp(['x1=',num2str(x(1)),',x2=',num2str(x(2))]);a=?10b=?23c=?5x1=-0.24308,x2=-2.0569492.程序結(jié)構(gòu)2.1順序結(jié)構(gòu)

只需將程序語句順序排列即可502.2選擇結(jié)構(gòu)1.if語句在MATLAB中,if語句有3種格式。(1)單分支if語句:if條件語句組end當(dāng)條件成立時,則執(zhí)行語句組,執(zhí)行完之后繼續(xù)執(zhí)行if語句的后繼語句,若條件不成立,則直接執(zhí)行if語句的后繼語句。51(2)雙分支if語句:if條件語句組1else語句組2end當(dāng)條件成立時,執(zhí)行語句組1,否則執(zhí)行語句組2,語句組1或語句組2執(zhí)行后,再執(zhí)行if語句的后繼語句。52例9計算分段函數(shù)的值。程序如下:x=input('請輸入x的值:');ifx<=0y=(x+sqrt(pi))/exp(2);elsey=log(x+sqrt(1+x*x))/2;end53(3)多分支if語句:if條件1語句組1elseif條件2語句組2……elseif條件m語句組melse語句組nend語句用于實現(xiàn)多分支選擇結(jié)構(gòu)。54例10輸入一個字符,若為大寫字母,則輸出其對應(yīng)的小寫字母;若為小寫字母,則輸出其對應(yīng)的大寫字母;若為數(shù)字字符則輸出其對應(yīng)的數(shù)值,若為其他字符則原樣輸出。c=input('請輸入一個字符','s');ifc>='A'&c<='Z'disp(char(abs(c)+abs('a')-abs('A')));elseifc>='a'&c<='z'disp(char(abs(c)-abs('a')+abs('A')));elseifc>='0'&c<='9'disp(abs(c)-abs('0'));elsedisp(c);end552.switch語句switch語句根據(jù)表達式的取值不同,分別執(zhí)行不同的語句,其語句格式為:switch表達式case表達式1語句組1case表達式2語句組2……case表達式m語句組motherwise語句組nend56

當(dāng)表達式的值等于表達式1的值時,執(zhí)行語句組1,當(dāng)表達式的值等于表達式2的值時,執(zhí)行語句組2,…,當(dāng)表達式的值等于表達式m的值時,執(zhí)行語句組m,當(dāng)表達式的值不等于case所列的表達式的值時,執(zhí)行語句組n。當(dāng)任意一個分支的語句執(zhí)行完后,直接執(zhí)行switch語句的下一句。57例11某商場對顧客所購買的商品實行打折銷售,標(biāo)準(zhǔn)如下(商品價格用price來表示):price<200沒有折扣200≤price<5003%折扣500≤price<10005%折扣1000≤price<25008%折扣2500≤price<500010%折扣5000≤price14%折扣輸入所售商品的價格,求其實際銷售價格。58程序如下:price=input('請輸入商品價格');switchfix(price/100)case{0,1}%價格小于200rate=0;case{2,3,4}%價格大于等于200但小于500rate=3/100;casenum2cell(5:9)%價格大于等于500但小于1000rate=5/100;casenum2cell(10:24)%價格大于等于1000但小于2500rate=8/100;casenum2cell(25:49)%價格大于等于2500但小于5000rate=10/100;otherwise%價格大于等于5000rate=14/100;endprice=price*(1-rate)%輸出商品實際銷售價格593.try語句語句格式為:try語句組1catch語句組2endtry語句先試探性執(zhí)行語句組1,如果語句組1在執(zhí)行過程中出現(xiàn)錯誤,則將錯誤信息賦給保留的lasterr變量,并轉(zhuǎn)去執(zhí)行語句組2。60例12矩陣乘法運算要求兩矩陣的維數(shù)相容,否則會出錯。先求兩矩陣的乘積,若出錯,則自動轉(zhuǎn)去求兩矩陣的點乘。程序如下:A=[1,2,3;4,5,6];B=[7,8,9;10,11,12];tryC=A*B;catchC=A.*B;endClasterr%顯示出錯原因C=71627405572ans=Errorusing==>mtimesInnermatrixdimensionsmustagree.612.3循環(huán)結(jié)構(gòu)1.for語句for語句的格式為:for循環(huán)變量=表達式1:表達式2:表達式3循環(huán)體語句end其中表達式1的值為循環(huán)變量的初值,表達式2的值為步長,表達式3的值為循環(huán)變量的終值。步長為1時,表達式2可以省略。62例13一個三位整數(shù)各位數(shù)字的立方和等于該數(shù)本身則稱該數(shù)為水仙花數(shù)。輸出全部水仙花數(shù)。程序如下:form=100:999m1=fix(m/100);%求m的百位數(shù)字m2=rem(fix(m/10),10);%求m的十位數(shù)字m3=rem(m,10);%求m的個位數(shù)字rem求余數(shù)ifm==m1*m1*m1+m2*m2*m2+m3*m3*m3disp(m)endend結(jié)果:15337037140763例14已知,當(dāng)n=100時,求的值。程序如下:程序如下:y=0;n=100;fori=1:ny=y+1/(2*i-1);endyy=3.284364在實際MATLAB編程中,采用循環(huán)語句會降低其執(zhí)行速度,所以前面的程序通常由下面的程序來代替:n=100;i=1:2:2*n-1;y=sum(1./i);yy=3.284365for語句更一般的格式為:for循環(huán)變量=矩陣表達式循環(huán)體語句end執(zhí)行過程是依次將矩陣的各列元素賦給循環(huán)變量,然后執(zhí)行循環(huán)體語句,直至各列元素處理完畢。66例15寫出下列程序的執(zhí)行結(jié)果。

s=0;a=[1,2,3;5,6,7;8,9,10];fork=as=s+k;enddisp(s);a=1235678910disp(s);61827672.while語句while語句的一般格式為:while(條件)循環(huán)體語句end其執(zhí)行過程為:若條件成立,則執(zhí)行循環(huán)體語句,執(zhí)行后再判斷條件是否成立,如果不成立則跳出循環(huán)。68

while語句可完成不定次重復(fù)的循環(huán),它與for語句不同,每次循環(huán)前要判別其條件,如果條件為真或非零值,則繼續(xù)循環(huán),否則結(jié)束循環(huán)。當(dāng)條件是一表達式時,其值必定會受到循環(huán)語句的影響。例如,為求出一個值n,使其n!?最大但小于1050,則可輸入r=1;k=1;whiler<1e50r=r*k;k=k+1;endk=k-1;r=r./k;disp(['The',num2str(k),'!is',num2str(r)])69執(zhí)行后得

The41!is3.345253e+049說明41!小于1050,且可取最大值,這可利用直接求取階乘的prod函數(shù)(或factorial(N))加以驗證。我們也可以采用變量的值控制循環(huán)次數(shù),例如輸入var=[12340560];a=[];k=1;whilevar(k)a=[avar(k).^3];k=k+1;enddisp(a)70執(zhí)行后得

182764這說明只循環(huán)了前4次,因為一旦取得的變量值為0(本例為第5次),則終止while循環(huán)。while循環(huán)中可利用break語句終止循環(huán),例如輸入var=[123456-1780]a=[];k=1;whilevar(k)ifvar(k)==-1,break,enda=[avar(k).^2];k=k+1;enddisp(a)71執(zhí)行后得

149162536這說明當(dāng)取var(k)=-1時,由于執(zhí)行了break語句,終止了while循環(huán)。

72程序如下:sum=0;cnt=0;val=input('Enteranumber(endin0):');while(val~=0)sum=sum+val;cnt=cnt+1;val=input('Enteranumber(endin0):');endif(cnt>0)summean=sum/cntend例16從鍵盤輸入若干個數(shù),當(dāng)輸入0時結(jié)束輸入,求這些數(shù)的平均值和它們之和。Enteranumber(endin0):5Enteranumber(endin0):6Enteranumber(endin0):8Enteranumber(endin0):0sum=19mean=6.3333733.循環(huán)的嵌套如果一個循環(huán)結(jié)構(gòu)的循環(huán)體又包括一個循環(huán)結(jié)構(gòu),就稱為循環(huán)的嵌套,或稱為多重循環(huán)結(jié)構(gòu)。例17若一個數(shù)等于它的各個真因子之和,則稱該數(shù)為完數(shù),如6=1+2+3,所以6是完數(shù)。求[1,500]之間的全部完數(shù)。form=1:500s=0;fork=1:m/2ifrem(m,k)==0%rem求m/k的余數(shù)s=s+k;endendifm==sdisp(m);endend62849674例如,利用rand函數(shù)產(chǎn)生10個隨機數(shù),然后利用嵌套for循環(huán)進行從大到小排序。MATLAB程序為x=fix(100*rand(1,10))

;disp(x)n=length(x);fori=1:n?1forj=n:?1:i+1ifx(j)>x(j-1)y=x(j);x(j)=x(j-1);x(j-1)=y;endendenddisp(x)75執(zhí)行后得到排序前和排序后的結(jié)果:

1968305415693786855986856968595437301915

for循環(huán)中可利用break語句來終止for循環(huán),如上例中加上交換標(biāo)志(flag),當(dāng)一次內(nèi)循環(huán)中沒有找到一個單元需要交換時,說明排序工作已經(jīng)結(jié)束,從而可以結(jié)束外循環(huán)。MATLAB程序為x=fix(100*rand(1,10))

;disp(x)n=length(x);76fori=1:n-1flag=-1forj=n:-1:i+1ifx(j)>x(j-1)y=x(j);x(j)=x(j-1);x(j-1)=y;flag=0

;

endendifflag,break,endenddisp(x),disp(['循環(huán)次數(shù)為',num2str(i)])77執(zhí)行后得

7995528817972725877397958887797352272517循環(huán)次數(shù)為6,這說明完成這10個數(shù)的排序只進行

了6次內(nèi)循環(huán)。

78For循環(huán)需要注意事項:For循環(huán)不能用For循環(huán)內(nèi)重新賦值循環(huán)變量n來終止。在For循環(huán)內(nèi)接受任何有效的MATLAB數(shù)組。For循環(huán)可按需要嵌套。當(dāng)有一個等效的數(shù)組方法來解給定的問題時,應(yīng)避免用For循環(huán)。為了得到最大的速度,在For循環(huán)(While循環(huán))被執(zhí)行之前,應(yīng)預(yù)先分配數(shù)組。forn=1:10 x(n)=sin(n*pi/10); n=10; endn=1:10;x=sin(n*pi/10)793.程序流控制(1)break語句和continue語句與循環(huán)結(jié)構(gòu)相關(guān)的語句還有break語句和continue語句。它們一般與if語句配合使用。break語句用于終止循環(huán)的執(zhí)行。當(dāng)在循環(huán)體內(nèi)執(zhí)行到該語句時,程序?qū)⑻鲅h(huán),繼續(xù)執(zhí)行循環(huán)語句的下一語句。continue語句控制跳過循環(huán)體中的某些語句。當(dāng)在循環(huán)體內(nèi)執(zhí)行到該語句時,程序?qū)⑻^循環(huán)體中所有剩下的語句,繼續(xù)下一次循環(huán)。80程序如下:forn=100:200ifrem(n,21)~=0continueendbreakendn%n/21的余數(shù)不等于0則繼續(xù)下一個循環(huán),即for循環(huán):n繼續(xù)加1,直到余數(shù)等于零,跳出continue循環(huán)體例18求[100,200]之間第一個能被21整除的整數(shù)。81(2)程序的暫停

暫停程序的執(zhí)行可以使用pause函數(shù)其調(diào)用格式為:pause(延遲秒數(shù))如果省略延遲時間,直接使用pause,則將暫停程序,直到用戶按任一鍵后程序繼續(xù)執(zhí)行。若要強行中止程序的運行可使用Ctrl+C命令。82用戶參數(shù)交互輸入

在M文件執(zhí)行過程中,可輸入程序所需的參數(shù),這可使程序設(shè)計變得更加靈活。參數(shù)輸入可有三種方式:●利用input函數(shù)輸入?yún)?shù),這時可同時顯示出提示信息。●利用keyboard函數(shù)進入鍵盤主控狀態(tài),直接修改或輸入變量?!窭胢enu函數(shù)制作成交互輸入的菜單,使輸入界面更加友好。另外,pause命令可使MATLAB進入暫停狀態(tài),即進入鍵盤主控狀態(tài),也可以完成輸入操作。

83鍵盤輸入

input函數(shù)是MATLAB中用于輸入?yún)?shù)的常用函數(shù),它可自帶提示信息,例如:

f=input('frequencyis')執(zhí)行時顯示

frequencyis這時可輸入頻率值f。又如,要求輸入方法的選擇:

m=input('methods\n1---linear\n2---bilinear\n3---others\n')84執(zhí)行時顯示:methods1---linear2---bilinear3---others這時可輸入方法選擇(1,2或3)。當(dāng)直接輸入字符串變量時,則應(yīng)在input中指定's'項,如m=input('methods:','s')85執(zhí)行時顯示

methods:這時用戶可直接輸入方法的名稱,如輸入bilinear,這時m為字符串變量“bilinear”。

在輸入時還可以寫成表達式,這時MATLAB先計算出表達式的值,然后賦給輸入變量。例如:a=5;b=4;c=input('Pleaseinputa^2+b')執(zhí)行時輸入a^2+b,則得c=2986鍵盤控制一般情況下,我們可利用debug命令對M函數(shù)文件進行調(diào)試,然而,利用keyboard函數(shù)也可以進行簡單的調(diào)試。

在M文件的適當(dāng)位置加上keyboard命令,MATLAB執(zhí)行該命令時,會將控制權(quán)交給鍵盤,這時用戶可檢查當(dāng)前局部工作空間中變量的內(nèi)容,也可對變量值進行修改,或者直接輸入新的變量(可使用MATLAB的任何命令建立)。利用return命令可退出鍵盤控制狀態(tài),MATLAB繼續(xù)執(zhí)行后續(xù)程序。

87菜單輸入利用menu函數(shù)可顯示出輸入菜單,用戶只需利用鼠標(biāo)點擊菜單中的按鈕,就可以完成輸入操作。當(dāng)然,輸入的值為菜單選項的序號,因此編寫程序時應(yīng)加以變換。例如,要輸入顏色的字符串變量scolor,它可取red、green、blue、yellow和black,則可輸入88s=menu('colorselection','red','green','blue','yellow','black')switchscase1,scolor='red';case2,scolor='green';case3,scolor='blue';case4,scolor='yellow';

case5,scolor='black';otherwisedisp('Error!')endscolor89輸入菜單90執(zhí)行時可顯示出如圖所示的菜單,假設(shè)在菜單中選擇第4個按鈕(yellow),則可得到

scolor= yellow

利用menu函數(shù)可從更多的數(shù)據(jù)中進行輸入,例如輸入

r=rand(2,3);

s=menu('selectioninput',r(1,1),r(1,2),r(1,3),r(2,1),r(2,2),r(2,3))則可從矩陣數(shù)據(jù)中輸入任一參數(shù)。

91三、程序調(diào)試3.1程序調(diào)試概述一般來說,應(yīng)用程序的錯誤有兩類:一類是語法錯誤,語法錯誤包括詞法或文法的錯誤,例如函數(shù)名的拼寫錯、表達式書寫錯等。另一類是運行時的錯誤。指程序的運行結(jié)果有錯誤,這類錯誤也稱為程序邏輯錯誤。923.2利用debugger調(diào)試器Debugger主要用來診斷第二類錯誤。在包含函數(shù)調(diào)用的MATLAB程序運行時,當(dāng)發(fā)生運行錯誤時,不會顯示出錯信息,而在執(zhí)行結(jié)束或出錯時,我們只能看到基本工作空間(即主程序執(zhí)行空間)中的變量,各個函數(shù)工作空間已關(guān)閉,因此無法檢測各個局部變量。為此,應(yīng)采用調(diào)試技術(shù)來查找問題。93為查找運行錯誤,可采用下列技術(shù):

◆在可能發(fā)生錯誤的M文件中,刪去某些語句行末的分號,使顯示其運行中間結(jié)果,從中可發(fā)現(xiàn)一些問題;◆在M文件的適當(dāng)位置上加上keyboard命令,使在執(zhí)行時在此暫停,從而檢查局部工作空間中變量的內(nèi)容,從中找到出錯的線索,利用return命令可恢復(fù)程序的執(zhí)行;◆注釋掉M函數(shù)文件的函數(shù)定義行,使函數(shù)文件轉(zhuǎn)變成命令文件,這樣在程序運行出錯時,可查看M文件產(chǎn)生的中間變量;注意,局部變量之間應(yīng)避免沖突;◆使用MATLAB提供的Debugger,Debugger為我們提供了下列功能:?設(shè)置/清除斷點;?單步執(zhí)行;?繼續(xù)執(zhí)行;94MATLAB的調(diào)試技術(shù)大體要經(jīng)過以下步驟:第一步:分段設(shè)置斷點一開始并不能肯定問題所在,我們總是按照執(zhí)行順序分段執(zhí)行,以期望能夠找到出錯的程序段。為此在程序中設(shè)置斷點,并執(zhí)行程序:第二步:清除斷點第三步:調(diào)試嵌套函數(shù)四、單步執(zhí)行五、修改并重新執(zhí)行找到了問題所在,修改源程序并重新執(zhí)行,如仍有問題,繼續(xù)上述過程進行調(diào)試,直到程序執(zhí)行正確。95設(shè)置斷點取消斷點單步運行進入函數(shù)跳出函數(shù)退出調(diào)試?yán)^續(xù)運行963.3調(diào)試命令除了采用調(diào)試器調(diào)試程序外,MATLAB還提供了一些命令用于程序調(diào)試。命令的功能和調(diào)試器菜單命令類似

dbstop-Setbreakpoint.dbclear-Removebreakpoint.dbcont-Resumeexecution.dbdown-Changelocalworkspacecontext.dbmex-EnableMEX-filedebugging.dbstack-Listwhocalledwhom.dbstatus-Listallbreakpoints.dbstep-Executeoneormorelines.dbtype-ListM-filewithlinenumbers.dbup-Changelocalworkspacecontext.dbquit-Quitdebugmode.97四、程序舉例例21猜數(shù)游戲。首先由計算機產(chǎn)生[1,100]之間的隨機整數(shù),然后由用戶猜測所產(chǎn)生的隨機數(shù)。根據(jù)用戶猜測的情況給出不同提示,如猜測的數(shù)大于產(chǎn)生的數(shù),則顯示“High”,小于則顯示“Low”,等于則顯示“Youwon”,同時退出游戲。用戶最多可以猜7次。98程序如下:%Playthegameofguessthenumberx=fix(100*rand);%arandomnumbercalculatedbythecomputern=7;test=1;fork=1:7numb=int2str(n);disp(['Youhavearightto',numb,'guesses'])disp(['Aguessisanumberbetween0and100'])guess=input('Enteryourguess:');

99ifguess<xdisp('Low')elseifguess>xdisp('High')elsedisp('Youwon')test=0;break;endn=n-1;endiftest==1disp('Youlost')end1001.編

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論