FORTRAN程序设计课件_第1页
FORTRAN程序设计课件_第2页
FORTRAN程序设计课件_第3页
FORTRAN程序设计课件_第4页
FORTRAN程序设计课件_第5页
已阅读5页,还剩142页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

FORTRAN90數據類型

整型數據

實型數據

複型數據

字元型數據

邏輯型數據一、整型數據

整型變數的說明:INTEGER[(類別參數值)][[,屬性列表]::]變數列表其中類別參數值取1,2,4,變數的屬性是指被說明對象的所屬性質。一個對象被說明具有某一屬性時,就使該對象具有某種附加功能、特殊的使用方式與適用範圍。屬性的種類有很多,這裏介紹兩種最常見屬性的說明格式:INTEGER,PARAMETER::I=5,J=24INTERGER,DIMENSION(1:10)::A例求Fibonacci數列前30項之和。

分析:本例中,Fibonacci數列前30項之和是一個很大的數,已經超過了類別參數為2的整數的取值範圍,只能採用類別參數為4整數。如果數超過類別參數為4的整數取值範圍,就只能採用實型數據來處理。二、實型數據

實型變數的說明:REAL[([KIND=]類別參數值)][[,屬性列表]::]變數列表單精確度用REAL(4)定義,雙精度用REAL(8)或DOUBLEPRECISION定義。缺省的類別值為4,即為單精確度。例利用雙精度求:

直到最後一項的絕對值小於10-15為止。三、複型數據

將兩個實數用逗號分隔,再用括弧括起來就構成了一個FORTRAN複型常量。其中第一個實數稱為複數的實部,第二個實數稱為複數的虛部。複型變數的說明:COMPLEX[(類別值)][[,屬性列表]::]變數列表如果實部和虛部都不是常數,而是運算式,則應該用CMPLX函數將實部和虛部組成複型數據再賦給複型變數。例如C=CMPLX(3.0*A,6.0+B)例有一線段AB,A的座標為(1,1),B的座標為(4.5,4.5),求AB的長度以及黃金分隔點C的座標。黃金分割點線上段的0.618處。分析:A,B的座標可用複數表示:即A為(1.0,1.0),B為(4.5,4.5)。AB的長度就是(A-B)的模。可用ABS函數直接求出複數的模。黃金分隔點C的座標為A+0.618×(B-A)。四、字元型數據

1.字元型常量字元型常量又叫字串常量,它是用單撇號或雙撇號括起來的字元序列。例如,″ABCD″、′CHINA′、′12345678′等都是FORTRAN字元型常量。當字串中又含有單撇號時,例如要將I′MASTUDENT作為一個字串來處理,為了區分′是字串中的字元還是定界符,可採用兩種方式表示:″I′MASTUDENT″′I′′MASTUDENT′前者用雙撇號作定界符,後者用單撇號作定界符,而將字串的單撇號用兩個單撇號表示,系統會自動將其處理為字串的一個單撇號字元。2.字元型變數CHARACTER(LEN=n1[,KIND=n2])[[,屬性說明]::]變數列表格式中的n1和n2是一個整數和整型運算式,n1代表被說明變數的長度,n2代表字元變數的類別參數,各項屬性說明是字元型變數有關屬性的說明。例如CHARACTER(LEN=25,KIND=2)::A,B,CCHARACTER(LEN=8),DIMENSION(1:10)::X,Y,ZCHARACTER(10),PARAMETER::NAME=′FORTRAN_90′CHARACTER(15)::ACHARACTER*15::ACHARACTER(15)::A,B*8,C*5,D,E3.子字串字元變數名(m:n)其中,m和n是整數和整型運算式,表示子字串在字串中的起止位置,該子字串的長度為n-m+1(n≥m≥1)。

4.字元運算式字元運算符只有一個,就是字元連接符″//″,它是由兩個斜杠組合而成的,其作用是將兩個字元型數據連接起來,成為一個字元型數據。5.字元關係運算式兩個字串比較時,將兩個字串中的字元自左向右這個進行比較。若所有字元完全相同,則兩運算式相等。否則,以第一次出現不同字元的比較結果為准。6.用於字元處理的內部函數•

求字串長度函數(LEN和LEN_TRIM)•

子串位置函數(INDEX)•

字元與字元序號相互轉化函數

7.字元處理應用舉例例1在讀入的一批單詞中,把以字母′B′開頭的列印出來,直到輸入′ZZZ′結束。例2翻譯密碼:為了保密,常不採用明碼電文,而用密碼電文,按事先約定的規律將一個字元轉換為另一個字元。收報人則按相反的規律轉換得到原來的字元。例如,將字母′A′→′F′,′B′→′G′,′C′→′H′,即將一個字母變成其後第五個字母。五、邏輯型數據

邏輯常量只有真和假兩種值:.TRUE.和.FALSE.。變數說明的格式為:LOGICAL[(類別值)][[,屬性列表]::]變數列表例當某點的X,Y座標落在四個方塊內和方塊邊上時,Z=0,如在方塊外,Z=3。實驗六FORTRAN數據類型

格式輸入輸出

輸入輸出概述

格式輸入輸出語句

格式說明語句

常用的編輯描述符

輸入輸出項與編輯符的相互作用

一、輸入輸出概述

輸入輸出是指在電腦記憶體與外部設備之間傳送數據的過程。從外部設備將數據傳送到電腦記憶體稱為輸入。將電腦內部的數據傳送到外部設備稱為輸出。要順利地傳送數據,一般應在輸入輸出語句中給電腦提供三方面的資訊:

(1)通過什麼設備來進行輸入輸出。

(2)採用什麼樣的格式來進行輸入輸出。

(3)輸入輸出的具體內容。二、格式輸入輸出語句

1.格式輸出v

PRINTf,輸出項其中f是格式說明符,指明了輸出所用的格式。它有以下三種形式:

(1)格式說明符是一個“*”,表示輸出使用表控格式。(2)格式說明符是一個字元常量。例如

PRINT'(1X,2F7.3)',X,Y(3)格式說明符是格式語句(FORMAT)的語句標號。例如PRINT100,A,B,C100FORMAT(1X,F9.4,2F7.3)v

WRITE(u,f)輸出項其中u是設備號,用於指明具體使用的輸出設備。u可以是一個無符號整數,還可以是星號*。*表示系統預先約定的外部設備,一般為顯示器。2.格式輸入格式輸入語句是指READ語句,它有兩種形式:READf,輸入項READ(u,f)輸入項其中f指明了輸入所用的格式。它有以下三種形式:

(1)格式說明符是一個“*”,表示輸入使用表控格式。(2)格式說明符是一個字元常量。例如READ(*,'(I3,2I4)')I,J,K(3)格式說明符是格式語句(FORMAT)的語句標號。這是最常用的格式輸入形式。

u是設備號,用於指明具體使用的輸入設備。u可以是一個無符號整數,還可以是星號“*”。“*”表示由電腦系統預先約定的外部設備,一般為鍵盤。三、格式說明語句

格式說明語句的一般格式是:

nFORMAT(格式說明)其中n是語句標號,FORMAT語句一定帶有語句標號,以便同格式輸入輸出語句配合使用。四、常用的編輯描述符

1.可重複編輯描述符

整型數據編輯描述符實型數據編輯描述符複型數據編輯描述符邏輯型數據編輯描述符字元型數據編輯描述符2.非重複編輯描述符3.縱向走紙控制符

整型數據編輯描述符:I編輯符、B編輯符、O編輯符和Z編輯符。

I編輯符用於十進位整數的輸入輸出。它的一般格式是:

rIw其中r是重複係數,為1時可以省略。w表示字段寬度,即與該編輯描述符對應的輸入輸出項所佔用的字元個數。(1)I型輸入的使用規則:在輸入記錄中從左往右取w個字元存入對應的輸入項。(2)I型輸出的使用規則:在輸出記錄中,對應的輸出項的值占w個字元寬度。實型數據編輯描述符:F編輯符、E編輯符、EN編輯符、ES編輯符和G編輯符。

F編輯符用於實型量的輸入輸出(按小數形式)。它的一般格式是:rFw.d其中r為重複係數,為1時可以省略。w為字段寬度,d為輸入輸出項小數部分所占的位數。(1)F型輸入規則:按編輯描述符中w指定的字段寬度從輸入記錄中截取數據,若w個字元中不含小數點,則系統自動按d決定小數點的位置,若w個字元中含有小數點,則按“自帶小數點優先”的原則。(2)F型輸出規則:把輸出項的值轉換成字段寬度為w的小數形式輸出,其中小數部分占d位,小數點占一位。複型數據編輯描述符複型數據沒有專門的編輯符。對複型數據的輸入輸出,可以按實部和虛部分別輸入輸出。邏輯型數據編輯描述符邏輯型數據的輸入輸出用L編輯符。其一般格式是:rLw

邏輯值只有兩個:真(.TRUE.)和假(.FALSE.)。(1)輸入時,輸入的數據可以是頭一個字母為T或F的任何字串。(2)輸出時,對邏輯真(.TRUE.),輸出一個字母T,對邏輯假(.FALSE.),輸出字母F,且在左邊補w-1個空格。字元型數據編輯描述符字元型數據的輸入輸出用A編輯符。其一般格式是:

rAw其中字段寬度w可以省略,省略時,輸入輸出項的字段寬度隱含為對應的字元型輸入輸出項的長度l。

(1)A編輯符的輸入規則:當w>l時,從w個字元中取出最右邊l個字元送給對應的輸入項。當w<l時,當w個字元全部送入輸入項,並靠左對齊,右邊補l-w個空格。這一點同字元賦值語句的規則是相同的。(2)A編輯符的輸出規則:在輸出記錄中,Aw編輯符所對應的輸出項一定占w個字元的寬度,但輸出項實際包含字元的個數l可能與w不一致。當w=l時,輸出項所有的字元全部輸出。當w>l時,輸出項所有的字元全部輸出,並且靠右對齊,左補w-l個空格。當w<l時,輸出項最左邊w個字元輸出。當w省略時,按輸出項的長度輸出,這是最方便的形式。2.非重複編輯描述符

(1)X編輯符。用於在輸入輸出的常數之間插入空格。它的一般格式是:

nX其中n是正數,用於指明從當前位置向右跳過n個字元位置。這裏n不能省略,即使n為1,也要寫成1X。(2)H編輯符。用於輸出一個字串。其一般格式是:

nHh1h2…hn其中n是正整數,表示字串的長度,h1h2…hn為n個字元。(3)撇號編輯符。用於輸出一個字串。撇號編輯符和H編輯符作用相同,但撇號編輯符使用更為方便。(4)斜扛編輯符:結束當前正在輸入或輸出的記錄,並轉入下一個記錄開始輸入輸出。3.縱向走紙控制符FORTRAN規定,將輸出記錄中的第一個字元作為縱向走紙控制符,這個字元不輸出,而從輸出紀錄的第二個字元開始輸出。常用的控制字元有:空格(走紙一行)、0(走紙二行)、1(換頁)、+(不走紙,返回到本行重迭列印)。五、輸入輸出項與編輯符的相互作用

(1)如果可重複編輯符的個數多於輸入輸出項的個數,則多餘的編輯符不起作用。(2)如果可重複編輯符的個數少於輸入輸出項的個數,則按順序用完最後一個可重複編輯符之後,再重複使用格式說明,但產生一個新記錄。(3)如果在編輯描述符表中包含有重複使用的編輯符組,則當所有編輯符用完之後,返回到最右邊那個編輯符組(包括其重複係數)開始使用。分析下列程式的輸出結果。

I=56J=1247K=5126WRITE(*,10)I,J,K10FORMAT(1X,2(I5,2X)/)END

輸出結果為:

□□□56□□□1247(空一行)5126總結

FORTRAN90提供的編輯描述符很多,這給初學者學習帶來了困難,但一些編輯描述符也有共同特點,把握這些特點以後也就不難掌握了。可重複編輯描述符是用來決定對應輸入輸出項的輸入輸出格式的,其中都有字段寬度w,而且對於輸入都是從輸入記錄中取w個字元,對於輸出都是在輸出記錄中輸出w個字元。但問題是,在輸入時,取得的w個字元按什麼規則加工後傳送到對應的輸入項。在輸出時,當輸出項實際包括的字元的個數和編輯符中所確定的字段寬度(對於數值型數據還有小數位數)之間不相符時,如何輸出?讀者可以分數值型、邏輯型、字元型進行總結。實驗七格式輸入輸出

