1FORTRAN77四则运算符
+-*/**(其中**表示乘方)在表达式中按优先级次序由低到高为:+或
—→*或/→**→函数→()
2FORTRAN77变量类型
2。1隐含约定:I—N规则
凡是以字母I,J,K,L,M,N六个字母开头的,即认为是整型变量,其它为实型
变量。
2。2用类型说明语句确定变量类型:可以改变I-N规则
INTEGER
整型
REAL
实型
DOUBLE
PRECISION
双精度实型
COMPLEX
复型,赋值形式为(实部,虚部),如D=(8。76E+0.5,—67。
8E-3),C=(3。0,6。3),如果含表达式则用CMPLX,如C=CMPLX(3.0
*A,6。0+B)
LOGICAL
逻辑型,逻辑常量有“T”和“F”,“T”表示“。TRUE。”,“F”表示“。FALSE。”
CHARACTER*N
字符型,N为字符串长度,可以在变量名称后重新指定长度,如
CHARACTER*8STR1,STR2*10,赋值形式为STR2=’I’’MABOY.'
2.3用IMPLICIT语句将某一字母开头的全部变量指定为所需类型
如IMPLICITREAL(I,J)三种定义的优先级别由低到高顺序为:I—N规则
→IMPLICIT语句→类型说明语句,因此,在程序中IMPLICIT语句应放在类型
说明语句之前。
2.4数组的说明与使用
使用I—N规则时用DIMENSION说明数组,也可在定义变量类型同时说明数组,
说明格式为:数组名(下标下界,下标上界),也可省略下标下界,此时默认为
1,例:
DIMENSIONIA(0:9),ND(80:99),W(3,2),NUM(—1:0),A(0:2,
0:1,0:3)
REALIA(10),ND(80:99)使用隐含DO循环进行数组输入输出操作:例如
WRITE(*,10)(’I=’,I,’A=',A(I),I=1,10,2)
10FORMAT(1X,5(A2,I2,1X,A2,I4))
2。5使用DATA语句给数组赋初值
变量表中可出现变量名,数组名,数组元素名,隐含DO循环,但不许出现任何
形式的表达式:例如
DATAA,B,C/-1.0,-1。0,—1。0/
DATAA/—1。0/,B/—1.0/,C/—1.0/
DATAA,B,C/3*—1。0/CHARACTER*6CHN(10)DATA
CHN/10*’'/INTEGERNUM(1000)
DATA(NUM(I),I=1,500)/500*0/,(NUM(I),I=501,1000)/500
*1/
3FORTRAN77程序书写规则
程序中的变量名,不分大小写;
变量名称是以字母开头再加上1到5位字母或数字构成,即变更名字串中只有前
6位有效;
一行只能写一个语句;
程序的第一个语句固定为PROGRAM程序名称字符串
某行的第1个字符至第5个字符位为标号区,只能书写语句标号或空着或注释内
容;
某行的第1个字符为C或*号时,则表示该行为注释行,其后面的内容为注释内
容;
某行的第6个字符位为非空格和非0字符时,则该行为上一行的续行,一个语句
最多可有19个续行;
某行的第7至72字符位为语句区,语句区内可以任加空格以求美观;
某行的第73至80字符位为注释区,80字符位以后不能有内容.
4FORTRAN77关系运算符
.GT.大于
。GE.天于或等于
。LT.小于
。LE.小于或等于
。EQ.等于
.NE。不等于。AND。逻辑与
.OR。逻辑或
。NOT。逻辑非
。EQV。逻辑等
。NEQV。逻辑不等运算符优先级由高到低顺序为:()→**→*或/→+或—→。
GT.或.GE。或.LT。或。LE.或。EQ.或.NE。→。NOT。→。AND.→。OR.→。
EQV.或。NEQV
5FORTRAN77语句
语句说明备注
WRITE(*,*)
X1,X2
输出语句
第一个*号是指输入输出文件设备号或其它设备,如果不指定
则是指显示器或打印机,第二个*号是指表控格式语句的行号,
如不指定则用默认格式
PRINT*,X1,
X2
输出语句*号是指表控格式语句的行号,如不指定则用默认格式
READ*,X1,
X2
输入语句*号是指表控格式语句的行号,如不指定则用默认格式
FORMAT(格式
符)
请见附录
一。
请见附录二。
END
结束程序或
子程序
STOP[N]
结束程序并
输出信息
[N]
[N]为数字或字符串信息
PAUSE[N]
暂停程序执
行并输出信
息[N],输
入回车后继
续执行
[N]为数字或字符串信息
PARAMETER
(PI=3。14)
参数语句,
用来定义常
量,在程序中
应放在类型
说明语句之
后
EQUIVALENCE
(变量表)
等价语句,
()内变量
共用一个存
储单元。
EQUIVALENCE(X1,X2,…XN),(X1,X2,…XN),…
COMMON
X1,……
公用语句,其
后变量相
等,用来在
程序单位间
传递数据,同
时可以用来
说明数组。
程序中可有
一个无名公
用区和多个
有名公用
区。
无名公用区:在主程序各子程序中相同,均在可执行语句之前,
如
COMMONA(5),I有名公用区:名称放在两个“/”之间,如
COMMON//X1,X2,X3/C1/X4,X5,X6
OPEN(说明项
1)
打开旧文件
或创建新文
件
说明项1中内容:UNIT=N,FILE=NAM,STATUS=STR1,
ACCESS=STR2,FORM=STR3,RECL=C,
BLANK=STR4,ERR=BH,IOSTAT=M其中:
1.N=1~99;
2。NAM为文件名,可以是字符常量或变量;
3。STR1='NEW’时新建文件;'OLD’时打开文件;’SCRATCH’
时表示临时文件,关闭时自动删除,且不能与FILE=NAM项共
存;'UNKNOWN'时由计算机系统规定文件状态;
2为文件存取方式,’SEQUENTIAL'表示顺序存
取,’DIRECT’表示直接存取,省略此项时表示按顺序存取;
5。STR3为记录格式说明,'FORMATTED'表示记录按有格式
形式存放,'UNFORMATTED'表示记录按无格式形式存放。
省略此项时,对于顺序文件是有格式的,对于直接存取文件是
无格式的;6.C表示记录长度,以字节为单位,直接存取文件必
指定,顺序文件必省略;
4表示数字值格式输入字段中空格含意,'NULL’时表示
忽略不计,'ZERO'时表示按0计。省略此项时按0计;
8。BH表示出错时处理语句行标号,可以省略此项;
9。M为整数,出错时返回该整数,可以省略此项。
CLOSE(说明项
2)
关闭已打开
文件
说明项2中内
容:UNIT=N,STATUS=STR5,ERR=BH,IOSTAT=M其中
STR5为文件关闭状态,’KEEP’时保留,'DELETE’删除,省略此
项时为保留;
ERR=BH,IOSTAT=M可以省略。
REWIND(说明
项3)
将文件读写
指针置于文
件开头
说明项3中内容:UNIT=N,ERR=BH,IOSTAT=M
ERR=BH,IOSTAT=M可以省略
BACKSPACE
(说明项3)
将文件读写
指针回退一
行
6FORTRAN77选择判断语句
6。1逻辑IF语句
IF(逻辑表达式)程序语句
6.2无ELSE块
IF(逻辑表达式)THEN程序块
ENDIF
6。3标准选择
IF(逻辑表达式)THEN程序块1
ELSE程序块2
ENDIF
6。4多重选择块
IF(逻辑表达式1)THEN程序块1
ELSEIF(逻辑表达式2)THEN程序块2
ELSEIF(逻辑表达式2)THEN程序块2
.。.。..
ELSEIF(逻辑表达式N)THEN程序块N
ELSE程序块N+1
ENDIF
7FORTRAN77循环语句
7.1GOTO语句
标号程序行程序块
GOTO标号
7.2DO语句
DO标号,记数变量=起始值,终止值,步距”语句,如
DO标号,N=1,100,1程序块标号CONTINUE
7。3DOWHILE语句
DO标号,WHILE(PI。EQ。3.14159)程序块标号CONTINUE
7。4DOUNTIL语句
DO标号,UNTIL(逻辑表达式)”语句,如
DO标号,UNTIL(.3.14159)程序块标号CONTINUE
8FORTRAN77内部函数
INT(X)将数字串或数值X转换为整型数
REAL(X)将数字串或数值X转换为实型数
DBEL(X)将数字串或数值X转换为双精度型数
CMPLX(X)
将数字串或数值X转换为复型数
CHAR(X)将数值X转换为字符(0≤X≤255)
ICHAR(X)将字符X转换为整数
AINT(X)截去X的小数部分
ANINT(X)
将X舍入到最接近的整数
NINT(X)将X舍入到最接近的整型数
ABS(X)返回X的绝对值
MOD(X1,X2)返回X1/X2的余数
SIGN(X1,X2)取X2的符号,取X1的绝对值
DIM(X1,X2)当X1>X2时,等于X1—X2,当X1≤X2时,等于0
DPROD(X1,X2)
双精度乘(X1,X2均为实数)
AIMAG(X)返回字符串X的虚部
CONJG(X)返回字符串X的共轭
MAX(X1,X2,X3,。。。,XN)返回X1,X2,X3,.。.,XN中最大值
MIN(X1,X2,X3,.。.,XN)返回X1,X2,X3,...,XN中最小值
SQRT(X)返回X的平方根(X≥0)
EXP(X)返回E的X次方
LOG(X)返回以E为底的X的对数即自然对数(X〉0)
LOG10(X)返回以10为底的X的对数即常用对数(X〉0)
SIN(X)返回弧度值X的正弦值
COS(X)
返回弧度值X的余弦值
TAN(X)返回弧度值X的正切值
ASIN(X)返回弧度值X的反正弦值
ACOS(X)
返回弧度值X的反余弦值
ATAN(X)返回弧度值X的反正切值
SINH(X)返回X的双曲正弦值
COSH(X)返回X的双曲余弦值
TANH(X)返回X的双曲正切值
LEN(X)返回字符串X的长度
INDEX(X1,X2)返回字符串X2在字符串X1中的位置,不包含时返回0
LGE(X1,X2)
如果字符串X1≥X2则等于.TRUE。,否则等于。FALSE。
LGT(X1,X2)如果字符串X1>X2则等于。TRUE.,否则等于.FALSE。
LLE(X1,X2)如果字符串X1≤X2则等于.TRUE。,否则等于.FALSE。
LLT(X1,X2)如果字符串X1<X2则等于。TRUE。,否则等于。FALSE.
9FORTRAN77函数与子程序
9。1FORTRAN77语句函数
当函数十分简单,用一条语句足以定义时(允许使用继续行)才用;
应该放在所有可执行语句之前和有关类型说明语句之后,是非执行语句;
只在其所在程序单位中有意义;
语句函数中的虚参就是变量名,不能是常量、表达式或数组元素等;
语句函数定义语句中的表达式可以包含已经定义过的语句函数、外部函数或内部
函数。
语句函数通过表达式得一个函数值,此数值类型必须与函数名的类型一致。语句
函数的使用同内部函数相同。语句函数例子:
YMJ(R)=3。14159265*R*R
ZMJ=YMJ(5)
9.2FORTRAN77自定义函数
定义格式:类型说明FUNCTION函数名(虚拟参数1,虚拟参数2,……,虚拟参
数N)程序块(可以含有RETURN)函数名=函数值END调用格式与内部函数相
同。
9.3FORTRAN77子程序
定义格式:
SUBROUTINE子程序名(虚拟参数1,虚拟参数2,……,虚拟参数N)程序块(可
以含有RETURN)
END调用格式:
CALL子程序名(实在参数1,实在参数2,……,实在参数N)数据块子程序:只是
用来给有名公用区中的变量赋初值,格式如下:
BLOCKDATA子程序名
DATA语句块
END
附录一、FORTRAN77控制输入输出格式
1。在打印输出时,每一行第1个字符不显示,用来控制纵向走纸或显示行。
第1个字符作用
空格正常回车换行
0
回车并跳过1行
1
换页
+
只回车不换行
其它通常是回车换行
2.输入小数时,自带小数点优先。
3.输出字段宽度不够时用*号填充。附录二、FORTRAN77控制输入输出格式
语句
1
IW或IW。M整数型W为字段宽度,M为最少数字位数
2
FW。D实数型D为小数位数
3
EW.D或EW。DEE指数实数型E为指数位数,通常为3或4
4GW.M
自动实数型
5
DW。D双精度型
6LW
逻辑型
7
A或AW字符型不指定W时自动
8
'字符串’插入字符串两个’表示一个字符'
9
NH字符串插入长度为N的字符串
10NX
插入N个空格
11
RIW,R(NX,IW.M)R个IW,R个(NX,IW。M)R为重复系数
12/
换行
13
,$禁止换行
目录:
一、说明
二、概述
三、数据类型及基本输入输出
四、流程控制
五、循环
六、数组
七、函数
八、文件
一、说明
本文多数内容是我读彭国伦《Fortran95程序设计》的笔记。只读到第九章,
主要是3~9章,都是最基本的用法(原书共16章)。这里主要摘录了我看书过
程中总结的一些Fortran和C不同的地方,主要是语法方面.希望这份笔记能够
给学过C但没有接触过Fortran的同学带去一些帮助。要想得更清楚些,推荐
看一下原书,觉得作者真的写得很好,很清楚;如果有C语言的基础,看完前
九应该很快的,花一两天就行了。觉得如果耐心看完本文,基本功能应该也可以
顺利用起来了.外,由于我之前没有用过Fortran,这次为了赶文档看书又看得
很粗浅,大多数东西看过之后都没得及仔细想,只是按着作者的意思去理解.所
以这份笔记还处于纸上谈兵的层次。如果有不妥的方,希望大家指正。谢谢!文
中蓝色的部分是程序代码,!后面的内容为注释。
二、概述
1、名词解释Fortran=FormulaTranslator/Translation一看就知道有什么
特色了:可以把接近数学语言的文本翻译成机械语言。的确,从一开始,IBM设计
的时候就是为了方便数值计算和科学数据处理。设计强大的数组操作就是为了实
现这一目标.ortran奠定了高级语言发展的基础。现在Fortran在科研和机械
方面应用很广。
2、Fortran的主要版本及差别按其发展历史,Fortran编译器的版本其实很多.
现在在广泛使用的是Fortran77和90在Fortran77基础
上添加了不少使用的功能,并且改良了77编程的版面格式,所以编程时推荐使
用90。鉴于很多现成的程序只有77版本,有必要知道77的一些基本常识,至
少保证能够看77程序。以下是77和90的一些格式上的区别。Fortran77:固
定格式(fixedformat),程序代码扩展名:。f或。for(1)若某行以C,c或*
开头,则该行被当成注释;(2)每行前六个字符不能写程序代码,可空着,或
者1~5字符以数字表明行代码(用作格式化输入出等);7~72为程序代码编
写区;73往后被忽略;(3)太长的话可以续行,所续行的第六个字符必须是”0"
以外的任何字符。Fortran90:自由格式(freeformat),扩展名:。f90(1)
以"!”引导注释;(2)每行可132字符,行代码放在每行最前面;(3)以&续
行,放在该行末或下行初。以下都是讨论Fortran90。
3、Fortran的一些特点,和C的一些不同其实很多,在下面涉及具体方面时可
以看到。这里只是大致提一些。(1)不分大小写(2)每句末尾不必要写分号
(3)程序代码命令间的空格没有意义(4)不像C,Fortran不使用{}(5)数据
类型多出了复数和逻辑判断类型。比如复数类型complex::a!声明复数
的方法.复数显然方便了科学计算,满足了工程方面需求a=(1.0,2。0)!
a=1+i(6)多出了乘幂运算(**)。乘幂除了整数还可以是实数形式。如开
方,开立方a=4。0**0.5,a=8。0**(1。0/3.0)。(7)数组有一些整体
操作的功能;可以方便的对部分元素进行操作(8)有些情况下可以声明大小待
定的数组,很实用的功能
4、Fortran的基本程序结构
先看一看所谓的"HelloFortran"程序。programmain!程序开始,main
是program的名字,完全自定义write(*,*)"Hello”!主程序
stop!终止程序end[program[main]]!end用于封装代码,表示代码
编写完毕。[]中的内容可省略,下同。再看一段实用一些的程序,好有点感
性认识。程序用于计算圆柱的表面积,要求输入底面半径和。其中展示了
Fortran的一些特色用法。程序摘自维基。其实是一个叫www。answers。com的
网上引的维基的网页。推荐去看看!能查到不少有意思的东西.program
cylinder!给主函数起个名字
!Calculatetheareaofacylinder。
!Declarevariablesandconstants.
!constants=pi
!variables=radiussquaredandheightimplicitnone!
Requireallvariablestobeexplicitlydeclared!这个一般都
是要写上的。下面会进一步说明。integer::ierr
character::yn
real::radius,height,area
real,parameter::pi=3。1415926536!这是常量的声明方
法interactive_loop:do!do循环,Fortran中的循环可以加标签,如d
前面的!interactive_loop就是标签
!(*,
*)’Enterradiusandheight.'!屏幕输出read(*,*,
iostat=ierr)radius,height!键盘输入。isotat的值用判断输入成功
否.
!Ifradiusandheightcouldnotbereadfrominput,thencycle
(ierr/=0)then
write(*,*)'Error,invalidinput。’cycleinteractive_loop!
cycle相当于C里的continueendif
!Computearea。The**means"raitoapower。”area=2
*pi*(radius**2+radius*height)!指数运算比C方便
!Writetheinputvariables(radius,height)andoutput(area)
tothescreen。write(*,’(1x,a7,f6。2,5x,a7,f6.2,5x,a5,
f6.2)')&!"&”表示续行。这里还显示了格式化输出’radius=',
radius,’height=',height,’area=',areayn=’’
yn_loop:do!内嵌的另一个do循环
write(*,*)'Performanothercalculation?y[n]’
read(*,'(a1)')yn
if(yn==’y'.or。yn=='Y')
exityn_loop
if(yn=='n’。=='N’。or。yn==’')
exitinteractive_loop
enddoyn_loop!结束内嵌do循环
enddointeractive_loopendprogramcylinder
Fortran程序的主要结构就是这样了。一般还会有些module的部分在主函数前,
函数在主函数后。
三、数据类型及基本输入输出
1、数据类型,声明及赋初值
(1)integer:短整型kind=2,长整型kind=4
integer([kind=]2)::a=3如果声明成integer::a,则默认为长整
型。!”::”在声明并同时赋初值时必须要写上;类型名后面有形容词时也必
须保留::;其他情况可略去!所谓形容词,可以看一下这个。比如声明常
数real,parameter::pi=3.1415926。parameter就是形容词。(2)
real:单精度kind=4(默认),双精度kind=8real([kind=]8)::
a=3.0还有指数的形式,如1E10为单精度,1D10为双精度(3)complex单
精度和双精度complex([kind=]4)
b(4)charactercharacter([len=]10)c!len为最大长度(5)
logicallogical*2::d=.ture。(等价于logical(2)::
d=.ture。)(6)自定义类型type:类似于C中的struct
Fortran77中给变量赋初值常用DATA命令,可同时给多个变量赋初值
dataa,b,string/1,2.0,'fortran’/与C不同的是,Fortran中
变量不声明也能使用,即有默认类型(跟implicit命令有关)。按照默认的定,
以i,j,k,l,m,n开头的变量被定义为integer,其余为real。取消该设置
需在程序声明部分之前implicitnone.彭国伦建议一般都使用该语句。另
一点关于声明的不同是Fortran有”等价声明":integera,b
equivalence(a,b)使得a,b使用同一块内存。这样可以节省内存;有时可
精简代码。如:equivalence(很长名字的变量如三维数组的某个元素,a),之后
使用a来编写程序就简洁多了。
2、基本输入输出
输入:read(*,*)a!从键盘读入输出:write(*,*)"text”!在屏
幕上输出.
Fortran77用’text'。Fortan90中一般""和’’都可print*,
"text”!只能用于屏幕输出(*,*)完整写为(unit=*,fmt=*)。其中unit
为输入/输出位置,如屏幕,文件等;fmt为格式。如这两项都写成*,则按默认
的方式进行,即上面描述的。print后面的*表示按默认格式输出.
四、流程控制1、运算符
(1)逻辑运算符
==/=〉>=<<=!Fortran90用法
.EQ。.NE..GT。.GE。。LT..LE。!Fortran77用法
(2)涉及相互关系的集合运算符
.AND..OR。。NOT。.EQV。。NEQV。!仅。NOT。连接一个表达式,其余左右
两边都要有表达式(可以是logical类型的变量)!.EQV.:当两边逻辑运算值相
同时为真,。NEQV.:当两边逻辑运算值不同时为真
2、IF
(1)基本:if(逻辑判断式)then
……
endif如果then后面只有一句,可写为if(逻辑判断式)……!then和end
if可省略
(2)多重判断:if(条件1)then
……
elif(条件2)then
……
elif(条件3)then
……
el
……
endif
(3)嵌套:if(逻辑判断式)then
if(逻辑判断式)then
if(逻辑判断式)then
elif(逻辑判断式)then
……
el……
endif
endif
endif
(4)算术判断:programexample
implicitnone
realc
write(*,*)"inputanumber”
read(*,*)c
if(c)10,20,30!10,20和30为行代码,根据c小于/等于/大于0,执
行10/20/30行的程10write(*,*)"A"goto40!goto可实现跳到
任意前面或后面的行代码处,但用多了破坏程序结20write(*,*)”B"
goto40
30write(*,*)"C”
goto40
40stop
end
3、SELECTCASE
类似于C的switch语句lectca(变量)
ca(数值1)!比如ca(1:5)代表1〈=变量〈=5会执行该模块……!
ca(1,3,5)代表变量等于1或3或5会执行该模块ca(数值2)!括
号中数值只能是integer,character或logical型常量,不能real型…
cadefault
……
endca
4、PAUSE,CONTINUE
pau暂停程序执行,按enter可继续执行
continue貌似没什么用处,可用作封装程序的标志
五、循环
1、DOdocounter=初值,终值,增/减量!counter的值从初值到终值按
增/减量变,……!counter每取一个值对应着一次循环。增/减量不写则认为
1
……
……!循环主体也没有必要用{}
enddo
Fortran77中不是用enddo来终止,而是下面这样子:do循环最后一行
的行代码counter=初值,终值,增/减量……行代码……!这是do的最后
一行
2、DOWHILE
dowhile(逻辑运算)
……
……
enddo类似于C中的while(逻辑运算){……}。一开始那个计算圆柱表面
积的程序中,应该也算是这一类。不过它是通过内部的if语句来控制循.看来
也是可以的,不过在这本书上没看到这样写。其实应该也可以归于下面这种。
3、没看到和C里面的do{……}while(逻辑运算);相对应的循环语句,不过可
以这样,保证
至少做一循环:dowhile(。ture.)
……
……if(逻辑运算)
exit!exit就好比C里面的break。C里的continue在Fortran里是
cycle
enddo
4、Fortran的一个特色:带署名的循环可以这样,不易出错:outer:do
i=1,3
inner:doj=1,3
……
enddoinner
enddoouter还可以这样,很方便:
loop1:doi=1,3
loop2:doj=1,3
if(i==3)
exitloop1!exit终止整个循环loop1if(j==2)
cycleloop2!cycle跳出loop2的本次循环,进行loop2的下次循环
write(*,*)i,j
enddoloop2enddoloop1
还有一些循环主要用于Fortran中的数组运算,为Fortran特有,很实用。
六、数组1、数组的声明和C不同的是,Fortran中的数组元素的索引
值写在()内,且高维的也只用一个(),如integera(5)!声明一个整型
一维数组real::b(3,6)!声明一个实型二维数组类型可以是integer,
real,character,logical或type。最高可以到7维.数组大小必须为常
数.但是和C语言不同,Fortran也有办法使用大小可变的数组,方法
如:integer,allocatable::a(:)!声明小可变经过某个途径得
知所需数组大小size之后,用下面的语句:allocate(a(size))!配置内
存空间之后该数组和通过一般方法声明的数组完全相同。与C不同,Fortran
索引值默认为从1开始,而且可以在声明时改变该规则:integera(-3:1)!
索引值为—3,—2,-1,0,1integerb(2:3,-1:3)!b(2~3,-1~3)
为可使用的元素
2、数组在内存中的存放和C不同,Fortran中的数组比如a(2,2)在内存中
存放顺序为a(1,1),a(2,1),a(1,2),a(2,2)。原则是放低维的元素,
再放高维的元素。此规则称为columnmajor。
3、赋初值
(1)最普通的做法:integera(5)
dataa/1,2,3,4,5/或integer::a(5)=(/1,2,3,4,5/)若
integer::a(5)=5,则5个元素均为5对于integer::a(2,2)=(/1,2,
3,4/)根据数组元素在内存中存放的方式,等价于赋值a(1,1)=1,a(2,
1)=2,a(1,2)=3,a(2,2)=4(2)利用Fortran的特色:隐含式循环。
看例子就明白了.
integera(5)
integeri
data(a(i),i=2,4)/2,3,4/!(a(i),i=2,4)表示i从2到4循环,
增量为默认值1还可以这样:integeri
integer::a(5)=(/1,(2,i=2,4),5/)!五个元素分别赋值为1,
2,2,2,5integer::b(5)=(/i,i=1,5/)!五个元素分别赋值为
1,2,3,4,还可以嵌套data((a(i,j),i=1,2),j=1,2)=/1,2,3,4/!
a(1,1)=1,1(2,1)=2,a(1,2)=3,a(2,2)=4
4、操作整个数组
设a,b为相同类型、维数和大小的数组
a=5!所有元素赋值为5
a=(/1,2,3/)!这里假设a为一维,a(1)=1,a(2)=2,a(3)=3a=b!
对应元素赋值,要求a,b,c维数和大小相同,下同
a=b+ca=b-ca=b*ca=b/ca=sin(b)!内部函数都可以这样用
5、操作部分数组元素
a为一维数组a(3:5)=(/3,4,5/)!a(3)=3,a(4)=4,a(5)=5
a(1:5:2)=3!a(1)=3,a(3)=3,a(5)=3
a(3:)=5!a(3)以及之后的所有元素赋值为5
a(1:3)=b(4:6)!类似于这种的要求左右数组元素个数相同
a(:)=b(:,2)!a(1)=b(1,2),a(2)=b(2,2),以此类推
6、WHERE
where形式上类似于if,但只用于设置数组。
设有两个同样类型、维数和大小的数组a,bwhere(a<3)b=a!a中小于
3的元素赋值给b对应位置的元素
endwhere再如:where(a(1:3)/=0)c=a!略去了endwhere,因为
只跟了一行where可嵌,也!可类似do循环有署名标签.
7、FORALL
有点像C中的for循环:
forall(triplet1[,triplet2[,triplet3…]],mask)其中triplet
形如i=2:6:2,表示循环,最后一个数字省略则增量为1例如:forall(i=1:
5,j=1:5,a(i,j)〈10)a(i,j)=1endforall又如:
forall(i=1:5,j=1:5,a(i,j)/=0)a(i,j)=1/a(i,j)
forall也可以嵌套使用,好比C中for循环的嵌套。
七、函数
Fortran中函数分两类:子程序(subroutine)和自定义函数(function)。自定
义函数本质上就是学上的函数,一般要传递自变量给自定义函数,返回函数值。
子程序不一定是这样,可以没有返值。传递参数要注意类型的对应,这跟C是一
样的。1、子程序
目的:把某一段经常使用的有特定功能的程序独立出来,可以方便调用。习惯上
一般都把子程序放在主程序结束之后。
形式:subroutinename(parameter1,parameter2)!给子程序起
一个有意义的名字。可以传递参数,这样可以有返回值。括号内也可以空着,代
不传递参数.implicitnone
integer::parameter1,parameter2!需要定义一下接收参数的类
型。……!接下来的程序编写跟主程序没有任何别。
……return!跟C不同,这里表示子程序执行后回到调用它的地方继续执行下
面的程序。不一定放在最后。可以放在子程序的其他位置,作用相同;子程序中
return之后的部分不执行.end[subroutinename]调用:使用call
命令直接使用,不需要声明。在调用处写:callsubroutine
name(parameter1,parameter2)
注意点:
a.子程序之间也可相互调用。直接调用就是了,像在主程序中调用子程序一样。
b.传递参数的原理和C中不同.Fortran里是传址调用(callby
address/reference),就是传递时用参数和子程序中接收时用的参数使用同一个
地址,尽管命名可以不同。这样如果子程序的执行改子程序中接收参数的值,所
传递的参数也相应发生变化。
c.子程序各自内部定义的变量具有独立性,类似于C。各自的行代码也具有独立
性。因此各个子程序主程序中有相同的变量名、行代码号,并不会相互影响。
2、自定义函数
和子程序的明显不同在于:需要在主程序中声明之后才能使用。调用方式也有差
别.另外按照惯例用函数不去改变自变量的值。如果要改变传递参数的值,习惯
上用子程序来做。
声明方式:
real,external::function_name一般自定义函数也是放在主程序之
后。形式:functionfunction_name(parameter1,parameter2)
implicitnonereal::parameter1,parameter2!声明函数参数类
型,这是必需的
real::function_name!声明函数返回值类型,这是必需的
……
……
function_name=…。!返回值的表达式
return
end也可以这样直接声明返回值类型,简洁些:realfunction
function_name(parameter1,parameter2)
implicitnone
real::parameter1,parameter2!这个还是必需的
……
……
function_name=…。!返回值表达式return
end调用:
function_name(parameter1,parameter2)不需要call命令。自定义
函数可以相互调用.调用时也需要事先声明。总之,调用自定义函数前需要做声
明,调用子程序则不需要.
3、关于函数中的变量
(1)注意类型的对应。
Fortran中甚至可以传递数值常量,但只有跟函数定义的参数类型对应才会到
想要的结果。如callShowReal(1。0)就必须用1。0而不是1.
(2)传递数组参数,也跟C一样是传地址,不过不一定是数组首地址,而可以是
数组某个指定元素地址。比如有数组a(5),调用callfunction(a)则传递
a(1)的地址,调用callfunction(a(3))则递a(3)的地址.
(3)多维数组作为函数参数,跟C相反的是,最后一维的大小可以不写,其他维
大小必须写.这决于Fortran中数组元素columnmajor的存放方式。
(4)在函数中,如果数组是接收用的参数,则在声明时可以用变量赋值它的大
小,甚至可以不指定小。例如:subroutineArray(num,size)
implicitnone
integer::sizeintegernum(size)!可以定义一个数组,其大小是
通过传递过来的参数决定的。这很实用……
……
return
end(5)save命令:将函数中的变量值在调用之后保留下来,下次调用此函
数时该变量的值就是上次保的值。只要在定义时加上save就行:integer,
save::a=1(6)传递函数(包括自定义函数、库函数、子程序都是可以的)。
类似于C中的函数指针需要在主程序和调用函数的函数中都声明作为参数传递
的函数。如real,external::function!自定义函数
real,intrinsic::sin!库函数
externalsub!子程序
(7)函数使用接口(interface):一段程序模块。以下情况必需:a。函数返
回值为数组b.指定参数位置来传递参数时c。所调用的函数参数个数不固定d。
输入指标参数时e。函数返回值为指针时.具体用法结合例子容易看懂。例子都
很长。看书吧。
4、全局变量
功能就不用说了。原理:根据声明时的相对位置关系而取用,不同与C中根据变
量名使用.
如果在主程序中定义:integer::a,b
commona,b!就是这样定义全局变量的在子程序或自定义函数中定义:
integer::c,d
commonc,d则a和c共用相同内存,b和d共用相同内存。全局变量太多时
会很麻烦.可以把它们人为归类,只需在定义时在common后面加上区间名,如
common/groupe1/a,
common/group2/b。这样使用时就不必把所有全局变量都列出来,再声明
common/groupe1/c就可以用a、c全局变量了.可以使用blockdata程
序模块。在主程序和函数中不能直接使用前面提到的data命令给全局变量赋初
值.可以给它们各自赋初值;如果要使用data命令必须要这样:blockdata
[name]
implicitnoneintegera,b,c
reald,e
commonabc
common/group1/d,e
dataa,b,c,d,e/1,2,3,4.0,5。0/
end[blockdata[name]]
5、ModuleModule不是函数。它用于封装程序模块,一般是把具有相关功能
的函数及变量封装在一起。用法很单,但能提供很多方便,使程序变得简洁,比
如使用全局变量不必每次都声明一长串,写在odule里调用就行了。Module一
般写在主程序开始之前。形式:modulemodule_name…………end[module
[module_name]]使用:在主程序或函数中使用时,需要在声明之前先写上
一行:umodule_中有函数时必须在contains命令之后(即在
某一行写上contains然后下面开始写数,多所有函数都写在这个contains之
后)。并且module中定义过的变量在module里的函数中可直接使用,函数之
间也可以直接相互调用,连module中的自定义函数在被调用时也不用先声明。
6、include放在需要的任何地方,插入另外的文件(必须在同一目录下).
如:include'funcion。f90’
八、文件
1、文本文件Fortran里有两种读取文件的方式,对应于两种文件
顺序读取:用于文本文件
直接读取:用于二进制文件
这里只摘录关于文本文件的读取.一般模式如下。
character(len=20)::filenamein="in。txt”,
filenameout=""!文件名
logicalaliveinteger::fileidin=10,fileidout=20!10,20
是给文件编的号,除1,2,5,6的正整数都可,因为2、6是默认的输出位置(屏
幕),1、5是默认的输入位置(键盘)
integer::errorreal::in,out!下面这一段用于确认指定名字的文件是
否存在inquire(file=filenamein,exist=alive)!如果存在,alive
赋值为0if(.NOT。alive)thenwrite(*,*)trim(filenamein),
"doesn'texist.”!trim用于删去filenamein中字串!后面的stop
多余空格,输出时好看些endifopen([unit=]fileidin,
file=filenamein,status="old”)open([unit=]fileidout,
file=filenameout[,status="new"])!unit指定输入/输出的位置。
打开已有文件一定要用status="old”;打开新文件用status="new";!
不指定status,则默认status="unknown",覆盖已有文件或打开新文
件……read([unit=]fileidin,[fmt=]100,iostat=error)
in!error=0表示正确读入数据。
100format(1X,F6。3)!按一定格式输入输出,格式可以另外写并指定行代
码,也可以直接写在read/write中write(([unit=]fileidout,”(1X,
F6.3)”)outclo(fileidin)clo(fileidout)!1X代表一个空
格。F6.3代表real型数据用占6个字符(含小数点),其中小数点后三位。!
常用的还有I3,用于整型数据,共占三个字符;A8,字符型,占8个字符。换行
用/二进制文件的读取有所不同。不再列举。
2、内部文件
另一个很实用的读写功能是内部文件(internalfile).看看这个例子就明白
了.
integer::a=1,b=2
character(len=20)::string
write(unit=string,fmt="(I2,'+',I2,’=',I2)”)a,b,a+b
write(*,*)string则结果输出1+2=3。反过来也是可以的:
integera
character(len=20)::string="123”
read(string,*)a
write(*,*)a
则输出123.
!全文结束.
本文发布于:2022-11-14 19:20:10,感谢您对本站的认可!
本文链接:http://www.wtabcd.cn/fanwen/fan/88/19484.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |