FORTRAN学习中的一些小心得

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

FORTRAN 心得
第一部分:一些小心得
1 Fortran不区分大小写
2 Fortran有5种基本数据类型,integer,real, character, logical, complex
3 fortran fixed format格式中的变量赋初值一般用DATA,因为它不能用::
4 real(kind=8) a这种格式只使用于Fortran90,Fortran77中要使用real*8或real(8)
5 FORTRAN中FREE与FIXED两种格式do循环的区别:
Fortran 95使用end do来结束循环。


Fortran 77使用DO循环要麻烦一点,它不使用END DO来结束循环,而是使用行号来结束循环,程序代码要在DO的后面写清楚这个循环到哪一行程序代码结束。

Fortran 77中,经常会使用CONTINUE这个命令来结束循环。

因为CONTINUE这个命令没有实际的用途,刚好可以拿来做封装使用。

6 循环的流程控制:
循环中的cycle命令相当于c++里的continue命令,用于结束一次循环
循环中的exit命令好比c里面的break,用于结束循环
7 不使用do循环,单纯用GOTO语句也能设计循环程序,但不推荐使用GOTO语句
7 fortran有等价声明:即用equivalence(a,b),这样使得a,b使用同一块内存,这样可以节省内存,有时可精简代码。


8 fortran77中只能用单引号。

(还有疑问,因为fixed format能用双引号)
9 逻辑运算符
== /= > >= < <= !Fortran90用法
.EQ. .NE. .GT. GE. .LT. .LE. !Fortran77用法
9 PAUSE,CONTINUE,STOP
pause 暂停程序执行,按enter可继续执行
continue 貌似没什么用处,可用作封装程序的标志
%
STOP 命令用来结束程序,要谨慎使用
10 数组元素之间要用逗号分隔,而不能像matlab一样既可以用逗号也可以用空格,fortran 的数组元素之间不能用空格。