數組

數組的概念

數組的說明與引用

數組元素的存儲結構

數組的輸入輸出

給數組賦初值

數組的應用一、數組的概念思考一:•

計算一個班學生的平均成績。•

計算一個班學生的平均成績以及每個成績與平均成績的差。思考二:•

求100個學生成績中的最高分。將100個學生的成績按從高到低的順序排列。把具有相同類型的一批數據看成是一個整體,叫做數組。給數組取一個名字叫數組名。數組中的每一個數據稱為數組元素,它可通過順序號(下標)來區分。例如,一個班60名學生的成績組成一個數組G,又如某廠5個車間全年各季度的產量組成數組P。在這裏,區分G數組的元素需要一個順序號,故稱為一維數組,而區分P數組的元素需要兩個順序號,故稱為二維數組。二、數組的說明與引用1.數組說明的內容程式中要使用任何一個數組都必須給予說明,即說明該數組的名字、類型、維數及大小。數組說明要用到數組說明符。它的一般形式是:數組名(維說明符[,維說明符]…)

維說明符的一般形式是:

[維下界:]維上界2.數組說明(1)用DIMENSION語句說明數組

DIMENSION數組說明符[,數組說明符]…例如DIMENSIONJU(20),NAME(-10:10,1:2)REALJUCHARACTERNAME(2)用類型說明語句說明數組類型符數組說明符[,數組說明符]…例如

CHARACTER*6CH(-10:10,5:9)*8REALKK(8)REAL(8)SOLUTION(30)(3)同時使用DIMENSION語句和類型說明語句說明數組一般格式為:類型符,DIMENSION(維說明符[,維說明符]…)::數組名[,數組名]…例如

REAL(8),DIMENSION(0:10)::A,B,CINTEGER,DIMENSION(4,5)::D,E

在說明數組時,也可以在數組名後面給出維說明,這時以該數組名後面的維說明為准。例如

REAL,DIMENSION(0:10)::A,B(20),C(4,5,3)說明A為A(0:10),而B,C分別為B(2)和C(4,5,3)3.數組元素的引用一般形式是:數組名(下標運算式[,下標運算式]…)思考:有下列程式片段:

REALLK(5,5)

LK(5,5)=12.5…兩個語句中都有L(5,5),它門的含義有何不同?對數組進行整體操作INTEGER,DIMENSION(4,5)::A A=100 A(:,1:5:2)=470說明了4×5整型數組A,先將A的全部元素賦為100,再將A第1,3,5列元素賦為470。三元運算式一般形式:初值:終值:步長三、數組元素的存儲結構FORTRAN90規定,數組元素在內存中是按列的順序連續存放的。就二維數組而言,存放時先存入第一列元素,然後第二列,…,直到全部元素存完為止。對於多維數組,首先改變第一個下標,其次改變第二個下標,直至最後一個。分析下列數組的存儲結構:

INTEGERA(50),B(3,4)REALC(3,2,3)四、數組的輸入輸出1.使用DO迴圈輸入輸出數組元素例如,利用二重迴圈實現二維數組的輸入輸出。2.以數組名作為輸入輸出項數組名作為輸入輸出項時,數組元素按照它們在內存中的排列順序輸入輸出。這種方式要特別注意數據的組織。3.使用隱DO迴圈進行數組元素的輸入輸出隱DO迴圈的一般形式是:

(輸入/輸出表,i=e1,e2[,e3])其中i是隱DO迴圈變數,e1、e2、e3是隱DO迴圈參數。例如WRITE(*,*)(3,4,I=1,3)等價於WRITE(*,*)3,4,3,4,3,4例分析下列程式段在輸出格式上的差異:(1)WRITE(*,*)(A(I),I=2,14,3)(2)DOI=2,14,3WRITE(*,*)A(I)ENDDO五、給數組賦初值1.使用DATA語句賦初值一般格式:DATA專案表/常量表/[[,]專案表/常量表/]…2.使用數組賦值符賦初值一般格式是:數組名=(/取值列表/)實驗八數組(一)六、數組的應用1.一維數組的應用例1從鍵盤輸入10個整數存入一個一維數組,然後將數組最大值與第一個元素互換,最小值與最後一個元素互換,其餘元素不變。例2輸入100個字母,分別統計母音字母A、E、I、O、U出現的次數。例3將N個數排序。2.二維數組的應用例1設有一個4×5的矩陣,求(1)矩陣所有元素之和及平均值。(2)保留所有大於平均值的元素,其餘元素清零。例2給定一個5×10矩陣,其元素互不相等,求每行絕對值最大的元素及其所在列號。例3矩陣乘法。已知m×n矩陣A和n×p矩陣B,試求它們乘積:C=A×B。例4求矩陣B50x50的範數。矩陣範數定義為它各行元素絕對值和的最大值,計算公式如下:總結1. 數組的概念、定義、引用。2. 關於數組的常用演算法:排序、查詢、矩陣乘法等。實驗八數組(二)

順序結構程式設計

FORTRAN常量

FORTRAN變數

FORTRAN內部函數

FORTRAN算術運算式

賦值語句

簡單輸入輸出語句

程式執行控制語句

程式舉例一、FORTRAN常量

1.直接常量(1)整型常量(2)實型常量:小數形式和指數形式。分析:1E2,1.0E2,100.0,100的區別。2.符號常量所謂符號常量,是用一個識別字來代表一個常量。符號常量常用PARAMETER語句來定義。二、FORTRAN變數

1.變數的概念變數實質上代表的是一個記憶體單元。分析下列語句:N=N+12.變數名變數的名字用識別字命名。在FORTRAN語言中,識別字只能由字母、數字和下劃線組成,且開頭只能是字母。3.變數的說明

(1)類型說明語句格式為:類型說明符變數名1,變數名2,…

類型說明符::變數名1,變數名2,…例如

