第三章-結構化程序設計_第1頁
第三章-結構化程序設計_第2頁
第三章-結構化程序設計_第3頁
第三章-結構化程序設計_第4頁
第三章-結構化程序設計_第5頁
已閱讀5頁,還剩74頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第3章

FORTRAN結構化程序設計本章內容順序結構程序設計選擇結構程序設計循環結構程序設計

結構化程序設計:按照一定的結構形式來設計和編寫程序,以便閱讀與檢查。順序結構選擇結構循環結構

當型循環

直到型循環

3.1順序結構程序設計先上后下,先左后右;即先執行A,再執行B順序結構【例3-1】輸入3個氣象站5個月(汛期)雨量數據,統計每個氣象站的總雨量和平均雨量,計算3個站五月、六月、七月、八月、九月的平均雨量,輸出每個氣象站每個月的雨量、總雨量和平均雨量,以及五月、六月、七月、八月、九月的平均雨量。站名汛期各月雨量(毫米)5月6月7月8月9月江陰76.8176.5308.141.069.6定波閘71.5208.5352.147.262.6肖山65.5200.0239.744.363.0表3-11998年主要站汛期雨量統計表1

PROGRAMex06_02

2

IMPLICITNONE

3

REALr11,r12,r13,r14,r15,total11,av11

4

REALr21,r22,r23,r24,r25,total21,av21

5

REALr31,r32,r33,r34,r35,total31,av31

6

REALav1,av2,av3,av4,av5

7

WRITE(*,“(28X,‘5月6月7月8月9月’)”)

8

WRITE(*,“(1X,‘輸入江陰氣象站五個月的雨:’,\)”)

9

READ(*,*)r11,r12,r13,r14,r15

10

WRITE(*,“(1X,‘輸入定波閘氣象站五個月的雨量:’,\)”)

11

READ(*,*)r21,r22,r23,r24,r25

12

WRITE(*,“(1X,‘輸入肖山氣象站五個月的雨量:’,\)”)

13

READ(*,*)r31,r32,r33,r34,r35

14

!100 FORMAT(F5.1,F5.1,F5.1,F5.1,F5.1)

15

total11=r11+r12+r13+r14+r15

16

av11=total11/5

17

total21=r21+r22+r23+r24+r25

18

av21=total21/5

19

total31=r31+r32+r33+r34+r35

20

av31=total31/5

21

av1=(r11+r21+r31)/3

22

av2=(r12+r22+r32)/3

23

av3=(r13+r23+r33)/3

24

av4=(r14+r24+r34)/3

25

av5=(r15+r25+r35)/3

26

WRITE(*,“(26X,‘5月6月7月8月9月總雨量平均雨量’)”)

27

WRITE(*,200)‘江陰氣象站五個月的雨量:’,r11,r12,r13,r14,r15,total11,av11

28

WRITE(*,200)‘定波閘氣象站五個月的雨量:’,r21,r22,r23,r24,r25,total21,av21

29

WRITE(*,200)‘肖山氣象站五個月的雨量:’,r31,r32,r33,r34,r35,total31,av31

30

200

FORMAT(1X,A22,5(F5.1,2X),F6.1,2X,F7.3)

31

WRITE(*,300)‘5月’,av1,‘6月’,av2,‘7月’,av3,‘8月’,av4,‘9月’,av5

32

300

FORMAT(1X,A4,‘平均雨量:’,F7.3)

33

END運行結果:3.2選擇結構3.2.1選擇結構簡介3.2.2

IF語句3.2.3

SELECTCASE語句3.2.4選擇語句的嵌套3.2.1選擇結構簡介

依據給定的條件做邏輯判斷,再根據判斷的結果決定應執行哪種操作——選擇結構。如:1輸入學生成績,判定合格與否,輸出判定結果。2已知三個整數A,B,C,輸入其值并打印三個數中最大值。

3暴雨預警信號分三級,分別以黃色、橙色、紅色表示。

(1)暴雨黃色預警信號(2)暴雨橙色預警信號(3)暴雨紅色預警信號根據降雨量評判當前預警信號,從而做出不同防御指南。必須使用選擇結構程序來解決這類問題FORTRAN提供了3種典型的塊IF結構:

(1)單分支

(2)雙分支

(3)多分支3.2.2

IF語句(1)單分支塊IF結構

