流程控制與邏輯運(yùn)算課件_第1頁(yè)
流程控制與邏輯運(yùn)算課件_第2頁(yè)
流程控制與邏輯運(yùn)算課件_第3頁(yè)
流程控制與邏輯運(yùn)算課件_第4頁(yè)
流程控制與邏輯運(yùn)算課件_第5頁(yè)
已閱讀5頁(yè),還剩117頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

Fortran95程序設(shè)計(jì)彭國(guó)倫編著第5章流程控制與邏輯運(yùn)算Fortran95程序設(shè)計(jì)彭國(guó)倫編著第5章流程控制與邏5-0-1自頂向下設(shè)計(jì)當(dāng)給定一個(gè)新問(wèn)題,如上一章的作業(yè),一個(gè)很自然的傾向就是坐在電腦前面開(kāi)始編程,而不是“浪費(fèi)”時(shí)間進(jìn)行思考。對(duì)于很小的問(wèn)題,這種飛躍式的編程方法通常都是可行的。現(xiàn)實(shí)世界中,問(wèn)題一般都是大型的,如果嘗試采用這種方法,程序員將陷入絕望的困境。在編寫(xiě)程序解決大型問(wèn)題之前,徹底考慮一下問(wèn)題以及將要采取的方法是非常值得的。2*5-0-1自頂向下設(shè)計(jì)當(dāng)給定一個(gè)新問(wèn)題,如上一章的作業(yè),一個(gè)5-0-1自頂向下設(shè)計(jì)自頂向下設(shè)計(jì)就是一個(gè)過(guò)程:

從大型任務(wù)開(kāi)始,將其分解為更小的、更容易理解的塊(子任務(wù)),執(zhí)行所需任務(wù)的一部分。