INTEGERX,YREAL::SCORE,HEIGTH=16.5(2)隱含說明語句IMPLICIT格式為:IMPLICIT類型說明(字母表)例如IMPLICITINTEGER(A,C,T-V)(3)隱含約定I-N規則:FORTRAN語言規定以I,J,K,L,M,N6個字母開頭的變數被當作整型變數。三、FORTRAN內部函數內部函數是指系統本身帶有的能完成一定功能的程式單位。

(1)FORTRAN內部函數,也稱為庫函數。在程式中可直接調用這些函數,在完成程式的編譯後,通過連接,即將一組二進位指令代入該函數出現的地方,與編譯好的目標程式一起形成可執行程式。(2)一個內部函數要求一個或多個引數。(3)函數的引數是有類型的,函數的值也是有類型的。三、FORTRAN內部函數

例:(1)求三個數X、Y、Z中的最大值可以表示為:MAX(X,Y,Z)。(2)判斷一個數自然數M是否為另外一個自然數N的因數,通過MOD(N,M)是否為0可以判斷,如果為0,則說明M是N的因數,否則說明N不能被M整除。四、FORTRAN算術運算式

1.運算符號與其優先順序別+、-、*、/、**2.如何書寫運算式

(1)運算式中的所有字元都必須寫在一行。

(2)運算式中常量的表示、變數的命名以及函數的引用要符合FORTRAN語言的規則。

(3)算術運算式中,乘號不能省略。

(4)兩整數相除,結果為整數,不會進行四捨五入,而是把小數後面的部分切掉。分析:3*2/3與2/3*33.算術運算式中類型轉化:將低級類型轉換成高級類型。

例(SIN(A)+COS(B))/(A*B)EXP(X*Y)*SQRT(X-Y)ABS(A**(-n))+LOG(B)1.0/N思考題

寫出FORTRAN運算式(1) (2)(3)將兩位自然數的個位與十位互換,得到一個新的數。(4)將實數X四捨五入保留兩位小數。

實驗一FORTRAN程式設計基礎

五、賦值語句

1.賦值語句的格式變數名=運算式

2.執行賦值語句時的類型轉換問題(1)左右兩邊類型相同,運算完畢,直接賦值。(2)左右兩邊類型不同,右邊運算式按原來規則計算,再轉換為與左邊變數相同的類型,然後將值賦給左邊的變數。六、簡單輸入輸出語句

1.表控輸入語句READ*,變數表READ(*,*)變數表例:READ*,X,Y,Z系統隱含指定的輸入設備表控輸入

六、簡單輸入輸出語句2.表控輸出語句

PRINT*,輸出項表WRITE(*,*)輸出列表例:PRINT*,”Y=”,X**2表控格式輸出

七、程式執行控制語句

STOP語句•

PAUSE語句•

END語句八、程式舉例

例1已知

f(x)=x3+sin2x2+ln(x4+1)輸入引數的值,求出對應的函數值。READ*,XF=X**3+SIN(X**2)**2+LOG(X**4+1)PRINT*,"F(X)=",FEND總結

1.編程的思路可以分三步來考慮:一是輸入原始數據,二是對原始數據進行處理,三是輸出處理結果。一般而言第一步和第三步比較簡單,往往需重點考慮第三步。在一開始學習程式設計時,讀者就要養成好的習慣。2.注意運算式的書寫方法。3.注意以下技巧:·

將實數取整。·

整除的判斷。分離整數的各位數字。思考題

已知,其中,求y的值。

實驗二順序結構程式設計

檔的概念檔的打開與關閉檔的讀寫檔應用舉例

一、檔的概念

數據檔是存放在外部介質上數據的集合。數據檔由記錄組成。它是數據傳遞的基本實體,是電腦記憶體與外部設備傳遞資訊的最小單位。記錄分為格式記錄和無格式記錄。格式記錄是一個字元的序列,在電腦內部以ASCII碼形式存放,輸出時轉換成外部形式。無格式記錄是由二進位值的序列組成。這些二進位值是FORTRAN數據的內部表示,輸入輸出時無需作格式轉換,其速度較快。根據記錄的數據存放形式可分為格式檔和無格式檔。由格式記錄組成的檔稱為格式檔,由無格式記錄組成的檔稱為無格式檔。根據檔的存放方式分為順序檔和直接檔。順序存取是指將檔的記錄按建立的時間先後順序依次存放在存儲介質中。

直接存取,又稱隨機存取。它是指將檔記錄由程式指定的某一位置直接存取。順序檔的存取操作必須從頭到尾順序進行。直接檔也稱為隨機檔,檔中的每一個記錄都有一個記錄號,可以按記錄號對指定的記錄進行讀寫。順序存取的檔中所有的記錄長度可以完全不同,而直接存取的檔中的記錄的長度由OPEN語句中的說明項“RECL=”指定,每個記錄長度相同。例以順序方式和直接方式將字元型、數值型數據寫入檔中。OPEN(10,FILE="A.TXT",FORM="FORMATTED",&ACCESS="SEQUENTIAL")WRITE(10,100)911WRITE(10,200)"WELCOME"OPEN(11,FILE="B.TXT",FORM="FORMATTED",&ACCESS="DIRECT",RECL=10)WRITE(11,100,REC=1)911WRITE(11,200,REC=2)"WELCOME"100FORMAT(1X,I5)200FORMAT(1X,A15)END二、檔的打開與關閉

1.OPEN語句

OPEN語句將設備號與檔案名聯繫起來,並指定檔的各項性質,其一般格式為:OPEN([UNIT=]ie[,FILE=ce][,ACCESS=ce][,FORM=ce][,RECL=ie])UNIT=ie是設備號說明,設備號是一個整型運算式。

FILE=ce是指定檔案名。

ACCESS=ce是檔存取方式說明。可用'SEQUENTIAL'或'DIRECT',缺省'SEQUENTIAL'。

FORM=ce是記錄格式說明。可用'FORMATTED'或'UNFORMATTED'。對於順序檔隱含為有格式,對於隨機檔,隱含為無格式。RECL=ie說明記錄長度,僅用於直接檔。

2.CLOSE語句CLOSE語句解除設備號與檔的連接,即關閉該檔。一般格式是:

CLOSE([UNIT=]ie[,STATUS=ce])其中STATUS=ce說明文件被關閉後的狀態:'KEEP'(保留)、"DELETE'(刪除),缺省狀態為'KEEP'。

