版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
FORTRAN77語(yǔ)言
--結(jié)構(gòu)化程序設(shè)計(jì)教材:《FORTRAN語(yǔ)言—FORTRAN77結(jié)構(gòu)化程序設(shè)計(jì)》譚浩強(qiáng)等編著第一章FORTRAN語(yǔ)言程序設(shè)計(jì)初步1.1FORTRAN語(yǔ)言發(fā)展概況1.2簡(jiǎn)單的FORTRAN77程序分析1.3FORTRAN源程序的書寫格式1.1FORTRAN語(yǔ)言發(fā)展概況FORTRAN語(yǔ)言是世界上第一個(gè)被正式推廣使用的高級(jí)語(yǔ)言。它是1954年被提出來(lái)的,1956年開始正式使用,至今已有五十多年歷史,但仍歷久不衰,它始終是數(shù)值計(jì)算領(lǐng)域所使用的主要語(yǔ)言。FORTRAN是英文FORmulaTRANslation的縮寫,意為“公式翻譯”。它是為科學(xué)、工程問(wèn)題或企事業(yè)管理中的那些能夠用數(shù)學(xué)公式表達(dá)的問(wèn)題而設(shè)計(jì)的,其數(shù)值計(jì)算的功能較強(qiáng)。FORTRAN77還不是完全結(jié)構(gòu)化的語(yǔ)言,但由于增加了一些結(jié)構(gòu)化的語(yǔ)句,特別是“塊if”語(yǔ)句,提供了IF-ELSE-ENDIF形式的判斷控制語(yǔ)句,使FORTRAN77能用于編寫結(jié)構(gòu)化程序。此外,還擴(kuò)充了字符處理功能,使FORTRAN不僅可用于數(shù)值計(jì)算領(lǐng)域,還可以使用于非數(shù)值運(yùn)算領(lǐng)域。目前,F(xiàn)ORTRAN77已在國(guó)內(nèi)外廣泛使用,大多數(shù)計(jì)算機(jī)系統(tǒng)都已配置了FORTRAN77。FORTRAN語(yǔ)言的不同版本:FORTRANI、FORTRANII、FORTRANIV、FORTRAN66、FORTRAN77、FORTRAN90……1.2簡(jiǎn)單的FORTRAN77程序分析
為了使讀者從一開始就了解什么是FORTRAN77程序,下面先介紹兩個(gè)很簡(jiǎn)單的FORTRAN77源程序。
[例1.1]求三個(gè)數(shù)的平均數(shù) 程序代碼:
CCALCULATETHEAVERAGEOFTHREENUMBERS
X=90.5 Y=87.0 Z=68.5
AVER=(X+Y+Z)/3.0 PRINT*,'THETHREENUMBERSARE',X,Y,Z PRINT*,'AVERAGE=',AVER END[例1.2]分別求R=1,3,12,5時(shí)的圓周長(zhǎng)可以用一個(gè)子程序來(lái)求圓周長(zhǎng)。源程序由兩部分組成:(1)主程序
CMAINPROGRAM PROGRAMEX2 PRINT*,'R=',1.0,'C=',C(1.0) PRINT*,'R=',3.0,'C=',C(3.0) PRINT*,'R=',12.0,'C=',C(12.0)
PRINT*,'R=',5.0,'C=',C(5.0)
END
(2)子程序
CSUBPROGRAM FUNCTIONC(R) PI=3.1415926 C=2*PI*R RETURN END
從以上例子中可以看出:1、一個(gè)程序由一個(gè)或若干個(gè)程序單位組成。主程序和每一個(gè)子程序分別是一個(gè)獨(dú)立的程序單位。在解決一個(gè)比較復(fù)雜的問(wèn)題時(shí),可以分別將每個(gè)功能編為一個(gè)子程序,然后按搭積木一樣將各有關(guān)程序單位組成一個(gè)程序。一個(gè)程序單位就是一個(gè)模塊,結(jié)構(gòu)化程序設(shè)計(jì)需要采用模塊化方法,在FORTRAN中,子程序是實(shí)現(xiàn)模塊化的有效方法。2、每一個(gè)程序單位都是以“END”結(jié)束的。在FORTRAN77中,END既是一個(gè)程序單位的結(jié)束標(biāo)志,又是一個(gè)獨(dú)立的語(yǔ)句(結(jié)束語(yǔ)句)。主程序中的END語(yǔ)句的作用是使程序“停止運(yùn)行”,子程序中的END語(yǔ)句是“使流程返回調(diào)用程序”。請(qǐng)注意在一個(gè)程序單位中只能有一個(gè)END語(yǔ)句,如果需要,可以用STOP語(yǔ)句使程序終止或用RETURN語(yǔ)句從子程序返回。3、一個(gè)程序單位包括若干行。FORTRAN行分為兩類:(1)語(yǔ)句行。由一個(gè)FORTRAN語(yǔ)句組成,它對(duì)程序運(yùn)行情況是有影響的。FORTRAN語(yǔ)句分為:執(zhí)行語(yǔ)句和非執(zhí)行語(yǔ)句。執(zhí)行語(yǔ)句使計(jì)算機(jī)在運(yùn)行時(shí)產(chǎn)生某些操作,如賦值語(yǔ)句、打印語(yǔ)句等。非執(zhí)行語(yǔ)句(包括說(shuō)明語(yǔ)句,數(shù)據(jù)語(yǔ)句等)將有關(guān)信息通知編譯系統(tǒng),以便在編譯時(shí)作出相應(yīng)的處理,例如類型說(shuō)明語(yǔ)句、函數(shù)子程序語(yǔ)句等。(2)非語(yǔ)句行,即注釋行。它不是FORTRAN語(yǔ)句,它不被翻譯成機(jī)器目標(biāo)指令,不產(chǎn)生任何機(jī)器操作。它僅僅是為了人們閱讀程序的方便而加到程序中的。一個(gè)程序中注釋行的數(shù)目不受限制,根據(jù)需要而定。但一個(gè)程序單位不能只由注釋行組成。注釋行是程序的一部分,在打印程序清單時(shí),注釋行也照樣打印出來(lái)。注釋行的內(nèi)容完全是根據(jù)程序設(shè)計(jì)人員需要而寫的,一般是為程序(或程序中某一部分)的作用作注釋。注釋可以用英文或漢語(yǔ)拼音文字,還可以用漢字作注釋。在一些實(shí)用程序中,注釋行的篇幅有時(shí)占整個(gè)程序的三分之一以上。 4、FORTRON程序中的語(yǔ)句可以沒(méi)有標(biāo)號(hào),也可以有標(biāo)號(hào),根據(jù)需要而定。標(biāo)號(hào)的作用是標(biāo)志一個(gè)語(yǔ)句以便被其它語(yǔ)句引用。在同一個(gè)程序單位中不能有兩個(gè)相同標(biāo)號(hào)的語(yǔ)句。標(biāo)號(hào)不影響語(yǔ)句的執(zhí)行順序。程序中語(yǔ)句執(zhí)行的順序一般依照它們?cè)诔绦蛑械奈恢枚?,即寫在前面的語(yǔ)句先執(zhí)行,寫在后面的語(yǔ)句后執(zhí)行。5、一個(gè)程序單位中各類語(yǔ)句的位置是有一定規(guī)定的,例如PROGRAM語(yǔ)句應(yīng)是主程序的第一個(gè)語(yǔ)句,F(xiàn)UNCTION語(yǔ)句是函數(shù)子程序的第一個(gè)語(yǔ)句,END語(yǔ)句只能是程序單位中最后一行。6、FORTRAN源程序必須按一定的格式書寫。哪些內(nèi)容寫在一行中的哪一列都有嚴(yán)格的規(guī)定。1.3FORTRAN源程序的書寫格式 FORTRAN源程序必須嚴(yán)格地按照一定的格式書寫。在編譯時(shí)對(duì)一行中不同位置上的內(nèi)容分別處理。標(biāo)準(zhǔn)的FORTRAN程序紙格式見下圖。1、第l~5列為標(biāo)號(hào)區(qū): 可以寫l至5位整數(shù)。也可以沒(méi)有標(biāo)號(hào)。標(biāo)號(hào)區(qū)中的空格不起作用。如l00與100或100作用相同。標(biāo)號(hào)應(yīng)是無(wú)符號(hào)整數(shù)(不應(yīng)包括正負(fù)號(hào)或小數(shù)點(diǎn))。標(biāo)號(hào)大小順序沒(méi)有任何要求。假如第二行的標(biāo)號(hào)為1000,第三行的標(biāo)號(hào)可以是10,也可以是10000。 標(biāo)號(hào)區(qū)內(nèi)不得出現(xiàn)標(biāo)號(hào)以外的內(nèi)容,但注釋行例外。注釋行的內(nèi)容可以寫在標(biāo)號(hào)區(qū)內(nèi),一行中第一列為“C”或“*”的,該行即被認(rèn)為注釋行。如果在第一列上出現(xiàn)的不是數(shù)字、空格或“C”和“*”的字符,編譯時(shí)按出錯(cuò)處理。2、第6列位續(xù)行標(biāo)志區(qū): 如果在一行的第6列上寫一個(gè)非空格和非零的字符,則該行作為其上一行的續(xù)行。3、第7~72列為語(yǔ)句區(qū): 語(yǔ)句可以從第7列以后的任何一列開始寫,但一行只能寫一個(gè)語(yǔ)句。語(yǔ)句區(qū)中的空格(除引號(hào)內(nèi)的字符串內(nèi)的空格)在編譯時(shí)被忽略,例如SIN(X)與SIN(X)等效。4、第73—80列為注釋區(qū): 程序員一般利用此8列為程序行編序號(hào)以便查找。FORTRAN語(yǔ)言
--FORTRAN77結(jié)構(gòu)化程序設(shè)計(jì)Email:x_h_b@第2章程序的靈魂-算法2.1算法的概念2.2簡(jiǎn)單算法舉例2.3算法的特性2.4怎樣表示一個(gè)算法第2章程序的靈魂-算法一個(gè)程序包括以下兩個(gè)方面的內(nèi)容:1、對(duì)數(shù)據(jù)的描述。在程序中要制定數(shù)據(jù)的類型和數(shù)據(jù)的組織形式,即數(shù)據(jù)結(jié)構(gòu)。2、對(duì)操作的描述。即操作步驟,也就是算法。 數(shù)據(jù)是操作的對(duì)象,操作的目的是對(duì)數(shù)據(jù)進(jìn)行加工處理,以得到期望的結(jié)果。作為程序設(shè)計(jì)人員,必須認(rèn)真考慮和設(shè)計(jì)數(shù)據(jù)結(jié)構(gòu)和操作步驟(算法)。著名計(jì)算機(jī)科學(xué)家沃思提出一個(gè)公式:數(shù)據(jù)結(jié)構(gòu)+算法=程序。 由于算法的重要性,在本章中先介紹有關(guān)算法的初步知識(shí),以便為后面各章的學(xué)習(xí)建立一定的基礎(chǔ)。2.1算法的概念廣義地說(shuō),為解決一個(gè)問(wèn)題而采取的方法和步驟,就稱為“算法”(algorithm)。例如,描述太極拳動(dòng)作的圖解,就是“太極拳的算法”。一首歌曲的樂(lè)譜,也可以稱為該歌曲的算法,因?yàn)樗付搜葑嘣摳枨拿恳粋€(gè)步驟,按照它的規(guī)定就能演奏出預(yù)定的曲子。計(jì)算機(jī)算法可分為兩大類別:
數(shù)值運(yùn)算算法
非數(shù)值運(yùn)算算法2.2簡(jiǎn)單算法舉例[例2.1]求1*2*3*4*5可以用最原始的方法進(jìn)行:步驟1:先求1*2,得到結(jié)果2。步驟2:將步驟1得到的乘積2再乘以3,得到結(jié)果6。步驟3:將6再乘以4,得24。步驟4:將24再乘以5,得120。
這樣的算法雖然是正確的,但太繁瑣。如果要求1*2*…*1000,則要寫999個(gè)步驟,顯然是不可取的??梢栽O(shè)兩個(gè)變量:一個(gè)變量代表被乘數(shù),一個(gè)變量代表乘數(shù)。不另設(shè)變量存放乘積結(jié)果,而直接將每一步驟的乘積放在被乘數(shù)變量中。設(shè)p為被乘數(shù),i為乘數(shù)。用循環(huán)算法來(lái)求結(jié)果??梢詫⑺惴ǜ膶懭缦拢篠1:使p=1S2:使i=2S3:使p*i,乘積仍放在變量p中,可表示為: p*ipS4:使i的值加1,即i+1iS5:如果i不大于5,返回重新執(zhí)行步驟S3以及其后的步驟S4和S5;否則,算法結(jié)束。[例2.2]有50個(gè)學(xué)生,要求將他們之中成績(jī)?cè)?0分以上的學(xué)號(hào)和成績(jī)輸出。
用n表示學(xué)生學(xué)號(hào),n1代表第一個(gè)學(xué)生學(xué)號(hào),ni代表第i個(gè)學(xué)生學(xué)號(hào)。用g代表學(xué)生成績(jī),gi代表第i個(gè)學(xué)生成績(jī),算法可以表示如下:
S1:1i S2:如果gi80,則輸出ni和gi;否則不輸出
S3:i+1i S4:如果i50,返回S2,繼續(xù)執(zhí)行;否則,算法結(jié)束。[例2.3]判定2000-2500年中哪一年是閏年。
閏年的條件是:1、能被4整除但不能被100整除的年份是閏年,如1996年、2004年;2、能被100整除又能被400整除的年份是閏年,如1600年、2000年。 設(shè)y為被檢測(cè)的年份??刹捎靡韵虏襟E:S1:2000yS2:若y不能被4整除,則輸出“y不是閏年”。然后轉(zhuǎn)到S6S3:若y能被4整除,不能被100整除,則輸出“y是閏年”。然后轉(zhuǎn)到S6S4:若y能被100整除,又能被400整除,輸出“y是閏年”,然后轉(zhuǎn)到S6S5:輸出“y不是閏年”S6:y+1yS7:當(dāng)y2500時(shí),轉(zhuǎn)S2繼續(xù)執(zhí)行,否則算法停止。[例2.4]求1-1/2+1/3-1/4+…+1/99-1/100
算法表示如下:S1:sign=1S2:sum=1S3:deno=2S4:sign=(-1)*signS5:term=sign*(1/deno)S6:sum=sum+termS7:deno=deno+1S8:若deno100返回S4;否則算法結(jié)束。[例2.5]對(duì)一個(gè)大于或等于3的正整數(shù),判斷它是不是一個(gè)素?cái)?shù)。
所謂素?cái)?shù),是指除了1和該數(shù)本身之外,不能被其他任何整數(shù)整除的數(shù)。例如,13是素?cái)?shù),因?yàn)樗荒鼙?,3,4,……,12整除。 判斷一個(gè)數(shù)n是否素?cái)?shù)的方法是很簡(jiǎn)單的:將n作為被除數(shù),將2到n-1各個(gè)整數(shù)先后作為除數(shù),如果都不能被整除,則n為素?cái)?shù)。 算法可以表示如下:
S1:輸入n的值
S2:i=2(i作為除數(shù))
S3:n被i除,得余數(shù)r S4:如果r=0,表示n能被i整除,則輸出n“不是素?cái)?shù)”,算法結(jié)束;否則執(zhí)行S5 S5:i+1i S6:如果in-1,返回S3;否則輸出n“是素?cái)?shù)”,然后結(jié)束。2.3算法的特性
一個(gè)程序應(yīng)該具有以下特性:1、有窮性。一個(gè)算法應(yīng)包含有限的操作步驟,而不能是無(wú)限的。事實(shí)上,“有窮性”往往指“在合理的范圍之內(nèi)”。如果讓計(jì)算機(jī)執(zhí)行一個(gè)歷時(shí)1000年才結(jié)束的算法,這雖然是有窮的,但超過(guò)了合理的限度,人們也不把它視為有效算法。究竟什么算“合理限度”,并無(wú)嚴(yán)格標(biāo)準(zhǔn),由人們的常識(shí)和需要而定。2、確定性。算法中的每一個(gè)步驟都應(yīng)當(dāng)是確定的,而不應(yīng)當(dāng)是含糊的、模棱兩可的。3、有零個(gè)或多個(gè)輸入。所謂輸入是指在執(zhí)行算法時(shí)需要從外界取得必要的信息。4、有一個(gè)或多個(gè)輸出。算法的目的是為了求解,“解”就是輸出。5、有效性。算法中的每一個(gè)步驟都應(yīng)當(dāng)能有效地執(zhí)行,并得到確定的結(jié)果。2.4怎樣表示一個(gè)算法
為了表示一個(gè)算法,可以用不同的方法。常用的有:自然語(yǔ)言、傳統(tǒng)流程圖、N-S流程圖、偽代碼、PAD圖等。1973年美國(guó)學(xué)者I.Nassi和B.Shneiderman提出了一種新的流程圖形式。在這種流程圖中,完全去掉了帶箭頭的流程線。全部算法寫在一個(gè)矩形框內(nèi)。在該框內(nèi)還可以包含其它的從屬于它的框,或者說(shuō),由一些基本的框組成一個(gè)大的框。這種適于結(jié)構(gòu)化程序設(shè)計(jì)的流程圖又稱N-S結(jié)構(gòu)化流程圖。 N-S流程圖用以下的流程圖符號(hào):
(1)順序結(jié)構(gòu):順序結(jié)構(gòu)如下圖所示。A和B兩個(gè)框組成一個(gè)順序結(jié)構(gòu)。(2)選擇結(jié)構(gòu):選擇結(jié)構(gòu)如下圖所示。當(dāng)p條件成立時(shí)執(zhí)行A操作,p不成立則執(zhí)行B操作結(jié)構(gòu)。(3)循環(huán)結(jié)構(gòu): 當(dāng)型循環(huán)結(jié)構(gòu)下,圖符表示先判斷后執(zhí)行,當(dāng)p條件成立時(shí)反復(fù)執(zhí)行A操作,直到p條件不成立為止。 直到型循環(huán)結(jié)構(gòu)下,圖符表示先執(zhí)行后判斷,當(dāng)p條件不成立時(shí)反復(fù)執(zhí)行A操作,直到p條件成立為止。[例2.11]將例2.1的求5!算法用N-S圖表示。 PROGRAMEXAM INTEGERP,I P=1 I=2 DO10,WHILE(I.LT.6) P=P*I I=I+110 CONTINUE PRINT*,P END[例2.12]將例2.2的算法用N-S圖表示。將5名學(xué)生中成績(jī)高于80分的學(xué)號(hào)和成績(jī)打印出來(lái)。 PROGRAMEXAM INTEGERNUM,GRADE I=010 READ*,NUM,GRADE IF(GRADE.GT.80)PRINT*,NUM,GRADE I=I+1 IF(I<5)GOTO10 END[例2.13]將例2.3判定閏年的算法用N-S圖表示 PROGRAMEXAM INTEGERYEAR READ*,YEAR IF(MOD(YEAR,4).EQ.0)THEN IF(MOD(YEAR,100).NE.0)THEN PRINT*,'是閏年' ELSE IF(MOD(YEAR,400).EQ.0)THEN PRINT*,'是閏年' ELSE PRINT*,'不是閏年' ENDIF ENDIF ELSE PRINT*,'不是閏年' ENDIF END[例2.14]將例2.4的算法用N-S圖表示。
求1-1/2+1/3+…+1/99-1/100。 PROGRAMEXAM SUM=1.0 DENO=2.0 SIGN=110 SIGN=(-1)*SIGN TERM=SIGN/DENO SUM=SUM+TERM DENO=DENO+1 IF(DENO.LE.100.0)GOTO10 PRINT*,SUM END習(xí)題2.4用傳統(tǒng)流程圖表示求解一下問(wèn)題的算法有兩個(gè)瓶子A和B,分別盛放醋和醬油,要求將它們互換。依次將10個(gè)數(shù)輸入,要求將其中最大的數(shù)輸出有3個(gè)數(shù)a、b、c,要求按大小順序把它們輸出求1+2+3+……+100判斷一個(gè)數(shù)n能否同時(shí)被3和5整除將100-200之間的素?cái)?shù)輸出求兩個(gè)數(shù)m和n的最大公約數(shù)有兩個(gè)瓶子A和B,分別盛放醋和醬油,要求將它們互換。 PROGRAMEXAM CHARACTER*4A,B,T A='醋' B='醬油' T=A A=B B=T PRINT*,A,'---',B END依次將10個(gè)數(shù)輸入,要求將其中最大的數(shù)輸出 PROGRAMEXAM REALR,MAX;READ*,R MAX=R I=110 READ*,R IF(MAX.LT.R)MAX=R I=I+1 IF(I<10)GOTO10 PRINT*,MAX END有3個(gè)數(shù)a、b、c,要求按大小順序把它們輸出 PROGRAMEXAM REALA,B,C,T PRINT*,'INPUTTHREENUMBERS:' READ*,A,B,C IF(A.GT.B)THEN T=A A=B B=T ENDIF IF(B.GT.C)THEN T=B B=C C=T ENDIF IF(A.GT.B)THEN T=A A=B B=T ENDIF PRINT*,A,B,C END 求1+2+3+……+100 PROGRAMEXAM INTEGERI,SUM I=1 SUM=0 DO10,WHILE(I.LE.10) SUM=SUM+I I=I+110 CONTINUE PRINT*,SUM END FORTRAN語(yǔ)言
--FORTRAN77結(jié)構(gòu)化程序設(shè)計(jì)3.1常量所謂常量是指其值始終不變的量,例如3,5.6,-8在FORTRAN中允許使用下面六種常量: (1)整型常量 (2)實(shí)型常量 (3)雙精度常量 (4)復(fù)型常量 (5)邏輯型常量 (6)字符型常量。3.1.1整型常量
整型常量,又稱整型常數(shù)或整數(shù)(integer)。它是一個(gè)正的或負(fù)的或零的數(shù)。例如5,-8,+123。 FORTRAN中的整數(shù)不應(yīng)包括小數(shù)點(diǎn)。整數(shù)可以包括數(shù)符,也可以不包括數(shù)符。 常數(shù)中各數(shù)字之間的空格不起作用。 常數(shù)中不允許加入逗號(hào)。3.1.2實(shí)型常量
實(shí)型常量,又稱實(shí)數(shù)(real)。 實(shí)數(shù)有兩種表示形式:
(一)小數(shù)形式:例如+12.3,-68.56,3.75,0.0等。 它由一個(gè)或多個(gè)數(shù)字和一個(gè)小數(shù)點(diǎn)組成。 小數(shù)點(diǎn)前或小數(shù)點(diǎn)后可以不出現(xiàn)數(shù)字,但不能小數(shù)點(diǎn)前后都不出現(xiàn)數(shù)字。 例如+0.8,-8.0,0.0,60.,.36,.0合法
18,36,7,.非法。 (二)指數(shù)形式: 數(shù)字部分和指數(shù)部分,例如:12.3E8,0.91E-30。 數(shù)字部分可以是不帶小數(shù)點(diǎn)的整數(shù)形式,也可以是帶小數(shù)點(diǎn)的實(shí)數(shù),例如3E5,3.0E5均合法。 指數(shù)不能為小數(shù),例如3E5.6,8.6E-3.7不合法。 指數(shù)部分不能單獨(dú)用來(lái)代表一個(gè)常數(shù),例如E12。3.2變量
3.2.1變量的概念
變量是指在程序運(yùn)行期間其值是可以變化的量。 系統(tǒng)為程序中的每一個(gè)變量開辟一個(gè)存儲(chǔ)單元,用來(lái)存放變量的值。 在程序中用到的變量,應(yīng)該給它賦予確定的值,否則它有一個(gè)不確定的值。3.2.2變量名
一個(gè)變量需要用一個(gè)名字(變量名)來(lái)識(shí)別。
FORTRAN的變量名按以下規(guī)定選定:
1、第一個(gè)字符必須是字母;
2、在一個(gè)字母后面可以跟1~5位數(shù)字或字母。 例如:A,X1,ABCD,CHINA,RATE,TOTAL,G861是合法的,而3X,X+Y,WAN-LI,-6B,U.S.A,DR.LI是不合法的。
選用變量名時(shí)注意: (1)在變量名中大寫與小寫是等價(jià)的,例如TOTAL,Total,total都代表同一個(gè)變量。 (2)變量名的字符之間可以插入空格,例如:AMOUNT和AMOUNT都代表同一個(gè)變量AMOUNT。 (3)變量名應(yīng)盡量做到見名知義,例如:GRADE代表等級(jí),AVER代表平均值,AMOUNT代表金額。(4)FORTRAN77沒(méi)有規(guī)定保留字,即可以用FORTRAN中的函數(shù)名或語(yǔ)句定義符作變量名,例如:
SIN=3.5 PRINT*,SIN
或
READ*,PRINT PRINT*,PRINT3.2.3變量類型
常量是分為類型的,而變量是用來(lái)存放常量的,因此變量也相應(yīng)地區(qū)分為整型變量、實(shí)型變量、雙精度型變量、復(fù)型變量、邏輯型變量、字符型變量。整型變量用來(lái)存放整型常量,實(shí)型變量用來(lái)存放實(shí)型常量。
在程序中應(yīng)當(dāng)說(shuō)明哪些變量是整型變量,哪些變量是實(shí)型變量。變量在內(nèi)存中所占的字節(jié)數(shù)和數(shù)據(jù)存儲(chǔ)形式與相應(yīng)類型的常數(shù)相同。
規(guī)定變量的類型可以用以下幾種方法:1、隱含約定-I-N規(guī)則
FORTRAN規(guī)定:在程序中的變量名,凡以字母I,J,K,L,M,N六個(gè)字母開頭的,即認(rèn)為該變量為整型變量。以其它字母開頭的變量為實(shí)型變量。 例如下面變量為整型變量:
I,J,IMAX,NUMBER,LINE,JOB,K1
而下面的變量為實(shí)型變量:
B1,COUNT,AMOUNT,YOUNG,TOTAL,BOOK,DG342、用類型說(shuō)明語(yǔ)句確定變量類型
FORTRAN中有六個(gè)類型說(shuō)明語(yǔ)句:
INTEGER語(yǔ)句(整型說(shuō)明語(yǔ)句)
REAL語(yǔ)句(實(shí)型說(shuō)明語(yǔ)句)
DOUBLEPRECISION語(yǔ)句(雙精度說(shuō)明語(yǔ)句)
COMPLEX語(yǔ)句(復(fù)型說(shuō)明語(yǔ)句)
LOGICAL語(yǔ)句(邏輯型說(shuō)明語(yǔ)句)
CHARACTER語(yǔ)句(字符型說(shuō)明語(yǔ)句) 例如: INTEGERA,SUM,TOTAL3.隱含說(shuō)明語(yǔ)句IMPLICIT語(yǔ)句 IMPLICITINTEGER(A,C,T-V) IMPLICITREAL(I,J) IMPLICITINTEGER(A,B),REAL(I,K)說(shuō)明:1、類型說(shuō)明語(yǔ)句最優(yōu)先,IMPLICIT語(yǔ)句次之,I-N規(guī)則最低。 例如:
IMPLICITREAL(I,J) INTEGERIMAX2、IMPLICIT語(yǔ)句和類型說(shuō)明語(yǔ)句應(yīng)該出現(xiàn)在程序單位中的所有執(zhí)行語(yǔ)句的前面,IMPLICIT語(yǔ)句又應(yīng)該在所有的類型說(shuō)明語(yǔ)句的前面。
3.3FORTRAN函數(shù)
用FORTRAN解題往往要用到一些專門運(yùn)算,如求三角函數(shù)sinx,cosx,求,絕對(duì)值|x|,對(duì)數(shù)lnx,指數(shù)ex,求一組數(shù)中最大數(shù)和最小數(shù)。FORTRAN提供了一些系統(tǒng)函數(shù)來(lái)完成這些運(yùn)算。程序設(shè)計(jì)者不必自己設(shè)計(jì)進(jìn)行這些運(yùn)算的語(yǔ)句組(即程序段或子程序),只需寫出一個(gè)函數(shù)的名字以及給出一個(gè)或若干個(gè)自變量,就可以得到所需的值。例如:
SQRT(4.0) SIN(2.0)EXP(3.5)LOG(3.0)例[3-1] PROGRAMFUNCTIONS PRINT*,SIN(1.0) PRINT*,TAN(1.0) PRINT*,ATAN(1.0) PRINT*,LOG(3.0) PRINT*,INT(8.6) PRINT*,INT(-8.6) PRINT*,MOD(8,3)
PRINT*,SIGN(4.0,-0.5) PRINT*,SIGN(-4.0,0.5) PRINT*,REAL(8) PRINT*,MAX(8,6,7,15,-1) PRINT*,MIN(8,6,7,15,-1) END3.4FORTRAN算術(shù)表達(dá)式
3.4.1算術(shù)運(yùn)算符和運(yùn)算優(yōu)先級(jí)
五種算術(shù)運(yùn)算符號(hào):+-*/**
不同的運(yùn)算符按以下優(yōu)先級(jí)次序:
**最高*,/次之+,-最低 同一優(yōu)先級(jí)的兩個(gè)運(yùn)算,按“先左后右”原則。 例如:
3+5-6.0*8.0/4**2
3.4.2FORTRAN算術(shù)表達(dá)式的含義和表示方法
所謂表達(dá)式是指一個(gè)或多個(gè)運(yùn)算的組合。表達(dá)式是由運(yùn)算符和括號(hào)將各運(yùn)算元素(常量、變量、函數(shù)、數(shù)組元素)連接起來(lái)的一個(gè)有值的式子。
FORTRAN允許使用四種表達(dá)式: 算術(shù)表達(dá)式 關(guān)系表達(dá)式 邏輯表達(dá)式 字符表達(dá)式
算術(shù)表達(dá)式中各運(yùn)算元素都是算術(shù)量,使用的運(yùn)算符只能是算術(shù)運(yùn)算符,表達(dá)式的值也是一個(gè)算術(shù)量(即數(shù)值)。例如:
(A-B)/C**2+SIN(X+Y)
表3.4是對(duì)表達(dá)式書寫的正誤比較,供讀者參考。3.4.3表達(dá)式運(yùn)算中的類型問(wèn)題 FORTRAN允許不同類型的算術(shù)量(包括整型、實(shí)型、雙精度、復(fù)型)之間的算術(shù)運(yùn)算,但不允許在算術(shù)量和非算術(shù)量(如邏輯型、字符型)之間進(jìn)行算術(shù)運(yùn)算。例如2*3.5是允許的。2為整型量,3.5為實(shí)型量,那么它的乘積是什么類型的呢? FORTRAN作如下規(guī)定:1、同類型的算術(shù)量之間運(yùn)算的結(jié)果仍保持原類型。2、如果參加運(yùn)算的兩個(gè)算術(shù)量為不同類型,則將它們轉(zhuǎn)換成同一類型,然后進(jìn)行運(yùn)算。轉(zhuǎn)換的規(guī)律是:將低級(jí)類型轉(zhuǎn)換為高級(jí)類型。類型的級(jí)別如下:整型低,實(shí)型高。 如果有:5*6.5,則系統(tǒng)先將5轉(zhuǎn)換為5.0,然后乘以6.5得32.5,為實(shí)型數(shù)。5*6.0的值為30.0。3.4.4運(yùn)算的誤差問(wèn)題
整型量的運(yùn)算是準(zhǔn)確的,沒(méi)有任何誤差(只要在整數(shù)范圍內(nèi))。而實(shí)型量的運(yùn)算會(huì)出現(xiàn)一些誤差。 例如:11111.1*1111.11
0.001+1246825.0-1246820.0
總之,在實(shí)數(shù)運(yùn)算中應(yīng)充分考慮到其可能出現(xiàn)的誤差,而且在運(yùn)算過(guò)程中誤差會(huì)不斷積累而增大,有時(shí)可能達(dá)到一個(gè)可觀的程度。 整型量的運(yùn)算速度比實(shí)數(shù)快而且不出現(xiàn)誤差,但整數(shù)的范圍有限。用實(shí)數(shù)運(yùn)算速度慢而且有誤差。如果想保持大的表數(shù)范圍又有較高的準(zhǔn)確度,應(yīng)增加有效位數(shù),可采用雙精度型數(shù),其有效位數(shù)可達(dá)16~17位以上。 3.5賦值語(yǔ)句
3.5.1賦值語(yǔ)句的性質(zhì)和作用
賦值語(yǔ)句的作用是將一個(gè)確定的值賦給一個(gè)變量。其一般格式為:
v=e
變量=表達(dá)式 例如
A=3.14159*R**2
賦值語(yǔ)句有三類:算術(shù)賦值語(yǔ)句;邏輯賦值語(yǔ)句;字符賦值語(yǔ)句。 賦值語(yǔ)句中的“=”號(hào)是“賦值”的符號(hào)。將賦值號(hào)右邊的表達(dá)式的值賦給左邊的變量。例如:A=3.6的作用是3.6A。 算術(shù)賦值語(yǔ)句兼有計(jì)算和賦值雙重功能。即先計(jì)算出表達(dá)式的值;然后將該值賦給一個(gè)變量。 根據(jù)賦值語(yǔ)句的性質(zhì)可以看出:賦值號(hào)左邊只能是變量名(或數(shù)值元素名),而不能是表達(dá)式,賦值號(hào)右邊可以是常量、變量或表達(dá)式(常量或變量是表達(dá)式的最簡(jiǎn)單的形式)。賦值號(hào)兩側(cè)的內(nèi)容不能任意調(diào)換。
下面兩個(gè)程序作用是不同的:
程序1 PROGRAMASIGNMENT A=1.0 B=2.0 A=B PRINT*,A,B END程序2 PROGRAMASIGNMENT A=1.0 B=2.0 B=A PRINT*,A,B END3.5.2執(zhí)行賦值語(yǔ)句時(shí)的類型轉(zhuǎn)換問(wèn)題
一個(gè)算術(shù)賦值語(yǔ)句中的被賦值的變量和表達(dá)式的類型可以相同,也可以不相同。FORTRAN作如下規(guī)定:1、如果變量與表達(dá)式的類型相同,則直接進(jìn)行賦值。如:
I=3 A=5.7*T2、如果類型不同,則應(yīng)先進(jìn)行表達(dá)式的求值,然后將該表達(dá)式的值轉(zhuǎn)換為被賦值變量的類型。如:
I=3.5*2.1 T=3*5/73、當(dāng)賦值號(hào)兩側(cè)的類型不同時(shí),往往會(huì)產(chǎn)生預(yù)想不到的結(jié)果。如:
IMAX=13.7*2.53.6簡(jiǎn)單的輸出語(yǔ)句
3.6.1輸出語(yǔ)句的作用和分類
程序的作用是對(duì)輸入的數(shù)據(jù)進(jìn)行加工處理,然后將結(jié)果輸出。最常用的輸出是顯示。可用PRINT語(yǔ)句實(shí)現(xiàn)打印輸出。 輸出一個(gè)或多個(gè)數(shù)據(jù)時(shí)需要通知系統(tǒng)以下信息: (1)輸出哪些數(shù)據(jù); (2)用什么格式輸出(如每個(gè)數(shù)據(jù)占多少列,小數(shù)部分占多少列,是用小數(shù)形式輸出還是用指數(shù)形式輸出?) (3)在什么設(shè)備上輸出。 如果已確定用顯示器輸出,可以用PRINT語(yǔ)句,用PRINT語(yǔ)句意味著只能在顯示器輸出。在PRINT語(yǔ)句中將上面提到的第1、2個(gè)信息告之系統(tǒng)。FORTRAN的輸出格式有以下三類:(1)按用戶指定的格式輸出;(2)系統(tǒng)隱含的標(biāo)準(zhǔn)格式輸出(又稱表控格式);(3)無(wú)格式的輸出,即以二進(jìn)制形式輸出,只適用于向磁盤、磁帶等輸出。3.6.2表控輸出語(yǔ)句
表控輸出是表控格式輸出的簡(jiǎn)稱。即由計(jì)算機(jī)系統(tǒng)隱含規(guī)定了輸出的格式。用這種方式輸出數(shù)據(jù)時(shí),系統(tǒng)自動(dòng)地分別為每一個(gè)不同類型的數(shù)據(jù)規(guī)定所占的列數(shù)和表數(shù)形式(例如實(shí)數(shù)是用小數(shù)形式輸出還是用指數(shù)形式輸出,小數(shù)點(diǎn)位置在何處等)。例如: 假若I=45,J=128 PRINT*,I,J
假若A=13.567,B=-186.75 PRINT*,A,B
假若A=162×1025,B=-11.72×10-13 PRINT*,A,B3.7簡(jiǎn)單的輸入語(yǔ)句
3.7.1輸入語(yǔ)句的作用和分類
所謂輸入是指從外部設(shè)備上將數(shù)據(jù)輸?shù)接?jì)算機(jī)內(nèi)存中。向計(jì)算機(jī)輸入數(shù)據(jù)又叫做“計(jì)算機(jī)從外部設(shè)備讀入數(shù)據(jù)”,輸出數(shù)據(jù)又叫做“向外部設(shè)備寫數(shù)據(jù)”。 FORTRAN用READ語(yǔ)句實(shí)現(xiàn)輸入數(shù)據(jù)。與輸出一樣,有三種類型的輸入:(1)數(shù)據(jù)按用戶規(guī)定的格式輸入;(2)用自由格式輸入(又稱表控輸入);(3)無(wú)格式輸入,即以二進(jìn)制形式輸入,只適用從磁盤或磁帶輸入。3.7.2表控輸入語(yǔ)句
表控輸入又稱自由格式輸入,用戶不必指定輸入數(shù)據(jù)的格式,只需將數(shù)據(jù)按其合法形式依次輸入即可,數(shù)據(jù)間以逗號(hào)或空格間隔。例如有一輸入語(yǔ)句:
READ*,I,J,A,B “*”號(hào)表示“表控輸入”,要求從系統(tǒng)隱含指定的輸入設(shè)備上讀入兩個(gè)整型數(shù)給I和J,讀入兩個(gè)實(shí)數(shù)給A和B??梢詮逆I盤輸入以下數(shù)據(jù):
3,10,7.5,-15.8
或:3107.5-15.8 注意:(1)應(yīng)該保證從輸入設(shè)備輸入READ語(yǔ)句中所要求的數(shù)據(jù):
1)輸入數(shù)據(jù)的個(gè)數(shù)應(yīng)當(dāng)不少于READ語(yǔ)句中變量的個(gè)數(shù);
2)輸入數(shù)據(jù)的類型要與READ語(yǔ)句中相應(yīng)的變量的類型一致。如果在輸入的第一個(gè)數(shù)據(jù)行上數(shù)據(jù)個(gè)數(shù)少于READ語(yǔ)句變量的個(gè)數(shù),則系統(tǒng)會(huì)繼續(xù)從第二個(gè)輸入的數(shù)據(jù)行中讀數(shù),依此類推。(2)若輸入的數(shù)據(jù)個(gè)數(shù)多于所需的個(gè)數(shù),則多余的數(shù)據(jù)不起作用。例如,輸入以下數(shù)據(jù):3,10,7.5,-15.8,30,70.6(3)每一個(gè)READ語(yǔ)句都是從一個(gè)新的輸入行開始讀數(shù)的。例如
READ*,I,J READ*,A,B READ*,X,Y
如果輸入:
3,10,7.5,-15.8 70.6,8.5(4)如果在輸入數(shù)據(jù)行中出現(xiàn)“/”號(hào),表示對(duì)READ語(yǔ)句的輸入到此結(jié)束,未被賦值的變量不予賦值。如:
READ*,I,J,A,B
輸入數(shù)據(jù)為:
3,10/7.5,-15.8(5)在一個(gè)數(shù)據(jù)的數(shù)字之間不要插入空格,因此空格是數(shù)據(jù)間的分隔符。例如對(duì)上述READ語(yǔ)句輸入以下數(shù)據(jù):
15,718,76.3,65.8(6)前已提及:數(shù)據(jù)類型應(yīng)與變量類型一致,如果變量為整型而輸入數(shù)據(jù)為實(shí)型數(shù),則按出錯(cuò)處理。如果變量為實(shí)型,輸入數(shù)據(jù)為整型數(shù),許多系統(tǒng)是通融的,先自動(dòng)將它變成實(shí)數(shù)然后輸入給實(shí)型變量,如:
READ*,A,B
輸入:
168,2473.8參數(shù)語(yǔ)句(PARAMETER語(yǔ)句)
在程序中常要多次用到某些常數(shù),例如=3.1415926,若每次用到時(shí)都重復(fù)寫3.1415926,是不方便的,F(xiàn)ORTRAN77允許用一個(gè)名字來(lái)代表一個(gè)常量,例如可以指定用PI來(lái)代表3.1415926,在本程序單位中用到PI時(shí),它就代表3.1415926,這個(gè)PI稱為“符號(hào)常量”或“符號(hào)常數(shù)”,即用一個(gè)符號(hào)來(lái)代表一個(gè)常量。
FORTRAN規(guī)定用PARAMETER語(yǔ)句來(lái)定義符號(hào)常量。 例如:PARAMETER(PI=3.1415926)
PARAMETER語(yǔ)句與賦值語(yǔ)句不同,它是非執(zhí)行語(yǔ)句,在程序定義一個(gè)符號(hào)常量后,不能再改變它的值。例如下面這樣是錯(cuò)誤的:
PI=0.5或READ*,PI PARAMETER語(yǔ)句應(yīng)寫在所有執(zhí)行語(yǔ)句之前。符號(hào)常量的定名規(guī)則與定變量名相同。名字本身隱含類型,也遵循I-N規(guī)則。可以用類型語(yǔ)句定義符號(hào)常量的類型,例如:
INTEGERP PARAMETER(P=5)
注意,先寫類型語(yǔ)句,后寫參數(shù)語(yǔ)句。在一個(gè)參數(shù)語(yǔ)句中可以定義多個(gè)符號(hào)常量。如
PARAMETER(A=0.5,N=50,J=30)
用符號(hào)常量好處是:若需要改變某一常量,不需一一改變這個(gè)常量,只需改變參數(shù)語(yǔ)句中符號(hào)常量的值則可。例如:
PARAMETER(PRICE=3.5) COST1=PRICE*NUM1 COST2=PRICE*NUM2 COST3=PRICE*NUM3
單價(jià)PRICE調(diào)整時(shí),不必一一修改賦值語(yǔ)句,只需將參數(shù)語(yǔ)句中的PRICE=3.5改為PRICE=5.1即可,一改全改,不會(huì)由于遺漏某一處未改而出錯(cuò)。 符號(hào)常量可以是數(shù)值型、邏輯型、字符型。 符號(hào)常量不能作為語(yǔ)句標(biāo)號(hào),也不能出現(xiàn)在FORMAT語(yǔ)句中代替常數(shù)。除此之外,凡出現(xiàn)常量處均可用符號(hào)常量代替。3.9END語(yǔ)句、STOP語(yǔ)句和PAUSE語(yǔ)句
3.9.1END語(yǔ)句FORTRAN77中END語(yǔ)句的作用:(1)結(jié)束程序單位的運(yùn)行;(2)作為程序單位的結(jié)束標(biāo)志。
END語(yǔ)句應(yīng)該出現(xiàn)在本程序單位中的最后一行。一個(gè)程序單位中只能有一個(gè)END語(yǔ)句。 在主程序中的END語(yǔ)句是使程序停止運(yùn)行,控制回到操作命令狀態(tài)。在子程序中的END,一方面作為子程序的結(jié)束標(biāo)志,一方面使流程返回到調(diào)用程序(接著執(zhí)行調(diào)用程序中的其它語(yǔ)句)。即它兼有RETURN語(yǔ)句的功能。3.9.2STOP語(yǔ)句 STOP語(yǔ)句是“停止運(yùn)行”,一個(gè)程序單位中可以有多個(gè)STOP語(yǔ)句,執(zhí)行到任一個(gè)STOP語(yǔ)句時(shí)程序即停止運(yùn)行。在子程序中如果有STOP語(yǔ)句,使整個(gè)程序停止運(yùn)行而不是使控制返回主程序。 在一個(gè)程序中含有多個(gè)STOP語(yǔ)句時(shí),為了使程序員能清晰地辨別出是哪一個(gè)STOP語(yǔ)句使程序停止運(yùn)行的,需要在執(zhí)行STOP時(shí),輸出所需的信息。STOP語(yǔ)句的形式:
STOP[n]
例如:
STOP123
或 STOP‘A’
則在程序停止運(yùn)行時(shí)輸出信息“123”或“A”,由此辨別程序的流程。注意:STOP語(yǔ)句中的“n”是寫一個(gè)不超過(guò)5位的無(wú)符號(hào)整數(shù)或一個(gè)字符串。而且它是可選的。3.9.3PAUSE語(yǔ)句 PAUSE語(yǔ)句是暫停語(yǔ)句,使程序“暫時(shí)停止執(zhí)行”,但不是“結(jié)束運(yùn)行”。系統(tǒng)只是把程序的執(zhí)行暫時(shí)“掛起來(lái)”,等待程序操作員輸入其它操作命令。在程序設(shè)計(jì)中,有時(shí)有意在程序中加幾個(gè)PAUSE語(yǔ)句,即設(shè)幾個(gè)“斷點(diǎn)”,把程序分成幾段,調(diào)試程序時(shí)一段一段地檢查,比如第一段驗(yàn)證無(wú)誤后再繼續(xù)調(diào)試第二段,若第一段有錯(cuò)則不應(yīng)接著運(yùn)行第二段而應(yīng)改正第一段后再?gòu)念^運(yùn)行。在調(diào)試完成后,再將所有的PAUSE語(yǔ)句刪去。PAUSE語(yǔ)句的一般形式為:
PAUSE[n] n的含義同STOP語(yǔ)句中的n。 暫停后使程序恢復(fù)運(yùn)行的方法和命令是不同的,對(duì)IBM-PC只需打入“回車”鍵則可使之恢復(fù)運(yùn)行。3.10程序舉例[3.4]求三角形面積 已知三角形面積=SQRT(S(S-A)(S-B)(S-C)),其中S=(A+B+C)/2,A,B,C為三邊之長(zhǎng)。
PROGRAMEXAM1 READ(*,*)A,B,C S=(A+B+C)/2.0 AREA=SQRT(S*(S-A)*(S-B)*(S-C)) WRITE(*,*)'A=',A,'B=',B,'C=',C WRITE(*,*)'AREA=',AREA END[例3.5]送入五個(gè)數(shù),要求打印出其中絕對(duì)值最大的數(shù)。PROGRAMEXAM2READ(*,*)A,B,C,D,ELARGE=MAX(ABS(A),ABS(B),ABS(C),ABS(D),ABS(E))WRITE(*,*)'THEGREATERNUMBERIS',LARGEEND[例3.6]我國(guó)人口在1982年統(tǒng)計(jì)為10.3億,如果年增長(zhǎng)率為1.5%,求公元2010年末的人口數(shù)。
計(jì)算人口公式為:p1=p0(1+r)n,p1為n年后人口,p0為人口初始值,r為年增長(zhǎng)率,n為年數(shù)。 程序?yàn)椋?/p>
PROGRAMEXAM3 R=0.015 N=2010-1982 P0=10.3E8
P1=P0*(1.0+R)**N WRITE(*,*)'THEPOPULATIONOF2010IS',P1 END習(xí)題
2、5、6、7、8FORTRAN語(yǔ)言
--FORTRAN77結(jié)構(gòu)化程序設(shè)計(jì)第四章邏輯運(yùn)算和選擇結(jié)構(gòu)
4.1引言
在第三章介紹了最簡(jiǎn)單FORTRAN程序,在程序中各語(yǔ)句是順序執(zhí)行的,這種程序只包括順序結(jié)構(gòu)。這種程序只能解決邏輯關(guān)系比較簡(jiǎn)單的問(wèn)題。在解決數(shù)值計(jì)算和非數(shù)值計(jì)算的問(wèn)題時(shí),常常遇到這樣問(wèn)題:需要對(duì)給定條件作邏輯判斷,根據(jù)判斷的結(jié)果決定執(zhí)行哪種操作。這需要用到選擇結(jié)構(gòu)。
用塊IF結(jié)構(gòu)實(shí)現(xiàn)選擇結(jié)構(gòu),其形式為:
IF(條件)THEN then塊
ELSE else塊
ENDIF[例4.1]計(jì)算職工工資。工人每小時(shí)計(jì)時(shí)工資為RATE,如果一周工作時(shí)間超過(guò)40小時(shí),加班部分的工資按正常時(shí)間工資的1.5倍計(jì)算。
CPayrollwithovertime PROGRAMPAYROLL READ(*,*)RATE,HOURS IF(HOURS.GT.40.0)THEN REGPAY=RATE*40.0 OVTPAY=1.5*RATE*(HOURS-40.0) ELSE REGPAY=RATE*HOURS OVTPAY=0.0 ENDIF PAY=REGPAY+OVTPAY PRINT*,'RATE=',RATE,'HOURS=',HOURS PRINT*,'REGULARPAY=',REGPAY,'OVERTIMEPAY=',OVTPAY PRINT*,'TOTALPAY=',PAY END4.2關(guān)系表達(dá)式
關(guān)系表達(dá)式是最簡(jiǎn)單的一種邏輯表達(dá)式。
<算術(shù)量><關(guān)系運(yùn)算符><算術(shù)量>
算術(shù)量可以是數(shù)值常數(shù)、數(shù)值型變量、數(shù)值函數(shù),也可以是算術(shù)表達(dá)式。
FORTRAN中有六個(gè)關(guān)系運(yùn)算符。見下表。關(guān)系運(yùn)算符英語(yǔ)含義數(shù)學(xué)符號(hào)
.GT. GreaterThan >.GE. GreaterthanorEqualto ≥.LT. LessThan <.LE. LessthanorEqualto ≤.EQ. EQualto =.NE. NotEqualto ≠關(guān)系表達(dá)式示例:
關(guān)系表達(dá)式 數(shù)學(xué)式子A.GT.3.5 A>3.5A+B.LE.0.0 A+B≤0SIN(X).GE.0.5 SIN(X)≥0.5A-B.NE.C+D A-B≠C+DI.LT.J/2 I<J/24.3邏輯表達(dá)式
關(guān)系表達(dá)式是最簡(jiǎn)單的邏輯表達(dá)式。關(guān)系表達(dá)式代表“簡(jiǎn)單條件”,如X.GT.0.0代表X>0。但遇到一些比較復(fù)雜條件,如0≤X<5,是0≤X和X<5兩個(gè)簡(jiǎn)單條件的組合,可以把它看作一個(gè)復(fù)合條件。可以寫成以下邏輯表達(dá)式:
X.GE.0.0.AND.X.LT.5.0
所謂邏輯表達(dá)式是對(duì)邏輯量進(jìn)行邏輯運(yùn)算的表達(dá)式。邏輯表達(dá)式的形式:
<邏輯量><邏輯運(yùn)算符><邏輯量> FORTRAN77的邏輯量: 邏輯常量 邏輯型變量 關(guān)系表達(dá)式 邏輯表達(dá)式的值是一個(gè)邏輯值,它不是真便是假。4.3.1邏輯常量
邏輯常量只有兩個(gè):
.TRUE..FALSE.
例如,當(dāng)X=3時(shí)X.LT.5的值為.TRUE.,而X.LE.0.0的值為.FALSE.。 邏輯常量可以在程序中出現(xiàn),可以將它們賦給邏輯型變量。邏輯常量又稱邏輯常數(shù),它的性質(zhì)與其它類型的常量相類似,代表一個(gè)常值。4.3.2邏輯型變量
邏輯型變量存放邏輯常量。它的值也只能是.TRUE.或.FALSE.之一。 可以將一邏輯常量賦予一個(gè)邏輯變量。假定A,B已被定義為邏輯型變量,則可以用賦值語(yǔ)句對(duì)它們賦值:
A=.TRUE. B=.FALSE.
這種賦值語(yǔ)句稱為邏輯賦值語(yǔ)句。它的一般形式為:
邏輯變量=邏輯表達(dá)式 程序中對(duì)每一個(gè)邏輯變量都應(yīng)加以說(shuō)明,可用LOGICAL語(yǔ)句,如:
LOGICALA,B4.3.3邏輯運(yùn)算符
邏輯運(yùn)算符 含義 邏輯運(yùn)算舉例
.AND.邏輯與 A.AND.B .OR. 邏輯或 A.OR.B .NOT. 邏輯非 .NOT.A .EQV. 邏輯等 A.EQV.B .NEQV. 邏輯不等A.NEQV.B邏輯表達(dá)式示例: (A.LT.B).AND.(A.GT.C) (X.LT.0.0).OR.(X.GT.100.0) NOT.(X.LE.0.0) (A.GT.B).EQV.(C.GT.D) L1.NEQV.L24.3.4邏輯表達(dá)式的運(yùn)算次序 一個(gè)邏輯表達(dá)式中可以包括多個(gè)邏輯運(yùn)算符。即多個(gè)邏輯量經(jīng)過(guò)邏輯運(yùn)算后可以得到一個(gè)邏輯值。例如以下邏輯表達(dá)式:
A.LE.0.0.AND.A+C.GT.B+D.OR..NOT..TRUE. FORTRAN77規(guī)定按以下次序進(jìn)行運(yùn)算: 先計(jì)算算術(shù)表達(dá)式的值 再求關(guān)系表達(dá)式的值 最后進(jìn)行邏輯運(yùn)算運(yùn)算類型 運(yùn)算符 優(yōu)先級(jí)括號(hào) () 1算術(shù)運(yùn)算 ** 2 */ 3 +- 4關(guān)系運(yùn)算 .GT..GE..LT. 5 .LE..EQ..NE.
邏輯運(yùn)算 .NOT. 6 .AND. 7 .OR. 8 .EQV.,.NEQV. 94.4用塊IF實(shí)現(xiàn)選擇結(jié)構(gòu)
4.4.1塊IF的組成
塊IF的形式:
IF(邏輯表達(dá)式)THEN
塊1 ELSE
塊2 ENDIF4.4.2塊IF的執(zhí)行過(guò)程
若邏輯表達(dá)式的值為真,則執(zhí)行塊1,否則執(zhí)行塊2。4.4.3塊IF的嵌套[例4.2]學(xué)生考試成績(jī),大于等于80分的為A等,大于等于60分而小于80分的為B等,小于60分的為D等。
READ(*,*)GRADE IF(GRADE.GE.60.0)THEN IF(GRADE.GE.80.0)THEN PRINT*,‘A’ ELSE PRINT*,‘B’ ENDIF ELSE PRINT*,‘D’ ENDIF[例4.3]如果在上例的基礎(chǔ)上將80分以上定為A等,70~79分定為B等,60~69分定為C等,小于60分的為D等。 READ(*,*)GRADE IF(GRADE.GE.60.0)THEN IF(GRADE.GE.70)THEN IF(GRADE.GE.80.0)THEN PRINT*,‘A’ ELSE PRINT*,‘B’ ENDIF ELSE PRINT*,‘C’ ENDIF ELSE PRINT*,‘D’ ENDIF[例4.4]三個(gè)數(shù)A、B、C,按升序排序。 READ(*,*)A,B,C IF(A.LE.B)THEN ELSE T=A A=B B=T ENDIF IF(B.LE.C)THEN ELSE T=B B=C C=T IF(A.LE.B)THEN ELSE T=A A=B B=T ENDIF ENDIF4.4.4ELSEIF語(yǔ)句 FORTRAN提供ELSEIF語(yǔ)句來(lái)處理邏輯“否則,如果……”
。[例4.6]例4.3可以用ELSEIF語(yǔ)句來(lái)實(shí)現(xiàn)。READ(*,*)GRADEIF(GRADE.GE.80.0)THEN WRITE(*,*)‘A’ELSEIF(GRADE.GE.70.0)THEN WRITE(*,*)‘B’ELSEIF(GRADE.GE.60.0)THEN WRITE(*,*)‘C’ELSE WRITE(*,*)‘D’ENDIF[例4.7]有一函數(shù):
Y= 0 (X<-10)
2X+20 (-10<=X<0)
20 (0<=X<20)
30-0.5X (20<=X<40)
50-X (40<=X<50)
0 (X>=50)
READ(*,*)X IF(X.LT.-10.0)THEN Y=0.0 ELSEIF(X.LT.0.0)THEN Y=2.0*X+20.0 ELSEIF(X.LT.20.0)THEN Y=20.0 ELSEIF(X.LT.40.0)THEN Y=30.0-0.5*X ELSEIF(X.LT.50.0)THEN Y=50.0-X ELSE Y=0.0 ENDIF PRINT*,‘Y=’,Y END4.5邏輯IF語(yǔ)句
邏輯IF語(yǔ)句實(shí)現(xiàn)選擇結(jié)構(gòu),但它與塊IF不同:(1)它只有條件為真時(shí)才有操作,為假時(shí)不進(jìn)行任何操作;(2)條件為真時(shí)只能執(zhí)行一個(gè)語(yǔ)句而不能執(zhí)行若干個(gè)語(yǔ)句。 例如:
IF(X.GT.0.0)PRINT*,X[例4.8]計(jì)算 READ(*,*)X IF(X.GE.0.0)Y=3.0*X+6.0 IF(X.LT.0.0)Y=-X*X+2.0*X-8.0 PRINT*,'X=',X,'Y=',Y END[例4.9]有三個(gè)數(shù)A,B,C,打印其中最大數(shù)。READ(*,*)A,B,CBIG=AIF(B.GT.BIG)BIG=BIF(C.GT.BIG)BIG=CPRINT*,BIG習(xí)題FORTRAN語(yǔ)言
--FORTRAN77結(jié)構(gòu)化程序設(shè)計(jì)第五章循環(huán)結(jié)構(gòu)的實(shí)現(xiàn)重復(fù)執(zhí)行一組指令稱為循環(huán)操作。在程序中存在兩類循環(huán):無(wú)條件循環(huán)和有條件循環(huán)。無(wú)條件循環(huán)是無(wú)休止地執(zhí)行一個(gè)程序段,而有條件循環(huán)是在滿足一定條件時(shí)才執(zhí)行循環(huán)。經(jīng)常會(huì)遇到循環(huán)類型的問(wèn)題,例如需要對(duì)全班學(xué)生求平均成績(jī),求n的階乘,求n個(gè)數(shù)的和等都需要用到循環(huán)處理的方法。5.1用GOTO語(yǔ)句實(shí)現(xiàn)循環(huán) GOTO語(yǔ)句的形式:
GOTO<語(yǔ)句標(biāo)號(hào)>
例如:“GOTO10”表示流程轉(zhuǎn)去標(biāo)號(hào)為10的語(yǔ)句行繼續(xù)執(zhí)行。由于GOTO語(yǔ)句破壞了語(yǔ)句順序執(zhí)行的正常狀態(tài),不符合結(jié)構(gòu)化程序設(shè)計(jì)原則,因此一般不提倡使用GOTO語(yǔ)句。只有在一個(gè)基本結(jié)構(gòu)內(nèi)部可以使用GOTO語(yǔ)句。利用GOTO語(yǔ)句可以實(shí)現(xiàn)循環(huán)處理。例:讀入學(xué)生的學(xué)號(hào)和成績(jī)并且打印無(wú)條件循環(huán):10 READ*,NUM,GRADE PRINT*,NUM,GRADE GOTO10有條件循環(huán):
N=110 READ*,NUM,GRADE PRINT*,NUM,GRADE N=N+1 IF(N.LE.5)GOTO105.2用DO語(yǔ)句實(shí)現(xiàn)循環(huán)
當(dāng)需要執(zhí)行的循環(huán)次數(shù)為已知時(shí)用DO語(yǔ)句實(shí)現(xiàn)循環(huán)比較方便。例如,上節(jié)讀5個(gè)學(xué)生的學(xué)號(hào)和成績(jī),要執(zhí)行READ語(yǔ)句和PRINT語(yǔ)句5次??梢愿挠肈O語(yǔ)句實(shí)現(xiàn):
DO10,N=1,5,1 READ*,NUM,GRADE10 PRINT*,NUM,GRADE5.2.1循環(huán)語(yǔ)句(DO語(yǔ)句)和循環(huán)次數(shù)的計(jì)算
DO循環(huán)由一個(gè)DO語(yǔ)句和循環(huán)體組成:
DO10,I=1,10,1 (循環(huán)語(yǔ)句) J=I*I (循環(huán)體)10PRINT*,I,J DO語(yǔ)句的一般形式為:
DO標(biāo)號(hào)[,]循環(huán)變量=初值,終值[,步長(zhǎng)]sv=e1,e2,e3
循環(huán)次數(shù)可以從循環(huán)初值、終值和步長(zhǎng)計(jì)算出來(lái):
r=INT((e2-e1+e3)/e3)
例如:DO10,I=1,10,2 DO20,N=1,5 DO100,X=1.2,2.4,0.2 DO150,T=2.5*2,50.0/2.0,0.5 DO200,M=1.5,12.5,1.55.2.2循環(huán)執(zhí)行過(guò)程
循環(huán)執(zhí)行過(guò)程執(zhí)行以下步驟:計(jì)算表達(dá)式e1,e2,e3的值,并將它們轉(zhuǎn)換成循環(huán)變量的類型。將初值e1賦予循環(huán)變量v。計(jì)算應(yīng)循環(huán)的次數(shù)r。檢查循環(huán)次數(shù),若r=0或r<0,則跳過(guò)循環(huán)體,執(zhí)行循環(huán)終端語(yǔ)句下面一個(gè)執(zhí)行語(yǔ)句。如果r>0,則執(zhí)行循環(huán)體。執(zhí)行終端語(yǔ)句時(shí)循環(huán)變量v增值,即v=v+e3。循環(huán)次數(shù)r減1。返回步驟4,重復(fù)執(zhí)行步驟4、5、6、7。 從以上流程圖和上述步驟可知,終端語(yǔ)句的作用,除了完成該語(yǔ)句本身的功能,還有兩個(gè)作用:(1)使循環(huán)變量v增值e3,(2)使循環(huán)次數(shù)r減1。5.2.3循環(huán)終端語(yǔ)句和繼續(xù)語(yǔ)句
(CONTINUE語(yǔ)句)循環(huán)終端語(yǔ)句可以是除了GOTO、塊IF、ELSE、ELSEIF、ENDIF、END、STOP和RETURN語(yǔ)句之外的任一可執(zhí)行語(yǔ)句,如打印語(yǔ)句、賦值語(yǔ)句、輸入語(yǔ)句等都可以作為終端語(yǔ)句非執(zhí)行語(yǔ)句不能作為循環(huán)的終端語(yǔ)句
為了使循環(huán)的起止范圍清晰,使終端語(yǔ)句與一般執(zhí)行語(yǔ)句所區(qū)別,用CONTINUE語(yǔ)句作為終端語(yǔ)句。 繼續(xù)語(yǔ)句CONTINUE的形式為:
CONTINUE
例如:
READ*,A,B CONTINUE PRINT*,A,B DO20,I=1,10,2 PRINT*,I 20 CONTINUE[例5.1]求5! INTEGERFACT FACT=1 DO10,I=1,5 FACT=FACE*I10 CONTINUE PRINT*,FACT END[例5.2]求1!+2!+…+N! READ*,N SUM=0.0 FACT=1.0 DO100,I=1,N FACT=FACE*I SUM=SUM+FACT100 CONTINUE PRINT*,SUM END[例5.3]一個(gè)整數(shù)I,求另一個(gè)整數(shù)J,使I和J在用8位二進(jìn)制表示時(shí)互為逆序。例如I=3,用8位二進(jìn)制表示為00000011,應(yīng)求出J=192,其二進(jìn)制數(shù)形式為11000000。即根據(jù)b7…b1b0得到b0b1…b7。
思路: 依次求出b0,b1,b2,…,b7,然后,將b0*27,b1*26,…,b7*20相加,得到J。 給定I后,用函數(shù)MOD(I,2)即可求出b0,例如MOD(3,2)的值為1,得b0=1。再將I/2=>I得到新的I,如此繼續(xù)下去,直到求出b7為止。C OBTAINTHEBIT-REVERSEOFI PRINT*,‘NUMBERTOREVERSE:’ READ*,I J=0 DO10,K=1,8 J=2*J+MOD(I,2) I=I/210 CONTINUE PRINT*,‘REVERSEIS’,J END[例5.4]求ex=1+x+x2/2!+x3/3!+…+xn/n! READ*,N,X TERM=1.0 E=1.0 DO10,I=1,N TERM=TERM*X/I E=E+TERM10 CONTINUE PRINT*,‘EXP(’,X,‘)=’,E END5.2.5DO循環(huán)的嵌套
在一個(gè)DO循環(huán)中又完整地包含另一個(gè)DO循環(huán),稱為DO循環(huán)的嵌套。
DO10,I=1,10 DO20,J=1,5 ……20CONTINUE ……10CONTINUE
內(nèi)循環(huán)應(yīng)當(dāng)完整地嵌套在外循環(huán)之內(nèi),內(nèi)外循環(huán)不能交叉。
DO10,I=1,10 DO20,J=1,5 ……10CONTINUE ……20CONTINUE[例5.5]求1!,3!,5!,7!CCALCULATES1!,3!,5!,7! DO20,J=1,7,2 FACT=1.0 DO10,K=1,J FACT=FACT*K10 CONTINUE PRINT*,J,‘!=’,FACT20 CONTINUE END[例5.6]例5.4程序可以改用DO循環(huán)嵌套實(shí)現(xiàn) READ*,N,X E=1.0 DO10,I=1,N FACT=1.0 P=1.0 DO20,J=1,I FACT=FACT*J P=P*X20 CONTINUE TERM=P/FACT E=E+TERM10 CONTINUE PRINT*,‘EXP(X)=’,E END[例5.7]打印“九九乘法表” DO10,I=1,9 DO20,J=1,I K=I*J PRINT*,I,‘*’,J,‘=’,K20 CONTINUE PRINT*,‘‘10 CONTINUE END[例5.8]百錢買百雞問(wèn)題
公元五世紀(jì)末,我國(guó)古代數(shù)學(xué)家張丘建在《算經(jīng)》中提出了“百雞問(wèn)題”:“雞翁一,值錢五;雞母一,值錢三;雞雛三,值錢一。百錢買百雞,問(wèn)雞翁、母、雛各幾何?”。意為:公雞每只5元,母雞3元,小雞一元三只。100元買100只雞。 設(shè)X為公雞數(shù),Y為母雞數(shù),Z為小雞數(shù)。根據(jù)題意:
X+Y+Z=100 5X+3Y+Z/3=100-》15X+9Y+Z=300 3個(gè)未知數(shù),2個(gè)方程式,是一個(gè)不定方程,它沒(méi)有唯一解,而有多組解。對(duì)這類問(wèn)題無(wú)法用解析法解,只能將所有可能的X,Y,Z值一個(gè)一個(gè)地去試,看是否滿足上面兩個(gè)方程式,如滿足就是一組解。 原始版: INTEGERX,Y,Z DO10,X=0,100 DO20,Y=0,100 DO30,Z=0,100 IF((X+Y+Z).EQ.100)THEN
IF(15*X+9*Y+Z.EQ.300)PRINT*,X,Y,Z ENDIF30 CONTINUE20 CONTINUE10 CONTINUE END 改進(jìn)版:
INTEGERX,Y,Z DO10,X=0,19 DO20,Y=0,33 Z=100-X-Y IF(15*X+9*Y+Z.EQ.300)PRINT*,X,Y,Z 20 CONTINUE 10 CONTINUE END5.3當(dāng)型循環(huán)的實(shí)現(xiàn)DO循環(huán)用來(lái)處理循環(huán)次數(shù)確定的情況是比較方便的。但是在處理的問(wèn)題中,有許多是事先無(wú)法確定循環(huán)次數(shù)的,而是只給出一個(gè)條件,滿足此條件時(shí)就繼續(xù)執(zhí)行循環(huán)體,若不滿足,則循環(huán)停止。例如統(tǒng)計(jì)得分并計(jì)算平均成績(jī)的程序。事先不知道有多少人得分,只能用SCORE的值來(lái)控制循環(huán)是否繼續(xù):當(dāng)SCORE>=0,表示輸入了一個(gè)正常的成績(jī),應(yīng)該統(tǒng)計(jì)和處理;當(dāng)SCORE<0,則表示數(shù)據(jù)結(jié)束,不再執(zhí)行循環(huán)體,程序進(jìn)行結(jié)束處理??梢杂貌煌椒▽?shí)現(xiàn)“當(dāng)型”循環(huán)。有不少計(jì)算機(jī)系統(tǒng)提供了DOWHILE語(yǔ)句,能很方便地實(shí)現(xiàn)當(dāng)型循環(huán),但FORTRAN77標(biāo)準(zhǔn)并未規(guī)定有此語(yǔ)句,只能用塊IF或邏輯IF語(yǔ)句來(lái)實(shí)現(xiàn)“當(dāng)型”循環(huán)。5.3.1用WHILE語(yǔ)句實(shí)現(xiàn)當(dāng)型循環(huán) WHILE語(yǔ)句的格式:
DO標(biāo)號(hào),WHILE(邏輯表達(dá)式)
循環(huán)體標(biāo)號(hào)CONTINUE[例5.9]統(tǒng)計(jì)若干個(gè)學(xué)生的得分并計(jì)算平均成績(jī) INTEGERCOUNT SUM=0.0 COUNT=0 READ*,SCORE DO10,WHILE(SCORE.GE.0.0) SUM=SUM+SCORE COUNT=COUNT+1 READ*,SCORE10 CONTINUE AVER=SUM/COUNT PRINT*,‘COUNT=’,COUNT PRINT*,‘AVERAGE=’,AVER END[例5.11]輸入兩個(gè)正整數(shù)M和N,求其最大公約數(shù)
用輾轉(zhuǎn)相除法來(lái)求最大公約數(shù)。例如,27和6,先用27除以6,余數(shù)為3。由于余數(shù)不等于0,再將6作為被除數(shù),3作為除數(shù),再求余數(shù),此時(shí)余數(shù)為0,則除數(shù)3就是最大公約數(shù)。
INTEGERM,N,R READ*,M,N IF(M.LT.N)THEN T=M M=N N=T ENDIF R=MOD(M,N)
DO10,WHILE(R.N
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 博士論文寫作實(shí)踐模板
- 經(jīng)典文學(xué)的現(xiàn)代演繹:《晚春》教案設(shè)計(jì)2024
- 校園咨詢合同范本
- 電梯轎廂地板裝修合同范本
- 宜城合同范本服務(wù)
- 2024物業(yè)服務(wù)協(xié)議延期條款明細(xì)
- 聯(lián)營(yíng)中標(biāo)合同范本
- 2024年音樂(lè)課件:《剪羊毛》教學(xué)的創(chuàng)新發(fā)展
- 2024年度展覽場(chǎng)地出租協(xié)議模板
- 2024短期保安服務(wù)協(xié)議模板
- 銀行紀(jì)檢委員紀(jì)檢工作報(bào)告
- 2022版小學(xué)道德與法治課程標(biāo)準(zhǔn)測(cè)試題
- GB/T 27021.1-2017合格評(píng)定管理體系審核認(rèn)證機(jī)構(gòu)要求第1部分:要求
- GB/T 22796-2021床上用品
- 中國(guó)聯(lián)通LAN工程施工及驗(yàn)收規(guī)范
- 中間表模式接口相關(guān)-住院與his-adt方案
- 臨床PCR檢驗(yàn)的室內(nèi)質(zhì)控方法課件
- 計(jì)算機(jī)解決問(wèn)題的過(guò)程-優(yōu)質(zhì)課課件
- 作文講評(píng)-“忘不了……”課件
- 深基坑安全管理(安全培訓(xùn))課件
- 12月4日全國(guó)法制宣傳日憲法日憲法知識(shí)科普宣教PPT教學(xué)課件
評(píng)論
0/150
提交評(píng)論