如果需要,每個(gè)子任務(wù)還可以依次再細(xì)分為更小的子任務(wù)。 對(duì)每一個(gè)塊單獨(dú)編碼和測(cè)試,直到每一個(gè)子任務(wù)都能夠獨(dú)立的正確工作。 將子任務(wù)集成為一個(gè)完整的任務(wù)。3*5-0-1自頂向下設(shè)計(jì)自頂向下設(shè)計(jì)就是一個(gè)過(guò)程:3*5-0-1自頂向下設(shè)計(jì)清楚的陳述要解決的問(wèn)題定義程序所需的輸入和程序產(chǎn)生的輸出。設(shè)計(jì)要在程序中實(shí)現(xiàn)的算法。將算法轉(zhuǎn)換為Fortran語(yǔ)句。測(cè)設(shè)完成的Fortran程序。4*5-0-1自頂向下設(shè)計(jì)清楚的陳述要解決的問(wèn)題4*5-0-1自頂向下設(shè)計(jì)開(kāi)始表明問(wèn)題定義所需的輸入輸出量設(shè)計(jì)算法將算法轉(zhuǎn)換為Fortran語(yǔ)句測(cè)試完成的Fortran程序結(jié)束子任務(wù)單元測(cè)試連續(xù)構(gòu)建子任務(wù)子任務(wù)加入主程序Alpha版本Beta版本正式版本5*5-0-1自頂向下設(shè)計(jì)開(kāi)始表明問(wèn)題定義所需的輸入輸出量設(shè)計(jì)算5-0-2偽代碼與流程圖作為設(shè)計(jì)過(guò)程的一部分,有必要對(duì)欲實(shí)現(xiàn)的算法進(jìn)行描述。為便于你和他人理解,應(yīng)該以一種標(biāo)準(zhǔn)的形式對(duì)算法進(jìn)行描述,并且這個(gè)描述還應(yīng)該便于設(shè)計(jì)思路轉(zhuǎn)換為Fortran代碼。描述算法的形式稱為結(jié)構(gòu)(construction),利用這些結(jié)構(gòu)描述的算法稱為結(jié)構(gòu)化算法(constructedalgorithm)。當(dāng)算法在Fortran程序中實(shí)現(xiàn)時(shí),結(jié)果程序稱為結(jié)構(gòu)化程序(structuredprogram)。6*5-0-2偽代碼與流程圖作為設(shè)計(jì)過(guò)程的一部分,有必要對(duì)欲實(shí)5-0-2偽代碼與流程圖用來(lái)建立算法的結(jié)構(gòu)可以用兩種不同的方法描述:偽代碼和流程圖。偽代碼是Fortran語(yǔ)句和自然語(yǔ)言摻雜在一起的混合體,構(gòu)成類Fortran程序,對(duì)每個(gè)不同的想法或代碼段都有單獨(dú)的一行來(lái)表示。偽代碼具有靈活性和易修改的特點(diǎn)。偽代碼中經(jīng)常使用代替=號(hào),表示一個(gè)值存在于一個(gè)變量中,或者叫賦值。流程圖是描述算法的圖形化方法,修改比較麻煩。7*5-0-2偽代碼與流程圖用來(lái)建立算法的結(jié)構(gòu)可以用兩種不同的5-0-2偽代碼與流程圖8橢圓框表示算法的開(kāi)始和結(jié)束矩形框表示計(jì)算,并將計(jì)算結(jié)果賦給一個(gè)變量表示輸入或輸出操作兩種選擇中的選擇指向子程序的引用反復(fù)的或計(jì)數(shù)的循環(huán)回路*5-0-2偽代碼與流程圖8橢圓框表示算法的開(kāi)始和結(jié)束矩形框5-1IF語(yǔ)句5-1-1IF基本用法最基本的使用方法是由一個(gè)程序模塊所構(gòu)成,當(dāng)IF所賦值的邏輯判斷式成立時(shí),這模塊中的程序代碼才會(huì)執(zhí)行。IF(邏輯判斷式)THEN…….…….…….EndIF邏輯成立時(shí)才會(huì)執(zhí)行這里面的程序代碼*能夠在程序執(zhí)行當(dāng)中自動(dòng)選擇轉(zhuǎn)向、跳過(guò)某些程序模塊來(lái)執(zhí)行程序代碼,這是IF關(guān)鍵字的功能。5-1IF語(yǔ)句5-1-1IF基本用法IF(邏輯判[ex0501.f90]programex0501implicitnonereal(kind=4)::speedwrite(*,*)“speed:“!信息提示read(*,*)speed!讀入車速if(speed>100.0)then!speed>100時(shí)才會(huì)執(zhí)行下面這一行程序

write(*,*)"Slowdown."endifstopend*[ex0501.f90]programex0501*程序的核心部分:if(speed>100.0)then!speed>100時(shí)才會(huì)執(zhí)行下面這一行程序write(*,*)"Slowdown."endifstop從IF到ENDIF之間的程序算是一個(gè)區(qū)塊,IF中判斷式成立時(shí)會(huì)執(zhí)行這個(gè)區(qū)塊中的程序IF中判斷式不成立時(shí),會(huì)跳躍到ENDIF后的地方繼續(xù)執(zhí)行IF括號(hào)中的判斷式成立時(shí),如果所需要執(zhí)行的程序模塊只有一行程序代碼,可以把IF跟這行程序代碼寫(xiě)在同一行。上面程序中if到endif之間的內(nèi)容可以改寫(xiě)成下面這一行程序代碼:If(speed>100.0)write(*,*)“Slowdown”*程序的核心部分:從IF到ENDIF之間的程序算是一個(gè)區(qū)塊,125-1IF語(yǔ)句IF命令還可以搭配ELSE,用來(lái)賦值當(dāng)判斷式不成立時(shí),會(huì)去執(zhí)行某一段程序代碼。IF(邏輯判斷式)THEN…….…….ELSE…….…….ENDIF邏輯成立時(shí),執(zhí)行這一段的程序代碼邏輯不成立時(shí)則執(zhí)行這一段的程序代碼如果….那么就….,否則就…..。*125-1IF語(yǔ)句IF命令還可以搭配ELSE,用來(lái)賦值當(dāng)判ex0502programex0502implicitnonereal(kind=4)::height !記錄身高

real(kind=4)::weight !記錄體重

write(*,*)"height:"read(*,*)height !讀入身高

write(*,*)"weight:"read(*,*)weight !讀入體重

if(weight>height-100)then!如果體重大于身高減去100,會(huì)執(zhí)行下面的程序

write(*,*)"Toofat!"else !如果體重不大于身高減去100,會(huì)執(zhí)行下面的程序

write(*,*)"Undercontrol."endifstopendex0502programex0502145-1-2邏輯運(yùn)算IF命令需搭配邏輯表達(dá)式才能使用。邏輯運(yùn)算符號(hào):F90以上F77說(shuō)明==.EQ.判斷是否“相等”/=.NE.判斷是否“不相等”>.GT.判斷是否“大于”>=.GE.判斷是否“大于或等于”<.LT.判斷是否“小于”<=.LE.判斷是否“小于或等于”*145-1-2邏輯運(yùn)算IF命令需搭配邏輯表達(dá)式才能使用。F*PROGRAMex0501IMPLICITNONEREALspeedWRITE(*,*)"speed:"READ(*,*)speed IF(speed.GT.100)then!FORTRAN77要用縮寫(xiě).GT.代表大于">" write(*,*)"Slowdown."ENDIFSTOPEND[ex0501.for][ex0501.f90]*PROGRAMex0501[ex0501.for][ex165-1-2邏輯運(yùn)算邏輯表達(dá)式除了可以單純對(duì)兩個(gè)數(shù)字比較大小之外,還可以對(duì)兩個(gè)邏輯表達(dá)式間的關(guān)系來(lái)運(yùn)算。如:If(a>=80.and.A<90)then“.and.”是并且的意思。表示相互關(guān)系的集合運(yùn)算符:.AND.交集,如兩邊表達(dá)式都成立,整個(gè)表達(dá)式就成立。.OR.并集,兩邊表達(dá)式只要有一個(gè)成立,整個(gè)表達(dá)式就成立。.NOT.邏輯反向,如后面的表達(dá)式不成立,整個(gè)表達(dá)式就成立。.EQV.兩邊表達(dá)式的邏輯運(yùn)算結(jié)果相同時(shí),整個(gè)表達(dá)式就成立。.NEQV.兩邊表達(dá)式的邏輯運(yùn)算結(jié)果不同時(shí),整個(gè)表達(dá)式就成立。大于小于等式的運(yùn)算符號(hào)優(yōu)先級(jí)高于集合運(yùn)算符號(hào)*165-1-2邏輯運(yùn)算邏輯表達(dá)式除了可以單純對(duì)兩個(gè)數(shù)字比較*programex0503implicitnoneintegerrain,windspeedwrite(*,*)"Rain:"read(*,*)rainwrite(*,*)"Wind:"read(*,*)windspeedif(rain>=500.or.windspeed>=10)thenwrite(*,*)"停止上班上課"elsewrite(*,*)"照常上班上課"endifstopend[ex0503.f90]*programex0503[ex0503.f90]AB.NOT.

AA

.AND.

BA

.OR.

B.T..T..F..T..T..T..F..F..F..T..F..T..T..F..T..F..F..T..F..F.ABA

.EQV.

BA

.NEQV.

B.T..T..T..F..T..F..F..T..F..T..F..T..F..F..T..F.*集合運(yùn)算符的使用方法AB.NOT.

AA

.AND.

BA

.OR.

B.T..*集合運(yùn)算符的使用舉例【.AND.】10>5.AND.6<10 True2>1.AND.3>1 True10>5.AND.6<10 False1>2.AND.1>3 False【.OR.】1>5.OR.2<5 True2>1.OR.3>1 True1>5.OR.2>5 False【.NOT.】.NOT.3>5 True.NOT.1<2 False*集合運(yùn)算符的使用舉例【.AND.】【.OR.】【.NOT.*【.EQV.】1>3.EQV.2>3 True1<2.EQV.2<3 True1<2.EQV.2>3 False【.NEQV.】1>2.NEQV.2<3 True1<2.NEQV.2<3 False1>2.NEQV.2>3 False*【.EQV.】【.NEQV.】*If((A>=10).AND.(A<=20))

then…….!變量A>=10并且A<=20時(shí),也就是變量A在10~20之!間時(shí)條件成立。If((key==‘Y’).OR.(key==‘y’))then……!如果變量key等于字符Y或y時(shí),條件成立If(.NOT.(A==10))then……!變量A等于10時(shí),條件不成立。邏輯運(yùn)算可以通過(guò)利用AND/OR/NOT/EQV/NEQV/這幾個(gè)運(yùn)算符號(hào)連接出很長(zhǎng)的表達(dá)式,也可以用括號(hào)(

)括起來(lái)以確定他們的運(yùn)算先后順序。*If((A>=10).AND.(A<=20))th邏輯表達(dá)式中包含算術(shù)運(yùn)算符、關(guān)系運(yùn)算符和邏輯運(yùn)算符,它們的運(yùn)算優(yōu)先次序如下表:*運(yùn)算類別運(yùn)算符優(yōu)先級(jí)括號(hào)()1算術(shù)運(yùn)算**2*/3+-4關(guān)系運(yùn)算>(.GT.)>=(.GE.)<(.LT.)<=(.LE.)==(.EQ.)/=(.NE.)5邏輯運(yùn)算.NOT.6.AND.7.OR.8.EQV..NEQV.9邏輯表達(dá)式中包含算術(shù)運(yùn)算符、關(guān)系運(yùn)算符和邏輯運(yùn)算符,它們的運(yùn)235-1-2邏輯運(yùn)算程序代碼中可以使用邏輯表達(dá)式來(lái)設(shè)置邏輯變量的內(nèi)容Logical_var=A>B當(dāng)A的數(shù)值大于B時(shí),logical_var這個(gè)邏輯變量會(huì)被設(shè)定成“真”(.TRUE.),否則會(huì)被設(shè)定為“假”(.FALSE.)*使用IF時(shí),可以先把邏輯運(yùn)算的結(jié)果存放到邏輯變量中,再利用邏輯變量來(lái)做條件判斷。235-1-2邏輯運(yùn)算程序代碼中可以使用邏輯表達(dá)式來(lái)設(shè)置邏*programex0504implicitnoneintegerrain,windspeedlogicalr,wwrite(*,*)"Rain:"read(*,*)rainwrite(*,*)"Wind:"read(*,*)windspeed

r=(rain>=500)!如果rain>=150,r=.true,不然r=.false.

w=(windspeed>=10)!如果windspeed>=10,w=.true,不然w=.false.if(r.or.w)then!只要r或w有一個(gè)值是true就成立

write(*,*)"停止上班上課"elsewrite(*,*)"照常上班上課"endifstopend[ex0504.f90]*programex0504[ex0504.f90]255-1-3

多重判斷IF-ELSEIF多重判斷可一次列出多個(gè)條件及多個(gè)程序模塊IF(條件1)then…….…….elseif(條件2)then…….…….elseif(條件3)then…….…….elseif(條件4)then…….…….else…….Endif條件1成立時(shí),執(zhí)行這個(gè)模塊程序條件2成立時(shí),執(zhí)行這個(gè)模塊程序條件3成立時(shí),執(zhí)行這個(gè)模塊程序條件4成立時(shí),執(zhí)行這個(gè)模塊程序Else這個(gè)模塊可以省略每個(gè)條件都不成立時(shí),才執(zhí)行這個(gè)模塊程序*255-1-3多重判斷IF-ELSEIF多重判斷可一次*programex0505implicitnoneintegerscorecharactergrade

write(*,*)"Score:"read(*,*)scoreif(score>=90.and.score<=100)thengrade='A'elseif(score>=80.and.score<90)thengrade='B'elseif(score>=70.and.score<80)thengrade='C'elseif(score>=60.and.score<70)thengrade='D'elseif(score>=0.and.score<60)thengrade='E’else!score<0或score>100的不合理情形

grade='?‘endifwrite(*,"('Grade:',A1)")gradestopend[ex0505.f90]*programex0505if(score>=90*因?yàn)镮F-ELSEIF所組合出來(lái)的多重判斷式只會(huì)執(zhí)行第一個(gè)符合條件的程序模塊,執(zhí)行完后就跳到ENDIF后繼續(xù)執(zhí)行程序,每個(gè)條件都不成立時(shí)才會(huì)執(zhí)行ELSE中的模塊。所以EX0505可以簡(jiǎn)化為:programex0506implicitnoneintegerscorecharactergrade write(*,*)"Score:"read(*,*)scoreif(score>100)thengrade='?'elseif(score>=90)then!會(huì)執(zhí)行到此,代表score<=100grade='A'elseif(score>=80)then!會(huì)執(zhí)行到此,代表score<90grade='B'elseif(score>=70)then!會(huì)執(zhí)行到此,代表score<80grade='C'elseif(score>=60)then!會(huì)執(zhí)行到此,代表score<70grade='D'elseif(score>=0)then!會(huì)執(zhí)行到此,代表score<60grade='E‘else!會(huì)執(zhí)行到此,代表score<0grade='?‘endifwrite(*,"('Grade:',A1)")gradestopend[ex0506.f90]*因?yàn)镮F-ELSEIF所組合出來(lái)的多重判斷式只會(huì)執(zhí)行第一*利用多個(gè)獨(dú)立的IF語(yǔ)句也能實(shí)現(xiàn)多重判斷的效果如:判別成績(jī)等級(jí)if(score>=90.and.score<=100)grade='A'if(score>=80.and.score<90)grade='B'if(score>=70.and.score<80)grade='C'if(score>=60.and.score<70)grade='D'if(score>=0.and.score<60)grade='E'if(score>100.or.score<0)grade='?'write(*,"('Grade:',A1)")gradestopendprogramex0507implicitnoneintegerscorecharactergrade

write(*,*)"Score:"read(*,*)score[ex0507.f90]*利用多個(gè)獨(dú)立的IF語(yǔ)句也能實(shí)現(xiàn)多重判斷的效果program295-1-3

多重判斷IF-ELSEIFIf(score>=90)grade=‘A’If(score>=80)grade=‘B’If(score>=70)grade=‘C’If(score>=60)grade=‘D’If(score>=0)grade=‘E’If(score>=100.or.score<0)grade=‘?’*如果把EX0507.F90中的6個(gè)IF語(yǔ)句改為如下的樣子執(zhí)行后會(huì)發(fā)現(xiàn),永遠(yuǎn)都只能得到“E”或“?”兩種結(jié)果。295-1-3多重判斷IF-ELSEIFIf(sc例子1:二次方程式求解設(shè)計(jì)并并編寫(xiě)程序,無(wú)論是何種類型,都可以求出二次方程式的根。定義輸入輸出 ax2+bx+c=0 提示用戶輸入系數(shù)a,b,c設(shè)計(jì)算法: 讀取輸入數(shù)據(jù),計(jì)算根,輸出根*例子1:二次方程式求解設(shè)計(jì)并并編寫(xiě)程序,無(wú)論是何種類型,都可例子1:二次方程式求解!Datadictionary:declarevariabletypes,definitions,&units

REAL::a!Coefficientofx**2termofequationREAL::b!CoefficientofxtermofequationREAL::c!ConstanttermofequationREAL::discriminant!DiscriminantoftheequationREAL::imag_part

!Imaginarypartofequation(forcomplexroots)REAL::real_part!Realpartofequation(forcomplexroots)REAL::x1!Firstsolutionofequation(forrealroots)REAL::x2!Secondsolutionofequation(forrealroots)*例子1:二次方程式求解!Datadictionary:例子1:二次方程式求解!PrompttheuserforthecoefficientsoftheequationWRITE(*,*)'Thisprogramsolvesfortherootsofaquadratic'WRITE(*,*)'equationoftheformA*X**2+B*X+C=0.'WRITE(*,*)'EnterthecoefficientsA,B,andC:'READ(*,*)a,b,c!EchobackcoefficientsWRITE(*,*)'ThecoefficientsA,B,andCare:',a,b,c!Calculatediscriminantdiscriminant=b**2-4.*a*c*例子1:二次方程式求解!Prompttheuserf例子1:二次方程式求解!Solvefortheroots,dependinguponthevalueofthediscriminantIF(discriminant>0.)THEN!therearetworealroots,so...x1=(-b+sqrt(discriminant))/(2.*a)x2=(-b-sqrt(discriminant))/(2.*a)WRITE(*,*)'Thisequationhastworealroots:'WRITE(*,*)'X1=',x1WRITE(*,*)'X2=',x2ELSEIF(discriminant<0.)THEN!therearecomplexroots,so...real_part=(-b)/(2.*a)imag_part=sqrt(abs(discriminant))/(2.*a)WRITE(*,*)'Thisequationhascomplexroots:'WRITE(*,*)'X1=',real_part,'+i',imag_partWRITE(*,*)'X2=',real_part,'-i',imag_partELSEIF(discriminant==0.)THEN!thereisonerepeatedroot,so...x1=(-b)/(2.*a)WRITE(*,*)'Thisequationhastwoidenticalrealroots:'WRITE(*,*)'X1=X2=',x1ENDIFENDPROGRAMroots*例子1:二次方程式求解!Solvefortheroo345-1-4

嵌套IF語(yǔ)句IF(……)THEN←第1層IF開(kāi)始IF(……)THEN←第2層IF開(kāi)始IF(……)THEN←第3層IF開(kāi)始ELSEIF(……)THEN ELSE ENDIF←第3層IF結(jié)束ENDIF←第2層IF結(jié)束ENDIF←第1層IF結(jié)束*345-1-4嵌套IF語(yǔ)句IF(……)THEN*[ex0508.f90]嵌套IF舉例:讀入坐標(biāo)點(diǎn)(x,y),判斷其落在哪個(gè)象限。elseif(x<0)thenif(y>0)then!x<0,y>0 ans=2elseif(y<0)then!x<0,y<0ans=3else!x<0,y=0 ans=0endifelse!x=0,y=任意數(shù)

ans=0endifif(ans/=0)then!ans不為0時(shí),代表有解

write(*,"('第',I1,'象限')")anselsewrite(*,*)"落在軸上"endifstopendprogramex0508implicitnone

realx,y

integerans

write(*,*)"Input(x,y)"

read(*,*)x,y

if(x>0)then

if(y>0)then!x>0,y>0

ans=1

elseif(y<0)then!x>0,y<0

ans=4

else!x>0,y=0

ans=0endif*[ex0508.f90]嵌套IF舉例:讀入坐標(biāo)點(diǎn)(x,y)*5-1-5

命名的IF結(jié)構(gòu)可以給IF結(jié)構(gòu)指定一個(gè)名稱。對(duì)IF結(jié)構(gòu)中的所有組成部分進(jìn)行命名,可以快速地指明某一特定的ELSE或ELSEIF語(yǔ)句屬于那個(gè)IF結(jié)構(gòu)。可使程序員的注意力更加清晰。帶有名稱的IF結(jié)構(gòu)的形式:[名稱:]IF(邏輯表達(dá)式_1)THEN語(yǔ)句1語(yǔ)句2……ELSEIF(邏輯表達(dá)式_2)THEN[名稱]語(yǔ)句1語(yǔ)句2……ELSE[名稱]語(yǔ)句1語(yǔ)句2……ENDIF[名稱]*5-1-5命名的IF結(jié)構(gòu)可以給IF結(jié)構(gòu)指定一個(gè)名稱。對(duì)I375-2浮點(diǎn)數(shù)及字符的邏輯運(yùn)算5-2-1浮點(diǎn)數(shù)的邏輯判斷使用浮點(diǎn)數(shù)做邏輯運(yùn)算時(shí),要避免使用“等于”的判斷使用浮點(diǎn)數(shù)計(jì)算,有效位數(shù)是有限的,難免會(huì)出現(xiàn)計(jì)算上的誤差,理想中的等號(hào)不一定會(huì)成立例:EX0509.f90浮點(diǎn)數(shù)的計(jì)算誤差經(jīng)常發(fā)生,在判斷式中要給誤差預(yù)留一點(diǎn)空間例:EX0510.f90*375-2浮點(diǎn)數(shù)及字符的邏輯運(yùn)算5-2-1浮點(diǎn)數(shù)的邏輯判*[ex0509.f90]programex0509implicitnonereal::areal::b=3.0a=SQRT(b)**2-b!理論上a應(yīng)該要等于0if(a==0.0)then write(*,*)"a等于0"elsewrite(*,*)"a不等于0"endifstopend*[ex0509.f90]programex0509*programex0509_2implicitnonereal::areal::b=4.0a=SQRT(b)**2-b!理論上a應(yīng)該要等于0if(a==0.0)then write(*,*)"a等于0"elsewrite(*,*)"a不等于0"endifstopend*programex0509_2*[ex0510.f90]programex0510implicitnonereal::areal::b=3.0real,parameter::e=0.0001!設(shè)置誤差范圍a=SQRT(b)**2-b!理論上a應(yīng)該要等于0

if(abs(a-0.0)<=e)then write(*,*)"a等于0"elsewrite(*,*)"a不等于0"endifstopend*[ex0510.f90]programex0510415-2-2

字符的邏輯判斷字符也可比較大小,根據(jù)是比較它們的字符碼,個(gè)人計(jì)算機(jī)中比較字符用字符的ASCⅡ碼。*‘a(chǎn)’<‘b’!因?yàn)閍的ASCⅡ碼為97,b的ASCⅡ碼為98‘A’<‘a(chǎn)’!因?yàn)锳的ASCⅡ碼為97,a的ASCⅡ碼為98“abc”<“bcd”!根據(jù)字母順序來(lái)比較,字符串“abc”的第1個(gè)字符小于字符!串“bcd”的第1個(gè)字符“abc”<“abcd”!根據(jù)字母順序來(lái)比較,兩個(gè)字符串的前3個(gè)字符都一樣!但字符串“abcd”比字符串“abc”多了一個(gè)字符。415-2-2字符的邏輯判斷字符也可比較大小,根據(jù)是比較它*[ex0511.f90]programex0511implicitnonecharacter(len=20)::str1,str2characterrelationwrite(*,*)"String1:"read(*,"(A20)")str1write(*,*)"String2:"read(*,"(A20)")str2

if(str1>str2)thenrelation='>'elseif(str1==str2)thenrelation='='elserelation='<'endifwrite(*,"('String1',A1,'String2')")relation

stopend*[ex0511.f90]programex0511if435-3SELECTCASE語(yǔ)句Selectcase(變量)case(數(shù)值1)…….…….case(數(shù)值2)…….…….case(數(shù)值n)…….…….casedefault…….Endif放入所要判斷的變量變量等于數(shù)值1時(shí),執(zhí)行此程序段變量等于數(shù)值2時(shí),執(zhí)行此程序段變量等于數(shù)值n時(shí),執(zhí)行此程序段變量不等于任何數(shù)值時(shí),執(zhí)行此程序段*435-3SELECTCASE語(yǔ)句Selectcas*case里的冒號(hào)前后放入兩個(gè)數(shù)字代表在這兩個(gè)數(shù)字之間的所有數(shù)值。case的括號(hào)里面可以用逗號(hào)來(lái)放多個(gè)變量。case(1) !變量=1時(shí),會(huì)執(zhí)行這個(gè)case中的程序模塊case(1:5) !1<=變量<=5時(shí),會(huì)執(zhí)行這個(gè)case中的程序模塊case(1:) !1<=變量時(shí),會(huì)執(zhí)行這個(gè)case中的程序模塊case(:5) !變量<=5時(shí),會(huì)執(zhí)行這個(gè)case中的程序模塊case(1,3,5) !變量等于1或3或5時(shí),會(huì)執(zhí)行這個(gè)case中的程序模塊*case里的冒號(hào)前后放入兩個(gè)數(shù)字代表在這兩個(gè)數(shù)字之間的所有*[ex0512.f90]programex0512implicitnoneintegerscorecharactergradewrite(*,*)"Score:"read(*,*)scoreselectcase(score)case(90:100)!90到100分之間

grade='A'case(80:89)!80到89分之間

grade='B'

case(70:79)!70到79分之間

grade='C'

case(60:69)!60到69分之間

grade='D'

case(0:59)!0到59分之間

grade='E'

casedefault!其它情形

grade='?'

endselect

write(*,"('Grade:',A1)")grade

stopend使用SELECT-CASE語(yǔ)句寫(xiě)的判斷分?jǐn)?shù)等級(jí)的程序:*[ex0512.f90]programex0512ca465-3SELECTCASE語(yǔ)句使用SELECTCASE來(lái)取代某些使用IF-ELSEIF的多重語(yǔ)句,會(huì)讓代碼看起來(lái)比較簡(jiǎn)潔。SELECTCASE有一些限制:只能使用整數(shù),字符和邏輯變量,不能使用浮點(diǎn)數(shù)和復(fù)數(shù)。每個(gè)case中所使用的數(shù)值必須是固定的常量,不能使用變量。*465-3SELECTCASE語(yǔ)句使用SELECTC*integer::a=65integer::b=97integer,parameter::c=87read(*,*)keyselectcase(key)case(a)!這一行程序錯(cuò)誤,case中不能使用變量……case(b)!這一行程序錯(cuò)誤,case中不能使用變量……case(c)!c是聲明成parameter的常量,可以使用……endselect*integer::a=65*programex0513implicitnonereala,b,anscharacteroperator