三、檔的讀寫

1.READ語句READ([UNIT=]ie[,FMT=]格式說明[,REC=ie][,END=L][,ERR=L])輸入表REC=ie為記錄號說明,僅適用於直接存取檔。END=L為檔結束說明,遇到檔結束標誌時轉向標號為L的語句去執行。WRITE語句中無此項。ERR=L為出錯說明,當產生錯誤時,轉向標號為L的語句去執行。

2.WRITE語句的一般形式WRITE([UNIT=]ie[,FMT=]格式說明[,REC=ie][,ERR=L])輸出表

3內部檔內部檔用字符串或字元數組作為單元標識,通過內部檔,利用格式輸入輸出可以實現記憶體和外部字元表示之間值的相互轉換。(1)用READ語句將ASCII碼轉換成數值型、邏輯型、字元型。例分析下列程式的輸出結果。CHARACTERstr(2)*10REALn(2)LOGICALloDATAstr/'1.232','.TRUE.'/READ(str(1),200)n,m !字元型轉換成數值型READ(str(2),*)lo !字元型轉換成邏輯型200FORMAT(2F3.1,I3)WRITE(*,*)n,m,loEND(2)利用WRITE語句將數值型、邏輯型、字元型轉換成ASCII碼。例11.13假設磁片上有70個檔,檔的主文件名首字元都為“F”,後兩個字元為檔序號(如F01.DAT),編寫程式,實現根據輸入的序號打開相應檔。CHARACTERfname*7WRITE(*,*)"請輸入兩位數的檔序號:"READ(*,*)iWRITE(fname,200)I !合併字串200FORMAT('F',I2,'.DAT')OPEN(11,FILE=fname)WRITE(11,*)'Fortran90'END四、檔應用舉例

例1建立一個有格式順序存取檔,存放某單位辦公用品資訊(如表所示)。

其中,品名、數量、單價由用戶輸入,金額由程式計算得出,然後存放到磁片檔中,檔案名為goods.dat。當輸入的品名為“/”時,結束輸入。

例2有9個班的學生成績,在磁片上建立9個存放學生成績的直接存取檔,檔案名分別為class1.dat、class2.dat、…,class9.dat,檔的記錄格式見表2。

選擇結構程式設計

關係運算和邏輯運算塊IF選擇結構塊CASE選擇結構邏輯IF語句程式舉例

一、關係運算和邏輯運算

1.關係運算(1)FORTRAN90共有6個關係運算符:(2)關係運算式運算式1關係運算符 運算式2

例:MOD(I,2)/=1或MOD(I,2).NE.12.邏輯運算(1)FORTRAN所用的基本邏輯運算有:·

邏輯與運算.AND.·

邏輯或運算.OR.·

邏輯非運算.NOT.·

邏輯等於運算.EQV.·

邏輯不等運算.NEQV.·

邏輯異或運算.XOR.(2)邏輯運算式邏輯值1邏輯運算符邏輯值2例:

(a)直角坐標中,第一象限的點

(b)X∈[-3,5](c)a<b<c二、塊IF選擇結構

IF(邏輯運算式)THEN

塊1 ELSE

塊2ENDIF例:判斷自然數M是否為N的因數,是輸出“YES”,不是輸出“NO” IF(MOD(N,M)==0)THEN PRINT*,”YES” ELSE PRINT*,”NO” ENDIF3.多分支結構IF(邏輯運算式1)THEN

塊1ELSEIF(邏輯運算式2)THEN

塊2 …ELSEIF(邏輯運算式n)THEN

塊nELSE

塊n+1ENDIF例教材PAGE44第9題三、塊CASE選擇結構

塊CASE選擇結構一般格式為:SELECTCASE(運算式)CASE(運算式1)

塊1CASE(運算式2)

塊2

……CASE(運算式N)

塊NCASEDEFAULT

默認塊ENDSELECT例編寫程式,輸入年月,輸出該月所對應的天數。四、邏輯IF語句

邏輯IF語句格式:IF(條件運算式)可執行語句例:教材PAGE44第9題

五、程式舉例

例1輸入一個三位自然數,判斷它是否為水仙花數,所謂水仙花數,是指各位數字的立方和等於該數本身的數如153=13+53+33為水仙花數。例2將學生成績分為優(90~100分)、良(80~89)、中(70~79)、及格(60~69)、不及格五個檔次。從鍵盤輸入學生的成績,輸出對應的檔次。

總結

選擇結構程式設計注意兩個問題:一是如何表達條件?二是實現選擇結構的語句。要注意關係運算式和邏輯運算式的書寫規則,注意各種語句的書寫格式、執行過程以及應用方法。

實驗三選擇結構程式設計

迴圈結構程式設計

用DO語句實現迴圈

用DOWHILE語句實現迴圈

幾種迴圈組織方式的比較

迴圈的嵌套

迴圈結構的程式設計方法

一、用DO語句實現迴圈

1.DO迴圈一般格式DOi=e1,e2[,e3]…(循環體)ENDDO其中i代表迴圈變數,它可以是整型或實型變數。e1、e2、e3稱為迴圈參數運算式,分別表示迴圈變數的初值、終值和步長。循環體是在迴圈過程中被重複執行的語句組。例求5!2.DO迴圈執行過程計算e1、e2、e3的值e1→i計算迴圈次數rr=0?執行循環體i+e3→ir-1→rENDDO下麵的語句YNDO迴圈的執行次數

r=MAX(INT((e2-e1+e3)/e3),0)說明•

循環體指的是DO語句與ENDDO語句之間的語句,因此循環體並不包括DO語句,執行程式時DO語句也只執行一次。如果迴圈參數運算式e1、e2、e3中含有變數,那麼即便在循環體中改變變數的值,迴圈參數並不改變。•

在循環體內給迴圈變數賦值,是不允許的。思考下列程式的執行結果DOK=1,10,2L=KENDDOPRINT*,K,LEND例1一個整數的因數(不包括該數本身)之和等於它本身,則稱該數為完數。例如6的因數有1,2,3,且1+2+3=6,因此6是完數。輸入一個整數,判斷它是否完數例2