一般形式為:

IF(條件) THEN IF塊

ENDIF這種塊IF結構包括:塊IF語句“IF(條件)THEN”。它是塊IF結構的入口語句。IF塊。它是一個語句序列,由若干條可執行語句組成。ENDIF語句。它是塊IF結構的出口語句。

【例3-2】從鍵盤輸入一個氣溫值,如果大于35.0,則顯示在屏幕上。1PROGRAMex04_022IMPLICITNONE3REALT4 READ*,T5 IF(T>35.0) THEN6 PRINT*,'這是高溫'7 PRINT*,'T=',T8 ENDIF9END(2)雙分支塊IF結構

一般形式為:

IF(條件) THEN IF塊

ELSE ELSE塊

ENDIF【例3-3】由于大氣受到污染,一些地區開始形成酸雨區,酸雨是指PH值小于5.6的雨雪或其他形式的大氣降水。通過收集水樣測量其PH值,判斷它的酸堿性并打印出來。根據題意設計算法并畫出程序流程圖,如圖所示。1PROGRAMex07_032IMPLICITNONE3 REALph4 WRITE(*,*)'PleaseenterPHvalue:'5 READ*,ph!定義變量ph來存放酸堿度值6 IF(ph<5.6)THEN!用分支語句來判斷7 WRITE(*,100)ph8 ELSE9 WRITE(*,200)ph10 ENDIF11100FORMAT(1X,'PH=',F4.2,',isacidrain!')12200FORMAT(1X,'PH=',F4.2,',isnotacidrain!')13END(3)多分支塊IF結構

一般形式為:

IF(條件1) THEN

塊1 ELSEIF(條件2)THEN

塊2 ELSEIF(條件3)THEN

塊3 . . ELSEIF(條件n)THEN

塊n [ELSE

塊n+1] ENDIF【例3-4】在氣象部門發布的天氣預報中小雨、中雨、暴雨等專業術語,它們之間的區別如表所示:降雨強度降雨量(12小時,單位:mm)降雨量(24小時,單位:mm)小雨<5<10中雨5~1510~25大雨15~3025~50暴雨30~7050~100大暴雨70~140100~250特大暴雨>140>2501PROGRAMex07_042IMPLICITNONE3 REALr!定義用來記錄降雨量的實型量r4 WRITE(*,100)5 READ*,r6 IF(r<5)THEN!用多分支IF語句進行判斷7 PRINT2008 ELSEIF(r<15)THEN9 PRINT30010 ELSEIF(r<30)THEN11 PRINT40012 ELSEIF(r<70)THEN13 PRINT50014 ELSEIF(r<140)THEN15 PRINT60016 ELSE17 PRINT70018 ENDIF19100FORMAT(1X,'請輸入12小時降雨量:')20200FORMAT(1X,'小雨')21300FORMAT(1X,'中雨')22400FORMAT(1X,'大雨')23500FORMAT(1X,'暴雨')24600FORMAT(1X,'大暴雨')25700FORMAT(1X,'特大暴雨')26END(4)邏輯IF結構

邏輯IF語句的一般形式:

IF(條件)語句其中“條件”可以是一個合法的邏輯表達式或關系表達式,“語句”是一個合法的可執行語句,且只有一條語句。【例3-5】根據層結參數N2的大小可以判斷大氣層結狀態:N2要求從鍵盤輸入。1PROGRAMex07_052IMPLICITNONE3 REALN24 WRITE(*,100)5 READ(*,*)N26 IF(N2.EQ.0.0)PRINT*,‘中性層結’7 IF(N2.GT.0.0)PRINT*,‘穩定層結’8 IF(N2.LT.0.0)PRINT*,‘不穩定層結’9100 FORMAT(1X,'PLEASEINPUTN2:')10END

CASE結構是一種多路分支選擇結構,可有多個分支可供選擇。

CASE結構的一般形式為:

SELECTCASE(選擇表達式)

CASE(控制表達式1) 塊1 CASE(控制表達式2) 塊2 . . CASE(控制表達式n) 塊n [CASEDEFAULT

默認塊] ENDSELECT3.2.3SELECTCASE語句