read(*,*)aread(*,“(A1)”)operator!不使用格式有些機(jī)器會(huì) !讀不到除號(hào)"/"read(*,*)bselectcase(operator)case('+')ans=a+b*programex0513*

case('-')ans=a-bcase('*')ans=a*bcase('/')ans=a/bcasedefault!輸入其它符號(hào)不處理

write(*,"('Unknownoperator',A1)")operator stop!結(jié)束程序

endselectwrite(*,"(F6.2,A1,F6.2,'=',F6.2)")a,operator,b,ansstopend*case('-')505-4其他流程控制5-4-1GOTO從Fortran77之前就流傳下來(lái)的古老的“跳轉(zhuǎn)”語(yǔ)句不建議使用使用GOTO會(huì)使編寫(xiě)的程序在結(jié)構(gòu)上變亂,導(dǎo)致程序代碼難以閱讀,這里介紹是希望大家能看懂一些用古典風(fēng)格編寫(xiě)的程序。GOTO命令就是提供程序員一個(gè)任意跳躍到所賦值“行代碼”的那一行程序位置來(lái)執(zhí)行程序的能力*505-4其他流程控制5-4-1GOTO**判斷一個(gè)人是否過(guò)重的程序ex0502.f90使用GOTO改寫(xiě)后的形式。[ex0514.for] PROGRAMex0514 IMPLICITNONE REALheight!記錄身高