Fibonacci數列定義如下:F1=1F2=1Fn=Fn-1+Fn-2(n>2)求Fibonacci數列的前30項。

例3所謂“水仙花數”是指一個三位整數,其各位數字立方和等於該數本身。例如,153就是一個水仙花數。輸出全部“水仙花數”。在[100,999]範圍內,對所有整數逐一驗證是否符合的條件,輸出符合條件的數。這種方法稱為窮舉法。

二、用DOWHILE語句實現迴圈對於迴圈次數確定的迴圈問題使用DO迴圈是比較方便的。但是,有些迴圈問題事先是無法確定迴圈次數的,只能通過給定的條件來決定是否繼續迴圈。這時可以使用DOWHILE語句來實現迴圈。1.DOWHILE迴圈的一般格式

DOWHILE(邏輯運算式)

循環體

ENDDO例輸出所輸入的全部正數,直到輸入負數或零,程式結束。

2.DOWHILE迴圈的執行過程例輸入一個整數,輸出其位數。執行循環體ENDDO下麵的語句滿足迴圈條件?3.與迴圈有關的控制語句

EXIT語句•

CYCLE語句

CYCLE語句和EXIT語句的區別在於:CYCLE語句只結束本次迴圈,而不是終止整個迴圈的執行。EXIT語句則是結束所在迴圈,跳出所在循環體。實驗四迴圈結構程式設計

三、幾種迴圈組織方式的比較實現迴圈結構的三種語句,它們各具特點。一般而言,事先能確定迴圈次數的迴圈問題用DO迴圈,而事先不能確定迴圈次數的迴圈問題用DOWHILE迴圈。但這並不是絕對的,很多情況下它們是可以相互代替的。例輸入一個整數m,判斷是否素數。•

用DO迴圈實現。•

用DOWHILE迴圈實現•

用DO迴圈和邏輯IF語句的嵌套實現。四、迴圈的嵌套如果一個迴圈結構的循環體又包括一個迴圈結構,就稱為迴圈的嵌套,或稱為多重迴圈結構。在例求[100,1000]以內的全部素數。

(1)判斷一個數是否素數。

(2)利用窮舉法將判斷一個數是否素數的程式段,對指定範圍內的每一個數都執行一遍,即可求出某個範圍內的全部素數。五、程式舉例例1已知某球從100m高度自由落下,落地後反復彈起。每次彈起的高度都是上次高度的一半。求此球第10次落地後反彈起的高度和球所經過的路程

分析:用變數H來表示下落的高度,變數R來表示反彈的高度,變數S來表示小球經過的路程,則H的初值為100,反彈高度R=H/2。彈起一次小球要經過下降和上升兩個階段,小球經過的路程為H+R,這個過程如圖所示。例2用牛頓迭代法求方程f(x)=2x3-4x2+3x-7=0在x=2.5附近的實根,直到滿足|xn-xn-1|≤10-6

為止。牛頓迭代公式為:注意:關於迭代初值x0的選取問題,理論上可以證明,只要選取滿足條件f(x0)f’’(x0)>0的初始值x0,就可保證牛頓迭代法收斂。當然迭代初值不同,迭代的次數也就不同。

例3求f(x)在[a,b]上的定積分。分析:求一個函數f(x)在[a,b]上的定積分,其幾何意義就是求曲線y=f(x)與直線x=a,x=b,y=0所圍成的圖形的面積。為了求得圖形面積,先將區間[a,b]分成n等分,每個區間的寬度為h=(b-a)/n,對應地將圖形分成n等分,每個小部分近似一個小曲邊梯形。近似求出每個小曲邊梯形面積,然後將n個小曲邊梯形的面積加起來,就得到總面積,即定積分的近似值。n越大,近似程度越高。這就是函數的數值積分方法。近似求每個小曲邊梯形的面積的常用方法(1)用小矩形代替小曲邊梯形,求出各個小矩形面積,然後累加。此種方法稱為矩形法。

(2)用小梯形代替小曲邊梯形,此種方法稱為梯形法。

(3)用拋物線代替該區間的f(x),然後求出拋物線與x=a+(i-1)h,x=a+ih,y=0圍成的小曲邊梯形面積,此種方法稱為辛普生法。以梯形法為例:

第一個小梯形的面積為:

第二個小梯形的面積為:

第i個小梯形的面積為:

第n個小梯形的面積為:本質上講這是一個累加問題。例4某些分子和分母都是兩位數的真分數,分子的個位數與分母的十位數相同,而且奇怪的是:如果把該分數的分子的個位數和分母的十位數同時去掉,所得結果正好等於原分數約分後的結果。例如,試求所有滿足上述條件的真分數。分析:我們先把條件歸納為下麵四點:

(1)分子和分母原為兩位數;

(2)真分數;

(3)分子的個位數與分母的十位數相同;

(4)把分子的個位數和分母的十位數同時劃去,分數值不變。考慮到分子和分母原為兩位數,可以把分子和分母看成從10到99這90個數中每次取兩個數的組合,對每一種組合驗證條件(2)、(3)、(4)。總結:如何編寫與調試程式

一、程式設計演算法“如何編寫程式”是學習高級語言程式設計的難點,也是學習的重點。初學者普遍感到頭疼的問題是,碰到一個問題後不知從何下手,難以建立起明確的編程思路。根據教學基本要求,將本章程序設計問題分為累加與累乘問題、數字問題、數值計算等3類,每一類程式設計問題的思路如下:

1.累加與累乘問題

累加與累乘問題是很典型、最基本的一類演算法,實際應用中很多問題都可以歸結為累加與累乘問題。演算法設計思路是:

(1)寫出循環體中需要重複執行的部分。這一部分要確定兩個內容:一是求每次要累加或累乘的數;二是迭代關係S=S+X或P=P*X。

(2)確定終止迴圈的方式。一般有事先知道迴圈次數的計數迴圈和事先不知道迴圈次數的條件迴圈兩種方式,依具體情況而定。計數迴圈可用一個變數來計數,當達到一定迴圈次數後即退出迴圈。條件迴圈可根據具體情況確定一個迴圈的條件,當迴圈條件不滿足時即退出迴圈。

(3)確定迴圈初始值,即第一次迴圈時迭代變數的值。