實質:判斷選擇表達式的值是否與某一控制表達式的值相匹配。說明:選擇表達式和控制表達式可以為整型、邏輯型或字符型。控制表達式可以是一個不重復的值或一組同類值的列表,如:(1)用逗號分隔的單個值列表。如:CASE(‘a’,‘b’,‘c’,‘x’,‘y’,‘z’),當選擇表達式的值為a,b,c,x,y,z之一時,執行相應的語句塊。CASE(3,6,9),當選擇表達式的值為3,6或9時,執行相應的語句塊。(2)用冒號分隔的值的范圍。如:CASE(‘a’:‘g’),當選擇表達式的值落入a~g范圍內時,執行相應的語句塊。CASE(5:10),當選擇表達式的值落入5~10范圍內時,執行相應的語句塊。CASE(10:),當選擇表達式的值大于或等于10時,執行相應的語句塊。CASE(:10),當選擇表達式的值小于或等于10時,執行相應的語句塊。【例3-6】根據風對地上物體所引起的現象將風的大小分為13個等級,稱為風力等級,以0~12等級數字記載,如下表所示:等級名稱風速陸地物象海面波浪浪高0無風0.0~0.2煙直上平靜0.01軟風0.3~1.5煙示風向微波峰無飛沫0.12輕風1.6~3.3感覺有風小波峰未破碎0.23微風3.4~5.4旌旗展開小波峰頂破裂0.64和風5.5~7.9吹起塵土小浪白沫波峰1.05勁風8.0~10.7小數搖擺中浪折沫峰群2.06強風10.8~13.8電線有聲大浪到個飛沫3.07疾風13.9~17.1步行困難破峰白沫成條4.08大風17.2~20.7折毀樹枝浪長高有浪花5.59烈風20.8~24.4小損房屋浪峰倒卷7.010狂風24.5~28.4拔起樹木海浪翻滾咆哮9.011暴風28.5~32.6損毀普遍波峰全呈飛沫11.512臺風/颶風32.7以上摧毀巨大海浪滔天14.0現對所輸入的風速進行分類并輸出。

1PROGRAMex07_062IMPLICITNONE3REALwind_velocity4PRINT*,'請輸入風速:'5READ*,wind_velocity6SELECTCASE(INT(wind_velocity*10))7 CASE(0:2)8 PRINT*,'0級'9 PRINT*,'無風'10 CASE(3:15)11 PRINT*,'1級'12 PRINT*,'軟風'13 CASE(16:33)14 PRINT*,'2級'15 PRINT*,'輕風'。

。。。。

。。。40 CASE(285:326)41 PRINT*,'11級'42 PRINT*,'暴風'43 CASE(327:)44 PRINT*,'12級'45 PRINT*,'臺風/颶風'46 CASEDEFAULT47 PRINT*,'非法數據'48ENDSELECT49END

在一個塊IF結構中都可以完整地包含一個(或多個)塊IF結構,即構成塊IF的嵌套結構。它的結構為:

3.2.4選擇語句的嵌套

當嵌套層次過多時,往往一時難以找到同一層的塊IF中的各語句,一般可按以下方法確定:

(1)從最內層的塊IF語句開始,向下找到離它最近的ENDIF語句,將它們用線括起來,這就是同一層次的塊IF。(2)由內向外重復這一個過程,直到遇見最外層塊IF語句和ENDIF語句為止。(3)在書寫嵌套分支結構時采取縮進方式進行程序書寫,程序的嵌套層次就容易確定。【例3-7】求解當系數a,b,c為不同情況下的一元二次方程根。N-S圖如下:

READ*,a,b,cd=b**2-4.0*a*cIF(a==0.0)THENIF(b==0.0)THENIF(c==0.0)THEN PRINT*,'平凡解'ELSEPRINT*,'無解'ENDIFELSEPRINT*,'一個實根'PRINT*,-c/dENDIFELSEIF(d>0.0)THEN x1=(-b+sqrt(d))/(2.0*a) x2=(-b-sqrt(d))/(2.0*a) PRINT*,'兩個不等實根:' PRINT*,'x1=',x1 PRINT*,'x2=',x2ELSEIF(d==0.0)THEN PRINT*,'兩個相等實根' PRINT*,-b/(2.0*a)ELSE pr=-b/(2.0*a) pi=sqrt(-d)/(2.0*a) PRINT*,'兩個復根' PRINT*,'x1=',pr,'+',pi,'i' PRINT*,'x2=',pr,'-',pi,'i'ENDIFENDIFEND【例3-8】已知U,V風速,判斷風向:U>0;V>0西南風U>0;V<0西北風U<0;V>0東南風U<0;V<0東北風programex0308realu,vread*,u,vif(u>0.0)then