REALweight!記錄體重

WRITE(*,*)"height:" READ(*,*)height!讀入身高

WRITE(*,*)"weight:" READ(*,*)weight!讀入體重

IF(weight>height-100)GOTO200 !上面不成立,沒(méi)有跳到200才會(huì)執(zhí)行這里100 WRITE(*,*)"Undercontrol." GOTO300!下一行不能執(zhí)行所以要跳到300.200 WRITE(*,*)"Toofat!”

300 STOP END*判斷一個(gè)人是否過(guò)重的程序ex0502.f90使用GOTO改*使用GOTO編寫(xiě)的“循環(huán)”[ex0515.for]PROGRAMex0515IMPLICITNONEINTEGERIINTEGERNPARAMETER(N=10)DATAI/0/10WRITE(*,'(1X,A3,I2)')'I=',II=I+1IF(I.LT.N)GOTO10STOPEND*使用GOTO編寫(xiě)的“循環(huán)”[ex0515.for]PRO*GOTO還有一種用法,程序代碼中可以一次提供好幾個(gè)跳躍點(diǎn),根據(jù)GOTO后面的算式來(lái)選擇要使用哪一個(gè)跳躍點(diǎn)。稱為計(jì)算GOTO語(yǔ)句。形式:goto(label1,label2,label3,…,lablek),int_exprlabel1到lablek是可執(zhí)行語(yǔ)句的行代碼。int_expr表達(dá)式計(jì)算出一個(gè)1和k之間的整形數(shù)。如果int_expr的值為1,轉(zhuǎn)去行代碼為label1的語(yǔ)句執(zhí)行,int_expr的值為k,轉(zhuǎn)去行代碼為labelk的語(yǔ)句執(zhí)行。如果label的值小于1或者大于k,將引發(fā)錯(cuò)誤。*GOTO還有一種用法,程序代碼中可以一次提供好幾個(gè)跳躍點(diǎn),* PROGRAMex0516 IMPLICITNONE INTEGERI INTEGERN DATAI,N/2,1/C I/N=1時(shí)GOTO10,I/N=2時(shí)GOTO20,I/N=3時(shí)GOTO30C I/N<1或I/N>3時(shí)不做GOTO,直接執(zhí)行下一行