(4)重新檢查,以保證演算法正確無誤。一般而言,這一類問題的演算法流程圖基本框架如圖所示。

例1已知,分別求:

(1)當N取1000時,S的值。

(2)S<0.78時的最大N值和與此時N值對應的S值。

(3)求S的值,直到累加項小於10-4為止。第一種情況下,屬於迴圈次數已知的迴圈結構,第二,三兩種情況下,屬於迴圈次數未知的迴圈結構,

2.數字問題

數字問題主要研究整數的一些自身性質與相互關係。處理過程中常常要用到求餘數、分離數字及判斷整除等技巧,務必熟練掌握。

(1)判斷一個整數M能否被另一個整數N整除。方法1:若MOD(M,N)的值為0,則M能被N整除,否則不能。方法2:若M-INT(M/N)*N的值為0,則M能被N整除,否則不能。事實上,MOD(M,N)的函數值是M除以N的餘數,正是按照運算式M-INT(M/N)*N得到的計算結果。M-INT(M/N)*N也可以寫成M-M/N*N。

(2)分離自然數M各位的數字。

數字問題的提法往往是,求某一範圍內符合某種條件的數。這一類問題的演算法設計思路是:

(1)考慮判斷一個數是否滿足條件的演算法。有時侯可以直接用一個關係運算式或邏輯運算式來判斷,如判斷奇數、偶數。但更多的情況是無法直接用一個條件運算式來判斷,這時可根據定義往往利用一個迴圈結構來進行判斷。

(2)在指定範圍內重複執行“判斷一個數是否滿足條件”的程式段,從而求得指定範圍內全部符合條件的數。這裏用的方法是窮舉。一般而言,這一類問題的演算法流程圖基本框架如圖2所示。

例2若兩個素數之差是2,則稱這兩個素數是一對孿生數。例如,3和5是一對孿生數。求[2,500]區間內(1)孿生數的對數。(2)最大的一對孿生數。

3.數值計算問題

數值計算是“計算方法”課程研究的對象,主要研究如何用電腦來求一些數學問題的數值解。目前數值計算方法已趨於完臻和成熟,許多問題都有了現成的演算法或軟體包。詳細內容可參閱數值分析或計算方法方面的專著,或直接使用有關軟體。(1)用牛頓迭代法求方程f(x)=0在x=x0

附近的實根。直到∣xn-xn-1∣≤ε為止。

(2)求之值。二、常用程式調試技巧

設置中斷點輸出中間結果注釋語句的運用

實驗五常用演算法

指針

指針的定義與使用

動態變數

指針與數組一、指針的定義與使用1.指針變數的定義格式指針變數的定義格式為:類型說明,POINTER::指針變數名1,指針變數名2,…其中類型說明可以是任何數據類型,如INTEGER、REAL等,它表示該指針所指的目標變數類型。POINTER為指針定義的關鍵字。2.指針變數的使用例PROGRAMPOINTER1 INTEGER,POINTER::P INTEGER,TARGET::X READ*,X P=>X PRINT*,"X=",X PRINT*,"P=",P END輸入3,程式的輸出結果為:

X=3P=35PX指針變數的三種狀態①未定義狀態,在程式開始時,所有的指針都處於這種狀態。②空狀態,此時指針還沒有作為任何對象的別名。在程式中,有時為了方便起見,可以讓指針指向一個空對象。其語句為:NULLIFY(指針變數名)。③關聯狀態,此時,指針已經作為其他對象的別名。值得注意的是只有在第三種狀態時,指針才能參與運算,否則,或者編譯出錯,或者非法操作。二、動態變數通過指針,可以先得到變數名,然後再利用ALLOCATE(P)函數可以動態分配其空間,其中P為指針變數。例如

PROGRAMPOINTER3 INTEGER,POINTER::P

ALLOCATE(P) P=4 PRINT*,"P=",P END輸出結果為:P=4三、指針與數組指針數組定義格式為:類型說明,DIMENSION(:…:),POINTER::指針名其中類型說明可以為各種數據類型,如INTEGER、REAL等;DIMENSION(:…:)是數組的動態說明標識,即不指定數組下標界限,“:”個數等於數組維數。POINTER為指針說明標識。例如REAL,DIMENSION(:),POINTER::XALLOCATE(X(20))第一個語句聲明了一個可以指向一維整型數組的指針X,第二個語句為該數組分配了20個單位的存儲空間。例輸入任意兩個數,將它們及四則運算結果存儲起來後,輸出。分析:利用指針,定義一個動態數組X,用來存放輸入的數據和計算的結果,該數組的空間大小可以根據要存儲的數據個數動態分配。總結指針是現代程式設計語言中一個非常重要的概念。FORTRAN90以前的FORTRAN版本,沒有指針這種數據類型,FORTRAN90對其作了重大改進,引入了指針的概念。但是值得注意的是,FORTRAN90的指針與C語言中的指針並不相同,因為它並不代表一個變數的地址,而是代表一個變數的別名,實質上它相當於C++裏的引用。四、鏈表指針用途之一是使得數據在電腦中可以按鏈接方式存儲,而鏈接存儲中,最簡單是鏈表。順序存儲和鏈接存儲是數據的兩種最基本的存儲結構。在順序存儲中,每個存儲結點只含有存儲元素本身的資訊,元素之間的邏輯關係是通過數組下標位置簡單計算出來的。順序存儲最大的缺點是不利於數據的動態變化,如向順序表中插入或刪除一個元素時,需要大量移動數據,處理效率很低。在鏈式存儲中,每一個節點包含兩個部分:一個值和一個指向下一個節點的指針。10.4.1結點的定義TYPENODEINTEGERVALUETYPE(NODE),POINTER::NEXTENDTYPENODE10.4.2鏈表的基本操作鏈表的基本操作包括建表、插入、刪除、查找、更新、遍曆等例建立一個包含5個節點的鏈表,並輸出建表後的結果。(1)定義鏈表TYPE(NODE),POINTER::CURRENT,L(2)建立鏈表READ*,NUMNULLIFY(L)ALLOCATE(CURRENT)CURRENT%VALUE=NUML=>CURRENTDOWHILE(NUM/=0)READ*,NUMIF(NUM/=0)THENALLOCATE(CURRENT)CURRENT%VALUE=NUMCURRENT%NEXT=>LL=>CURRENTENDIFENDDO12345(3)鏈表的輸出CURRENT=>LPRINT*,CURRENT%VALUECURRENT=>CURRENT%NEXTDOWHILE(ASSOCIATED(CURRENT))PRINT*,CURRENT%VALUECURRENT=>CURRENT%NEXTENDDOEND12345

