




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第5章循環(huán)結(jié)構(gòu)程序設(shè)計(jì)本章介紹循環(huán)的概念,循環(huán)結(jié)構(gòu)設(shè)計(jì)的基本方法和技術(shù),利用分支和轉(zhuǎn)向語(yǔ)句書(shū)寫(xiě)循環(huán)程序,利用專門的循環(huán)語(yǔ)句書(shū)寫(xiě)循環(huán)程序。5.1循環(huán)結(jié)構(gòu)循環(huán)結(jié)構(gòu)分為無(wú)條件循環(huán)和有條件循環(huán)。無(wú)條件循環(huán)就是無(wú)休止地反復(fù)執(zhí)行一個(gè)程序段,而有條件循環(huán)就是每次執(zhí)行程序段之前需要根據(jù)設(shè)置的條件判斷是否繼續(xù)循環(huán)。5.1.1循環(huán)結(jié)構(gòu)的構(gòu)成例如對(duì)例4.3提出的判斷肥胖問(wèn)題。如果現(xiàn)在要求考察5個(gè)人的體重情況,考慮算法時(shí),不能像寫(xiě)流水賬一樣,輸入第1個(gè)人的身高、體重,判斷第一個(gè)人的體重情況;輸入第2個(gè)人的身高、體重,判斷第二人的體重情況;…;輸入第5個(gè)人的身高、體重,判斷第5個(gè)人的體重情況。這樣的算法顯然是不行的。既然每個(gè)人體重情況的處理過(guò)程都是一樣的,則可以將體重情況的處理過(guò)程描述為:“輸入身高、體重(每次輸入的身高、體重不同!),判斷體重情況并給出提示信息”,可以加一條流線將圖4.7修改得到問(wèn)題要求的流程圖5.1。從圖中可以看出形成了循環(huán)結(jié)構(gòu),被循環(huán)執(zhí)行的部分就是處理一個(gè)人的身高、體重?cái)?shù)據(jù)的操作,稱為循環(huán)體。W0>W1NW0>W1NY|W0-W1|<5NY輸入H,W0開(kāi)始計(jì)算標(biāo)準(zhǔn)體重W1提示“標(biāo)準(zhǔn)”提示“過(guò)胖”提示“過(guò)瘦”圖5.1重復(fù)判斷的流程示意圖為了描述流線表示的操作,F(xiàn)ORTRAN語(yǔ)言提供了GOTO語(yǔ)句,即無(wú)條件轉(zhuǎn)向語(yǔ)句。1)GOTO語(yǔ)句格式:GOTO<標(biāo)號(hào)>功能:轉(zhuǎn)向“標(biāo)號(hào)”所指的語(yǔ)句去執(zhí)行。說(shuō)明:“標(biāo)號(hào)”是合法的1~5位正整數(shù),并且應(yīng)該是本程序單位中某語(yǔ)句的語(yǔ)句標(biāo)號(hào)。根據(jù)流程圖5.1,可以寫(xiě)出對(duì)應(yīng)程序如下: REALH,W05READ*,H,W0 W1=H-110 IF(ABS(W0-W1).LE.5)THEN PRINT*,'標(biāo)準(zhǔn)!' ELSEIF(W0.GT.W1)THEN PRINT*,'過(guò)胖!' ELSE PRINT*,'過(guò)瘦!' ENDIFGOTO5 END由于在END語(yǔ)句前增加了一條GOTO語(yǔ)句,在READ語(yǔ)句和GOTO語(yǔ)句之間就形成了一個(gè)循環(huán)過(guò)程。執(zhí)行該程序時(shí),用戶每次輸入一組H和W0值,程序就給出體重情況的提示。但是該循環(huán)結(jié)構(gòu)是無(wú)條件循環(huán)結(jié)構(gòu),因此程序成為一個(gè)無(wú)條件循環(huán)程序,執(zhí)行時(shí)將進(jìn)入“死循環(huán)”。從流程圖中也可以看出沒(méi)有“結(jié)束”框,程序中的END語(yǔ)句永遠(yuǎn)都不會(huì)被執(zhí)行。無(wú)條件循環(huán)實(shí)際是一個(gè)不正確的循環(huán)結(jié)構(gòu),因?yàn)橛?jì)算機(jī)執(zhí)行這樣的程序會(huì)出現(xiàn)“死循環(huán)”現(xiàn)象,程序永遠(yuǎn)不會(huì)結(jié)束,計(jì)算機(jī)永遠(yuǎn)不會(huì)停機(jī)(除非用戶強(qiáng)制性地終止程序執(zhí)行!)。解決程序“死循環(huán)”的辦法就是采用“條件循環(huán)”,即根據(jù)問(wèn)題提供的條件為循環(huán)結(jié)構(gòu)人為“設(shè)置出口”,當(dāng)問(wèn)題得到解答后程序自動(dòng)結(jié)束,退出程序執(zhí)行狀態(tài),返回操作系統(tǒng)。因此,當(dāng)用戶設(shè)計(jì)循環(huán)結(jié)構(gòu)時(shí),必須考慮三個(gè)要素:(1)初始化。為進(jìn)入循環(huán)結(jié)構(gòu)作好準(zhǔn)備,對(duì)變量賦初值。(2)設(shè)計(jì)循環(huán)體。常用的方法是遞推、迭代、窮舉。(3)設(shè)置循環(huán)出口。采用“計(jì)數(shù)”或“設(shè)置條件”等方法。2)為循環(huán)結(jié)構(gòu)設(shè)置出口采用的兩種方法(1)用“計(jì)數(shù)”方法設(shè)置循環(huán)出口如果問(wèn)題中已經(jīng)提供了“循環(huán)體”將要循環(huán)的次數(shù)N,則可以使用“計(jì)數(shù)”的方式為循環(huán)結(jié)構(gòu)設(shè)置出口,具體方法如下:任意設(shè)置一個(gè)變量I(當(dāng)然也可以是其它變量)作為計(jì)數(shù)器,I的初值設(shè)為0,每執(zhí)行一次“循環(huán)體”,計(jì)數(shù)器就計(jì)數(shù)一次(I=I+1),然后判斷I的值是否已經(jīng)達(dá)到N(是否已經(jīng)計(jì)滿?),如果沒(méi)有計(jì)滿則返回“循環(huán)體”繼續(xù)執(zhí)行,否則不再返回“循環(huán)體”,直接跳出循環(huán)結(jié)構(gòu)。計(jì)數(shù)器的值逐步遞增稱為“正向計(jì)數(shù)”,如果將I的初值設(shè)為N,然后I的值逐步遞減,直到I的值變?yōu)?,則稱為“反向計(jì)數(shù)”。對(duì)本節(jié)開(kāi)始的“判斷肥胖問(wèn)題”,要求考察5個(gè)人的體重情況,則可以用計(jì)數(shù)方式為循環(huán)結(jié)構(gòu)設(shè)置出口,避免出現(xiàn)“死循環(huán)”。設(shè)計(jì)數(shù)器I=0,畫(huà)出流程圖如圖5.2和5.3所示的判斷過(guò)程。圖5.2和圖5.3都能自動(dòng)地控制5次要求輸入5個(gè)人的身高H、體重W0,正確判斷體重情況。(2)用“條件”設(shè)置循環(huán)出口有的問(wèn)題不能提供循環(huán)體執(zhí)行的次數(shù),程序設(shè)計(jì)者可以針對(duì)問(wèn)題的特點(diǎn)人為設(shè)置“條件”,約定其作為跳出循環(huán)結(jié)構(gòu)的信號(hào)。假如上述問(wèn)題要求是“判斷一批人的肥胖情況”。問(wèn)題中既沒(méi)有說(shuō)明這一批人的具體人數(shù),也沒(méi)有提供其它“條件”,采用什么方法為循環(huán)結(jié)構(gòu)設(shè)置出口呢?結(jié)束W0>W1NY|W0-W1|<5N結(jié)束W0>W1NY|W0-W1|<5NY輸入H,W0開(kāi)始計(jì)算標(biāo)準(zhǔn)體重W1提示“標(biāo)準(zhǔn)”提示“過(guò)胖”提示“過(guò)瘦”I=0I=I+1I<5NY結(jié)束結(jié)束W0>W1NY|W0-W1|<5NY輸入H,W0開(kāi)始計(jì)算標(biāo)準(zhǔn)體重W1提示“標(biāo)準(zhǔn)”提示“過(guò)胖”提示“過(guò)瘦”I=0I=I+1I<5NY圖5.3用“反向計(jì)數(shù)”控制循環(huán)的流程圖可以與用戶約定用某個(gè)特定的輸入數(shù)據(jù)作為“結(jié)束標(biāo)志”,即計(jì)算機(jī)如果得到了某個(gè)特定的數(shù)據(jù)就跳出循環(huán)結(jié)構(gòu)。由于人的身高H、體重W0都不可能為“負(fù)數(shù)”,所以可以選擇用“負(fù)數(shù)”作為特定的“結(jié)束標(biāo)志”。求解該問(wèn)題的流程圖如圖5.4所示。結(jié)束結(jié)束W0>W1NY|W0-W1|<5NY輸入H,W0開(kāi)始計(jì)算標(biāo)準(zhǔn)體重W1提示“標(biāo)準(zhǔn)”提示“過(guò)胖”提示“過(guò)瘦”H>0,W>0NY圖5.4用“條件”控制循環(huán)的流程圖用戶必須遵照約定的條件,當(dāng)把“一批人的體重情況”都判斷完后,最后必須輸入一組“負(fù)數(shù)”,讓機(jī)器跳出循環(huán)結(jié)構(gòu)。采用這種辦法設(shè)置循環(huán)結(jié)構(gòu)的出口,要求“結(jié)束標(biāo)志”必須“遠(yuǎn)離”問(wèn)題涉及的有效數(shù)據(jù),即不能與問(wèn)題中涉及的有效數(shù)據(jù)混淆。因?yàn)?,如果將“結(jié)束標(biāo)志”約定為問(wèn)題中可能出現(xiàn)的有效數(shù)據(jù),則當(dāng)該數(shù)據(jù)出現(xiàn)時(shí),機(jī)器已經(jīng)將其作為結(jié)束標(biāo)志結(jié)束循環(huán)了,導(dǎo)致程序結(jié)果不正確。3)構(gòu)造循環(huán)體設(shè)計(jì)循環(huán)結(jié)構(gòu)時(shí)首先要考慮怎樣構(gòu)成循環(huán)體,本節(jié)提出的例子中循環(huán)體的工作很簡(jiǎn)單,就是“輸入數(shù)據(jù),處理數(shù)據(jù)”,不需要作特別的技術(shù)處理,但在解決很多實(shí)際問(wèn)題時(shí)構(gòu)造循環(huán)體的工作并不容易,需要將一個(gè)復(fù)雜的過(guò)程進(jìn)行細(xì)化,提煉出最基本的操作用遞推、迭代、窮舉等方法進(jìn)行處理。(1)用“遞推”的方法構(gòu)造循環(huán)體采用“遞推”的方法時(shí),要求提供“初始條件”,根據(jù)“遞推關(guān)系(公式)”,由前面的結(jié)果得到后面的結(jié)果?!纠?.1】已知一個(gè)數(shù)列的第1、2項(xiàng)為1,從第3項(xiàng)開(kāi)始,以后各項(xiàng)的值都為其前兩項(xiàng)的和。產(chǎn)生該數(shù)列的前20項(xiàng),或者當(dāng)某項(xiàng)的值超過(guò)105為止。分析:根據(jù)已知的第1、2項(xiàng),依次得到后續(xù)各項(xiàng),可以采用“遞推”的方法構(gòu)造循環(huán)體。如果設(shè)第1、2項(xiàng)為A,B,則第3項(xiàng)C=A+B;然后將B的值傳給A(A←B),C的值傳給B(B←C),新的第1、2項(xiàng)又準(zhǔn)備好了,即可以得到新的第3項(xiàng)C=A+B;……;一直到產(chǎn)生所有的數(shù)列項(xiàng)。根據(jù)上述思想,可以得到用“計(jì)數(shù)”方式控制循環(huán)出口的流程圖,見(jiàn)圖5.5。因?yàn)橐呀?jīng)產(chǎn)生并輸出了第一和第二項(xiàng),故I的初值設(shè)為2,只要I的值不等于20,就說(shuō)明還沒(méi)有完成20項(xiàng)。圖5.6是用“條件”設(shè)置循環(huán)出口的流程圖。利用問(wèn)題中的“當(dāng)某項(xiàng)的值超過(guò)105為止”作為循環(huán)出口的條件。I<20I<20NY輸出A,B開(kāi)始A=1,B=1,I=2輸出C結(jié)束C=A+BB→A,C→B,I=I+1圖5.5用“計(jì)數(shù)”方式控制循環(huán)出口CC≤100000NY輸出A,B開(kāi)始A=1,B=1,C=A+B輸出C結(jié)束B(niǎo)→A,C→B,C=A+B圖5.6用“條件”方式控制循環(huán)出口(2)用“窮舉”的方法構(gòu)造循環(huán)體有些問(wèn)題中,循環(huán)體的構(gòu)造找不出遞推關(guān)系,不能用遞推方法實(shí)現(xiàn),往往需要配合循環(huán)控制過(guò)程,對(duì)所有可能的情況一一列出進(jìn)行分析、判斷。這種將對(duì)象一一列出的方法叫“窮舉”?!纠?.2】任意輸入兩個(gè)正整數(shù)M,N,求它們的最大公約數(shù)。分析:根據(jù)數(shù)學(xué)知識(shí),兩個(gè)數(shù)的最大公約數(shù)即它們的共同約數(shù)中最大的那個(gè)數(shù)。極端的情況是M、N中較小者就是最大公約數(shù)??梢杂?、2、3……K(M,N中較小者)依次去考察是否它們的公約數(shù),找到一個(gè)就保留一個(gè),最后保留的公約數(shù)就是最大公約數(shù)。流程圖如圖5.7所示。流程圖中窮舉的1、2、3…..K,一方面在循環(huán)體中充當(dāng)被考察的對(duì)象,另一方面又用K作為設(shè)置循環(huán)出口的計(jì)數(shù)終值。I≤I≤KNY輸出A,B開(kāi)始K=MIN(M,N),I=1輸出FCH結(jié)束I=I+1I是M,N的公約數(shù)NYFCH=I圖5.7“窮舉法”求最大公約數(shù)的算法流程圖4)初始化有些工作必須在進(jìn)入循環(huán)結(jié)構(gòu)之前作好,以便循環(huán)結(jié)構(gòu)正常循環(huán)起來(lái),比如計(jì)數(shù)器清0,累加器清0等,這些工作稱為初始化。到底初始化需要做些什么工作要視具體問(wèn)題而定。5.1.2循環(huán)結(jié)構(gòu)的兩種類型1)當(dāng)型循環(huán)從語(yǔ)句書(shū)寫(xiě)順序看,循環(huán)結(jié)構(gòu)中設(shè)置的循環(huán)出口是在循環(huán)體之前的話,實(shí)際表示的控制關(guān)系是:當(dāng)“條件成立時(shí)執(zhí)行循環(huán)體”。故稱為當(dāng)型循環(huán)。如圖5.3、圖5.4、圖5.5、圖5.6、圖5.7構(gòu)成的循環(huán)結(jié)構(gòu)都是當(dāng)型循環(huán)結(jié)構(gòu)。“當(dāng)型”循環(huán)結(jié)構(gòu)都可以概括為如圖1.7(a)所示的控制關(guān)系。2)直到型循環(huán)從語(yǔ)句書(shū)寫(xiě)順序看,循環(huán)結(jié)構(gòu)中設(shè)置的循環(huán)出口是在循環(huán)體之后的話,實(shí)際表示的控制關(guān)系是:執(zhí)行循環(huán)體,直到“條件不成立時(shí)結(jié)束循環(huán)”。故稱為直到型循環(huán)。圖5.2構(gòu)成的循環(huán)結(jié)構(gòu)就是“直到型”循環(huán)?!爸钡叫汀毖h(huán)結(jié)構(gòu)都可以概括為圖1.7(b)所示的控制關(guān)系。通過(guò)上面介紹的例子,讀者對(duì)循環(huán)結(jié)構(gòu)設(shè)計(jì)方法有了初步認(rèn)識(shí),知道了設(shè)計(jì)循環(huán)結(jié)構(gòu)應(yīng)該關(guān)注的幾個(gè)問(wèn)題。對(duì)于同樣的問(wèn)題,其解決的方法和控制過(guò)程不是唯一的。在構(gòu)造循環(huán)結(jié)構(gòu)時(shí),到底設(shè)計(jì)成“當(dāng)型”或“直到型”,并不作強(qiáng)行要求??梢愿鶕?jù)問(wèn)題的特點(diǎn)和程序設(shè)計(jì)者的喜好來(lái)決定,有些問(wèn)題既可以設(shè)計(jì)成“當(dāng)型”也可以設(shè)計(jì)成“直到型”。5.2用GOTO語(yǔ)句設(shè)計(jì)的循環(huán)程序通過(guò)對(duì)問(wèn)題的分析,提出構(gòu)造循環(huán)體的辦法和控制循環(huán)過(guò)程的方式,可以畫(huà)出求解問(wèn)題的流程圖,為了將流程圖轉(zhuǎn)換成計(jì)算機(jī)能執(zhí)行的程序,可以利用FORTRAN語(yǔ)言提供的相應(yīng)功能的語(yǔ)句得到FORTRAN語(yǔ)言的源程序。5.2.1塊IF與GOTO語(yǔ)句實(shí)現(xiàn)的循環(huán)用塊IF結(jié)構(gòu)與GOTO語(yǔ)句配合實(shí)現(xiàn)循環(huán)結(jié)構(gòu),一般是針對(duì)當(dāng)型循環(huán),其基本形式為:S1IF(邏輯表達(dá)式)THEN循環(huán)體GOTOS1ENDIF根據(jù)第四章介紹的塊IF結(jié)構(gòu)的功能,以及本章開(kāi)始介紹的GOTO語(yǔ)句的功能,可以將圖5.3、圖5.4、圖5.5、圖5.6、圖5.7構(gòu)成的循環(huán)結(jié)構(gòu)翻譯成FORTRAN語(yǔ)言的源程序。圖5.3對(duì)應(yīng)的FORTRAN語(yǔ)言源程序:PROGRAMMAINI=05IF(I.LT.5)THENREAD*,H,W0W1=110-W0IF(ABS(W0-W1).LE.5)THENPRINT*,‘標(biāo)準(zhǔn)’ELSEIF(W0.GT.W1)THENPRINT*,‘過(guò)胖’ELSEPRINT*,‘過(guò)瘦’ENDIFI=I+1GOTO5ENDIFEND圖5.4對(duì)應(yīng)的FORTRAN語(yǔ)言源程序:PROGRAMMAINREAD*,H,W05IF(H.GT.0.AND.W0.GT.0)THENW1=110-W0IF(ABS(W0-W1).LE.5)THENPRINT*,‘標(biāo)準(zhǔn)’ELSEIF(W0.GT.W1)THENPRINT*,‘過(guò)胖’ELSEPRINT*,‘過(guò)瘦’ENDIFREAD*,H,W0GOTO5ENDIFEND圖5.5對(duì)應(yīng)的FORTRAN語(yǔ)言源程序:PROGRAMMAINDATAA,B/2*1.0/PRINT*,A,BI=25IF(I.LT.20)THENC=A+BPRINT*,CA=BB=CI=I+1GOTO5ENDIFEND圖5.6對(duì)應(yīng)的FORTRAN語(yǔ)言源程序:PROGRAMMAINDATAA,B/2*1.0/PRINT*,A,BC=A+B5IF(C.LE.1E5)THENPRINT*,CA=BB=CC=A+BGOTO5ENDIFEND圖5.7對(duì)應(yīng)的FORTRAN語(yǔ)言源程序:PROGRAMMAININTEGERFCHREAD*,M,NK=MIN(M,N)I=15IF(I.LE.K)THENIF(MOD(M,I).EQ.0.AND.MOD(N,I).EQ.O)FCH=II=I+1GOTO5ENDIFWRITE(*,100)M,‘和’,N,‘的最大公約數(shù)是:’,F(xiàn)CH100FORMAT(1X,I4,A,I4,A,I4)END5.2.2邏輯IF語(yǔ)句與GOTO語(yǔ)句設(shè)計(jì)的循環(huán)程序用邏輯IF語(yǔ)句與GOTO語(yǔ)句實(shí)現(xiàn)循環(huán)一般是針對(duì)“直到型”循環(huán),一般格式是:S1循環(huán)體IF(邏輯表達(dá)式)GOTOS1根據(jù)邏輯IF語(yǔ)句的功能,配合GOTO語(yǔ)句可以寫(xiě)出圖5.2對(duì)應(yīng)流程圖的FORTRAN語(yǔ)言源程序。PROGRAMMAINI=05READ*,H,W0W1=110-W0IF(ABS(W0-W1).LE.5)THENPRINT*,‘標(biāo)準(zhǔn)’ELSEIF(W0.GT.W1)THENPRINT*,‘過(guò)胖’ELSEPRINT*,‘過(guò)瘦’ENDIFI=I+1IF(I.LT.5)GOTO5END5.3用循環(huán)語(yǔ)句書(shū)寫(xiě)循環(huán)程序FORTRAN語(yǔ)言還提供了專門的循環(huán)語(yǔ)句,將循環(huán)過(guò)程的“判斷”、“計(jì)數(shù)”、“轉(zhuǎn)向”等固定動(dòng)作包含在循環(huán)語(yǔ)句中,因此,利用循環(huán)語(yǔ)句可以更方便、快捷地描述循環(huán)結(jié)構(gòu),使程序更加清楚、簡(jiǎn)練。5.3.1DO-WHILE循環(huán)對(duì)當(dāng)型循環(huán)可以很方便地使用FORTRAN語(yǔ)言提供的DO-WHILE語(yǔ)句實(shí)現(xiàn)。1)語(yǔ)句格式DO標(biāo)號(hào)[,]WHILE(邏輯表達(dá)式)循環(huán)體標(biāo)號(hào)終端語(yǔ)句或者:DOWHILE(邏輯表達(dá)式)循環(huán)體ENDDO2)語(yǔ)句功能(1)計(jì)算〈邏輯表達(dá)式〉的值;(2)如果結(jié)果為“真”則執(zhí)行“循環(huán)體”直到遇到終端語(yǔ)句,返回①;(3)如果結(jié)果為“假”則跳出循環(huán)結(jié)構(gòu),執(zhí)行終端語(yǔ)句的后續(xù)語(yǔ)句。DO-WHILE語(yǔ)句的功能完全可以用圖1.7(a)表示。這種循環(huán)結(jié)構(gòu)只表述了“當(dāng)條件成立執(zhí)行循環(huán)體”的“當(dāng)型”循環(huán)結(jié)構(gòu),既可以用于用“條件”設(shè)置出口的循環(huán),也可以用于用“計(jì)數(shù)方式”設(shè)置出口的循環(huán)。如果用“計(jì)數(shù)方式”設(shè)置出口不要忘了需要設(shè)置計(jì)數(shù)器。3)說(shuō)明(1)DO-WHILE語(yǔ)句表述的循環(huán)結(jié)構(gòu)中沒(méi)有專門的轉(zhuǎn)向語(yǔ)句,轉(zhuǎn)向的功能是隱含在終端語(yǔ)句中的,因此,終端語(yǔ)句除了完成本身的功能外,還向計(jì)算機(jī)提示循環(huán)體結(jié)束,并使控制自動(dòng)轉(zhuǎn)向DO-WHILE語(yǔ)句。(2)由DO-WHILE語(yǔ)句構(gòu)成的“當(dāng)型”循環(huán)結(jié)構(gòu)程序中,DO-WHILE語(yǔ)句執(zhí)行的次數(shù)不止一次。(3)原則上終端語(yǔ)句可以是一般的執(zhí)行語(yǔ)句,如打印語(yǔ)句、賦值語(yǔ)句、輸入語(yǔ)句等,但是受其特性的限制,下列語(yǔ)句不能作終端語(yǔ)句:GOTO、塊IF、ELSE、ELSEIF、ENDIF、END、STOP、RETURN和所有的非執(zhí)行語(yǔ)句。另外,如果邏輯IF語(yǔ)句(行IF語(yǔ)句)作為終端語(yǔ)句時(shí),它不應(yīng)該包括DO、塊IF、ELSEIF、ELSE、ENDIF、END和另一個(gè)邏輯IF語(yǔ)句。下面的語(yǔ)句段是不正確的:DO10WHILE(I.LE.20)K=I*IPRINT*,I,K10IF(K.GT.100)GOTO5總之,循環(huán)終端語(yǔ)句的功能應(yīng)該是明確的,不能是不定的。為了使循環(huán)體的起止范圍清晰,使終端語(yǔ)句與一般的執(zhí)行語(yǔ)句有所區(qū)別,可以使用FORTRAN語(yǔ)句提供的繼續(xù)語(yǔ)句作為循環(huán)體的終端語(yǔ)句。繼續(xù)語(yǔ)句的一般格式為:CONTINUE它的功能就是執(zhí)行一個(gè)空操作,因此CONTINUE又稱為空語(yǔ)句。用CONTINUE語(yǔ)句作循環(huán)體的終端語(yǔ)句有下列優(yōu)點(diǎn):①使循環(huán)體的范圍清晰,終端語(yǔ)句規(guī)范化,凡是DO-WHILE語(yǔ)句構(gòu)成的循環(huán)結(jié)構(gòu)都用CONTINUE結(jié)束,容易識(shí)別。②不再使用一般的執(zhí)行語(yǔ)句作循環(huán)終端語(yǔ)句,避免出現(xiàn)不符合語(yǔ)法要求的錯(cuò)誤。③用戶不用再去記憶那些語(yǔ)句可以作終端語(yǔ)句,那些語(yǔ)句又不能作終端語(yǔ)句,減輕用戶負(fù)擔(dān)。例如:DO10WHILE(I.LE.20)K=I*IPRINT*,I,KI=1+110CONTINUE程序結(jié)構(gòu)非常清晰,在DO-WHILE和CONTINUE之間就是循環(huán)體?;蛘邔?xiě)成:DOWHILE(I.LE.20)K=I*IPRINT*,I,KI=1+1ENDDO4)DO-WHILE語(yǔ)句應(yīng)用如圖5.3、圖5.4、圖5.5、圖5.6、圖5.7所示的當(dāng)型循環(huán)結(jié)構(gòu),如果用DO-WHILE語(yǔ)句書(shū)寫(xiě),程序會(huì)更簡(jiǎn)便,清楚。圖5.3對(duì)應(yīng)的FORTRAN語(yǔ)言程序:PROGRAMMAINI=0DO10WHILE(I.LT.5)READ*,H,W0W1=110-W0IF(ABS(W0-W1).LE.5)THENPRINT*,‘標(biāo)準(zhǔn)’ELSEIF(W0.GT.W1)THENPRINT*,‘過(guò)胖’ELSEPRINT*,‘過(guò)瘦’ENDIFI=I+110CONTINUEEND可以看出,流程圖中對(duì)應(yīng)的“轉(zhuǎn)向”工作,用DO-WHILE語(yǔ)句書(shū)寫(xiě)時(shí)就不需要專門用GOTO語(yǔ)句了,因?yàn)镈O-WHILE語(yǔ)句本身表示了循環(huán)的關(guān)系,即自動(dòng)包含了“轉(zhuǎn)向”的工作。圖5.4對(duì)應(yīng)的FORTRAN語(yǔ)言源程序:PROGRAMMAINREAD*,H,W0DO10WHILE(H.GT.0.AND.W0.GT.0)W1=110-W0IF(ABS(W0-W1).LE.5)THENPRINT*,‘標(biāo)準(zhǔn)’ELSEIF(W0.GT.W1)THENPRINT*,‘過(guò)胖’ELSEPRINT*,‘過(guò)瘦’ENDIFREAD*,H,W010CONTINUEEND圖5.5對(duì)應(yīng)的FORTRAN語(yǔ)言源程序:PROGRAMMAINDATAA,B/2*1.0/PRINT*,A,BI=2DO10WHILE(I.LT.20)C=A+BPRINT*,CA=BB=CI=I+110CONTINUEEND圖5.6對(duì)應(yīng)的FORTRAN語(yǔ)言源程序:PROGRAMMAINDATAA,B/2*1.0/PRINT*,A,BC=A+BDO10WHILE(C.LE.1E5)PRINT*,CA=BB=CC=A+B10CONTINUEEND圖5.7對(duì)應(yīng)的FORTRAN語(yǔ)言源程序:PROGRAMMAININTEGERFCHREAD*,M,NK=MIN(M,N)I=1DO10WHILE(I.LE.K)IF(MOD(M,I).EQ.0.AND.MOD(N,I).EQ.O)FCH=II=I+110CONTINUEWRITE(*,100)M,‘和’,N,‘的最大公約數(shù)是:’,F(xiàn)CH100FORMAT(1X,I4,A,I4,A,I4)END DO-WHILE語(yǔ)句可以描述所有“當(dāng)型”的循環(huán)結(jié)構(gòu)程序,特別對(duì)用“條件”設(shè)置循環(huán)出口的“當(dāng)型”循環(huán),可以直接套用DO-WHILE語(yǔ)句。對(duì)于采用“計(jì)數(shù)”方式設(shè)置循環(huán)出口的“當(dāng)型”循環(huán),計(jì)數(shù)器的“計(jì)數(shù)一次”操作則應(yīng)該屬于循環(huán)體的一個(gè)動(dòng)作(如圖5.3、圖5.5、圖5.7對(duì)應(yīng)的程序中的I=I+1),千萬(wàn)不能漏掉。其實(shí),對(duì)于采用“計(jì)數(shù)”方式設(shè)置循環(huán)出口的“當(dāng)型”循環(huán)結(jié)構(gòu),F(xiàn)ORTRAN語(yǔ)言還專門提供了一個(gè)循環(huán)語(yǔ)句來(lái)對(duì)應(yīng)描述,這就是下面介紹的DO循環(huán)結(jié)構(gòu)語(yǔ)句。5.3.2DO循環(huán)結(jié)構(gòu)1)DO語(yǔ)句格式DO循環(huán)由一個(gè)DO語(yǔ)句和循環(huán)體組成,其一般形式為:DOs[,]v=e1,e2[,e3]S:表示循環(huán)終端語(yǔ)句標(biāo)號(hào),s是statement的縮寫(xiě)。v:表示循環(huán)變量,可以是任何合法的變量名,v是variable的縮寫(xiě)。e1,e2,e2:分別表示循環(huán)初值表達(dá)式、循環(huán)終值表達(dá)式、循環(huán)步長(zhǎng)值表達(dá)式,e是expression的縮寫(xiě)。方括號(hào)“[]”中的內(nèi)容為可選項(xiàng)。下面形式的DO語(yǔ)句都是合法的形式:DO20,I=1,20,2DO10,N=1,5DO100X=1.2,3.5,1.0DO200T=1.5*2,100.0/2.0,2.0DO5M=100,0,-2DO循環(huán)語(yǔ)句也可以寫(xiě)成下面形式,但必須與ENDDO配對(duì)使用:DOv=e1,e2[,e3]循環(huán)體ENDDO2)DO語(yǔ)句功能DO語(yǔ)句描述的是用“計(jì)數(shù)”方式設(shè)置出口的“當(dāng)型”循環(huán)結(jié)構(gòu),執(zhí)行過(guò)程包含下面的步驟:(1)計(jì)算e1,e2,e3各表達(dá)式的值,并將它們轉(zhuǎn)換成循環(huán)控制變量的類型。(2)將初值e1賦給循環(huán)變量,即相當(dāng)于執(zhí)行一個(gè)賦值語(yǔ)句:v=e1。(3)計(jì)算應(yīng)該執(zhí)行的次數(shù)r=INT((e2-e1+e3)/e3)。(4)檢查循環(huán)次數(shù),若r=0(或r〈0),則跳出循環(huán)體,執(zhí)行循環(huán)終端語(yǔ)句下面的一個(gè)執(zhí)行語(yǔ)句。如果r>0,則執(zhí)行循環(huán)體。(5)執(zhí)行循環(huán)終端語(yǔ)句時(shí),循環(huán)變量v增加步長(zhǎng)值,即執(zhí)行v=v+e3。(6)循環(huán)次數(shù)r減1,即執(zhí)行r=r-1,得到還要循環(huán)的次數(shù)。(7)返回(4),重復(fù)執(zhí)行(4)、(5)、(6)、(7)。DO語(yǔ)句的功能也可以用圖5.8和圖5.9所示的流程圖直觀地描述出來(lái),它們的作用是相同的。圖5.8DO循環(huán)的執(zhí)行過(guò)程(1)r>0圖5.8DO循環(huán)的執(zhí)行過(guò)程(1)r>0NYe1→vr-1→r計(jì)算循環(huán)次數(shù)r計(jì)算e1,e2,e3執(zhí)行循環(huán)體v+e3→v執(zhí)行循環(huán)終端語(yǔ)句后的語(yǔ)句圖5.9DO循環(huán)的執(zhí)行過(guò)程(2)v≤e2NYe1→vv+e3→v計(jì)算e1,e2,e3執(zhí)行循環(huán)體執(zhí)行循環(huán)終端語(yǔ)句后的語(yǔ)句INTEGERFCHREAD*,M,NK=MIN(M,N)DO10I=1,K,1IF(MOD(M,I).EQ.0.AND.MOD(N,I).EQ.0)FCH=I10CONTINUEWRITE(*,100)M,‘和’,N,‘的最大公約數(shù)是:’,F(xiàn)CH100FORMAT(1X,I4,A,I4,A,I4)END由于I=1,判斷I.LE.K,I=I+1這幾個(gè)操作都自動(dòng)地包含在DO循環(huán)結(jié)構(gòu)語(yǔ)句中了,與前面的程序相比,用DO循環(huán)結(jié)構(gòu)語(yǔ)句書(shū)寫(xiě)的程序更加精練、清晰。應(yīng)當(dāng)特別指出的是:循環(huán)體不包括DO循環(huán)語(yǔ)句,DO循環(huán)語(yǔ)句在循環(huán)結(jié)構(gòu)中只執(zhí)行一次,不是r次。3)關(guān)于DO語(yǔ)句的說(shuō)明(1)在DO語(yǔ)句的一般形式中,表達(dá)式e3(即步長(zhǎng)表達(dá)式)是可選項(xiàng),如果不寫(xiě)e3,則表示e3的值默認(rèn)為1,即循環(huán)變量的遞增量(步長(zhǎng)值)為1。例如下面兩個(gè)語(yǔ)句的意義相同,DO10I=1,50,1DO10I=1,50(2)循環(huán)變量初值、終值和步長(zhǎng)值e1,e2,e3可以分別是常量、變量或表達(dá)式。如果是變量則它應(yīng)該已經(jīng)獲得值,如果是表達(dá)式,則先計(jì)算出表達(dá)式的值,總之,e1,e2,e3最終應(yīng)該是一個(gè)確定的數(shù)值。例如:DO200T=1.5*2,100.0/2.0,2.0相當(dāng)于下面的語(yǔ)句:DO200T=3.0,50.0,2.0(3)循環(huán)體執(zhí)行的次數(shù)可以從e1,e2,e3計(jì)算出來(lái),計(jì)算公式如下:r=INT((e2-e1+e3)/e3)例如:DO20,I=1,20,1的循環(huán)次數(shù)是r=INT((20-1+1)/1)=20次。DO20,T=1,20,2的循環(huán)次數(shù)是r=INT((20-1+2)/2)=10次。DO語(yǔ)句書(shū)寫(xiě)以后,機(jī)器編譯時(shí)就決定了r,所以,如果想在循環(huán)體中改變循環(huán)變量的值(比如賦值)來(lái)改變循環(huán)的次數(shù)是不行的,換句話說(shuō),在循環(huán)體中改變循環(huán)變量的值將會(huì)出錯(cuò)。(4)e3不能為0,因?yàn)樵谇笱h(huán)次數(shù)時(shí)r時(shí),e3為分母項(xiàng),r會(huì)趨于無(wú)窮大。直觀地說(shuō),循環(huán)變量本應(yīng)該從其初值e1為起點(diǎn),每次以e3的值為增量變化,直到超過(guò)e2的值為止。如果e3的值為0,則循環(huán)控制變量的值永遠(yuǎn)不會(huì)變化,也就永遠(yuǎn)不能超過(guò)終值e3,循環(huán)也就會(huì)無(wú)休止地進(jìn)行,出現(xiàn)死循環(huán)。(5)e1,e2,e3的值可以為正數(shù)、負(fù)數(shù),e1,e2的值還可以為零。(6)當(dāng)e3>0時(shí),循環(huán)變量v的值沿著正方向(遞增)變化,結(jié)束循環(huán)的條件是v>e2。當(dāng)e3<0時(shí),循環(huán)變量v的值沿著負(fù)方向(遞減)變化,結(jié)束循環(huán)的條件是v<e2。(7)如果計(jì)算出循環(huán)次數(shù)r<0時(shí),則按r=0處理,即一次也不執(zhí)行循環(huán)體。例如:DO10I=20,0,2計(jì)算循環(huán)次數(shù)r=INT((0-20+2)/2)=-9,即一次也不執(zhí)行循環(huán)體。直觀地看,由于步長(zhǎng)為2,結(jié)束循環(huán)的條件為I>0,事實(shí)上I=20(初值)時(shí)就大于終值0了,因此一次也不執(zhí)行循環(huán)體。同理:DO10I=1,10,-1也是一次也不執(zhí)行循環(huán)體。因?yàn)檠h(huán)控制變量I的值為1(初值)時(shí),已經(jīng)小于終值10了。(8)循環(huán)變量v和循環(huán)初值e1,終值e2、步長(zhǎng)e3可以是整型、實(shí)型或雙精度型。如果循環(huán)變量的類型和e1,e2,e3的類型不一致,要求按賦值的規(guī)則處理,即先將e1,e2,e3的類型化成循環(huán)變量的類型,然后再進(jìn)行處理。例如:DO10I=1.5,3.6,1.2不要根據(jù)r=INT((3.6-1.5+1.2)/1.2)=2而認(rèn)為循環(huán)次數(shù)為2,而應(yīng)當(dāng)先將實(shí)型量轉(zhuǎn)化為整型量,即變成下面形式DO語(yǔ)句:DO10I=1,3,1再計(jì)算循環(huán)次數(shù)r=INT((3-1+1)/1=3,即DO10I=1.5,3.6,1.2語(yǔ)句確定的循環(huán)次數(shù)為3次,而不是2次。但是如果將I換成實(shí)型變量X,則語(yǔ)句DO10X=1.5,3.6,1.2確定的循環(huán)次數(shù)就是2次,而不是3次。特別提請(qǐng)注意的是:為避免錯(cuò)誤,應(yīng)盡量使循環(huán)控制變量類型與初值、終值和步長(zhǎng)值的類型一致。由于實(shí)型數(shù)在運(yùn)算和存儲(chǔ)時(shí)有誤差,當(dāng)用實(shí)型變量作循環(huán)控制變量時(shí),循環(huán)次數(shù)的理論值與實(shí)際值之間將會(huì)出現(xiàn)一些誤差,例如有循環(huán)程序段:DO10X=0.0,50.0,0.110PRINT*,X按公式計(jì)算r=INT((50.0-0.0+0.1)/0.1)=501,故應(yīng)該循環(huán)501次,但實(shí)際上在許多計(jì)算機(jī)上它只能循環(huán)500次。原因是X從初值0.0開(kāi)始每次增量0.1,但0.1在內(nèi)存中的存儲(chǔ)是有誤差的(無(wú)法用一個(gè)有限的二進(jìn)制數(shù)準(zhǔn)確地表示十進(jìn)制數(shù)0.1),因此每次增加的值不是0.1而是與0.1相接近的一個(gè)數(shù),每次的誤差積累,在執(zhí)行完500次循環(huán)后,理論上X的值為50.0,由于未超過(guò)終值,所以應(yīng)再執(zhí)行一次循環(huán)體,共501次。但在實(shí)際上,由于上述誤差累積,到執(zhí)行完500次循環(huán)后,X的值可能已經(jīng)超過(guò)50.0,因而停止執(zhí)行循環(huán),循環(huán)次數(shù)比理論上少一次。這種情況在程序設(shè)計(jì)中常有發(fā)生,并且比較隱蔽不易發(fā)現(xiàn)。如果用循環(huán)來(lái)進(jìn)行計(jì)算,則少一次循環(huán)會(huì)影響計(jì)算結(jié)果。所以,在設(shè)計(jì)循環(huán)程序時(shí)應(yīng)該盡量避免用實(shí)型變量作循環(huán)控制變量。用整型變量作循環(huán)變量的話,計(jì)算出來(lái)的循環(huán)次數(shù)是絕對(duì)準(zhǔn)確的。如果在循環(huán)體中需要用到實(shí)型的e1,e2,e3時(shí),可以想辦法進(jìn)行轉(zhuǎn)換。對(duì)上述的循環(huán)程序可以修改為:DO10I=0,500X=I/10.010PRINT*,X這樣既可以保證執(zhí)行循環(huán)體501次,又能滿足打印各個(gè)X值(實(shí)數(shù))的要求。用I來(lái)控制循環(huán)次數(shù),建立I與X的關(guān)系,注意不要寫(xiě)成“X=I/10”(整型量相除的結(jié)果仍然是整數(shù)?。?。從DO循環(huán)結(jié)構(gòu)語(yǔ)句的功能來(lái)看,它描述的是用“計(jì)數(shù)”方式設(shè)置出口的“當(dāng)型”循環(huán)結(jié)構(gòu),循環(huán)變量v就是“計(jì)數(shù)器”,e1是計(jì)數(shù)器的初值,e3是計(jì)數(shù)器遞增的值、e2是計(jì)數(shù)的終值。今后凡是對(duì)用“計(jì)數(shù)”方式設(shè)置出口的“當(dāng)型”循環(huán)結(jié)構(gòu),都可以直接套用DO語(yǔ)句書(shū)寫(xiě)。待大家慢慢熟悉了循環(huán)結(jié)構(gòu),就可以不畫(huà)流程圖而直接寫(xiě)程序了。4)DO循環(huán)的終端語(yǔ)句DO語(yǔ)句構(gòu)成循環(huán)結(jié)構(gòu)時(shí),循環(huán)體的最后一條語(yǔ)句就是終端語(yǔ)句,終端語(yǔ)句除了完成該語(yǔ)句本身的功能外,還向計(jì)算機(jī)提示循環(huán)體結(jié)束,使計(jì)算機(jī)完成2個(gè)工作:(1)使循環(huán)變量增加步長(zhǎng)值(v=v+e3);(2)使循環(huán)次數(shù)r減1。與DO-WHILE語(yǔ)句相同,原則上終端語(yǔ)句可以是一般的執(zhí)行語(yǔ)句,如打印語(yǔ)句、賦值語(yǔ)句、輸入語(yǔ)句等,但是受其特性的限制,下列語(yǔ)句不能作終端語(yǔ)句:GOTO、塊IF、ELSE、ELSEIF、ENDIF、END、STOP、RETURN和所有的非執(zhí)行語(yǔ)句。另外,如果邏輯IF語(yǔ)句(行IF語(yǔ)句)作為終端語(yǔ)句時(shí),它不應(yīng)該包括DO、塊IF、ELSEIF、ELSE、ENDIF、END和另一個(gè)邏輯IF語(yǔ)句??傊?,循環(huán)終端語(yǔ)句的功能應(yīng)該是明確的,不能是不定的。為了使循環(huán)體的起止范圍清晰,使終端語(yǔ)句與一般的執(zhí)行語(yǔ)句有所區(qū)別,仍然建議使用繼續(xù)語(yǔ)句作為循環(huán)體的終端語(yǔ)句。5)DO循環(huán)的一些規(guī)定(1)循環(huán)變量可以在循環(huán)體中被引用,但不能被賦值。下面程序段是正確的:DO20N=1,20M=2*NPRINT*,M20CONTINUE它的功能是打印出2,4,6,8,….40。而下面的程序段是錯(cuò)誤的:DO20N=1,20N=2*NPRINT*,N20CONTINUE由于N是循環(huán)變量,在循環(huán)體內(nèi)被賦值,破壞了原有的循環(huán)過(guò)程,循環(huán)變量只能在執(zhí)行終端語(yǔ)句時(shí)由機(jī)器自動(dòng)增值而不能在循環(huán)體中通過(guò)賦值語(yǔ)句來(lái)改變。(2)循環(huán)結(jié)構(gòu)循環(huán)的次數(shù)是在進(jìn)入循環(huán)結(jié)構(gòu)之前就確定的,在執(zhí)行循環(huán)體期間不可能通過(guò)改變某些變量的值而改變。如有下面的程序段:DATAK,J,M/1,100,2/DO30I=K,J,MK=2*KJ=J+1M=M/2PRINT*,K,J,M30CONTINUE在進(jìn)入循環(huán)結(jié)構(gòu)之前,計(jì)算的r=INT((j-k+m)/m)=50,盡管在循環(huán)體中改變了K,J,M的值,循環(huán)體仍然執(zhí)行50次,輸出50組數(shù)據(jù)。(3)可以用轉(zhuǎn)向語(yǔ)句(GOTO、邏輯IF等)從循環(huán)體內(nèi)轉(zhuǎn)到循環(huán)體外,也可以在循環(huán)體內(nèi)轉(zhuǎn)向,但不允許從循環(huán)體外轉(zhuǎn)到循環(huán)體內(nèi)。例如下面程序段是合法的:DO10I=1,50……IF(MOD(I,5).EQ.O)GOTO5……10CONTINUE……5PRINT*,I*I而下面程序段是不合法的:IF(MOD(N,2).EQ.0)GOTO5DO20I=1,50……5PRINT*,I……20CONTINUE程序段中,如果從循環(huán)結(jié)構(gòu)外直接進(jìn)入循環(huán)結(jié)構(gòu)內(nèi),DO循環(huán)結(jié)構(gòu)語(yǔ)句就無(wú)法確定循環(huán)的初值,終值,步長(zhǎng)值等,無(wú)法控制循環(huán)過(guò)程。(4)未執(zhí)行完應(yīng)執(zhí)行的次數(shù)而跳出循環(huán)結(jié)構(gòu)的稱為“非正常出口”,執(zhí)行完全部應(yīng)執(zhí)行的循環(huán)次數(shù)而跳出循環(huán)的稱為“正常出口”。6)DO循環(huán)結(jié)構(gòu)語(yǔ)句應(yīng)用如圖5.3、圖5.5所示的“計(jì)數(shù)”方式設(shè)置循環(huán)出口的“當(dāng)型”循環(huán)結(jié)構(gòu),如果用DO循環(huán)結(jié)構(gòu)語(yǔ)句書(shū)寫(xiě)程序會(huì)更簡(jiǎn)便,清楚。圖5.3對(duì)應(yīng)的FORTRAN語(yǔ)言程序:PROGRAMMAINDO10I=1,5READ*,H,W0W1=110-W0IF(ABS(W0-W1).LE.5)THENPRINT*,‘標(biāo)準(zhǔn)’ELSEIF(W0.GT.W1)THENPRINT*,‘過(guò)胖’ELSEPRINT*,‘過(guò)瘦’ENDIF10CONTINUEEND為了和DO循環(huán)結(jié)構(gòu)語(yǔ)句判斷的條件“I.LE.5”相吻合,所以程序中循環(huán)變量的初值改為1(流程圖中計(jì)數(shù)器的初值為0,判斷條件為“I.LT.5”)??梢钥闯?,流程圖中對(duì)應(yīng)的“計(jì)數(shù)器設(shè)初值,判斷,計(jì)數(shù)器遞增”等工作已經(jīng)自動(dòng)地包含在DO循環(huán)結(jié)構(gòu)語(yǔ)句中了,書(shū)寫(xiě)程序時(shí)不需要再寫(xiě)專門語(yǔ)句。圖5.5對(duì)應(yīng)的FORTRAN語(yǔ)言源程序如下,為了與DO語(yǔ)句功能吻合,仍然將I的初值設(shè)為3。PROGRAMMAINDATAA,B/2*1.0/PRINT*,A,BDO10I=3,20C=A+BPRINT*,CA=BB=C10CONTINUEEND圖5.10例5.3算法流程圖I≤100NY計(jì)數(shù)一次:I=I+1圖5.10例5.3算法流程圖I≤100NY計(jì)數(shù)一次:I=I+1S=0,I=1累加S=S+N開(kāi)始輸入一個(gè)N結(jié)束輸出S分析:這是一個(gè)等差數(shù)列求和的問(wèn)題,如果使用等差數(shù)列求和公式當(dāng)然可以很輕松地求出結(jié)果,但是現(xiàn)在不用公式,而是采用循環(huán)結(jié)構(gòu)程序解決。解決“求和”問(wèn)題,往往采用“累加”的方式??梢栽O(shè)置一個(gè)累加器S,初值為0,循環(huán)體的操作為:“得到一個(gè)加數(shù)N,完成累加S=S+N”,循環(huán)體執(zhí)行的次數(shù)為100(用“計(jì)數(shù)”方式設(shè)置循環(huán)出口),計(jì)數(shù)器的初值為0(表示一次都沒(méi)累加)。在循環(huán)體內(nèi)只要變化加數(shù)N,累加操作的對(duì)象也隨之變化。根據(jù)上述思路,畫(huà)出流程圖如圖5.10所示。由于計(jì)數(shù)器初值為0,“當(dāng)型”循環(huán)結(jié)構(gòu)的判斷條件為“I<100”,為了與DO循環(huán)結(jié)構(gòu)語(yǔ)句中的判斷條件(I≤100PROGRAMMAINS=0DO10I=1,100READ*,NS=S+N10CONTINUEPRINT*,‘S=’,SEND程序中試圖通過(guò)每次讀入一個(gè)加數(shù)N實(shí)現(xiàn)“得到加數(shù)”操作,邏輯上沒(méi)有問(wèn)題,其實(shí)就這道題來(lái)講,每次要得到的加數(shù)就是當(dāng)前的I,另外,如果將循環(huán)次數(shù)通過(guò)READ語(yǔ)句在執(zhí)行程序時(shí)確定,可以將這個(gè)程序修改成更有通用性的程序。PROGRAMMAINS=0READ*,MDO10I=1,MS=S+I10CONTINUEPRINT*,‘S=’,SEND執(zhí)行程序時(shí),如果輸入的M=100,則S=1+2+3+…+100,如果輸入的M=500,則S=1+2+3+….+500。【例5.4】求分析:可以設(shè)置一個(gè)累加器S=0,加數(shù)項(xiàng)FACT=1,可以用遞推方式依次得到加數(shù)項(xiàng)1!,2!,…,100!,循環(huán)體循環(huán)的次數(shù)是100次。畫(huà)出流程圖如圖5.11所示。圖5.11例5.4算法流程圖結(jié)束圖5.11例5.4算法流程圖結(jié)束N≤MNYN=N+1S=0,F(xiàn)ACT=1,(N=1)S=S+FACT開(kāi)始輸入M輸出SFACT=FACT*NPROGRAMMAINREALS,F(xiàn)ACTDATAS,F(xiàn)ACT/0.0,1.0/READ*,MDO10N=1,MFACT=FACT*NS=S+FACT10CONTINUEPRINT*,‘結(jié)果為:’,SEND5.4結(jié)構(gòu)化的循環(huán)結(jié)構(gòu)按照結(jié)構(gòu)化程序設(shè)計(jì)的思想,在流程圖中任何一個(gè)順序結(jié)構(gòu)、分支結(jié)構(gòu)、循環(huán)結(jié)構(gòu)都必須只有一個(gè)入口和一個(gè)出口,如果出現(xiàn)了兩個(gè)或者兩個(gè)以上的出口,可以采用一些技巧將其改變成只有一個(gè)出口。在循環(huán)結(jié)構(gòu)中,當(dāng)出現(xiàn)了“非正常出口”時(shí),則出現(xiàn)了非結(jié)構(gòu)化的問(wèn)題,可以采用一些技巧將其改變成結(jié)構(gòu)化的形式?!纠?.5】判斷鍵盤輸入的數(shù)M是否素?cái)?shù)。分析:根據(jù)數(shù)學(xué)知識(shí),整數(shù)M如果是素?cái)?shù),則它只能有1和M兩個(gè)約數(shù)。換一種說(shuō)法,整數(shù)M是否素?cái)?shù),可以考察它是否能被2,3,…..,M-1整除,如果2,3,….M-1都不能整除M,則M是素?cái)?shù),否則M不是素?cái)?shù)。另外根據(jù)數(shù)的特性,其實(shí)可以考察2,3,…,M/2或。流程圖如圖5.12所示。從圖上可以看出,當(dāng)發(fā)現(xiàn)某個(gè)數(shù)I是M的約數(shù)時(shí)將不再繼續(xù)循環(huán)(非正常出口,此時(shí)還有未考察到的數(shù)?。?,直接跳出循環(huán)結(jié)構(gòu)。由于循環(huán)結(jié)構(gòu)出現(xiàn)了兩個(gè)出口,為了判斷到底是哪個(gè)出口出來(lái)的,所以緊接著還要判斷一次,如果此時(shí)“I≤K”成立,則說(shuō)明是找到了M的一個(gè)約數(shù),是非正常出口出來(lái)的,M不是素?cái)?shù),否則,M是素?cái)?shù)。對(duì)應(yīng)程序如下:PROGRAMMAINREAD*,MK=M/2(或者K=SQRT(REAL(M))DO10I=2,KIF(MOD(M,I).EQ.0)GOTO510CONTINUE5IF(I.LE.K)THENPRINT*,M,‘不是素?cái)?shù)!’ELSEPRINT*,M,‘是素?cái)?shù)!’ENDIFEND圖5.12例5.5算法流程圖結(jié)束I≤KNYI=I+1K=M/2,I=2開(kāi)始圖5.12例5.5算法流程圖結(jié)束I≤KNYI=I+1K=M/2,I=2開(kāi)始輸入M輸出M“不是素?cái)?shù)”I不整除MNYI≤KNY輸出M“是素?cái)?shù)”PROGRAMMAINLOGICALPP=.FALSE.READ*,MK=SQRT(M)DO10I=2,KIF(MOD(M,I).EQ.0)p=.true.10CONTINUEIF(p)THENPRINT*,M,‘不是素?cái)?shù)!’ELSEPRINT*,M,‘是素?cái)?shù)!’ENDIFEND程序阻止了循環(huán)結(jié)構(gòu)的非正常出口,但當(dāng)找到了M的約數(shù)后還要繼續(xù)判斷剩余的數(shù),其實(shí)這是多余的工作,影響了程序的效率,如果將循環(huán)改成用條件“.NOT.P.AND.I.LE.K”控制出口,將解決所有的問(wèn)題。LOGICALPP=.FALSE.READ*,MK=SQRT(M)I=2DO10WHILE(.NOT.P.AND.I.LE.K)IF(MOD(M,I).EQ.0)P=.TRUE.10CONTINUEIF(P)THENPRINT*,M,‘不是素?cái)?shù)!’ELSEPRINT*,M,‘是素?cái)?shù)!’ENDIFEND程序改成了用“條件”控制循環(huán)過(guò)程,所以只能用DO-WHILE語(yǔ)句書(shū)寫(xiě)。5.5循環(huán)嵌套在循環(huán)體中又完整地包含另一個(gè)循環(huán)結(jié)構(gòu),稱為循環(huán)的嵌套。例如:外循環(huán)內(nèi)循環(huán)外循環(huán)內(nèi)循環(huán)……DO20J=1,10……20CONTINUE……10CONTINUE按照循環(huán)結(jié)構(gòu)的意義,循環(huán)嵌套時(shí)內(nèi)循環(huán)應(yīng)當(dāng)完整地嵌套在外循環(huán)內(nèi),即內(nèi)循環(huán)應(yīng)該是外循環(huán)體中的一部分。循環(huán)結(jié)構(gòu)不能發(fā)生交叉?!纠?.6】求3~100之間的全部素?cái)?shù)。分析:判斷一個(gè)數(shù)是否素?cái)?shù)的程序已經(jīng)介紹過(guò),只是在外層套上一個(gè)DO循環(huán)語(yǔ)句。ProgrammainLOGICALPDO20M=3,100P=.FALSE.K=SQRT(M)DO10I=2,KIF(MOD(M,I).EQ.0)P=.TRUE.10CONTINUEIF(P)THENPRINT*,M,‘不是素?cái)?shù)!’ELSEPRINT*,M,‘是素?cái)?shù)!’ENDIF20CONTINUEEND【例5.7】按格式打印“九九表”。分析:數(shù)學(xué)課用的“九九表”,形式應(yīng)該如下:1*1=11*2=22*2=41*3=32*3=63*3=9…………1*9=92*9=183*9=27……….9*9=81每個(gè)算式中的第二個(gè)乘數(shù)用I表示,則I=1,9,表示一共有9行,處于外層循環(huán),算式中的第二個(gè)乘數(shù)用J表示,則J=1,….I,表示每一行有1,2,….,I列,處于內(nèi)層循環(huán),再配合格式輸出,寫(xiě)出程序如下:ProgrammainDO10I=1,9DO20I=1,IWRITE(*,100)J,I,I*J20CONTINUEPRINT*,‘’10CONTINUE100FORMAT(1X,I1,‘*’,I1,‘=’,I2,‘’,$)END由于FORMAT語(yǔ)句中使用了$符號(hào),執(zhí)行WRITE語(yǔ)句后將不會(huì)換行,當(dāng)一行上的所有算式都輸出完后(即內(nèi)層循環(huán)結(jié)束)需要安排一個(gè)輸出空符號(hào)語(yǔ)句,去掉該行上最后一個(gè)算式后的不換行格式。循環(huán)嵌套結(jié)構(gòu)的意義很簡(jiǎn)單,也很容易掌握,結(jié)合打印“乘法九九表”的例子具體看一下循環(huán)嵌套的執(zhí)行過(guò)程:(1)先計(jì)算外層循環(huán)的循環(huán)次數(shù)r1,外循環(huán)變量賦初值。(2)如果r1>0,則執(zhí)行外循環(huán)體,如r1≤0,則結(jié)束外循環(huán),轉(zhuǎn)向外循環(huán)終端語(yǔ)句的下一條語(yǔ)句。(3)在執(zhí)行外循環(huán)體各語(yǔ)句時(shí),遇到DO語(yǔ)句,則計(jì)算內(nèi)循環(huán)次數(shù)r2,內(nèi)循環(huán)變量取初值。(4)如果r2>0,則執(zhí)行內(nèi)循環(huán)體各語(yǔ)句,共執(zhí)行r2次,每執(zhí)行一次,內(nèi)循環(huán)變量加一次增量,r2的值減1,如果r2≤0,則結(jié)束內(nèi)循環(huán),從“正常出口”跳出內(nèi)循環(huán)。(5)接著執(zhí)行內(nèi)循環(huán)終端語(yǔ)句下面的外循環(huán)體內(nèi)的語(yǔ)句,直到遇到外循環(huán)終端語(yǔ)句。(6)外循環(huán)控制變量加一次增量,r1的值減1,返回(2)。在循環(huán)嵌套結(jié)構(gòu)中,外層循環(huán)執(zhí)行一次,內(nèi)層循環(huán)變量的值就要從頭至尾變化一圈。如果外層循環(huán)的次數(shù)是r1的話,則內(nèi)層循環(huán)就要做R1圈,所以內(nèi)層循環(huán)體的執(zhí)行次數(shù),應(yīng)該是其所有外層循環(huán)次數(shù)與內(nèi)層循環(huán)次數(shù)的乘積值。在循環(huán)嵌套結(jié)構(gòu)中,內(nèi)層、外層的概念是相對(duì)的,第一層循環(huán)是第二層循環(huán)的外層,第二層循環(huán)又是第三層循環(huán)的外層。只要對(duì)基本的循環(huán)結(jié)構(gòu)執(zhí)行過(guò)程弄清楚了,要處理多層循環(huán)結(jié)構(gòu)也就比較容易了?!纠?.8】搬磚問(wèn)題。36塊磚,36人搬;男搬4,女搬3,兩個(gè)小孩抬一磚。要求一次搬完,問(wèn)男、女、小孩各若干?分析:設(shè)男士X人,女士Y人,小孩Z人。根據(jù)題意可以得到方程式:X+Y+Z=364X+3Y+Z/2=363個(gè)未知數(shù),2個(gè)方程式,是一個(gè)不定方程,它沒(méi)有唯一解,而有多組解,無(wú)法用數(shù)學(xué)方法解,只能將所有可能的X,Y,Z值(即采用“窮舉”的辦法)一個(gè)一個(gè)地去試,看是否滿足上面的方程組,只要滿足則得到一組解。根據(jù)題意,可以知道X的取值范圍為0~9,Y的取值范圍為0~12,Z的取值范圍為0~72。利用三重循環(huán)就可以羅列出所有的取值。下面是FORTRAN語(yǔ)言的源程序:ProgrammainINTEGERX,Y,ZDO10X=0,9DO20Y=0,12DO30Z=0,72IF(X+Y+Z.EQ.36.AND.4*X+3*Y+Z/2.EQ.36)PRINT*,X,Y,Z30CONTINUE20CONTINUE10CONTINUEEND程序邏輯簡(jiǎn)單易懂,但程序效率很低,因?yàn)檠h(huán)體的IF語(yǔ)句執(zhí)行次數(shù)將高達(dá)10×13×73=949次。程序執(zhí)行結(jié)果為:X=3,Y=3,Z=30和X=1,Y=6,Z=29。顯然,第二組不符合題意要求,因?yàn)樾『?shù)為29人,不符合“兩個(gè)小孩搬一磚”的條件(小孩數(shù)應(yīng)該為偶數(shù)?。T僮屑?xì)分析可以發(fā)現(xiàn),當(dāng)X,Y的取值確定以后,Z的取值就可以用Z=36-X-Y算出,從而可以減少一層循環(huán),再將作為“條件”的方程變換為8X+6Y+Z=36,可以保證只有偶數(shù)的Z才有可能被選中。程序可以修改如下:ProgrammainINTEGERX,Y,ZDO10X=0,9DO20Y=0,12Z=36-X-YIF(8*X+6*Y+Z.EQ.72)PRINT*,X,Y,Z20CONTINUE10CONTINUEEND程序的執(zhí)行結(jié)果為:X=3,Y=3,Z=30。程序的循環(huán)體為兩個(gè)語(yǔ)句,執(zhí)行的次數(shù)為10×13=130次,顯然效率提高了??梢?jiàn)只要對(duì)問(wèn)題稍做分析,便可使程序質(zhì)量得到提高。5.6循環(huán)結(jié)構(gòu)程序設(shè)計(jì)5.6.1循環(huán)結(jié)構(gòu)語(yǔ)句的比較(1)DO-WHILE語(yǔ)句描述的是“當(dāng)型”結(jié)構(gòu)的循環(huán)過(guò)程,不管采用的是“計(jì)數(shù)”方式或“條件”方式設(shè)置的循環(huán)出口都可以用DO-WHILE語(yǔ)句書(shū)寫(xiě),只是當(dāng)采用“計(jì)數(shù)”方式設(shè)置循環(huán)出口時(shí),計(jì)數(shù)器的遞增(或遞減)過(guò)程應(yīng)該屬于循環(huán)體中的一個(gè)操作。(2)DO語(yǔ)句專門用于描述“當(dāng)型”結(jié)構(gòu)且以“計(jì)數(shù)”方式設(shè)置循環(huán)出口的循環(huán)過(guò)程。計(jì)數(shù)器的初始化、遞增(或遞減)過(guò)程都自動(dòng)地包含在DO語(yǔ)句中。(3)如果要描述“直到型”的循環(huán)結(jié)構(gòu),可以用分支、轉(zhuǎn)向語(yǔ)句。有的FORTRAN語(yǔ)言系統(tǒng)也提供了專門的描述“直到型”循環(huán)結(jié)構(gòu)的語(yǔ)句形式。這里不再贅述。5.6.2循環(huán)結(jié)構(gòu)程序設(shè)計(jì)綜合舉例圖5.13例5.9算法流程圖結(jié)束DAT圖5.13例5.9算法流程圖結(jié)束DAT≠9999NY開(kāi)始輸入FIRDAT與FIR同號(hào)NY輸出DAT輸入DAT分析:題面明確要求用數(shù)據(jù)9999作為結(jié)束循環(huán)的“標(biāo)志”,因此讀數(shù)過(guò)程可以用“當(dāng)型”循環(huán)結(jié)構(gòu)控制。循環(huán)體的工作為:讀入一個(gè)數(shù),判斷是否與第一個(gè)數(shù)同號(hào),如果是同號(hào)則輸出該數(shù),否則不輸出該數(shù)。設(shè)置一個(gè)存放第一個(gè)數(shù)的變量FIR。求解問(wèn)題的流程圖如圖5.13所示。ProgrammainINTEGERFIR,DATREAD*,F(xiàn)IRREAD*,DATDO10WHILE(DAT.NE.9999)IF(FIR*DAT.GT.0)PRINT*,DATREAD*,DAT10CONTINUEEND為了使用DO-WHILE語(yǔ)句,程序中安排了兩個(gè)READ*,DAT,一個(gè)是在進(jìn)入循環(huán)結(jié)構(gòu)之前屬于初始化的內(nèi)容,一個(gè)是在循環(huán)體中,為什么要這樣安排?循環(huán)體中的READ*,DAT不要行不行?【例5.10】寫(xiě)程序?qū)ふ页朔e值為323的兩個(gè)相鄰奇數(shù)。分析:如果用I表示第一個(gè)奇數(shù)、第二個(gè)奇數(shù),…,第N個(gè)奇數(shù),可以采用遞推的方法構(gòu)成循環(huán)體,依次考察1和3,3和5,…,321和323。由于找到了相鄰兩個(gè)奇數(shù)乘積值為323時(shí)就可以結(jié)束循環(huán)過(guò)程,所以不能使用DO語(yǔ)句,只能用DO-WHILE語(yǔ)句。循環(huán)進(jìn)行的條件是:I<323同時(shí)I*(I+2)≠323,可以寫(xiě)出程序如下:ProgrammainI=1DO10WHILE(I.LT.323.AND.I*(I+2).NE.323)I=I+210CONTINUE圖5.14例5.11算法流程圖P=12.9,YEAR=0圖5.14例5.11算法流程圖P=12.9,YEAR=0輸出P,YEAR結(jié)束開(kāi)始輸入RP<2*12.9NYP=P*(1+R)YEAR=YEAR+1PRINT*,I,I+1ELSEPRINT*,‘沒(méi)有找到!’ENDIFEND【例5.11】我國(guó)人口在2006年統(tǒng)計(jì)為12.9億,如果年增長(zhǎng)率為R,問(wèn)從2006年起經(jīng)過(guò)幾年人口會(huì)翻一番。分析:本例在第三章曾出現(xiàn)過(guò),只是要求的問(wèn)題不同。設(shè)人口初值為P=12.9,可以用遞推方法設(shè)計(jì)循環(huán)體,依次推出經(jīng)過(guò)一年后、二年后、…、N年后的人口值,由于循環(huán)的次數(shù)不知道,所以用條件:“人口達(dá)到或超過(guò)2*12.9億”作為控制循環(huán)結(jié)束的條件。流程圖見(jiàn)圖5.14所示。這是一個(gè)“直到型”的循環(huán)結(jié)構(gòu),利用分支和轉(zhuǎn)向語(yǔ)句寫(xiě)出對(duì)應(yīng)程序如下:ProgrammainDATAP,YEAR/12.9,0/R=0.01510P=P*(1+R)YEAR=YEAR+1IF(P.LT.2*12.9)GOTO10PRINT*,YEAR,‘年后人口數(shù)為:’,PEND如果把第二行的賦值語(yǔ)句R=0.015改為READ*,R,則可以使程序成為一個(gè)通用的適用于任意增長(zhǎng)率的程序?!纠?.12】鍵盤輸入一個(gè)整數(shù)I,請(qǐng)求出另一個(gè)整數(shù)J,使I和J在用8位二進(jìn)制表示時(shí)互為逆序。例如I=3,它用8位二進(jìn)制表示時(shí)為00000011,要求求出J=?,J的8位二進(jìn)制形式為11000000。分析:根據(jù)二進(jìn)制整數(shù)和十進(jìn)制整數(shù)轉(zhuǎn)換的法則,應(yīng)該先將輸入的十進(jìn)制數(shù)據(jù)I用“除二取余”法轉(zhuǎn)換成二進(jìn)制形式a7a6a5a4a3a2a1a0,再計(jì)算出:J=a0×107+a1×106+a2×105+a3×104+a4×103+a5×102+a6×101+a7×100由于使用“除二取余”法將I轉(zhuǎn)換成二進(jìn)制形式時(shí),依次得到的余數(shù)是a0、a1、a2、a3、a4、a5、a6、a7,故計(jì)算J時(shí)從a0×107開(kāi)始累加,得到程序如下:ProgrammainREAD*,IJ=0DO10K=7,0,-1J=J+MOD(I,2)*2**kI=I/210CONTINUEWRITE(*,100)J100FORMAT(1X,‘J=’,I5)END其實(shí)J的形式還可以寫(xiě)為:J=a0×27+a1×26+a2×25+a3×24+a4×23+a5×22+a6×21+a7×20=2×(2×(2×(2×(2×(2×(2×(2×(0)+a0)+a1)+a2)+a3)+a4)+a5)+a6)+a7如果設(shè)J=0,程序還可以寫(xiě)成下面形式:ProgrammainREAD*,IJ=0DO10K=1,8J=J+MOD(I,2)I=I/210CONTINUEWRITE(*,100)J100FORMAT(1X,‘J=’,I5)END【例5.13】輸入一個(gè)自然數(shù),要求打印出各因子。例如,輸入24,則輸出:24=1×2×2×2×3(打印格式不限)。分析:分解一個(gè)數(shù)的各個(gè)因子,可以從2開(kāi)始去除該數(shù),如果2是它的因子則輸出2并且不改變除數(shù)繼續(xù)去除,直到2不是它的因子,然后用3去除,…。循環(huán)考察該數(shù)是否還有因子的條件是:該數(shù)不等于1。流程圖見(jiàn)圖5.15所示。結(jié)束M結(jié)束M≠1NY輸出I,計(jì)算M=M/I輸入M,I=2,輸出因子1開(kāi)始I是M的因子NYI=I+1圖5.15例5.13算法流程圖ProgrammainREAD*,MI=2WRITE(*,200)M,‘=’,1DO10WHILE(M.NE.1)IF(MOD(M,I).EQ.0)THENWRITE(*,100)‘*’,IM=M/IELSEI=I+1ENDIF10CONTINUE100FORMAT(1X,A,I1,$)200FORMAT(1X,I5,A,I1,$)END【例5.14】找出1~100之間的全部“同構(gòu)數(shù)”?!巴瑯?gòu)數(shù)”是指這樣一個(gè)數(shù),它出現(xiàn)在它的平方數(shù)的右側(cè)。例如:52=25,5是25右側(cè)的數(shù),5就是“同構(gòu)數(shù)”。分析:判斷一個(gè)數(shù)是否出現(xiàn)在其平方數(shù)的右側(cè),關(guān)鍵要看平方數(shù)減去該數(shù)后右側(cè)0的個(gè)數(shù)是否剛好是該數(shù)的位數(shù),問(wèn)題就變成求該數(shù)的位數(shù)??梢詫?xiě)出程序如下:ProgrammainDO10M=1,100KK=M*MN=1DO20WHILE(M/10**N.NE.0)N=N+120CONTINUEIF(KK-M.EQ.KK/10**N*10**N)WRITE(*,100)M,‘是同構(gòu)數(shù)’10CONTINUE100FORMAT(1X,I3,A)END程序中表達(dá)式“KK/10**N*10**N”表示將平方數(shù)除以10的N次方后(注意將自動(dòng)取整?。┰偬砩螻個(gè)0,也即將平方數(shù)末尾N個(gè)數(shù)字變成0,邏輯表達(dá)式“KK-M.EQ.KK/10**N*10**N”如果成立則表示平方數(shù)減去該數(shù)后末尾的0的個(gè)數(shù)也有N個(gè),所以M是同構(gòu)數(shù)?!纠?.15】有數(shù)字燈謎如下,A、B、C、D均為一位非負(fù)整數(shù),求出A、B、C、D的值。ABCD-)CDCABC分析:這道題最容易想到窮舉法??梢砸来瘟_列出A、B、C、D各自可能的取值,再判斷是否可以組成算式,對(duì)各組可以組成算式的A、B、C、D輸出即可。ProgrammainINTEGERA,B,C,DDO10A=1,9DO20B=0,9DO30C=1,9DO40D=0,9M=A*1000+B*100+C*10+DN=C*100+D*10+CK=A*100+B*10+CIF(M-N.EQ.K)PRINT*,A,B,C,D40CONTINUE30CONTINUE20CONTINUE10CONTINUEEND【例5.16】打印如下圖案。*********************打印規(guī)則圖案是程序設(shè)計(jì)中很有趣的一類問(wèn)題??梢愿鶕?jù)圖案的特點(diǎn)和規(guī)則利用循環(huán)結(jié)構(gòu)輸出,還可以結(jié)合字符數(shù)據(jù)的函數(shù)和子字符串等實(shí)現(xiàn)輸出。分析:本題圖案是一個(gè)規(guī)則的倒直角三角形??梢远x一個(gè)長(zhǎng)度為6的字符串,根據(jù)每一行輸出的“*”號(hào)的個(gè)數(shù)填充該字符串中相應(yīng)位置上的子字符串的“*”號(hào),然后輸出該字符串(即一行的“*”號(hào)的個(gè)數(shù))。寫(xiě)出程序如下:ProgrammainCHARACTERA*6DO10I=1,6A=‘’DO20J=1,6-I+1A(J:J)=‘*’20CONTINUEPRINT*,A10CONTINUEEND注意:程序中,每次構(gòu)造一行的所有“*”號(hào)之前,都對(duì)字符串變量A進(jìn)行了“清空”操作,為什么?不要行不行?【例5.17】編一程序打印如下圖形。1
123123451234567123456789分析:與上一個(gè)例題相比,這里輸出的字符是變化的,并且填涂符號(hào)的起始子字符串也是變化的??梢岳米址瘮?shù)得到不同位置上的符號(hào),利用變量的值確定起始子字符串位置。參考程序如下:ProgrammainCHARACTERA*60
DO10I=1,5
A=''
K=31-I
DO20J=1,2*I-1
A(K+J:K+J)=CHAR(48+J)
20CONTINUEWRITE(*,'(1X,A)')A10CONTINUEEND【例5.18】用一元方程的迭代解法求方程x3+2x2+2x+1=0的近似根。一元方程f(x)=0,反映了科學(xué)領(lǐng)域內(nèi)的一類常見(jiàn)的規(guī)律。很多人總習(xí)慣于設(shè)法構(gòu)造解析表達(dá)式去精確地描述一個(gè)方程的解,但是,能用解析表達(dá)式精確地描述出解的方程實(shí)在是太有限了。在這種情況下,可以求助于一些近似解法。迭代法是近似解法中的一種,用迭代法求一元方程f(x)=0的解,其基本方法如下:(1)要把方程f(x)=0改寫(xiě)為一種迭代形式:x=g(x)形式;(2)選取適當(dāng)?shù)某踔祒0(估計(jì)的粗略解);(3)將x0代入g(x)得x1,再將x1代入g(x)得x2,…,即:x0→g(x0)→x1→g(x1)→x2→g(x2)→x3→g(x3)→x4→g(x4)→x5→g(x5)…當(dāng)然,迭代過(guò)程不可能重復(fù)無(wú)窮多次。一般說(shuō)來(lái)重復(fù)的次數(shù)應(yīng)該由指定的精度(或誤差)決定,當(dāng)誤差小于給定值時(shí),便認(rèn)為所得到的解足夠精確了,迭代過(guò)程可以結(jié)束。所以,用迭代法解一元方程根的重復(fù)過(guò)程都是用誤差進(jìn)行控制的,即每迭代一次就要對(duì)所得到的誤差作一次判斷,看其是否已小于給定的誤差值,通常是用當(dāng)前的解與上次的解之差作為相對(duì)誤差。結(jié)束I≤MNY打印“未收斂”提示輸入收斂精度E1開(kāi)始|X1-X|≤E1NYX=X1輸入X、M,I=1計(jì)算迭代值X1打印迭代次數(shù)I、迭代值X將方程結(jié)束I≤MNY打印“未收斂”提示輸入收斂精度E1開(kāi)始|X1-X|≤E1NYX=X1輸入X、M,I=1計(jì)算迭代值X1打印迭代次數(shù)I、迭代值X圖5.16例5.18算法流程圖算法流程圖如圖5.16所示,對(duì)應(yīng)的程序如下:ProgrammainREAD*,X,M,E1
DO10I=1,M
X1=(-X**3-2.0*X*X-2.0)/2.0
WRITE(*,100)I,X1
IF(ABS(X1-X).LE.E1)THEN
STOP
ELSEX
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 電焊工施工合同協(xié)議書(shū)
- 湖北省隨州市部分高中2024-2025學(xué)年高一下學(xué)期2月聯(lián)考地理試卷(含答案)
- 洗衣設(shè)備購(gòu)銷合同共
- 健身房運(yùn)營(yíng)管理作業(yè)指導(dǎo)書(shū)
- 會(huì)議策劃與活動(dòng)執(zhí)行服務(wù)協(xié)議
- 健康科技在老年健康管理中的應(yīng)用解決方案
- 水利建設(shè)工程施工合同協(xié)議書(shū)
- 大學(xué)生科普小說(shuō)讀后感
- 觀看紀(jì)錄片長(zhǎng)江觀后感
- 車隊(duì)土石方運(yùn)輸合同
- 2023年上海市16區(qū)數(shù)學(xué)中考二模匯編2 方程與不等式(39題)含詳解
- 《貝爾格里爾斯》課件
- 火鍋店消防知識(shí)培訓(xùn)課件
- 直腸癌健康宣教
- 回彈法檢測(cè)混凝土強(qiáng)度自動(dòng)計(jì)算表,測(cè)區(qū)混凝土強(qiáng)度換算表,回彈值
- 視頻自媒體創(chuàng)作學(xué)習(xí)通超星課后章節(jié)答案期末考試題庫(kù)2023年
- 水工建筑物之水閘設(shè)計(jì)全解
- 《燕歌行》并序pptx課件
- 牛屠宰加工工藝流程圖及工藝說(shuō)明及牛肉凍品分割標(biāo)準(zhǔn)
- 基于SLAM的定位與避障設(shè)計(jì)
- 汽車動(dòng)力學(xué)輪胎動(dòng)力學(xué)
評(píng)論
0/150
提交評(píng)論