GOTO(10,20,30)I/N10 WRITE(*,*)'I/N=1' GOTO10020 WRITE(*,*)'I/N=2' GOTO10030 WRITE(*,*)'I/N=3‘100 STOP END[ex0516.for]* PROGRAMex0516[ex0516.for]*IF判斷還有一種叫做算術(shù)判斷的方法,做法和GOTO類似。形式:if(arithmetic_expression)label1,label2,label3其中arithmetic_expression可以是任何整形、實(shí)型算術(shù)表達(dá)式。label1,label2和label3是可執(zhí)行語(yǔ)句的行代碼。當(dāng)arithmetic_expression的值為負(fù)時(shí),執(zhí)行行代碼為label1的語(yǔ)句,當(dāng)arithmetic_expression的值為0時(shí),執(zhí)行行代碼為label2的語(yǔ)句,當(dāng)arithmetic_expression的值為正時(shí),執(zhí)行行代碼為label的語(yǔ)句。5-4-2IF與GOTO的聯(lián)用<0 =0 >0*IF判斷還有一種叫做算術(shù)判斷的方法,做法和GOTO類似。*[ex0517.for] PROGRAMex0517 IMPLICITNONE REALA,B REALC DATAA,B/2.0,1.0/ C=A-BC C<0就GOTO10,C=0就GOTO20,C>0就GOTO30 IF(C) 10,20,3010 WRITE(*,*)‘A<B' GOTO4020 WRITE(*,*)A=B' GOTO4030 WRITE(*,*)‘A>B‘40 STOP END*[ex0517.for] PROGRAMex0517575-4-3

PAUSE,CONTINUE,STOPPAUSE:暫停執(zhí)行,直到用戶按下Enter鍵才會(huì)繼續(xù)執(zhí)行。CONTINUE:繼續(xù)向下執(zhí)行程序,f90后很少使用STOP:結(jié)束程序執(zhí)行*575-4-3PAUSE,CONTINUE,STOPPAU585-5二進(jìn)制的邏輯運(yùn)算二進(jìn)制的邏輯運(yùn)算和IF中的邏輯判斷式不太相同,比較接近單純的數(shù)學(xué)運(yùn)算。

