版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Fortran語法基礎Fortran從誕生至今,已經走過了長達50餘年的發展歷程中。在這一發展歷程中,相關的語言標準先後制定了5部。具體的語法也隨著標準的變更而變化著。在每一個新標準中,前一個標準中的一些舊語句、語法或是被廢棄、或是建議減少使用,如Fortran90標準中就建議減少使用“COMMON”語句;或者新增了一些新的語句,如Fortran95標準中的“FORALL”語句。本章將主要介紹Fortran的基本語法。2.1程式書寫格式在1.6小節中,程式HELLO已經展示了Fortran的一種源代碼書寫格式,即自由格式(FreeFormat),這種格式是Fortran90/95標準中的一大特色。同Fortran77標準中的舊格式,即固定格式(FixedFormat)相比,取消了在源代碼書寫上的諸多限制,程式編制起來更為靈活。兩種格式書寫的源代碼通過檔擴展名來進行區別。2.1.1固定格式(FixedFormat)採用固定格式書寫的Fortran源代碼,檔擴展名為*.F或*.FOR。在固定格式中,Fortran標準規定了若干個列範圍。每一個列範圍都有自己的用途和約定,程式必須嚴格按照這些約定進行編寫。2.1.2自由格式(FreeFormat)採用自由格式書寫的Fortran源代碼,檔擴展名為*.F90。自由格式是Fortran90標準中的一大特色,廢除了固定格式中的許多限制。它並不規定程式代碼中每一行第幾列字元的具體作用,在源代碼的編寫上顯得相當自由。同固定格式相比,自由格式主要在以下幾個方面進行了改進。行的定義。在自由格式中每行可以書寫132個字元。程式語句的位置沒有了只能從第7列後開始書寫的固定約定,可以在任意一列開始書寫。同一行中可以順序書寫多條程式語句,語句之間用分號“;”進行分隔。注釋行的定義。在自由格式中,驚嘆號“!”後的字元均被視為注釋。但是,字串中的“!”出外,如“PRINT*,‘Hello!Fortran90/95’”中,“Fortran90/95’”不會被認為是注釋。續行的定義。在Fortran90/95標準中規定,當程式代碼中的一行超過132個字元時,至多可以有39個續行。續行標誌固定為“&”。當一行代碼的最後一個字元為“&”時,則表示下一行與本行接續;當一行代碼的第一個字元為“&”時,則表示本行與上一行接續。行號的定義。在Fortran90/95標準中規定,行號只需寫在代碼行的最前面即可。空格的應用。Fortran90/95標準中規定,語句和變數名中間不能有空格。例如,關係運算符“==”不能寫成“==”;“ABS(-2.0)”與“AB□S(-□2.0)”作用不再相同,“AB□S(-□2.0)”不能正常通過編譯。2.1.3兼顧兩種格式的代碼寫法由於現存大量舊的Fortran代碼(Fortran77程式)都是採用固定格式編寫的,在一些編譯器上可能會由於格式的問題而出現編譯錯誤。因此,有必要提供一種能夠兼顧兩種格式的代碼寫法,以便於將固定格式的代碼轉換為符合自由格式要求的代碼。能夠兼顧兩種格式的代碼在書寫時需要注意的要點有以下幾條:開始列。除注釋行外的每一行代碼只能從第7列開始編寫。這主要是由於自由格式中並沒有規定代碼編寫的起始列,因此可以套用固定格式的規定。注釋行。標明注釋行的符號只能用感嘆號“!”,並且應該寫在第一列。注釋行必須單獨占一行,不能出現其他語句的行尾。續行方式。續行標誌只能使用符號“&”。在接續的兩行中,前一行應該在72列後、132列前添加續行標誌;後一行則應該在第6列書寫續行標誌。空格使用。在Fortran90/95標準中,語句和變數中間不允許出現空格。因此,兼顧兩種格式的源代碼中也不允許在語句和變數中出現空格。2.2字元集“字元集”是指能夠用於編寫Fortran程式的所有字元及符號。不是所有的外文字母或數字符號都能被某一高級電腦語言接受,每一種高級電腦語言都會規定它所能使用的字元。Fortran中允許使用的基本字元主要分為兩大類:文字字元和特殊字元。文字字元主要包括26個英文字母、10個自然數字和下劃線。如表所示。2.3空格的使用在Fortran90/95標準中,空格不能出現在語句和變數名中間;除了在字串常量或是輸入輸出中外,不代表任何具體意義。其主要作用是分隔語句和變數,使代碼更為易讀。在國外的一些科學研究和工程設計機構,如美國航空航天局(NASA)等,在開發科學計算程式時對空格的使用有一些很好的規定。在程式中要確保不在Fortran定義的語句或變數名中出現空格,不要嘗試通過空格來對變數名進行區別;在編寫公式時,儘量通過空格來使公式的書寫和閱讀更為清晰易懂;在編寫大段代碼時,可以使用整行的空格來對代碼段進行功能劃分。建議在編寫程式時,儘量遵守這些規定。下麵來看一段使用空格來確分四則運算的實例,先給出不使用空格進行區分的範例:Y=X+A*B/C-(0.5+C*D)**22.4注釋格式儘管注釋在編譯過程中是一定會被編譯器忽略的,但卻是源代碼檔中十分重要的一部分。因為注釋是保證源代碼具有可讀性的一個非常重要的手段。在不同的高級電腦語言中,表示注釋的方法各有不同,甚至在一種語言裏,也可能有幾種引入注釋的方法。不同的注釋方法各有優缺點,在使用中應該根據實際情況進行選擇。在C語言程式中,需要使用“/*”和“*/”這樣的特殊標記來界定注釋的內容而不管行邊界。採用這種方式進行注釋時經常出現的錯誤就是漏掉結束的界定符,使得後面的語句也變成了注解;好處也很明顯,就是能夠方便的實現代碼的塊注釋。而Fortran95語言中的“!”,Ada語言中的“-”,或是C++語言中的“//”,注釋都是在行的任意位置開始直到行的末尾結束。這種做法更為合理、不容易出錯,但要實現大段代碼的整體注釋就不是特別方便了。2.5命名方式在Fortran中為對象命名有一定的要求。簡單的說,Fortran77的命名要求和Fortran90/95的命名要求是不同的。本節主要介紹不同標準下的命名方式。在Fortran77標準中,程式和變數等對象的名字是由不多於6個字元(包括英文字母A-Z、a-z和數字0-9)組成的字元段。同時,對象名字的第1個字元必須是字母,名字的有效使用範圍原則上僅限於一個程式單元之中(內部過程除外)。下麵的代碼段演示了Fortran77標準的對象命名方式。INTEGER0B !錯誤INTEGERC-10 !錯誤REALsin !正確REALtest:real !錯誤2.6程式單元和語句順序程式單元是程式中的基本組成部分,瞭解程式單元的用途可以加深對電腦程式的理解。本節主要介紹Fortran程式中的程式單元和句順序的基本概念及相關規定。Fortran中的程式單元分為兩大類:可執行程式單元和不可執行程式單元。可執行程式單元,在程式中主要用來執行一個完整的功能。可執行程式單元主要包括以下三種:主程序單元、外部函數副程式單元和外部子例行副程式單元。不可執行程式單位,在程式中主要用來為其他程式單元提供定義。不可執行程式單元有兩種:模組程式單元和數據塊程式單元。第3章簡單輸入與輸出電腦程式的主要作用是對輸入的數據進行適當的加工處理以得到人們關心的結果,並將結果輸出。在進一步講解程式設計的基本概念前,有必要介紹簡單的輸入輸出語句。這樣,程式設計中的一些問題可以直觀的表現出來,便於對一些概念的理解。3.1輸入和輸出概述在Fortran語言中,數據的輸入輸出操作由相應的輸入輸出語句來完成。輸入輸出語句負責向電腦說明程式中哪些數據要進行輸入輸出、輸入輸出數據的格式、在何種設備上進行輸入輸出等問題。Fortran中的輸入輸出方式主要有以下三種:按用戶指定的格式進行輸入輸出;按系統隱含的標準格式輸入輸出(也稱為表控輸入輸出、直接列表輸入輸出);無格式的輸入輸出。3.2簡單輸出語句簡單輸出語句主要是指表控輸出,即表控格式(ListDirectedFormat,也叫直接列表)輸出。在用這種格式進行輸出時,電腦系統會用隱含的輸出格式為每一種數據類型規定輸出的長度和表示形式。例如,實數是用小數還是指數來表達,小數位數有幾位等。在Fortran中沒有專用的表控輸出語句,表控輸出格式的輸出都是輸出語句的簡化形式。具體來說,PRINT語句和WRITE語句都能夠進行表控輸出。下麵分別對兩種語句的表控輸出用法進行說明。3.2.1PRINT語句的表控輸出PRINT語句是Fortran中較為常用的一種輸出語句,用它來完成表控輸出的語法格式如下所示。PRINT*[,輸出項,……]在PRINT語句中不能指定輸出設備,只能向系統隱含指定的設備輸出數據(隱含指定的輸出設備一般是指電腦螢幕);語句中的星號“*”表示“表控格式輸出”,即按照電腦默認的格式進行數據的輸出;輸出項可以有多個,每個輸出項之間用逗號“,”分隔;當語句中沒有輸出項時,命令將輸出一個空白行。3.2.2WRITE語句的表控輸出使用WRITE語句來完成表控輸出的語法格式如下所示。WRITE(*,*)[輸出項,……]WRITE語句中第一個星號“*”表示在系統隱含指定的設備上輸出;WRITE語句中的第二個星號“*”表示“表控格式輸出”;輸出項可以有多個,每個輸出項之間用逗號“,”分隔;當語句中沒有輸出項時,命令將輸出一個空白行。3.2.3表控輸出的特點從上面兩個例子中可以發現表控輸出的一些特點。如果輸出的是整數,系統會自動為每個整數分配11列,當要輸出的數據位數不夠時,左端以空格補齊。在輸出實數時,給每個實數分配的輸出長度分為以下兩種情況。當實數能夠用小數形式表達時,分配8列,小數點前最多7位。如果小數點後有效位數不足,則用“0”補齊。如果實數只能用指數形式表達時,則分配13列。其中,指數部分占4位,小數點後占7位。在輸出數組時,數組元素會按照它在數組中存儲的先後順序依次輸出。在輸出字串時,直接按照字串的實際長度進行輸出。用戶也可以在同一條PRINT語句或WRITE語句中輸出整數、實數和字串。示例如下。PRINT*,1000,1.414,“TwoNumbers”3.3簡單輸入語句簡單輸入語句主要是指表控輸入格式,又稱為自由格式輸入。這種輸入操作不需要用戶指定輸入數據的具體格式,只要將數據按其合法的形式依次輸入就可以了。數據之間以逗號“,”或空格間隔。Fortran中的表控輸入語句也是特定輸入語句的簡化形式。READ語句能夠實現表控輸入,其實現形式有兩種。下麵分別給出兩種形式的表控輸入語句。3.3.1READ語句的表控輸入形式一使用READ語句來完成表控輸入的語法形式如下所示。READ*[,輸入項,……]在這種形式中,不能指定輸入設備,只能由系統隱含指定的設備上輸入(系統隱含指定的設備一般是指鍵盤);語句中的星號“*”表示“表控輸入”,即按照數據合法的格式進行輸入;輸入項可以有多個,每個輸出項之間用逗號“,”分隔;當語句中沒有輸入項時,系統將掛起程序的運行直到用戶鍵入回車符。3.3.2READ語句的表控輸入形式二第二種形式的READ語句表控輸入的語法如下。READ(*,*)[輸入項,……]語句中的第一個星號“*”表示“系統默認的輸入設備”(一般指鍵盤);第二個星號“*”表示“表控輸入”;輸入項可以有多個,每個輸出項之間用逗號“,”分隔;當語句中沒有輸入項時,系統將掛起程序的運行直到用戶鍵入回車符。下麵用一個具體的代碼來演示表控輸入語句的應用。這段代碼主要演示了第二種形式的READ語句表控輸入在程式的簡單實現。TEST0305.F90!這是直接列表輸入語句READ的範例PROGRAMTEST0305IMPLICITNONE!變數定義
REAL::A,BINTEGER::I,J!表控輸入
READ(*,*)A,BREAD(*,*)I,J!表控輸出
PRINT*,"Output:"PRINT*,A,BPRINT*,I,J
ENDPROGRAMTEST03053.3.3表控輸入的特點在應用READ語句進行表控輸入操作時,輸入的數據應該符合READ語句中的要求,即輸入的數據個數應該與READ語句中的變數個數一致;輸入數據的類型應與READ語句中相應變數的類型一致。如果輸入的數據不夠,READ語句將會等待用戶繼續輸入,直到輸入所需的全部數據為止。如果輸入的數據過多,則多餘的數據不起作用。如果輸入的數據與READ語句中的變數類型不一致,則可能出現賦值錯誤。第4章常量和變數常量和變數都是程式中預留的用於保存數據的記憶體空間。常量的值在程式運行過程中始終不會發生變化。而變數的值在程式的運行過程中是可以變化的。在Fortran語言中,有五種基本的數據類型可供使用。他們分別是整型(INTEGER)、實型(REAL)、複型(COMPLEX)、字元型(CHARACTER)和邏輯型(LOGICAL)。按用途,又可以分數值型、字元型和邏輯型三種。相應的常量和變數也可以分為這三種。本章將按照用途介紹常量和變數的基本概念。4.1數值型常量及其類型數值型常量的值在程式運行過程中不會發生改變,它們通常也被稱為常數。數值型常量包括整型常量、實型常量和複型常量。本節主要介紹數值型常量的類型和基本概念。4.1.1整型常量整型常量也稱為整型常數或整數。按照所需存儲空間的大小,又分為長整型和短整型兩種。長整型佔用4位元組的存儲空間,短整型則佔用2位元組的存儲空間。默認情況下為長整型。有些編譯器還提供額外的擴展整型常量,如CompaqVisualFortran在x86及其相容機上額外提供佔用1位元組空間的整型常量;在OpenVMS、Tru64UNIX和Linux系統中還提供佔用8位元組空間的整型常量。由於存儲整型常量的記憶體單元容量是一定的,因此整數所能表達的範圍是有限的。長整型能夠存儲的數值範圍為-231到231-1,即-2,147,483,648到2,147,483,647之間;短整型能夠存儲的數值範圍為-215到215-1,即-32,768到32,767之間。整型常量可以包含正負號,也可以不包含(此時默認為正,即+2與2等價)。在Fortran77標準中,常量內部的空格不起任何作用,如“123”與“1□2□3”等價;但Fortran90/95標準中則不允許出現這種表達方式。4.1.2實型常量實型常量也稱為實型常數或實數。按照所需存儲空間的大小,實數分為單精確度和雙精度兩種。在實數的表達方式上,可以分為小數形式和指數形式兩種。下麵分別進行說明。1.實數的精度:單精確度實數佔用4位元組的存儲空間,有效位數6到7位;雙精度實數佔用8位元組的存儲空間,有效位數15到16位。2.實數的表達形式:當以小數形式來表達實數時,小數點的前面或後面可以不出現數字,但不允許小數點前後都不出現數字。例如,+10.4、-0.8、34.、.01等都是合法的。4.1.3複型常量複型常量也稱為複型常數或複數。按所需存儲空間的大小分為單精確度和雙精度兩種。複型常數是Fortran語言中特有的一種數據結構,能夠同時存儲複數的實部和虛部。在程式中,複型常數用一個括弧中的兩個實數來表示。第一個實數表示複數的實部,第二個實數表示複數的虛部。比如:(3.0,6.3)和(1.0E2,2.0E3)。在存儲的時候,複型常數會佔據兩個實數的存儲單元。因此,單精確度的複型常數佔用8位元組的存儲空間;雙精度的複型常數則需要佔用16位元組的存儲空間。CompaqVisualFortran在OpenVMS、Tru64UNIX和Linux系統中還提供佔用32位元組存儲空間的複型常量。複型常量中實部和虛部所表達的數的範圍與同精度的實數是一致的。即單精確度時的數值範圍為1.17549435E-38到3.40282347E38;雙精度時的數值範圍為2.2250738585072013D-308到1.7976931348623158D308。4.1.4常量的存儲形式電腦在存儲上述三種不同類型的常數時,並不區分數據的具體形式,而是統一將數據轉化為二進位的形式進行存儲。在轉化的過程中,由於存儲空間是一定的,因此存儲實型常數時會產生存儲誤差的問題,即電腦的截斷問題。在CompaqVisualFortran安裝目錄的\DF98\BIN檔夾中有一個BITVIEWER程式可以查看各種數據在電腦中存儲的二進位數據形式。通過它可以直觀的瞭解電腦中數據的存儲方式。軟體的圖形用戶介面如圖4.1所示,圖中最下麵一排的方框表示數據在電腦中的存儲空間;每一個方框只有兩個數值,即0和1;右側有多個選項可供選擇,用於表示數據所佔用的存儲空間。如4表示4位元組、2表示2位元組等。4.1.5符號常量在程式中有時會經常用到同一個常數。如一些數學常數、物理常數等。如果每次都在程式中重複書寫使用這些常數值,會顯得很繁瑣。Fortran允許用一個名字來對常量進行命名。比如常見的用PI來代表圓周率3.1415926535。此時稱PI為“符號常量”或“符號常數”,即用符號來表示常量。在Fortran中,可以使用PARAMETER語句將一個符號聲明為常量。比如將PI聲明為常數3.1415926535,可以用如下的語句實現:PARAMETER(PI=3.1415926535)4.2數值型變數及其類型數值型變數主要是指整型、實型、複型三種變數。系統會為程式中的每一個變數按照其類型開闢一塊存儲單元,用於存儲變數的值。每一個變數都需要用一個名字(變數名)來識別,並且同一個程式單元內不能用同一個變數名來命名不同的變數。本節主要介紹數值型變數的類型和基本概念。4.2.1數值型變數概述數值型變數的分類同數值型常量一樣。整型變數用來存儲整型常量,實型變數用來存儲實型常量,複型變數用來存儲複型常量。在存儲空間的分配上,同類型的變數與常量佔據相同的存儲空間。變數名的作用是識別程式中的變數。Fortran中的變數名命名有一定的規則,主要有以下幾條。變數名中只能包含26個英文字母和0~9十個數字;在Fortran90/95標準中,還允許使用下劃線“_”。變數名的第一個字元必須是字母,不能是下劃線“_”或數字。在Fortran77標準中,變數名不允許超過6個字元;在Fortran90/95標準中,變數名不允許超過31個字元。4.2.2使用系統默認的隱含約定Fortran中約定:在沒有強制規定變數類型的情況下,如果變數名的首字母為I、J、K、L、M、N六個字母中的一個時,即認為該變數為整型變數,而以其他字母開頭的變數則默認為實型變數。這就是所謂的“I-N規則”。“I-N規則”的使用有利有弊。好處就是不管在程式的什麼位置,如果想要臨時添加一個變數,只要按照“I-N規則”的約定取好變數名就可以使用了;缺點也是明顯的,就是眾多隨意添加的變數使得程式閱讀起來不是很方便,更有可能造成人為錯誤。比如下麵的代碼段就是一個典型的錯誤範例。TEST0401.F90!這是一個錯誤的變數定義範例PROGRAMTEST0401I=3000*3WRITE(*,*)lENDPROGRAMTEST04014.2.3使用類型說明語句聲明如果不想受“I-N規則”的約束,或是防止出現“I-N”規則下的常見錯誤,可以使用類型說明語句對變數的類型進行約定。在Fortran中,基本的類型說明語句主要有六種。即INTEGER語句、REAL語句、DOUBLPRECISION語句、COMPLEX語句、LOGICAL語句和CHARACTER語句。數值型變數主要涉及到前四種語句。即INTEGER語句(整型說明語句)、REAL語句(實型說明語句)、DOUBLPRECISION語句(雙精度說明語句)和COMPLEX語句(複型說明語句)。類型聲明語句的語法形式如下:類型說明語句[([KIND=]數字)][::]變數名[,變數名……]4.2.4用隱含說明語句聲明除了上面提到的兩種變數類型說明方法外,還可以用隱含說明語句(IMPLICIT語句)將以某一字母開頭的所有變數都聲明為同一種類型。該語句的語法形式如下:IMPLICIT類型說明語句(字母列表)其中字母列表中的字母用逗號進行間隔。如果是連續的一串字母,可以用首尾字母間加符號“-”的方式來進行縮寫。比如“C-H”。下麵的聲明代碼將以字母A-G和N開頭的變數都聲明為整型:IMPLICITINTEGER::(A-G,N)4.2.5數值型變數聲明及其應用在編寫程式的過程中,顯式的聲明所有用到的變數是一種良好的編程習慣,建議在編寫實際的應用程式時使用“IMPLICITNONE”來進行強制的變數類型檢查。凡是沒有進行類型說明的變數,在編譯過程中都會被編譯器找出來。在三種類型規定方法中,以類型說明語句的優先順序最高,IMPLICIT語句次之,“I-N規則”的級別最低;類型說明語句和IMPLICIT語句都是不可執行語句,必須出現在本程式單元中所有可執行語句之前;類型說明語句只能在本程式單元內有效;DOUBLEPRECISION語句在Fortran90/95標準完全可以用REAL(8)語句代替,目前已很少使用。4.3字元型常量及變數文字處理能力是Fortran語言的另一特色。早期Fortran77中的文字處理能力較弱,在Fortran90/95標準中的文字處理能力已經大大加強。本節將介紹字元型常量和變數的基本概念。4.3.1字元型變數概述字元型常量也稱為字串,它是用引號(單引號或雙引號,Fortran77中只允許用單引號)括起來的若干個字元。字串中的字元可以是電腦系統中允許使用的任意字元,通常會大於Fortran字元集。比如字元型常量‘BEIJING’,”PLANE”,”#$@%&”,”北京”都是合法的。在電腦中,一個字元通常會佔據一個位元組的存儲空間;但某些語言的字元在計算中需要多個位元組的空間來存儲。比如,一個漢字在電腦上會佔據4位元組的存儲空間。字元型變數是用來存儲字元型常量的變數,在程式中必須事先定義字元型變數才能使用。定義字元型常量可以使用CHARACTER語句,有四種定義字元型變數的語法形式,這些語法定義會在隨後的小節進行介紹。4.3.2定義形式一聲明字元型變數的第一種語法形式如下。CHARACTER[::]變數名在這種形式的定義中,類型聲明語句CHARACTER說明其後變數名所代表的變數為字元型變數。Fortran77和Fortran90/95中都可以採用這種形式進行聲明。但需要注意,在Fortran77下不能出現分隔符號“:”。採用這種形式進行聲明時,允許對變數的長度進行說明,說明的方式有兩種:變數名*len或變數名(len)4.3.3定義形式二第二種聲明字元型變數的語法形式如下。CHARACTER([KIND=]n)[::]變數名在這種形式的聲明中,關鍵字KIND用於指出賦值號“=”後所跟的數字n為變數的種別參數(有關種別參數的內容會在後面的小節進行講解)。這個數字實際上就是說明聲明語句中變數名所代表的變數的長度的,意義同定義形式一中的len。採用這種形式也可以定義字元型數組。在實際的編程實踐中,也可以採用如下替代形式:CHARACTER([LEN=]n)[::]變數名4.3.4定義形式三第三種形式的字元型變數聲明的語法形式如下。CHARACTER*len[::]變數名在這種形式的聲明中,類型聲明語句後的星號“*”用於指明其後所跟的數字表示變數的長度,意義和前面兩種定義形式中的差不多。這種形式的定義也可用於聲明字元型數組,形式如下:CHARACTER*len[::]變數名(dim)其中的dim用於說明字元數組中的緯度的長,即長度。下麵給出幾個實例。CHARACTER*20::StringCHARACTER*10::Array_string(20)4.3.5定義形式四在這種形式中,通過IMPLICIT語句來強迫使以某些字母開頭的變數被默認處理成字元型。語法形式如下:IMPLICITCHARACTER[*數字]字母表IMPLICITCHARACTER[(數字)]字母表Fortran77標準中通常採用前一種形式,Fortran90/95標準中通常採用後一種形式。定義中的數字表示字元型變數的長度,即能夠存儲多少個字元。當數字緊跟CHARACTER語句之後時,表示統一指定字元長度;當數字緊跟變數名之後時,表示單獨指定字元的長度。如果統一指定的字元長度與變數個別指定的長度不一致時,以個別指定優先於統一指定。定義中括弧內的部分可有可無。比如:IMPLICITCHARACTER(5)(G-N),CHARACTERX4.3.6字元型變數聲明及其應用實際上,只要字元變數的長度不為1,則可以將其看作數組來進行理解。正因為如此,在對字元型變數進行操作時,允許對字元型變數中的某一個或某幾個存儲位置上的數據進行單獨操作。這在接下來的子字串的相關內容中進行講解。用PARAMETER語句配合CHARACTER語句還可以定義有名字元型常量,比如:CHARACTER(9)::NamePARAMETER(Name=‘PeterPan’)或CHARACTER(9),PARAMETER::Name=‘PeterPan’4.3.7子字串的概念在字元型數據的應用上,還有一個子字串(Substring)的概念需要瞭解。所謂子字串是指字串的一部分。比如有一字串為“Beijing”,則“Bei”、“jing”、“ei”等都是該字串的子字串。可以用下麵的形式來引用子字串:字串變數名([star]:[end])其中,star和end都是整型運算式。他們指定了要引用的子字串在字串中的起始和終止位置。4.4邏輯型常量及變數邏輯量通常用於程式中的流程控制。在Fortran中,邏輯量主要有三種:邏輯常量、邏輯變數和關係運算式。本小節主要介紹Fortran中邏輯常量和邏輯變數的基本概念和應用。Fortran中的邏輯常量只有兩個:TRUE,表示“真”,即滿足邏輯條件;FALSE,表示“假”,即不滿足邏輯條件。例如,當A=0時,此時“A<1”的值就為TRUE(真),而“A<-1”的值就為FALSE(假)。邏輯常量又稱為邏輯常數,在程式中,它們通常被賦給一個邏輯變數。邏輯變數被用來存放邏輯常量,它的值只能是TRUE或FALSE中的一個。在程式中使用邏輯變數必須事先加以定義說明。在Fortran中,邏輯變數的定義是通過LOGICAL語句來實現的。該語句的一般形式為:LOGICAL[([KIND=]數字)][::]變數名[,變數名]4.5變數的初始化變數在定義之後,通常會由系統按照自身設置為變數賦給一個初值。這一過程稱為變數的初始化。但是有些系統並不提供這種功能。如果貿然使用沒有經過初始化的變數,很可能導致程式運行出錯。在Fortran中,允許在聲明變數的同時設置變數的初置。在Fortran90/95中要設置變數的初置,可以將想要設置的初值直接寫在聲明的變數之後。使用這種方法進行初值的設置時,聲明中的兩個冒號不能省略。4.6賦值語句變數在聲明後就可以使用了,在使用過程中,變數需要保存不同的數據。將數據的值寫進變數的過程就是賦值的過程。在Fortran語言中,除了一些專用的特殊語句外,最常用的賦值手段就是賦值語句。賦值語句就是等號“=”,在Fortran中有著廣泛的用途。本節就將介紹賦值的概念和賦值語句的作用。4.6.1何為賦值所謂賦值,就是將一個常量的值傳輸給一個相應的變數。在Fortran中,賦值除了通過DATA語句之外,還可以使用賦值語句來實現,並且賦值語句具有比DATA語句更廣泛的用途。賦值語句的作用就是將一個確定的值賦給一個變數,語句的一般格式為:V=P其中,運算式中的等號“=”就是賦值符;V代表一個變數名,P代表一個運算式。Fortran的賦值語句有三種類型:算術賦值語句、邏輯賦值語句和字元賦值語句。算術賦值語句的作用是將一個算術量賦予一個算術型變數;邏輯賦值語句的作用是將一個邏輯量賦給一個邏輯性變數;字元賦值語句的作用就是將一個字元型數據賦給一個字元型變數。儘管用途不一樣,但是三種賦值語句採用的都是同樣的運算符號,即賦值符“=”。賦值語句中的“=”號是賦值符,而不是等號。賦值符的作用是將賦值符右邊運算式的值傳遞給賦值符左邊的變數。例如,賦值語句“X=3.0”的作用是將數值3.0傳遞到變數X中。因此,在閱讀程式代碼時對賦值符的理解應是帶方向的,即將什麼數據賦值給什麼變數。4.6.2賦值過程的類型轉換在一個算術賦值語句V=e中,賦值變數(V)和運算式(e)的類型既可以相同,也可以不相同。Fortran中對於賦值時的類型轉換問題作了如下規定。如果變數V與運算式e的類型相同,則直接進行賦值,不需進行類型轉換。如果變數V與運算式e的類型不同,則首先進行運算式的求值,然後求值的結果轉換為賦值變數的類型。在不同的類型之間進行轉換是有限制條件的:數值型以及邏輯型數據之間允許相互賦值轉換;數值型數據與字元型數據之間則不允許進行直接賦值轉換,需要使用專用的字元函數;邏輯型數據不允許與字元型數據之間進行直接或間接的轉換。整型數據與實型數據的相互轉換遵循如下規則:整形向實型轉換時,保持數值的大小不變;實型向整型轉換時,直接將實型的小數部分截去。在由整型數據向邏輯型數據轉換時,邏輯型數據的值由整型數據的奇偶來決定:當整型數據為奇數時,轉換成的邏輯型數據的值為TRUE;當整型數據為偶數(包括0)時,轉換成的邏輯型數據的值為FALSE。在由實型數據向邏輯型數據轉換時,實型數據會首先轉換成整型,然後再由整型向邏輯型轉換。第5章種別和屬性在前面的章節中,談到過數值型常量的存儲空間問題。不同精度的數值所需的存儲空間是不同的,相應的變數也應該與常量的存儲空間一致。如果變數的存儲空間不夠,則會造成常量在存儲時的精度丟失。在Fortran中,可以通過種別參數來指定變數的儲存空間,從而達到優化使用存儲空間、防止精度丟失的目的。本節主要介紹種別和屬性的基本概念。5.1種別概述種別是一個全新的程式設計概念。通過它,程式員可以更靈活的控制程式所佔用的存儲空間。本節將對種別的一些基本概念進行介紹。5.1.1種別的概念種別是Fortran90/95標準中才開始引入的一種表示數據大小和精度的概念。引入種別的概念後,Fortran中的數據,不僅僅有一個類型所屬,並且同一類型下還可進一步分出若干個種別。種別數值的大小確定了該類型數據實際的大小範圍和存儲精度。這就好比動物學中的分類,在貓科動物這一大的類型之下,還有老虎、獵豹、家貓等的進一步劃分,它們的個頭會有很大差異。有了種別說明之後,電腦程式會更容易在不同硬體和軟體平臺間進行移植。由於目前的電腦系統並不統一,多種體系平臺的現象依然客觀存在。在不同的平臺上,同種類型的變數可能規定了不同的精度範圍。因此,在某種電腦上正確運行的程式在另一種電腦上運行時就有可能出現溢出等現象。有了數據的種別屬性之後,就可以有效避免這種情況的發生。5.1.2種別的使用在變數聲明中,種別由種別說明符進行說明。帶種別說明符的類型說明語句的基本語法形式如下:類型說明([KIND=]種別值)[::]變數名列表種別說明符寫在類型說明語句後的括弧內,由關鍵字KIND,賦值號“=”以及種別值組成。其中,關鍵字KIND和賦值號“=”可以省略。例如程式中要說明一個實型變數A,種別值為4;一個字元型變數C,種別值為10;一個整型變數K,種別值為8。那麼可以用下麵的代碼來進行聲明:REAL(KIND=4)::ACHARACTER(KIND=10)::CINTEGER(KIND=8)::K5.2種別值和種別函數前面已經提到過了,由於Fortran國際標準中只是提出了數據的種別概念和定義,但並沒有規定統一的種別分類和相關的數值定義。這一現象是由於當前電腦體系並不統一的現實造成的。因此,具體的種別值是由各個編譯器廠商自行確定的。本節主要介紹CompaqVisualFortran編譯系統中提供的幾類種別值。5.2.1整型數據的種別整型數據在CompaqVisualFortran中被劃分為4種種別,種別值即表示整型數據所占記憶體空間的位元組數n。表所示是CompaqVisualFortran中定義的幾種整型數據種別。整型數據的種別種別值n取值範圍(-28n-1—28n-1-1)備註INTEGER([KIND=]1)或INTEGER*1-128到127
INTEGER([KIND=]2)或INTEGER*2-32768到32767
INTEGER([KIND=]4)或INTEGER*4-2147483648到2147483647缺省值INTEGER([KIND=]8)或INTEGER*8-9223372036854775808到9223372036854775807僅適用於Alpha晶片機型5.2.2實型數據的種別實型數據在CompaqVisualFortran中被劃分為3種種別。在Fortran90/95標準中並沒有明確規定實型數據中指數的允許範圍和有效位數,表中的數據僅適用於CompaqVisualFortran。實型數據的種別種別值取值範圍備註REAL([KIND=]4)或REAL*410-38
到1038,7位有效數字缺省值REAL([KIND=]8)或REAL*810-308
到10308,15位有效數字等價於雙精度型DOUBLEPRECISIONREAL([KIND=]16)或REAL*16
僅用於OpenVMS、Tru64UNIX、Linux操作系統5.2.3複型數據的種別複型數據在CompaqVisualFortran中被劃分為3種種別,如表所示。每種表示實型數據的方法都可以用來表示複型數據的實部和虛部,數據的取值範圍可以參考前一小節。需要注意的是簡寫寫法與完整寫法之間的差別。複型數據的種別種別值備註COMPLEX([KIND=]4)或COMPLEX*8缺省值COMPLEX([KIND=]8)或COMPLEX*16等價於雙精度複型DOUBLECOMPLEXCOMPLEX([KIND=]16)或COMPLEX*32僅用於OpenVMS、Tru64UNIX、Linux操作系統5.2.4邏輯型數據的種別邏輯型數據在CompaqVisualFortran中被劃分為4種種別,如表所示。由於邏輯型數據只有兩種,即TRUE(真)和FALSE(假),因此不管具體是何種種別,使用上並無太大區別。筆者的習慣是,使用邏輯型數據時採用其默認的種別值即可,如果想進一步節省記憶體,還可以使用種別值為1的邏輯型數據。邏輯型數據的種別種別值備註LOGICAL([KIND=]1)orLOGICAL*1
LOGICAL([KIND=]2)orLOGICAL*2
LOGICAL([KIND=]4)orLOGICAL*4缺省值LOGICAL([KIND=]8)orLOGICAL*8僅用於Alpha晶片機型5.2.5字元型數據的種別字元型數據在CompaqVisualFortran中只有1種種別,種別值的大小為1。除了上述5種基本數據類型外,CompaqVisualFortran中還提供了一種位元組型數據BYTE。該類型的數據只佔用一個位元組的存儲空間,等價於INTEGER([KIND=]1)。5.2.6種別函數儘管沒有統一的標準來規定種別的具體分類和數值,但是Fortran90/95中提供了用於查詢和選擇種別值的內部函數。下麵分別介紹這些函數和它們的用途。1.KIND函數:KIND函數用於查詢變數所屬的種別,函數的原型為:C=KIND(X)。2.SELECTED_REAL_KIND函數:SELECTED_REAL_KIND函數返回與實型變數的取值範圍和存儲精度相一致的種別參數,函數的原型為:C=SELECTED_REAL_KIND([p][,r])。3.SELECTED_INT_KIND函數:SELECTED_INT_KIND函數返回與整型變數的取值範圍相一致的種別參數,函數的原型為:C=SELECTED_INT_KIND([m])。其中,整型參數m用來指出所需要的取值範圍在-10m到10m之間。5.3常數種別和進制變數的種別可以在變數聲明的過程中通過類型說明語句進行說明,那麼常數是否也有種別之分呢?答案是肯定的。既然變數有種別之分,那麼用於給變數賦值的常數自然也有種別之分。種別值較小(也就是取值範圍較小、數據精度較低)的常數在賦值給種別值較高的變數時,不會有什麼問題;但是反過來將種別值較高的常數賦值給種別值較低的變數時就會出現問題,如丟失數據精度等。本節主要介紹如何對程式中出現的常數進行種別的表明。5.3.1非字元型常數的種別說明對於數值型或邏輯型常數這類非字元型常數來說,可以使用後輟法來表示數據所屬的種別。尾碼法在常數數值後面加上一道下劃線“_”,然後再跟上具體的種別值。對於實型常數,如果數據指數部分的字母是D時,禁止使用種別值進行說明。因為字母D表示該數據已經是實型數據的最高種別,種別值為8,即雙精度實數。對於複型常數,如果數據的實部和虛部都是用整數的形式來表示的,那麼它的精度和範圍都會被默認為與缺省的實型常數相同;如果實部和虛部都是用實數的形式來表示,那麼它的精度和範圍會視具體的情況來確定:如果實部和虛部具有相同的種別說明,則複數的種別就是該種別;如果實部和虛部具有不同的種別說明,則複數的種別由較大的種別值確定。5.3.2字元型常數的種別說明如果是字元型常數,則應改用前輟法來說明數據的種別。嵌綴法將種別值寫在字元型常數的前面,其間通過下劃線“_”把數據部分和種別值連接起來。例如下麵的例子:1_’αβγ’ 2_’計算方法’字串中使用了希臘字母和漢字,是假定所使用的電腦系統支持希臘字母與漢字,並且規定這兩個字串的種別參數分別是1和2。理論上說,這樣進行種別說明是可行的,因為漢字在內存中會佔用兩個位元組,而一般的英文字元只佔用一個位元組。但是,實際情況卻不是這樣的。5.3.3數據的進制說明除了前面兩個小節介紹的情況之外,在Fortran90/95中,還可以根據需要定義不同進制的正整數常量,這包括二進位、八進制和十六進制。二進位常量以字母“B”開頭,後跟定界符括起來的數字串,定界符可以是單引號“'”或者雙引號“””,數字只能是0或1。例如:B’01011’B”01011”5.4屬性說明在類型說明語句中除了可以說明對象的類型和種別之外,還可以進一步說明對象的屬性。當一個對象在類型說明語句中被說明具有某種屬性後,該對象就具有了某種附加的特殊功能。本節主要介紹Fortran中屬性的相關概念。5.4.1對象的屬性在Fortran90/95中,一個對象可以沒有附加的屬性說明,此時它只是普通的一般變數,與Fortran77中的變數完全相同。一個對象也可以有多個附加的屬性說明,之後被說明對象就具有了多個附加的特殊功能,並且確定了它在不同場合下的特定使用方式。每種屬性說明都有專門的關鍵字與之對應,各屬性關鍵字間用逗號進行分隔,之間沒有嚴格的先後關係,但是屬性關鍵字應該寫在類型說明語句的種別說明符之後,分隔符號“::”之前。屬性不僅僅可用於說明數據,還可以用於說明過程。5.4.2常用屬性說明常用的屬性說明是在編程實踐中經常會碰到的,這些屬性說明會為程式設計帶來某種方便。本小節將對這些常用屬性進行簡單的介紹。1.PARAMETER屬性PARAMETER屬性也稱為常數名屬性、參數屬性,這種屬性在前面的小節中已經遇到過,這裏作為單獨的概念進行解釋。2.DIMENSION屬性DIMENSION屬性用於說明一個對象名是數組名,該語句的一般形式如下:類型說明語句,DIMENSION[(形狀說明符)][::]數組名[(形狀說明符)]3.EXTERNAL屬性EXTERNAL屬性用於說明一個函數為外部函數,該屬性的一般使用形式為:類型說明語句,EXTERNAL::外部函數名第6章常用內部過程作為一門古老而又年輕的高級電腦語言,Fortran提供了大量的內部過程供程式員在編程過程中使用。並且隨著新標準的推出,Fortran語言的內部過程還在繼續擴展,能夠提供更多的常用功能,大大減輕了程式員的重複性勞動。本節主要介紹常用內部過程的基本知識。6.1內部過程概述在Fortran語言中,有很多常用的數學過程、字元處理過程和系統過程。其中,數學過程和字元處理過程通常是以函數副程式的形式存在,而系統過程則通常是以子例行副程式的形式存在。這些過程為應用程式的編寫提供了非常方便的手段和豐富的功能。Fortran語言將這些功能各異、用途各異的過程分別編寫成一個個獨立的副程式,編譯後組成一個大的標準過程庫(有時也稱為標準函數庫),存放在外部存儲介質(如電腦的硬碟)上。用戶在完成自身根源程式的編譯之後,使用LINK命令將已翻譯成二進位指令的目標程式與這個標準過程庫連接起來。通過這個連接,將程式中出現過程名的地方用標準過程庫中相應的一組指令代替,最終形成統一的用戶可執行程式。6.2常用數學函數作為一種主要面向科學、工程和事務處理中的數值計算問題的高級電腦語言,Fortran提供了豐富的數學函數供用戶在編程時使用。本小節主要介紹在日常編程中經常會遇到和使用的數學函數。6.2.1絕對值函數絕對值函數用於求出數據的絕對值,函數的原型如下:C=ABS(X)其中,ABS是Fortran中絕對值函數的通用名。除了這個通用名外,絕對值函數還有4個專用名,它們是:IABS,專用於求默認種別的整型數據的絕對值,返回值也為默認種別的整型數據。ABS,專用於求默認種別的實型數據的絕對值,返回值也為默認種別的實型數據。DABS,專用於求雙精度實型數據的絕對值,返回值也為雙精度的實型數據。CABS,專用於默認種別的複型數據的絕對值,返回值也為默認種別的複型數據。6.2.2指數函數指數函數用於求出數據的指數值,函數的原型如下:C=EXP(X)其中,EXP是Fortran中指數函數的通用名。除了這個通用名外,指數函數還有3個專用名,它們是:EXP,專用於求默認種別的實型數據的指數值,返回值也為默認種別的整型數據。DEXP,專用於求雙精度的實型數據的指數值,返回值也為雙精度的實型數據。CEXP,專用於默認種別的複型數據的指數值,返回值也為默認種別的複型數據。6.2.3正弦函數正弦函數用於求出數據的正弦值,函數的原型如下:C=SIN(X)其中,SIN是Fortran中正弦函數的通用名。除了這個通用名外,正弦函數還有3個專用名,它們是:SIN,專用於求默認種別的實型數據的正弦值,返回值也為默認種別的整型數據。DSIN,專用於求雙精度的實型數據的正弦值,返回值也為雙精度的實型數據。CSIN,專用於默認種別的複型數據的正弦值,返回值也為默認種別的複型數據。函數在數學上等價於。函數中參數的單位是弧度而不是度,在使用時需要注意這一點。6.2.4余弦函數余弦函數用於求出數據的余弦值,函數的原型如下:C=COS(X)其中,COS是Fortran中余弦函數的通用名。除了這個通用名外,余弦函數還有3個專用名,它們是:COS,專用於求默認種別的實型數據的余弦值,返回值也為默認種別的整型數據。DCOS,專用於求雙精度的實型數據的余弦值,返回值也為雙精度的實型數據。CCOS,專用於默認種別的複型數據的余弦值,返回值也為默認種別的複型數據。6.2.5反正弦函數反正弦函數用於求出數據的反正弦值,函數的原型如下:C=ASIN(X)其中,ASIN是Fortran中反正弦函數的通用名。除了這個通用名外,反正弦函數還有2個專用名,它們是:ASIN,專用於求默認種別的實型數據的反正弦值,返回值也為默認種別的整型數據。DASIN,專用於求雙精度的實型數據的反正弦值,返回值也為雙精度的實型數據。6.2.6反余弦函數反余弦函數用於求出數據的反余弦值,函數的原型如下:C=ACOS(X)其中,ACOS是Fortran中反余弦函數的通用名。除了這個通用名外,反余弦函數還有2個專用名,它們是:ACOS,專用於求默認種別的實型數據的反余弦值,返回值也為默認種別的整型數據。DACOS,專用於求雙精度的實型數據的反余弦值,返回值也為雙精度的實型數據。6.2.7正切函數正切函數用於求出數據的正切值,函數的原型如下:C=TAN(X)其中,TAN是Fortran中正切函數的通用名。除了這個通用名外,正切函數還有2個專用名,它們是:TAN,專用於求默認種別的實型數據的正切值,返回值也為默認種別的整型數據。DTAN,專用於求雙精度的實型數據的正切值,返回值也為雙精度的實型數據。6.2.8反正切函數反正切函數用於求出數據的反正切值,函數的原型如下:C=ATAN(X)其中,ATAN是Fortran中反正切函數的通用名。除了這個通用名外,反正切函數還有2個專用名,它們是:ATAN,專用於求默認種別的實型數據的反正切值,返回值也為默認種別的整型數據。DATAN,專用於求雙精度的實型數據的反正切值,返回值也為雙精度的實型數據。6.2.9自然對數函數自然對數函數用於求數據的自然對數值,函數的原型如下:C=LOG(X)其中,LOG是Fortran中自然對數函數的通用名。除了這個通用名外,自然對數函數還有3個專用名,它們是:ALOG,專用於求默認種別的實型數據的自然對數值,返回值也為默認種別的整型數據。DLOG,專用於求雙精度的實型數據的自然對數值,返回值也為雙精度的實型數據。CLOG,專用於求默認種別的複型數據的自然對數值,返回值也為默認種別的複型數據。6.2.10常用對數函數常用對數函數用於求數據的常用對數值,函數的原型如下:C=LOG10(X)其中,LOG10是Fortran中常用對數函數的通用名。除了這個通用名外,常用對數函數還有2個專用名,它們是:ALOG10,專用於求默認種別的實型數據的常用對數值,返回值也為默認種別的整型數據。DLOG10,專用於求雙精度的實型數據的常用對數值,返回值也為雙精度的實型數據。6.2.11取整函數取整函數用於將數據轉換為整型,函數的原型如下:C=INT(X)其中,INT是Fortran中取整函數的通用名。除了這個通用名外,取整函數還有3個專用名,它們是:IFIX,專用於將默認種別的實型數據轉換為整數,返回值為默認種別的整型數據。INT,專用於將默認種別的實型數據轉換為整數,返回值為默認種別的整型數據。IDINT,專用於將雙精度的實型數據轉換為整數,返回值為默認種別的整型數據。函數的執行結果同數學上的取整有所不同,Fortran中的取整函數只是將數據的小數部分截去,不使用四捨五入規則。函數的參數可以是實型、整型和複型。6.2.12求餘函數求餘函數用於求第一個變數被第二個變數所除後的餘數,函數的原型如下:C=MOD(X1,X2)其中,MOD是Fortran中求餘函數的通用名。除了這個通用名外,求餘函數還有2個專用名,它們是:MOD,適用於默認種別的整型數據,返回值為默認種別的整型數據。AMOD,適用於默認種別的實型數據,返回值為默認種別的實型數據。6.2.13取符號函數取符號函數返回第一個參數的絕對值與第二個參數的符號的乘積,函數的原型如下:C=SIGN(X1,X2)其中,SIGN是Fortran中取符號函數的通用名。除了這個通用名外,取符號函數還有3個專用名,它們是:ISIGN,適用於默認種別的整型數據,返回值為默認種別的整型數據。SIGN,適用於默認種別的實型數據,返回值為默認種別的實型數據。DSIGN,適用於雙精度的實型數據,返回值為雙精度的實型數據。6.2.14最大值函數最大值函數用於找出一系列數據中的最大值,函數的原型為:C=MAX(X1,X2[,X3]…)其中,MAX是Fortran中最大值函數的通用名。除了這個通用名外,最大值函數還有5個專用名,它們是:MAX0,適用於默認種別的整型數據,返回值為默認種別的整型數據。AMAX0,適用於默認種別的整型數據,返回值為默認種別的實型數據。MAX1,適用於默認種別的實型數據,返回值為默認種別的整型數據。AMAX1,適用於默認種別的實型數據,返回值為默認種別的實型數據。DMAX1,適用於雙精度的實型數據,返回值為雙精度的實型數據。6.2.15最小值函數最小值函數用於找出一系列數據中的最小值,函數的原型為:C=MIN(X1,X2[,X3]…)其中,MIN是Fortran中最小值函數的通用名。除了這個通用名外,最小值函數還有5個專用名,它們是:MIN0,適用於默認種別的整型數據,返回值為默認種別的整型數據。AMIN0,適用於默認種別的整型數據,返回值為默認種別的實型數據。MIN1,適用於默認種別的實型數據,返回值為默認種別的整型數據。AMIN1,適用於默認種別的實型數據,返回值為默認種別的實型數據。DMIN1,適用於雙精度的實型數據,返回值為雙精度的實型數據。6.3常用字符函數Fortran90/95的內部函數中新增了許多和字元型數據操作有關的函數供用戶使用,可以很方便地進行各種字元操作。6.3.1字元與數值轉換函數這是一系列函數的總稱,涉及到4個基本函數:ICHAR,CHAR,IACHR和ACHAR函數。Fortran90/95中允許把字元型的值轉換成數值型的值(已知字元得到字元在某種字元集中的序號數值),也可把數值型的值轉換成字元型的值(已知字元在某種字元集中的序號數值進而得到該位置上的字元)。函數ICHAR的作用是根據字元得到字元在電腦字元集中的位置,函數的原型為:C=ICHAR(字元數據)6.3.2字串長度函數字串長度函數用於求出參數字元實體的字段長度,函數的原型為:C=LEN(string)其中,string必須是字元型,可以是字元標量也可以是字元數組。函數返回一個正整數,為該字元實體的字段長度(包括尾隨空格、中間空格在內)。比如LEN(‘ABC123’)的值是9(6個字元加3個空格)。如果想要得到不計尾部空格的字串長度,則可以使用LEN_TRIM函數。函數的原型如下:C=LEN_TRIM(string)6.3.3子字串位置索引函數子字串位置索引函數的作用是找出指定子字串在目標字串內的起始位置,函數的原型如下:C=INDEX(string,substring[,back])其中,string表示要在其中進行索引的目標字串;substring表示子字串;back為邏輯型變數,當back的值為.TRUE.時表示從目標字串的後面開始搜索,當back的值為.FALSE.或省略不寫時,表示從目標字串的前面開始搜索。函數值返回一個正整數,指明子字串在目標字串中是從第幾個字元開始的。目標字串和子字串可以是任何形式的字元實體。如果目標字串中不含有子字串中的內容,則函數的返回值為0。例如INDEX(‘VitaminC’,‘i’)的值為2;INDEX(‘VitaminC’,‘i’,BACK=.TRUE.)的值為6;INDEX(‘VitaminC’,‘b’)的值為0。6.3.4字串驗證函數字串驗證函數的作用是確認指定的字元集中是否包含了給定字串中所有的字元,函數的原型為:C=VERIFY(string,set,[,back])其中,string為要在其中進行驗證的字元集;set為給定的字串;back表示是從字元集的前面還是後面開始驗證:當back值為.TRUE.時表示從後面開始驗證,當back的值為.FALSE.或省略不寫時表示從前面開始驗證。函數的返回值是一個正整數,指明給定字串中與字元集相異的第一個字元是從左邊第幾個字元開始的。如果沒有相異的字元,則返回函數值為0。比如VERIFY('banana','nbc')的值為2,VERIFY('banana','nbc',BACK=.TRUE.)的值為6,VERIFY('banana','nbca')的值為0。6.3.5尾部空格除去函數尾部空格除去函數的作用就是除去字串尾部的尾隨空格,函數的原型為:C=TRIM(string)函數的返回值與函數的輸入參數類型相同、種別相同。返回值就是輸入參數除去尾部空格後剩餘的部分。比如TRIM(‘ABC123’)///’34’的值是’ABC12334’。這個函數在進行檔案名的處理上較為方便:為了保存檔的完整路徑名稱,通常需要使用一個字段寬度較大的字元變數(在Windows系統下,如果使用系統函數,一般要求256個字元寬度)。如果輸入的檔實際路徑名較短,則在顯示時會留下大段的空格。使用TRIM函數就可以避免這種現象。6.3.6字元大小比較函數字元大小比較函數是一個函數族,共包含了4個基本函數。其作用就是比較字元在ASCII字元集中的先後位置,其原型為:C=LGE(string_a,string_b)C=LGT(string_a,string_b)C=LLE(string_a,string_b)C=LLT(string_a,string_b)四個函數都是用兩個字元型實體作為參數,用來判斷它們之間是否滿足大於等於、大於、小於等於、小於關係。6.4常用系統過程在Fortran90/95中還增加了許多常用的系統過程,這些系統過程大多採用子例行副程式的形式。這裏介紹的主要是用於獲得系統時間和亂數的系統過程。6.4.1CPU時間函數該函數用於返回同處理器無關的精確的處理器運行時間,單位為秒。過程的原型如下:CALLCPU_TIME(time)其中,time是一個實型變數,用於保存處理器的運行時間。如果過程不能返回有意義的時間,則會返回一個與處理器無關的負值。CPU_TIME函數可以用於獲得某一段可執行代碼在CPU中的實際運行時間,比如下麵的代碼段用於確定代碼執行時間並將其列印出來:
REAL::time_begin,time_end……CALLCPU_TIME(time_begin)!可執行代碼段
CALLCPU_TIME(time_end)PRINT*,'Timeofoperationwas',time_end-time_begin,'seconds'6.4.2日期和時間函數該過程用於返回從即時時鐘處獲得的日期和時間相關資訊,日期和時間的格式符合國際標準ISO8601:1988。過程的原型如下:CALLDATE_AND_TIME([date][,time][,zone][,values])其中,date用於保存返回的日期資訊,必須是一個至少有8個字元長度的字串。可以用於保存世紀、年、月、日等資訊,形式為CCYYNNDD。下麵分別給出這些字元的意義:CC:表示系統中所處的世紀;YY:表示系統中所處的年份;MM:表示系統中所處的月份;DD:表示系統中所處的日期。6.4.3系統時間過程系統時間過程用於保存從系統即時時鐘處獲得的數據資訊。過程的原型如下:CALLSYSTEM_CLOCK([count][,count_rate][,count_max])其中,count用於保存處理器時鐘的當前值,必須是一個默認種別的整型變數。每有一個時鐘計數發生,count的值就會增加1,直到數值達到count_max,然後count被清零重新開始計數。count_rate必須是一個整型數據,用於指定每秒鐘內觸發的時鐘計數次數。count_max也是一個整型數據,用來設置時鐘計數的最大值,可以為系統能夠處理的最大整數。6.4.4亂數生成過程亂數生成過程用於生成偽亂數,結果可以是一個標量也可以是一個數組。過程的原型如下:CALLRANDOM_NUMBER(harvest)其中,harvest必須是實型變數,可以是標量或數組。亂數的大小範圍在0到1之間。第7章運算符及運算式在Fortran中提供了極為豐富的運算符,囊括了算術運算、邏輯運算、字元運算等方面。特別是在算術運算方面,作為這種高級電腦語言的專長,Fortran提供了一些其他高級語言需要使用函數才能進行的計算能力。例如乘方運算。本章開始講述有關Fortran運算符和運算式的相關內容。7.1算術運算算術運算是Fortran語言中功能最為強大的部分,也是Fortran直到今天仍然活躍在電腦舞臺上的重要原因。本節主要介紹Fortran語言中的算術運算及其相關概念。7.1.1算術運算符及其優先順序在Fortran語言中編寫算術運算式是相當方便的。除了部分算術運算符在外觀上有所不同之外,程式中的算術運算式與教科書中的算術運算式幾乎沒什麼區別。Fortran語言中定義了五種基本的算術運算。這五種基本的算術運算和運算符羅列如下:算術加法,運算符為加號“+”,表示數學中的加號;算術減法,運算符為減號“-”,表示數學中的減號;算術乘法,運算符為星號“*”,表示數學中的乘號;算術除法,運算符為撇號“/”,表示數學中的除號;乘方運算,運算符為兩個連續的星號“**”,表示數學中的乘方。7.1.2算術運算式Fortran語言中允許使用四種類型的運算式,即:算術運算式,關係運算式,邏輯運算式和字元運算式。本節介紹其中的算術運算式,其他類型的運算式將在後面的小節中進行介紹。所謂算術運算式是指由一個或多個算術運算符組成的,能夠完成特定計算任務的式子。在Fortran程式中,算術運算式是由Fortran語言規定的算術運算符和括弧將各種算術運算量(包括常量、變數、函數、數組及數組元素)連結起來的一個有值運算式。例如下麵就是一個Fortran算術運算式的實例:A+B–C*TAN(D)/(ABS(E)+F)7.1.3算術運算式中的類型轉換在本章的一開始,就已經介紹了Fortran中的常量和變數是分類型的,那麼不同類型的數據之間在算術運算式中是否能夠進行運算?如果可以,那麼又該遵循什麼規則呢?Fortran語言允許不同類型的算術運算量(如整型、實型、雙精度和複型)之間進行算術運算,但不允許在算術運算量和非算術運算量(如邏輯型、字元型)之間進行算術運算。例如“2*10.0”是允許的,但“2*TRUE”是不允許的。那麼不同類型的算術運算量之間的運算結果應該是什麼類型呢?例如“2*10.0”的結果應該是“20”還是“20.0”呢?7.1.4算術運算的誤差由於電腦在保存整型數據時是準確無誤的,只存在保存值的範圍問題;而在保存實型數據時,不僅僅存在保存的值有一個範圍,而且在存儲數據的精度上也是受存儲空間限制的。例如想要保存圓周率的精確值,這幾乎是不可能。在本書配套光碟/Tools/PI目錄下有一個小軟體Super可用於計算圓周率,從這個軟體可以看到想要精確存儲圓周率將要花費的存儲空間是不可想像的。正因為存儲精度上的問題,電腦在進行整型數據之間的運算時是準確無誤的,結果不存在任何誤差(只要結果在整型數據的保存範圍內)。而實型數據之間的運算就會由於存儲精度方面的問題而出現一些誤差。來看兩個實例。7.2關係運算在實際的數學或工程問題中,經常會遇到比較兩個數據誰大誰小的問題。這就是一個關係比較的問題。在Fortran中,提供了進行這類操作的運算符和運算式規則。本節就開始對此進行介紹。7.2.1關係運算符關係運算符也可以稱作關係比較符,它是一個雙目運算符。Fortran中定義了六個基本的關係運算符,這六個基本關係運算符在不同的Fortran標準中有各自的表示方式。Fortran77中的關係運算符運算符定義所代表的數學符號意義描述.GT.>大於.GE.≥大於等於.LT.
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 企业数据资产管理与数据治理的协同融合机制研究
- 智能技术驱动实体经济融合发展的机制研究
- 构建柔性物流网络的最佳实践与策略研究
- 新质生产力形成机制与区域发展特征研究
- 企业盈利能力多维度分析可视化指标体系构建与应用
- 智能体架构设计及其自主决策机制的深度研究
- 监理内部承包协议书
- 冬季防火措施施工方案
- 立交桥绿化养护工程质量保证体系及措施
- 道路施工方案样板
- 教师利剑护蕾培训
- 齿轮泵 课件《液压与气压传动》演示模板
- 2025年大学《测控技术与仪器-信号分析与处理》考试参考题库及答案解析
- GB/T 23452-2025天然砂岩建筑板材
- 火电厂新员工安全培训课件
- T-CALC 10-2025 安宁疗护人文关怀服务指南
- 高中焰色反应课件
- 高校教师课程思政育人能力的提升路径与策略
- 2025年部编版二年级道德与法治上册全册教案
- 中国黄金集团招聘面试经典题及答案
- 3岁以下婴幼儿健康养育照护指南(试行)
评论
0/150
提交评论