11 数组的声明:
Fortran 77中数组的声明,必须使用DIMENSION命令
Integer a; !先声明a是整型
Dimension a(10) !再声明a是大小为10的数组
Fortran 95中可以用简单的方法:
`
Integer a(10) !最简单的方法
Integer,dimension(10):: a !另一种方法
12 数组的赋值:
Fortran 77中数组的声明,可以使用DATA命令或隐含式循环来赋初值;
Fortran 95中可以直接设置初值;如:integer ::a(5)=(/1,2,3,4,5/);此时,括号和除号之间不能有空格;
13 与C不同,Fortran数组索引值默认从1开始,而且可以在声明时改变该规则,如
&
integer a(-3:1) !索引值为-3,-2,-1 ,0,1
13 数组在内存中的存放顺序也与C不同(正好相反),如a(2,2)在内存中的存放顺序为a(1,1),a(2,1),a(1,2),a(2,2);
原则是放低维的元素,再放高维的元素,此规则称为column major
矩阵输出时也是按列输出。

14 Fortran的特色:隐含式循环
15 a,b都为数组,则可以这样用a=sin(b),(内部函数都可以这样用)
16 数组专用:
,
where命令形式上类似于if,但只用于设置数组where.....elsewhere...elsewhere...endwhere (没有then)
FORALL是Fortran95添加的功能,只能用于数组操作
forall可以嵌套使用,还可以在forall中使用where,但where中不能使用forall 15 Fortran中传递参数的原理与c++不同,Fortran中是传址调用,就是传递时用参数和子程序接受时用的参数使用一个地址,尽管命名可以不同。

16 调用自定义函数前需要做声明,调用子程序则不需要。

17 Module中有函数时必须在contains命令之后
18 全局变量(有的书上叫无名公用区、有名公用区)

全局变量用来定义一块共享的内存空间;
全局变量不能声明成常量
全局变量不能直接使用data命令赋初值,要在block data模块中使用data来设置初值。

COMMON语句是说明语句,因此它应该出现在相应程序单元中的所有可执行语句之前。

取用全局变量时,是根据它们的相对位置关系来作对应,而不是根据变量名称来对应。

19 传递参数与使用全局变量都可以在不同程序之间共享数据,那什么时候该使用参数,还有什么时候该使用全局变量呢
简单地说,当需要共享的变量不多,而且只有少数几个程序需要使用这些数据时,那就使用参数,

需要共享大笔数据,或是有很多不同程序都需要使用这些数据时,就使用全局变量。

20 INCLUDE命令
1 INCLUDE命令可以写在任何地方,它只是单纯地用来插入一个文件的内容。

2 有时候也会应用在声明全局变量,先把声明全局变量的程序代码编写在某个文件中,需
要使用全局变量的函数再去INCLUDE这个文件,这样可以减少程序代码。

第二部分:格式化输入输出
1 表控输入输出(即表控格式输入输出)
1 注意点:不同计算机系统对表控格式输出的规定不同,例如对一个整型数,有的系
统规定输出占13列,有的系统规定输出占10列,也有的系统不规定固定的列数而按照数据的实际长度输出,再用一个空格作分隔符。

,
2 如果在输入数据行中出现”/”号,表示对READ语句的输入到此结束,未被赋值的
变量将不予赋值。

2 FORMAT 语句
语句格式:
标号 FORMAT(格式描述符)
例如: write(*,100) i,j,k;
100 FORMAT(1X,I3,I5,I7),其中,1X是换行控制符(走纸控制),I3表示i变量的值输出占3列,I5表示j变量的值输出占5列
1格式描述符
主要介绍:I、F、E、X、纵向走纸、'(撇号)、r(重复系数)、/(斜杠)等(1)(
(2)
(3)X描述符
作用:用于输出空格
一般形式: nX
(4) I描述符
作用:用于整型数据的输出
一般形式: Iw 或
(5) F描述符
(
作用:用于实数的小数形式输出
一般形式:
(6)E描述符
作用:用于实数的指数形式输出
一般形式:
其中:E—实数的指数形式输出;
w—字段宽度;
|
d—数字部分的小数位数。

数值部分<1
(7)
(8)A描述符
作用:用于字符型数据的格式描述
一般形式: Aw或A ,其中w是字段宽度。

(9)‘号描述符
{
作用:用于输出字符常量,即把撇号内的字符串原样照打
例如:write(*,100) i,j
100 format(1x,'i=',i3,' j=',i4)
(10)
(11)H描述符
作用:它的作用与撇号描述符类似,也可以输出字符型常量
一般形式: nH
建议:建议最好不要使用H描述符,而是使用撇号描述符,避免错误
]
例如: I=123
WTRITE(*,100),I
100 FORMAT(1X,2HI=,I3);
(12)
(13)斜杠描述符
反斜杠\描述符和美元$描述符的作用相同,都是在输出一个记录行后取消回车符,
常用于输出字符串与输入数据显示于屏幕同一行的情形。

?
例如:write(*,'("please enter your name",$)');
Read(*,*) My_age
(14)重复系数r
在format语句中,如果出现几个(或几组)相同的格式编辑符,则可以利用重复
系数而只写一个(或一组)编辑符。

r——可重复使用的次数。

}
例:
write(*,100) n1,n2,x,y1,y2,y3
100 format (1x, i10, i10, , , ,

Format (1x, 2i10, ,
第三部分:函数操作
!
1 语句函数
1 语句函数的定义
REAL(KIND=8) X, F
F(X)=X**2+X+1
2 语句函数的调用
语句函数一旦被定义后,就可以在本程序单元中被调用。

调用的形式和调用内容函数形同,即:
语句函数名(实参)
2
3、
4说明
语句函数定义语句是非执行语句,它应该放在所有可执行语句之前和所有的说明语句之后。

语句函数只能在本程序单元中被使用。

2 函数子程序
1定义的一般形式:
类型说明符 FUNCTION 函数名(形参表)
函数主体

函数名=表达式;
END
或者:
FUNCTION 函数名(形参表)
函数主体
函数名=表达式;

END
3 子例行程序
子例行程序定义的一般形式:
SUBROUTINE 函数名(形参表)。

end
子例行程序的调用:
-
CALL 子程序名(实参)
4 函数子程序与子例行程序的区别
1
2子例行程序的名称不用来返回函数的处理结果,因此是没有类型的。

所以不能定义子例行程序的类型。

3子例行程序必须以SUBROUTINE语句开头,以END语句结束。

4能用函数子程序实现的功能,都能用子例行程序来实现,反之亦然。

因此在程序设计时,要对具体问题选择哪种方式。

5由于不能给子例行程序名赋值,所以在将函数子程序转换为子例行程序时,应该增加一个变量用来带回在函数子程序中由函数名带出的子例行程序处理结果。

6子例行程序的调用需要专门的CALL语句。

-
5 数据块子程序(BLOCK DATA)
1 数据块子程序是非执行程序单元,因而在其中不能出现任何可执行语句,也不能被别的
程序调用。

2 它是专门用来给有名公用区中的项目赋初值的子程序。

注意:COMMON变量不能直接在子
程序或主程序中使用DATA命令来设置初值,要在BLOCK DATA程序模块中使用DATA命令来设置初值。

3 数据块子程序是一个完整的程序单元。

它由BLOCK DATA语句开始,END语句结束。

4 BLOCK DATA只能用来设置全局变量的初值,而且在主程序执行前,全局变量的初值内
容就会设置完毕,事实上这一段程序会在主程序执行前就会生效;
5 全局变量不能声明成常量,所以BLOCK DATA中不能出现PARAMETER。

6 MODULE
"
1 MODULE可以用来封装程序模块,通常是用来把程序中具备相关功能的函数及变量封装
在一起。

例如需要使用全局变量时,可以把全局变量都声明在MODULE中,需要使用这些变量的函数只要USE这个MODULE就可以使用它们。

2 MODULE中的变量如果不是声明成全局变量,这些变量被函数使用时,只会是函数中的局部变量。

3 MODULE中还可以容纳函数,语法如下:
Module module_name
……… !先写声明相关程序代码
………
contains !从contains后开始写作函数

subroutine sub_name
………
end subroutine [sub_name] !subroutine不能省略
function function_name
…………..
end function [function_name] !function不能省略
end

这个做法比较符合模块化概念,编写大程序时,可以把程序中属于绘图功能的部分放在module Graphics中,把数值计算的部分放在module Numerical中。

Visual Fortran中所提供的一些扩充函数库就用这个方法来归类,像是数值函数库IMSL就放在module IMSL,3D 绘图程序库OpenGL的函数就放在module OpengGL中。

使用它们之前都要先use IMSL ,use OpenGL。

第四部分:FORTRAN的文件操作
1 记录结构(什么是记录结构)
一个数据文件在磁盘上的存放格式确定了文件的记录结构。

例如,在DOS或windows下用现有的编辑器建立一个文件,其数据存放方式如下:
1,2,3,4,5
6,7,8,9,10
11,12,13,14,15

16,17,18,19,20
文件中存有4行数据,每行5个数据。

在建立这些数据时,当每行最后一个数据输完后,打入了一个回车或换行标记(当然这是不可见标记)。

以上文件有4行,每行末尾都有一个标记。

因此,将每一行称为一个记录。

可以这样说,一个记录包括多个数据,以回车或换行标记作为记录的结束。

这就是记录的概念。

文件中的记录多少,每个记录的数据多少就是这个文件的记录方式—也称为记录结构。

由多个数据记录按一定的结构形式存入磁盘,就组成了文件。

2 open语句的使用:
OPEN语句的功能是打开一个文件,其语句的基本格式为:(前后位置可以变化)
OPEN(UNIT=number,FILE=filename,STATUS=status,ACCESS=access,…)

其中,
1. UNIT=number
number必须是一个正整数,用来给后面的文件指定一个代码(这样方便使用write或read 等命令在文件上读写),它可以使用变量或是常量来赋值。

Number值最好避开1、2、5、6。

因为2、6是默认的输出位置,也就是屏幕。

1、5则是默认的输入位置,也就是键盘。

2 FILE=filename
这个字段用来指定所要打开的文件名称,文件名要符合操作系统规定。

最好不要使用中文名3 FORM=’FORMATTED’ OR ‘UNFORMATTED’
FORM字段只有两个值可以设置:’FORMATTED’或‘UNFORMATTED’
FORM=’FORMATTED’表示文件使用“文本文件”格式来保存

FORM= ‘UNFORMATTED’表示文件使用“二进制文件”格式来保存
这一栏不给定时,默认值为FORMATTED(潘师兄的程序大部分都没写这一栏)
4 STATUS=’NEW’或’OLD’或’SCRATCH’或’UNKNOWN’
STATUS=’NEW’一个存在的旧文件,如果文件存在,则打开。

否则出现一个I/O错误STATUS=’OLD’文件决不能存在,否则出现一个I/O错误
STATUS=’SCRATCH’打开一个暂存文件,暂存文件是临时文件,当关闭或终止程序时,文件将被删除。

这时不需要指定文件名称,也就是FILE这一栏可以省略,因为程序本身会自动取一个文件名。

STATUS=’ UNKNOWN’缺省时的默认值,文件存在则打开,不存在则创建,相当于NEW 与OLD的综合利用。


5 ACCESS=’SEQUENTIAL’或’DIRECT’
这个字段用来设置文件读写的方法
ACCESS=’SEQUENTIAL’读写文件的操作会以顺序的方法来做读写,这就是“顺序读取文件”
ACCESS=’DIRECT’读写文件的操作可以任意指定位置,这就是“直接读取文
件”
不赋值时,默认值为SEQUENTIAL’
6. RECL=length

7 ERR=LABEL
这个字段用来设置当文件打开发生错误时,程序会跳跃到LABEL所指的行代码处来继续执行程序。

3 直接读取文件的操作
在FORTRAN语言中,读取文件的操作可以有“顺序读取”及“直接读取”两种方法。

所谓的直接访问文件,即将文件事先分区成好几个同样大小的小模块,(即指定记录号,且在每条记录中的数据还是按顺序的),再来进行读写的工作。

~
4 读写命令WRITE与READ语句的运用
WRITE/READ
(UNIT=number,FMT=format,NML=namelist,REC=record,IOSTAT=stat,ERR=errlabel,END=E NDLABEL,ADVANCE=advance,SIZE=size)
1UNIT=number 指定文件代码
2
3FMT=format 指定输入输出格式,若为 *号则表示自由格式(为了读写数据的准确,建议使用*号)
4
5 REWIND的使用
Rewind语句将一个文件的操作位置重新定位在其第一条记录上。

其语句格式为:
REWIND(u,ERR=LABEL,IOSTAT=iocheck)
u, 文件编号
ERR=LABEL 遇到错误转到LABEL语句
IOSTAT=iocheck 返回文件打开的状态,见OPEN语句。

6 BACKSPACE语句
Backspace语句用于在文件数据操作中,从当前数据位置回退到上一个数据位置。

其语句
格式为:
BACKSPACE(UNIT=number,ERR=errlabel,IOSTAT=iostat)
7 ENDFILE语句
把当前的文件位置变成文件的结尾。

8 INQUIRE语句
查询文件状态命令
第五部分:使用QuickWin
1 使用QuickWin特性的程序必须显示地用语句USE DFLIB
访问QuickWin图形库;
2 必须把用户项目的类型选为
第六部分:FORTRAN内置函数学习
1DBLE
语法:result=DBLE(a)
作用:转换维双精度实数
参数类型:ALL
函数值类型:real(8)。

相关文档
最新文档