0.and.0=00.and.1=0

1.and.0=01.and.1=1F90的庫(kù)函數(shù):IAND()

IOR()用來(lái)做二進(jìn)制的AND和OR運(yùn)算,是把輸入的兩個(gè)整數(shù)中,同樣位置的位進(jìn)行邏輯運(yùn)算。a=2 !a等于二進(jìn)制的010b=4 !b等于二進(jìn)制的100c=iand(a,b) !c=0,也就是二進(jìn)制的000c=ior(a,b) !c=6,也就是二進(jìn)制的110*585-5二進(jìn)制的邏輯運(yùn)算二進(jìn)制的邏輯運(yùn)算和IF中的邏輯判*

integer::a

a=B“10”!a=2

a=O“10”!a=8

a=Z“10”!a=16Fortran90在設(shè)置整數(shù)時(shí),可以不用十進(jìn)制的方法,而使用其他進(jìn)制的方法來(lái)做設(shè)置。把數(shù)字用雙引號(hào)括起來(lái),最前面加上B代表這段數(shù)字是二進(jìn)制數(shù)字,同理最前面用O代表要使用八進(jìn)制,用Z代表要使用16進(jìn)制。*integer::aFortran90在設(shè)置整Fortran程序的調(diào)試編寫(xiě)包含分支和循環(huán)結(jié)構(gòu)的程序比編寫(xiě)簡(jiǎn)單的順序結(jié)構(gòu)程序更容易犯錯(cuò)誤。如果只是發(fā)現(xiàn)輸出值有錯(cuò)誤,如何定位排錯(cuò)?最好方法:符號(hào)調(diào)試器,但是需要查看系統(tǒng)手冊(cè)以便如何使用。一般方法:在程序中插入write語(yǔ)句,在一些關(guān)鍵位置點(diǎn)輸出變量的值,以觀察程序中間結(jié)果與預(yù)期結(jié)果的差異。如果是IF塊的問(wèn)題:重點(diǎn)檢查邏輯表達(dá)式。另外一個(gè)常見(jiàn)錯(cuò)誤:實(shí)數(shù)型變量的等值測(cè)試。Fortran程序的調(diào)試編寫(xiě)包含分支和循環(huán)結(jié)構(gòu)的程序比編寫(xiě)簡(jiǎn)61作業(yè)P98

1、2、3、4*5、一束光線從折射率為n1的區(qū)域穿透到折射率為n2的另一個(gè)區(qū)域,光線被折射,折射的角度由斯涅爾定律給出。編寫(xiě)Fortran程序,給定區(qū)域1中的入射角1和折射率n1、n2,計(jì)算光束在區(qū)域2中的出射角度2。計(jì)算時(shí)以空氣和水為例,并大致估計(jì)一下發(fā)生全反射的入射角度??梢愿鶕?jù)n1=1.0,n2=1.7測(cè)試不同的角度,并適當(dāng)變化n2值的大小,看看全反射角的變化。61作業(yè)P98*5、一束光線從折射率為n1的區(qū)域穿透到折射率Fortran95程序設(shè)計(jì)彭國(guó)倫編著第5章流程控制與邏輯運(yùn)算Fortran95程序設(shè)計(jì)彭國(guó)倫編著第5章流程控制與邏5-0-1自頂向下設(shè)計(jì)當(dāng)給定一個(gè)新問(wèn)題,如上一章的作業(yè),一個(gè)很自然的傾向就是坐在電腦前面開(kāi)始編程,而不是“浪費(fèi)”時(shí)間進(jìn)行思考。對(duì)于很小的問(wèn)題,這種飛躍式的編程方法通常都是可行的?,F(xiàn)實(shí)世界中,問(wèn)題一般都是大型的,如果嘗試采用這種方法,程序員將陷入絕望的困境。在編寫(xiě)程序解決大型問(wèn)題之前,徹底考慮一下問(wèn)題以及將要采取的方法是非常值得的。63*5-0-1自頂向下設(shè)計(jì)當(dāng)給定一個(gè)新問(wèn)題,如上一章的作業(yè),一個(gè)5-0-1自頂向下設(shè)計(jì)自頂向下設(shè)計(jì)就是一個(gè)過(guò)程:

從大型任務(wù)開(kāi)始,將其分解為更小的、更容易理解的塊(子任務(wù)),執(zhí)行所需任務(wù)的一部分。