副程式語句函數函數副程式子例行程式程式單元之間的數據傳遞遞歸調用等價語句與數據塊副程式內部副程式模組一、語句函數1.語句函數的定義語句函數定義的一般格式是:

f(x1,x2,…,xn)=e2.語句函數的調用語句函數的調用形式和內在函數完全相同。例1計算f(1)f(10)f(12)f(-5)的值。例2找出100~999之間的所有水仙花數。二、函數副程式1.函數副程式的定義函數副程式的定義格式是:[類型說明]FUNCTION函數名(虛參表)

函數體END函數名的命名方法與變數名相同,虛參可以是簡單變數和數組變數,但不能是常數、數組元素、運算式)例1求分析:上述三個數列的通項不同,求和範圍也不同,用一個程式段難以同時計算三個數列的和,並且,因為無法用一個語句函數完成數列的求和計算,所以也無法使用語句函數來簡化程式設計。可以採用函數副程式來完成這個問題。設計一個求和的函數副程式SM(M,N,L),M、N分別為求和範圍的上、下界,L反映數列通項的性質。函數定義部分應注意如下問題:(1)函數不能有同名虛參。虛參的類型可以在函數體中進行說明,當未對虛參類型進行說明時,虛參類型遵守I—N隱含規則。(2)函數定義部分中一定要有一個語句將函數值賦值給函數名,這種賦值語句的格式是:函數名=運算式。注意不要在函數名後帶上括弧。2.函數副程式的調用調用一個函數副程式的方法和調用內在函數和語句函數的方法基本相同。例2用函數副程式的方法設計一個程式,求50~100內的所有素數及其和。分析:設計一個函數副程式PRIME(N):主程序的任務是應用PRIME函數副程式在50~100之間使用枚舉法求出那些使PRIME函數值為1的自然數並求這些數的和。思考:副程式的返回值分別為邏輯型、字元型時,主、副程式程式做何修改?例2當一個數各個數位的立方和等於這個數本身時,稱這樣的數為水仙花數(如153=1**3+5**3+3**3,所以,153是一個水仙花數。)編程:求100~999之間的水仙花數。分析:設計一個函數副程式NUM(N,I),當I=100時,函數NUM返回N的百位上的數;當I=10時,NUM返回N的十位上的數,I=1時,NUM返回N的個位上的數。主程序中調用NUM函數在100~999之間找出所有水仙花數。三、子例行程式1.子例行副程式的定義子例行副程式定義格式是:SUBROUTINE副程式名(虛參表)

子例行程式體END副程式的命名方法與變數相同。虛參由變數、數組名(不能是數組元素,常數、運算式)充當,當虛參多於一個時,各虛參間用逗號分隔,當沒有虛參時,子例行程式名後的一對括弧可以省略。子例行程式的設計方法和函數副程式相同,但因為其名字沒有值,所以不能有對子例行程式的名字賦值的語句。2.子例行副程式的調用子例行程式的調用格式是:CALL子例行程式名(實參表)其實參的類型與函數副程式相同。和函數副程式的調用不同的是,子例行副程式的調用是一個獨立的語句。例1用子例行程式的方法求上面的s1,s2,s3。例2設計一個子例行程式程式,求任意矩陣的轉置矩陣。實驗九副程式(一)四、程式單元之間的數據傳遞1.簡單變數作為虛參(1)簡單變數或數組元素作為實參。系統將實參與虛參安排同一個存儲單元,對虛參的任何改變都作用在對應的實參上,因而調用一個副程式(包括函數副程式和子例行程式)時,實參的值有可能改變。(2)常量或運算式作為實參。首先計算運算式的值(如果實參為運算式時),然後將該值賦值給對應的虛參。此種情況下,副程式中不能改變與常量(或運算式)對應的虛參的值。2.數組名作為虛參當虛參是數組名時,對應的實參可以是與虛參類型相同的數組名或數組元素,並且實參與虛參共用一片連續的存儲單元。例:寫出下列程式的執行結果 INTEGERA(5) N1=1 N2=1 DO10J=1,510 A(J)=M(N1,N2) WRITE(*,*)A END FUNCTIONM(I1,I2) M=I1+I2 I1=I2 I2=M ENDJ=1J=2J=3J=4J=5I2I18—>135—>85—>83—>53—>52—>32—>31—>21—>21—>1N2N1例PROGRAMMAININTEGERA(10)……CALLSB(A(3))……ENDSUBROUTINESB(B)DIMENSIONB(6)

……ENDDIMENSIONB(10)A(1)A(2)A(3)A(4)A(5)A(6)A(7)A(8)A(9)A(10)B(1)B(2)B(3)B(4)B(5)B(6)四、程式單元之間的數據傳遞3.副程式名作為虛參例設有三個連續函數:四、程式單元之間的數據傳遞4.變數的作用域(1)變數存儲區的分配與釋放(2)變數作用域(3)副程式中變數的存儲屬性:SAVE屬性,STATIC屬性,AUTOMATIC屬性變數的存儲屬性的說明方法是:存儲屬性變數名表例如AUTOMATICA,B,CINTEGERSAVEX,Y

例分析:定義一個函數,實現的功能相當於f(a)/(f(b)*f(c)),函數有四個參數(FUN,A,B,C),其中FUN是虛擬函數名,A、B、C為引數,第一次調用時把內部函數名SIN傳送給FUN,第二次調用時把內部函數名COS傳送給FUN。五、遞歸調用1.遞歸的概念2.遞歸函數遞歸函數的定義格式是:RECURSIVEFUNCTION函數名(虛參表)RESULT(變數名)

調用該函數本身

…END例1設計一個計算N!的函數副程式。函數副程式如下:RECURSIVEFUNCTIONFAC(N)RESULT(FAC1)IF(N==1)THENFAC1=1

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论