if(v>0.0)then!u>0,v>0print*,'西南風'

elseif(v<0.0)then!u>0,v<0print*,'西北風‘

else!u>0,v=0print*,'西風'

endifelseif(u<0.0)then

if(v>0.0)then!u<0,v>0print*,'東南風'

elseif(v<0.0)then!u<0,v<0print*,'東北風'

else!u<0,v=0print*,'東風‘

endifelse

if(v>0.0)then!u=0,v>0print*,'南風'

elseif(v<0.0)then!u=0,v<0print*,'北風'

else!u=0,v=0print*,'無風'

endifendifend3.3循環結構程序設計

3.3.1循環語句的形式3.3.2循環控制語句3.3.3循環語句的嵌套3.3.4兩種循環形式的比較和關系3.3.1循環語句的形式

(1)有循環變量的DO循環結構

格式有循環變量DO結構的一般形式為:[結構名:]DO循環變量=E1,E2,E3

循環體ENDDO[結構名]DO循環結構的程序舉例【例3-9】了解循環執行的過程和計算循環次數DOI=1,3,2M=I*IPRINT*,I,MENDDOEND運行結果DO循環結構循環的次數:R=MAX(INT((E2-E1+E3)/E3),0)REAL::IDOI=0.6,6.6,1.4INTEGER::IDOI=0.6,6.6,1.4DOR=0.6,6.6,-1.4DOR=6.6,0.6,1.45次,0.6,2.0,3.4,4.8,6.27次,0,1,2,3,4,5,60次0次先計算E1、E2、E3的值,然后轉換為與循環控制變量相同的類型;給循環控制變量賦初值

v=E1;計算循環次數,計算公式為:

R=MAX(INT((E2-E1+E3)/E3),0)檢查循環次數,當R0時,執行循環體,繼續做第(4-6)步;當

R≤0時,轉向(7);當執行到循環終端語句時,循環變量按步長增值,即:循環變量

=循環變量

+E3;循環次數減1:R=R–1;返回

(4)繼續執行。

循環結束。執行過程注意事項循環變量在循環體中可以引用不能重新賦值E1、E2、E3的類型應與循環變量相同。E3的缺省意味著循環步長為1。可以不經過ENDDO語句退出循環DO循環和其它結構(如塊IF結構、CASE結構)可以相互嵌套使用退出循環后,循環變量仍然存在。【例3-10】循環輸入一周日最高氣溫,判斷最高氣溫,并計算一周平均最高氣溫。2014年3月23日-29日南京日最高氣溫如下:16.017.017.018.016.022.024.0(單位:℃)。programex0309realt,tmax,sum,taveIntegeritmax=0.0sum=0.0doi=1,7read*,tsum=t+sumif(t>=tmax)thentmax=tendifenddotave=sum/7.0print*,'tmax=',tmaxprint*,'tave=',taveend43(2)DO-WHILE控制的循環結構

DO-WHILE結構格式一般形式為:[結構名:]DOWHILE(邏輯表達式)

循環體

ENDDO[結構名]例子【例3-11】循環輸入每六小時降水資料,如果發現數據小于0或者大于1000時,終止循環,并提示輸入數據異常。realprecipprint*,'輸入每六小時降水量(mm):'read*,precipdowhile(precip.ge.0.and.precip.le.1000) print*,'降水量(mm):',precip read*,precipenddoprint*,'輸入數據異常'end程序運行結果45DO-WHILE循環流程圖

46循環結構的選擇:如果已知循環的次數,或者知道循環的初值和終值,那么用有循環變量的DO循環結構。知道循環的條件時,選用DO_WHILE循環結構,或者是重復DO循環結構。其中在使用這兩種結構時,注意循環條件的變化,以避免“死循環”。47(1)EXIT語句EXIT語句用于強制退出循環,將執行控制轉移到當前循環或結構之外。

一般格式為:

EXIT[DO循環結構名]

3.3.2循環流程控制語句48EXIT語句的使用說明:EXIT語句通常是作為邏輯IF語句的內嵌語句來使用。其作用是有條件中斷。

形式為:IF(邏輯表達式)EXIT[結構名]

執行過程為:當邏輯表達式為真時,中止正在執行的循環,將控制轉到EXIT語句指定的結構之后;當邏輯表達式為假時,繼續正在執行的循環,不進行任何轉移。49【例3-12】輸入正整數n,求級數的前n項和,如果當某項絕對值≤10-5時,雖未滿n項,也因滿足精度而不再加入下一項。1PROGRAMex08_08

2IMPLICITNONE

3INTEGER::i,n

4REAL::s=0,t

5READ*,n

6DOi=1,n

7t=1./(i*(i+1))!注意t要求是實型8s=s+t

9IF(ABS(t)<=1.E-5)EXIT!循環的非正常出口時,I的值為當前值10ENDDO

11IF(i==n+1)i=i-1!循環正常出口時,I的值為終值+步長12PRINT*,'SUM=',s,'TERM=',i

13END

51(2)CYCLE語句

CYCLE語句用于中止執行循環體中剩余的語句,重新執行下一輪循環。

一般格式為:

CYCLE[DO循環結構名]52CYCLE語句的使用說明:CYCLE語句與EXIT語句不同,它不中止循環的執行,而是將循環變量增加一個步長,從下一個循環開始執行。CYCLE語句通常是作為邏輯IF語句的內嵌語句來使用。形式為: IF(邏輯表達式)CYCLE[DO循環結構名]

53執行過程:當邏輯表達式為真時,中止正在執行的循環體的剩余語句,將控制轉到循環體的開始重新循環;當邏輯表達式為假時,繼續正在執行的循環,不進行任何轉移。【例3-13】順序輸出1-10序列中除了9以外的其它數字doi=1,10 if(i==9)cycle print*,ienddoend運行結果【練習】輸入3月份氣溫,缺測記錄為999,請統計3月份平均氣溫。programmainimplicitnonerealt,tsum,taveintegeri,numtsum=0.0num=0doi=1,31read*,tif(t==999.0)cycletsum=tsum+tnum=num+1enddotave=tsum/numprint*,taveendprogrammainimplicitnonerealt,tsum,taveintegeri,numtsum=0.0num=0doi=1,31read*,tif(t/=999.0)thentsum=tsum+tnum=num+1endifenddotave=tsum/numprint*,taveend563.3.3循環語句的嵌套

DO循環結構嵌套的一般格式為:

[結構名1:]DOV1=E11,E12,E13[其它循環體][結構名2:]DOV2=E21,E22,E23

內部循環體

ENDDO[結構名2][其它循環體]ENDDO[結構名1]【例3-13】doj=1,2 print*,'第',j,'次外循環開始' print*,'****' doi=1,3 print*,'第',(j-1)*3+i,'次內循環' enddo print*,'第',j,'次外循環結束' print*,'****'enddoend運行結果58循環嵌套執行的過程

計算外層循環次數R1,I賦初值R1>0計算內層循環次數R2,J賦初值R2>0執行內層循環體J=J+內層循環步長R2=R2-1I=I+外層循環步長R1=R1-159循環嵌套循環的次數:外層循環的次數為:R1內層循環的次數為:R2整個循環的次數為:RR=R1*R260計算循環嵌套循環次數:M=0DOI=1,3,4

DOJ=4,19,4 M=M+1

PRINT*,M

ENDDOENDDOEND運行結果61嵌套DO循環的說明

三種DO循環結構必須是完整的嵌套。循環嵌套時,內、外層不能使用相同的循環變量。循環轉移的問題。DO循環結構可以與選擇結構的嵌套。62計算循環嵌套循環次數:M=0II:DOI=1,3,4 JJ:DOJ=4,19,4 M=M+1 if(M>=3)EXITII ENDDOJJENDDOIIPRINT*,MEND運行結果3.3.4兩種循環形式的比較和關系

(1)帶循環變量的DO循環用來處理已確定循環次數的問題。DOWHILE循環既可以用來處理已知循環次數的循環問題,也可用來處理不確定循環次數的問題。(2)對事先已確定循環次數的問題,用帶循環變量的DO循環比較方便,它能使循環變量自動增值,不需用戶寫邏輯表達式,只需寫出循環變量的初值、終值和步長即可,使用方

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論