如果需要,每個(gè)子任務(wù)還可以依次再細(xì)分為更小的子任務(wù)。 對(duì)每一個(gè)塊單獨(dú)編碼和測(cè)試,直到每一個(gè)子任務(wù)都能夠獨(dú)立的正確工作。 將子任務(wù)集成為一個(gè)完整的任務(wù)。64*5-0-1自頂向下設(shè)計(jì)自頂向下設(shè)計(jì)就是一個(gè)過(guò)程:3*5-0-1自頂向下設(shè)計(jì)清楚的陳述要解決的問(wèn)題定義程序所需的輸入和程序產(chǎn)生的輸出。設(shè)計(jì)要在程序中實(shí)現(xiàn)的算法。將算法轉(zhuǎn)換為Fortran語(yǔ)句。測(cè)設(shè)完成的Fortran程序。65*5-0-1自頂向下設(shè)計(jì)清楚的陳述要解決的問(wèn)題4*5-0-1自頂向下設(shè)計(jì)開(kāi)始表明問(wèn)題定義所需的輸入輸出量設(shè)計(jì)算法將算法轉(zhuǎn)換為Fortran語(yǔ)句測(cè)試完成的Fortran程序結(jié)束子任務(wù)單元測(cè)試連續(xù)構(gòu)建子任務(wù)子任務(wù)加入主程序Alpha版本Beta版本正式版本66*5-0-1自頂向下設(shè)計(jì)開(kāi)始表明問(wèn)題定義所需的輸入輸出量設(shè)計(jì)算5-0-2偽代碼與流程圖作為設(shè)計(jì)過(guò)程的一部分,有必要對(duì)欲實(shí)現(xiàn)的算法進(jìn)行描述。為便于你和他人理解,應(yīng)該以一種標(biāo)準(zhǔn)的形式對(duì)算法進(jìn)行描述,并且這個(gè)描述還應(yīng)該便于設(shè)計(jì)思路轉(zhuǎn)換為Fortran代碼。描述算法的形式稱為結(jié)構(gòu)(construction),利用這些結(jié)構(gòu)描述的算法稱為結(jié)構(gòu)化算法(constructedalgorithm)。當(dāng)算法在Fortran程序中實(shí)現(xiàn)時(shí),結(jié)果程序稱為結(jié)構(gòu)化程序(structuredprogram)。67*5-0-2偽代碼與流程圖作為設(shè)計(jì)過(guò)程的一部分,有必要對(duì)欲實(shí)5-0-2偽代碼與流程圖用來(lái)建立算法的結(jié)構(gòu)可以用兩種不同的方法描述:偽代碼和流程圖。偽代碼是Fortran語(yǔ)句和自然語(yǔ)言摻雜在一起的混合體,構(gòu)成類Fortran程序,對(duì)每個(gè)不同的想法或代碼段都有單獨(dú)的一行來(lái)表示。偽代碼具有靈活性和易修改的特點(diǎn)。偽代碼中經(jīng)常使用代替=號(hào),表示一個(gè)值存在于一個(gè)變量中,或者叫賦值。流程圖是描述算法的圖形化方法,修改比較麻煩。68*5-0-2偽代碼與流程圖用來(lái)建立算法的結(jié)構(gòu)可以用兩種不同的5-0-2偽代碼與流程圖69橢圓框表示算法的開(kāi)始和結(jié)束矩形框表示計(jì)算,并將計(jì)算結(jié)果賦給一個(gè)變量表示輸入或輸出操作兩種選擇中的選擇指向子程序的引用反復(fù)的或計(jì)數(shù)的循環(huán)回路*5-0-2偽代碼與流程圖8橢圓框表示算法的開(kāi)始和結(jié)束矩形框5-1IF語(yǔ)句5-1-1IF基本用法最基本的使用方法是由一個(gè)程序模塊所構(gòu)成,當(dāng)IF所賦值的邏輯判斷式成立時(shí),這模塊中的程序代碼才會(huì)執(zhí)行。IF(邏輯判斷式)THEN…….…….…….EndIF邏輯成立時(shí)才會(huì)執(zhí)行這里面的程序代碼*能夠在程序執(zhí)行當(dāng)中自動(dòng)選擇轉(zhuǎn)向、跳過(guò)某些程序模塊來(lái)執(zhí)行程序代碼,這是IF關(guān)鍵字的功能。5-1IF語(yǔ)句5-1-1IF基本用法IF(邏輯判[ex0501.f90]programex0501implicitnonereal(kind=4)::speedwrite(*,*)“speed:“!信息提示read(*,*)speed!讀入車速if(speed>100.0)then!speed>100時(shí)才會(huì)執(zhí)行下面這一行程序

write(*,*)"Slowdown."endifstopend*[ex0501.f90]programex0501*程序的核心部分:if(speed>100.0)then!speed>100時(shí)才會(huì)執(zhí)行下面這一行程序write(*,*)"Slowdown."endifstop從IF到ENDIF之間的程序算是一個(gè)區(qū)塊,IF中判斷式成立時(shí)會(huì)執(zhí)行這個(gè)區(qū)塊中的程序IF中判斷式不成立時(shí),會(huì)跳躍到ENDIF后的地方繼續(xù)執(zhí)行IF括號(hào)中的判斷式成立時(shí),如果所需要執(zhí)行的程序模塊只有一行程序代碼,可以把IF跟這行程序代碼寫(xiě)在同一行。上面程序中if到endif之間的內(nèi)容可以改寫(xiě)成下面這一行程序代碼:If(speed>100.0)write(*,*)“Slowdown”*程序的核心部分:從IF到ENDIF之間的程序算是一個(gè)區(qū)塊,735-1IF語(yǔ)句IF命令還可以搭配ELSE,用來(lái)賦值當(dāng)判斷式不成立時(shí),會(huì)去執(zhí)行某一段程序代碼。IF(邏輯判斷式)THEN…….…….ELSE…….…….ENDIF邏輯成立時(shí),執(zhí)行這一段的程序代碼邏輯不成立時(shí)則執(zhí)行這一段的程序代碼如果….那么就….,否則就…..。*125-1IF語(yǔ)句IF命令還可以搭配ELSE,用來(lái)賦值當(dāng)判ex0502programex0502implicitnonereal(kind=4)::height !記錄身高

real(kind=4)::weight !記錄體重

write(*,*)"height:"read(*,*)height !讀入身高

write(*,*)"weight:"read(*,*)weight !讀入體重

if(weight>height-100)then!如果體重大于身高減去100,會(huì)執(zhí)行下面的程序

write(*,*)"Toofat!"else !如果體重不大于身高減去100,會(huì)執(zhí)行下面的程序

write(*,*)"Undercontrol."endifstopendex0502programex0502755-1-2邏輯運(yùn)算IF命令需搭配邏輯表達(dá)式才能使用。邏輯運(yùn)算符號(hào):F90以上F77說(shuō)明==.EQ.判斷是否“相等”/=.NE.判斷是否“不相等”>.GT.判斷是否“大于”>=.GE.判斷是否“大于或等于”<.LT.判斷是否“小于”<=.LE.判斷是否“小于或等于”*145-1-2邏輯運(yùn)算IF命令需搭配邏輯表達(dá)式才能使用。F*PROGRAMex0501IMPLICITNONEREALspeedWRITE(*,*)"speed:"READ(*,*)speed IF(speed.GT.100)then!FORTRAN77要用縮寫(xiě).GT.代表大于">" write(*,*)"Slowdown."ENDIFSTOPEND[ex0501.for][ex0501.f90]*PROGRAMex0501[ex0501.for][ex775-1-2邏輯運(yùn)算邏輯表達(dá)式除了可以單純對(duì)兩個(gè)數(shù)字比較大小之外,還可以對(duì)兩個(gè)邏輯表達(dá)式間的關(guān)系來(lái)運(yùn)算。如:If(a>=80.and.A<90)then“.and.”是并且的意思。表示相互關(guān)系的集合運(yùn)算符:.AND.交集,如兩邊表達(dá)式都成立,整個(gè)表達(dá)式就成立。.OR.并集,兩邊表達(dá)式只要有一個(gè)成立,整個(gè)表達(dá)式就成立。.NOT.邏輯反向,如后面的表達(dá)式不成立,整個(gè)表達(dá)式就成立。.EQV.兩邊表達(dá)式的邏輯運(yùn)算結(jié)果相同時(shí),整個(gè)表達(dá)式就成立。.NEQV.兩邊表達(dá)式的邏輯運(yùn)算結(jié)果不同時(shí),整個(gè)表達(dá)式就成立。大于小于等式的運(yùn)算符號(hào)優(yōu)先級(jí)高于集合運(yùn)算符號(hào)*165-1-2邏輯運(yùn)算邏輯表達(dá)式除了可以單純對(duì)兩個(gè)數(shù)字比較*programex0503implicitnoneintegerrain,windspeedwrite(*,*)"Rain:"read(*,*)rainwrite(*,*)"Wind:"read(*,*)windspeedif(rain>=500.or.windspeed>=10)thenwrite(*,*)"停止上班上課"elsewrite(*,*)"照常上班上課"endifstopend[ex0503.f90]*programex0503[ex0503.f90]AB.NOT.

AA

.AND.

BA

.OR.

B.T..T..F..T..T..T..F..F..F..T..F..T..T..F..T..F..F..T..F..F.ABA

.EQV.

BA

.NEQV.

B.T..T..T..F..T..F..F..T..F..T..F..T..F..F..T..F.*集合運(yùn)算符的使用方法AB.NOT.

AA

.AND.

BA

.OR.

B.T..*集合運(yùn)算符的使用舉例【.AND.】10>5.AND.6<10 True2>1.AND.3>1 True10>5.AND.6<10 False1>2.AND.1>3 False【.OR.】1>5.OR.2<5 True2>1.OR.3>1 True1>5.OR.2>5 False【.NOT.】.NOT.3>5 True.NOT.1<2 False*集合運(yùn)算符的使用舉例【.AND.】【.OR.】【.NOT.*【.EQV.】1>3.EQV.2>3 True1<2.EQV.2<3 True1<2.EQV.2>3 False【.NEQV.】1>2.NEQV.2<3 True1<2.NEQV.2<3 False1>2.NEQV.2>3 False*【.EQV.】【.NEQV.】*If((A>=10).AND.(A<=20))

then…….!變量A>=10并且A<=20時(shí),也就是變量A在10~20之!間時(shí)條件成立。If((key==‘Y’).OR.(key==‘y’))then……!如果變量key等于字符Y或y時(shí),條件成立If(.NOT.(A==10))then……!變量A等于10時(shí),條件不成立。邏輯運(yùn)算可以通過(guò)利用AND/OR/NOT/EQV/NEQV/這幾個(gè)運(yùn)算符號(hào)連接出很長(zhǎng)的表達(dá)式,也可以用括號(hào)(

)括起來(lái)以確定他們的運(yùn)算先后順序。*If((A>=10).AND.(A<=20))th邏輯表達(dá)式中包含算術(shù)運(yùn)算符、關(guān)系運(yùn)算符和邏輯運(yùn)算符,它們的運(yùn)算優(yōu)先次序如下表:*運(yùn)算類別運(yùn)算符優(yōu)先級(jí)括號(hào)()1算術(shù)運(yùn)算**2*/3+-4關(guān)系運(yùn)算>(.GT.)>=(.GE.)<(.LT.)<=(.LE.)==(.EQ.)/=(.NE.)5邏輯運(yùn)算.NOT.6.AND.7.OR.8.EQV..NEQV.9邏輯表達(dá)式中包含算術(shù)運(yùn)算符、關(guān)系運(yùn)算符和邏輯運(yùn)算符,它們的運(yùn)845-1-2邏輯運(yùn)算程序代碼中可以使用邏輯表達(dá)式來(lái)設(shè)置邏輯變量的內(nèi)容Logical_var=A>B當(dāng)A的數(shù)值大于B時(shí),logical_var這個(gè)邏輯變量會(huì)被設(shè)定成“真”(.TRUE.),否則會(huì)被設(shè)定為“假”(.FALSE.)*使用IF時(shí),可以先把邏輯運(yùn)算的結(jié)果存放到邏輯變量中,再利用邏輯變量來(lái)做條件判斷。235-1-2邏輯運(yùn)算程序代碼中可以使用邏輯表達(dá)式來(lái)設(shè)置邏*programex0504implicitnoneintegerrain,windspeedlogicalr,wwrite(*,*)"Rain:"read(*,*)rainwrite(*,*)"Wind:"read(*,*)windspeed

r=(rain>=500)!如果rain>=150,r=.true,不然r=.false.

w=(windspeed>=10)!如果windspeed>=10,w=.true,不然w=.false.if(r.or.w)then!只要r或w有一個(gè)值是true就成立

write(*,*)"停止上班上課"elsewrite(*,*)"照常上班上課"endifstopend[ex0504.f90]*programex0504[ex0504.f90]865-1-3

多重判斷IF-ELSEIF多重判斷可一次列出多個(gè)條件及多個(gè)程序模塊IF(條件1)then…….…….elseif(條件2)then…….…….elseif(條件3)then…….…….elseif(條件4)then…….…….else…….Endif條件1成立時(shí),執(zhí)行這個(gè)模塊程序條件2成立時(shí),執(zhí)行這個(gè)模塊程序條件3成立時(shí),執(zhí)行這個(gè)模塊程序條件4成立時(shí),執(zhí)行這個(gè)模塊程序Else這個(gè)模塊可以省略每個(gè)條件都不成立時(shí),才執(zhí)行這個(gè)模塊程序*255-1-3多重判斷IF-ELSEIF多重判斷可一次*programex0505implicitnoneintegerscorecharactergrade

write(*,*)"Score:"read(*,*)scoreif(score>=90.and.score<=100)thengrade='A'elseif(score>=80.and.score<90)thengrade='B'elseif(score>=70.and.score<80)thengrade='C'elseif(score>=60.and.score<70)thengrade='D'elseif(score>=0.and.score<60)thengrade='E’else!score<0或score>100的不合理情形

grade='?‘endifwrite(*,"('Grade:',A1)")gradestopend[ex0505.f90]*programex0505if(score>=90*因?yàn)镮F-ELSEIF所組合出來(lái)的多重判斷式只會(huì)執(zhí)行第一個(gè)符合條件的程序模塊,執(zhí)行完后就跳到ENDIF后繼續(xù)執(zhí)行程序,每個(gè)條件都不成立時(shí)才會(huì)執(zhí)行ELSE中的模塊。所以EX0505可以簡(jiǎn)化為:programex0506implicitnoneintegerscorecharactergrade write(*,*)"Score:"read(*,*)scoreif(score>100)thengrade='?'elseif(score>=90)then!會(huì)執(zhí)行到此,代表score<=100grade='A'elseif(score>=80)then!會(huì)執(zhí)行到此,代表score<90grade='B'elseif(score>=70)then!會(huì)執(zhí)行到此,代表score<80grade='C'elseif(score>=60)then!會(huì)執(zhí)行到此,代表score<70grade='D'elseif(score>=0)then!會(huì)執(zhí)行到此,代表score<60grade='E‘else!會(huì)執(zhí)行到此,代表score<0grade='?‘endifwrite(*,"('Grade:',A1)")gradestopend[ex0506.f90]*因?yàn)镮F-ELSEIF所組合出來(lái)的多重判斷式只會(huì)執(zhí)行第一*利用多個(gè)獨(dú)立的IF語(yǔ)句也能實(shí)現(xiàn)多重判斷的效果如:判別成績(jī)等級(jí)if(score>=90.and.score<=100)grade='A'if(score>=80.and.score<90)grade='B'if(score>=70.and.score<80)grade='C'if(score>=60.and.score<70)grade='D'if(score>=0.and.score<60)grade='E'if(score>100.or.score<0)grade='?'write(*,"('Grade:',A1)")gradestopendprogramex0507implicitnoneintegerscorecharactergrade

write(*,*)"Score:"read(*,*)score[ex0507.f90]*利用多個(gè)獨(dú)立的IF語(yǔ)句也能實(shí)現(xiàn)多重判斷的效果program905-1-3

多重判斷IF-ELSEIFIf(score>=90)grade=‘A’If(score>=80)grade=‘B’If(score>=70)grade=‘C’If(score>=60)grade=‘D’If(score>=0)

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論