Fortran语言的入门与心得

实验室很多旧的程序是用Fortran语言编写的,因此,就学习了一下Fortran语言,下面是我的一些个人总结:

第一部分:第一个例子

1.1  Hello world 程序

       program main

         implicit none

         print *, 'Hello World'

       end program main

第二部分:一些小心得

  1. Fortran不区分大小写
  2. Fortran每行的末尾不必要写分号
  3. 不像C语言,fortran不使用大括号{ }
  4. Fortran有5种基本数据类型,integer,real, character,   logical,  complex  与像其他语言一般没有复数类型,这是fortran与其他语言不同的地方。
  5. DOUBLE  PRECISION语句在FORTRAN90标准中完全可以用REAL(8)代替,目前很少使用。
  6. Fortran两种格式之间的一些遗留问题,平时编程要注意:
  7. 使用系统默认的隐含约定(I-N规则):FORTRAN中约定,在没有强制规定变量类型的情况下,如果变量名的首字母为IJKLMN6个字母中的一个时,即认为该变量为整型变量,而已其他字母开头的变量则默认为实型变量。这就是所谓的(I-N规则)。

I-N规则)的使用有利有弊。

  1. 变量名:

在FORTRAN77标准中,变量名不允许超过6个字符;在FORTRAN90标准中,变量名不允许超过31个字符;

  1. fortran fixed format格式中的变量赋初值一般用DATA,因为它不能用::DATA的语法是在DATA后接上要设置初值的变量,然后再用两个斜杠包住所要设置的值,如下例:     INTEGER  LINE      

DATA  LINE/0/

  1. real(kind=8) a这种格式只使用于Fortran90,Fortran77中要使用real*8real(8)
  2. 关于常数parameter的声明方法

第一种方法:

先声明一个变量,再利用PARAMETER命令将其声明为常量,例如:

real   pi;

parameter (pi=3.14159)  注意此处要用括号括起来

第二种方法:(适用于FORTRAN 90

      Fortran90里,PARAMETER可以作为一个形容词,和变量的声明同时写在一起,例如:

     real, parameter ::  pi=3.141592653

     

  1. FORTRAN中乘方要使用“**”运算符,使用乘方运算符“**”时,一定要写成两个连续的星号。一般来说,乘方运算要比等价的单个乘法运算花费更多的时间。
  2. 算术表达式中的类型转换:
  1. FORTRAN语言允许不同类型的算术运算量之间进行算术运算。
  2. 同类型的算术运算量之间的运算结果保持原类型不变。需要特别注意的是:FORTRAN语言中规定两个整数相除的商也是整数。例如,2/5的结果为0
  3. 参加运算的两个算术运算量为不同类型时,编译系统会自动将它们转换成同一类型之后才进行运算。
  1. FORTRAN中FREE与FIXED两种格式do循环的区别:

Fortran 95使用end do来结束循环。

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

Fortran 77中,经常会使用CONTINUE这个命令来结束循环。因为CONTINUE这个命令没有实际的用途,刚好可以拿来做封装使用。

  1. 循环的流程控制:

       循环中的cycle命令相当于c++里的continue命令,用于结束一次循环

       循环中的exit命令好比c里面的break,用于结束循环

  1. 不使用do循环,单纯用GOTO语句也能设计循环程序,但不推荐使用GOTO语句
  2. fortran有等价声明:即用equivalence(a,b),这样使得a,b使用同一块内存,这样可以节省内存,有时可精简代码。
  3. fortran77中只能用单引号。(还有疑问,因为fixed format能用双引号)
  4. 关系运算符

         ==    /=     >      >=     <     <=         !Fortran90用法

      .EQ.   .NE.   .GT.    .GE.    .LT.   .LE.      !Fortran77用法(左右各有一个点)

  1. 逻辑运算符

5种逻辑运算符,新旧FORTRAN标准中的逻辑运算符没有任何区别,每个运算符的左右都有一个点“.”,书写时不能漏写。

.AND.     .OR.     .NOT.      .EQV.        .NEQV.                 !语法

逻辑与   逻辑或   逻辑非   逻辑等价   逻辑不等价               !意义

  1. PAUSE,CONTINUE,STOP

       pause 暂停程序执行,按enter可继续执行

       continue 貌似没什么用处,可用作封装程序的标志

       STOP 命令用来结束程序,要谨慎使用

  1. Fortran的特色:隐含式循环
  2. a,b都为数组,则可以这样用a=sin(b),(内部函数都可以这样用)
  3. 数组专用

where命令形式上类似于if,但只用于设置数组 where.....elsewhere...elsewhere...endwhere (没有then)

         FORALL是Fortran95添加的功能,只能用于数组操作

         forall可以嵌套使用,还可以在forall中使用where,但where中不能使用forall

  1. Fortran中传递参数的原理与c++不同,Fortran中是传址调用,就是传递时用参数和子程序接受时用的参数使用一个地址,尽管命名可以不同。
  2. 调用自定义函数前需要做声明,调用子程序则不需要。
  3. Module中有函数时必须在contains命令之后
  4. 全局变量COMMON,有的书上叫无名公用区、有名公用区)

全局变量用来定义一块共享的内存空间;

    全局变量不能声明成常量

全局变量不能直接使用data命令赋初值,要在block data模块中使用data来设置初值

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

取用全局变量时,是根据它们的相对位置关系来作对应而不是根据变量名称来对应。由于全局变量是使用“地址对应”的方法在程序中共享数据,所以在程序设计时常常会有麻烦出现:比如要调用后面的变量就要从第一个开始,这种麻烦在全局变量多的情况下更为惊人。因此,可以把全局变量进行归类,放在彼此独立的COMMON区间中。l

common  /group1/ a

common  /group2/ b

24  传递参数与使用全局变量都可以在不同程序之间共享数据,那什么时候该使用参数,还有什么时候该使用全局变量呢?

    简单地说,当需要共享的变量不多,而且只有少数几个程序需要使用这些数据时,那就使用参数,

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

25  INCLUDE命令

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

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

26 如何换行

第三部分:流程控制

3.1  IF语句

1.  一个模块

 IF   (逻辑判断式)  THEN

       …..

       …..

END IF

2.  可以包含ELSE模块

IF   (逻辑判断式)  THEN

       …..

       …..

ELSE

…..

       …..

 

END IF

3.  多重判断

IF   (逻辑判断式)  THEN

       …..

       …..

ELSE IF  (逻辑判断式) THEN

…..

ELSE IF  (逻辑判断式) THEN

 

       …..

 

END IF

 

 

 

3.2  DO 循环

3.2.1  FORTRAN77中的基本DO构造

FORTRAN77中的DO构造如下:

   DO 语句标号 ,循环控制

          循环体

   语句标号  终止语句

 

3.2.2  FORTRAN90/95中的基本DO构造

在FORTRAN90/95中通过引入专用循环终止语句的方式来使得循环结构更为清晰。如下:

        DO   循环控制( 循环变量=循环初值,循环终值,循环增量)

          循环体

         ENDDO  

3.3  DO WHILE 循环

循环不一定要由计数器的增、减来决定是否该结束循环,它可改由一个逻辑运算来做决定,这就是DO-WHILE循环的功能

DO  WHILE  (逻辑判断式)

       …..

       …..

END DO

 

 

 

 

 

 

 

 

第四部分:FORTRAN中的数组

4.1 数组的说明

  1. 数组的下标必须用逗号隔开,而不能像matlab一样既可以用逗号也可以用空格,fortran的数组元素之间不能用空格
  2. 与C不同,Fortran数组索引值默认从1开始,而且可以在声明时改变该规则,下标是整型常量、变量或表达式,可正、可负、也可以为0,但必须在引用的数组的维数之内。

          integer a(-3:1)      !索引值为-3,-2,-1 ,0,1

  1.  
  2. 数组的声明:

Fortran 77中数组的声明,必须使用DIMENSION命令

Integer   a;         !先声明a是整型

Dimension  a(10)    !再声明a是大小为10的数组

Fortran 95中可以用简单的方法:

Integer  a(10)  real  b(3,3)    !最简单的方法

Integer,dimension(10)::  a      !另一种方法

  1. 声明可变大小的数组:

Fortran77中还没有支持可变大小的数组,就只能先声明一个超大数组,然后往里面写数据。

而Fortran90的数组则可以声明可变大小的数组,然后根据需求实时改变它的大小。

使用可变大小的数组要经过两个步骤:

   第一步当然是声明,这里的声明方法可能有些不同,声明时要加上allocatable,数组的大小也不用赋值,使用一个冒号“:”来代表它是一维数组就行了。

第二步,声明完成后,这个数组还不能使用,因为还没有设置它的大小。要经过allocate这个命令到内存中配置了足够的空间后才能使用数组

如:

  Integer :: students;

  Integer,allocatable :: a(:) ;   !声明一个可变大小的一维数组

  Allocate(a(students));          ! 配置内存空间

除了一维数组外,其他维度的数组当然也可以使用。方法如下:

  Integer,allocatable ::a2(:,:) ;        !用2个冒号,代表二维数组

  Integer,allocatable ::a3(:,:) ;        !用3个冒号,代表三维数组

 

ALLOCATE命令是去求内存使用空间,而DEALLOCATE则是逆向运行,它是用来把用ALLOCATE命令所得到的内存空间释放掉,使用这两个命令可以用来重新设置数组的大小。

 

  1. 如何声明一个单位矩阵?

例子:声明一个3*3维的单位矩阵

REAL(kind=8)  B(3,3); 

DATA B / 1.0D+0, 3*0.0D+0, 1.0D+0, 3*0.0D+0, 1.0D+0/

 

  1. 数组在内存中的存放顺序也与C不同(正好相反),如a(2,2)在内存中的存放顺序为a(1,1),a(2,1),a(1,2),a(2,2);

原则是放低维的元素,再放高维的元素,此规则称为column major

矩阵输出时也是按列输出。。

  1. FORTRAN中,数组最多可以声明为7

    4.2 数组的引用

在FORTRAN77标准中,数组只允许在输入输出语句中进行整体操作。在其他场合,只能对数组的元素通过下标索引的方式逐个进行操作。到了FORTRAN90标准,这一限制被大大放宽了。数组除了能够进行整体操作以外,还能对数组中的片段和数组的整体进行操作。(且其引用方式与MATLAB很相似)。

引用数组元素的语法如下:

      数组名(下标,下标,….)

引用数组片段的语法如下:

     数组名(下标范围,….

数组片段的引用方式较为灵活,既可以通过三元下标来进行引用,也可以通过向量下标来进行引用。三元下标的格式如下:

  [下界][上界]:[步长]

如:  B(1,1:5)    B(1,1:10:2)

 

4.3 数组的赋值

Fortran 77中数组的声明,可以使用DATA命令 或隐含式循环来赋初值;

Fortran 95中可以直接设置初值;如:integer  ::a(5)=(/1,2,3,4,5/);此时,括号和除号之间不能有空格;

数组构造器是由括号和斜线之间的一系列值或隐DO循环组成。其一般形式为:(/取值列表/)。取值列表可以是标量,隐DO循环或任意秩的数组。其中的所有值的类型都相同,以逗号隔开。如果列表中出现了数组,它的值是按列来赋的。

 

例:INTEGER A(6)

A=(/1,2,3,4,5,6/)    ! 斜杠与括号间不能有空格

例:

    C1=(/4,8,7,6/)            ! 标量表示

C2=(/B(I,1:5),B(I:J,7:9)/)      ! 数组表示

C3=(/(I,I=1,4)/)           ! 隐DO循环

C4=(/4,A(1:5),(I,I=1,4),7/)     ! 混合表示

下面是一些数组构造器的替换格式

1) 用方括号代替括号和斜线,例如下面两个数组构造器是等价的:

例:INTEGER C(4)

C=(/4,8,7,6/)

C=[4,8,7,6]      原来fortran赋值数组可以使用方括号

2) 冒号三元下标(代替隐DO循环)来指定值的范围和步长,例如下面两个数组构造器是等价的:

例:INTEGER D(3)

D=(/1:5:2/)            ! 三元下标格式

D=(/(I,I=1,5,2)/)        ! 隐DO循环格式

 

d)    RESHAPE语句

可以用内在函数RESHAPE语句把一个一维数组改变形状后赋给另一已知形状的数组。由于Fortran的数组顺序不同于C,Fortran中左边第一维是变化最快的,RESHAPE语句可以用于当Fortran过程化为C过程时将Fortran数组改序成C数组序。它的一般形式为:结果=RESHAPE(源,形状[,补充][,顺序])可以是任意数据类型的数组,它提供结果数组的元素。当补充被省略或其大小为0时,源的大小必须大于PRODUCT(形状)。形状为7个元素以下的一维固定的整型数组,它决定了结果数组的形状,其大小为正元素非负。补充为与源数组相同类型和属性的数组,当源数组的大小比结果数组小时用来补充元素值。顺序必须是和形状数组有相同形状的整型数组,其元素为(1,2,...,n)的排列,n是形状数组的大小。当顺序被省略时,默认值为(1,2,...,n)。

因此,结果数组的形状与形状数组相同,与源数组的类型和属性相同,大小是形状数组元素值的乘积。结果数组的元素是源数组的元素按顺序数组指定的维别顺序排列的,当省略顺序数组时元素按通常的顺序排列。源数组元素用完后按序用补充数组的元素,必要时重复使用补充数组直至结果数组的所有元素均有其值。

例:RESHAPE((/3,4,5,6,7,8/),(/2,3/))的结果是

例:RESHAPE((/3,4,5,6,7,8/),(/2,4/),(/1,1/),(/2,1/))的结果是

例:INTEGER AR1(2,5)

REAL F(5,3,8),C(8,3,5)

AR1=RESHAPE((/1,2,3,4,5,6/),(/2,5/),(/0,0/),(/2,1/)) 

! AR1的取值为     [1 2 3 4 5]

!                 [6 0 0 0 0]

C=RESHAPE(F,(/8,3,5/),ORDER=(/3,2,1/))   ! 将Fortran数组序化为C数组序

END

例:INTEGER B(2,3),C(8)

B=RESHAPE((/1,2,3,4,5,6/),(/2,3/))       ! 赋值给形状为(2,3)的数组

C=(/O,RESHAPE(B,(/6/)),7/)               ! 赋值给向量C之前先把B转换成向量

 

 

 

4.5 常用内在函数

4.5.1 内部基本函数

在FORTRAN语言的数组表达式中,允许将数组作为内部基本函数的参数。此时,内部基本函数的函数值就是一个同参数数组形状相同的数组,例如,B=SQRT(A),即对数组A的每一个元素开方。

4.5.2 矩阵乘积函数

C=MATMUL(A,B)

使用时,数组A和B只能是维数为12的数组

数组A和B中至少要有一个的维数为2,也就是不能是两个向量相乘。

4.5.3 向量点乘函数

C=DOT_PRODUCT(A,B)

 

第五部分:格式化输入输出

5.1 表控输入输出(即表控格式输入输出)

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

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

5.2  WRITE命令

5.2.1  write命令语法

向屏幕输出字符串:

Write(*,*)    “string”                 !一般用法

Write(6,*)    “string”                 !严谨一些的用法

Write(UNIT=6,FMT=*)    “string”        !最严谨的用法

因为屏幕的输出UNIT位置就是6

5.2.2  写入字符串

Write命令不仅可以写入屏幕与文件,而且还可以写入字符串,fortran轨道确定程序中的errout文件就用到了这一功能。

例如:

CHARACTER*6 :: NAME=’hahaha’;

CHARACTER*60 MESS;

INTEGER::  IERR=4;

WRITE (MESS,*) IERR, NAME  !将IERR和NAME写入到字符串MESS中

 

5.3  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. X描述符

作用: 用于输出空格

一般形式: nX

  1.   I描述符

作用: 用于整型数据的输出

一般形式: Iw Iw.n

  1.  F描述符

作用:用于实数的小数形式输出

一般形式: Fw.d

  1. E描述符

作用:用于实数的指数形式输出

一般形式:Ew.d

其中:E—实数的指数形式输出;

       w—字段宽度;

       d—数字部分的小数位数。

          数值部分<1

  1. A描述符

作用:用于字符型数据的格式描述

一般形式: AwA    ,其中w是字段宽度。

 

  1. 号描述符

作用:用于输出字符常量,即把撇号内的字符串原样照打

例如:write(*,100) i,j

 100  format(1x,'i=',i3,'  j=',i4)

  1. H描述符

作用:它的作用与撇号描述符类似,也可以输出字符型常量

一般形式: nH

    建议:建议最好不要使用H描述符,而是使用撇号描述符,避免错误

例如:  I=123

        WTRITE(*,100),I

     100  FORMAT(1X,2HI=,I3);

 

  1. 斜杠描述符

 

         反斜杠\描述符美元$描述符的作用相同,都是在输出一个记录行后取消回车符,常用于输出字符串与输入数据显示于屏幕同一行的情形。

例如:   write(*,'("please enter your name",$)');

            Read(*,*) My_age

 

 

  1. 重复系数r

format语句中,如果出现几个(或几组)相同的格式编辑符,则可以利用重复系数而只写一个(或一组)编辑符。

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

 例:

   write(*,100) n1,n2,x,y1,y2,y3

100   format (1x, i10, i10, f8.3, f7.2, f7.2, f7.2)

    

    Format (1x, 2i10, f8.3, 3f7.2)  

第六部分:函数操作

6.1  语句函数

   1  语句函数的定义

REAL(KIND=8)   X F

F(X)=X**2+X+1 

   2 语句函数的调用

       语句函数一旦被定义后,就可以在本程序单元中被调用。调用的形式和调用内容函数形同,即:

                  语句函数名(实参)

  1. 说明

语句函数定义语句是非执行语句,它应该放在所有可执行语句之前和所有的说明语句之后。

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

6.2  函数子程序

  1. 定义的一般形式:

类型说明符  FUNCTION  函数名(形参表)

 

函数主体

函数名=表达式;

END

或者:

        FUNCTION  函数名(形参表)

        

         函数主体

函数名=表达式;

END

6.3  子例行程序

子例行程序定义的一般形式:

     SUBROUTINE   函数名(形参表)

      。。。

end

子例行程序的调用:

     CALL    子程序名(实参)

6.4   函数子程序与子例行程序的区别

  1. 子例行程序的名称不用来返回函数的处理结果,因此是没有类型的。所以不能定义子例行程序的类型。
  2. 子例行程序必须以SUBROUTINE语句开头,以END语句结束。
  3. 能用函数子程序实现的功能,都能用子例行程序来实现,反之亦然。因此在程序设计时,要对具体问题选择哪种方式。
  4. 由于不能给子例行程序名赋值,所以在将函数子程序转换为子例行程序时,应该增加一个变量用来带回在函数子程序中由函数名带出的子例行程序处理结果。
  5. 子例行程序的调用需要专门的CALL语句。

6.5   数据块子程序(BLOCK DATA)

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

2  它是专门用来给有名公用区(全局变量)中的项目赋初值的子程序。注意:COMMON变量不能直接在子程序或主程序中使用DATA命令来设置初值,要在BLOCK  DATA程序模块中使用DATA命令来设置初值。

3   数据块子程序是一个完整的程序单元。它由BLOCK  DATA语句开始,END语句结束。

4   BLOCK DATA只能用来设置全局变量的初值,而且在主程序执行前,全局变量的初值内容就会设置完毕,事实上这一段程序会在主程序执行前就会生效

5   全局变量不能声明成常量,所以BLOCK DATA中不能出现PARAMETER

6.6   MODULE

1   MODULE可以用来封装程序模块,通常是用来把程序中具备相关功能的函数及变量封装在一起。例如需要使用全局变量时,可以把全局变量都声明在MODULE中,需要使用这些变量的函数只要USE这个MODULE就可以使用它们。

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

  1.  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的文件操作

7.1 记录结构(什么是记录结构)

一个数据文件在磁盘上的存放格式确定了文件的记录结构。例如,在DOS或windows下用现有的编辑器建立一个文件S.DAT,其数据存放方式如下:

1,2,3,4,5

6,7,8,9,10

11,12,13,14,15

16,17,18,19,20

文件中存有4行数据,每行5个数据。在建立这些数据时,当每行最后一个数据输完后,打入了一个回车或换行标记(当然这是不可见标记)。以上文件有4行,每行末尾都有一个标记。因此,将每一行称为一个记录。可以这样说,一个记录包括多个数据,以回车或换行标记作为记录的结束。这就是记录的概念。

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

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

7.2  open语句的使用:

  OPEN语句的功能是打开一个文件,其语句的基本格式为:(前后位置可以变化

   OPEN(UNIT=number,FILE=filename,STATUS=status,ACCESS=access,…)

其中, 

  1.   UNIT=number

number必须是一个正整数,用来给后面的文件指定一个代码(这样方便使用writeread等命令在文件上读写),它可以使用变量或是常量来赋值。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’,‘REPLACE’’SCRATCH’’UNKNOWN’

STATUS=’NEW’   表示这个文件原本不存在,是第一次打开

STATUS=’OLD’    表示这个文件原本就已经存在

STATUS=’REPLACE  文件若已经存在,会重新创建一次,原本的内容会消失。文件若不存在,会创建新文件。

STATUS=’ SCRATCH’   打开一个暂存文件,暂存文件是临时文件,当关闭或终止程序时,文件将被删除。这时不需要指定文件名称,也就是FILE这一栏可以省略,因为程序本身会自动取一个文件名。

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

5   ACCESS=’SEQUENTIAL’’DIRECT’

这个字段用来设置文件读写的方法

ACCESS=’SEQUENTIAL’  读写文件的操作会以顺序的方法来做读写,这就是“顺序读取文件”

ACCESS=’ DIRECT’       读写文件的操作可以任意指定位置,这就是“直接读取文件”

不赋值时,默认值为SEQUENTIAL’ 

6  RECL=length

 

7    ERR=LABEL

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

7.3 直接读取文件的操作

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

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

 

 

7.4 读写命令WRITE与READ语句的运用

WRITE/READ(UNIT=number,FMT=format,NML=namelist,REC=record,IOSTAT=stat,ERR=errlabel,END=ENDLABEL,ADVANCE=advance,SIZE=size)

  1. UNIT=number 指定文件代码
  2. FMT=format   指定输入输出格式,若为 *号则表示自由格式(为了读写数据的准确,建议使用*号)
  3.  

7.5  REWIND的使用

  Rewind语句将一个文件的操作位置重新定位在其第一条记录上。其语句格式为:

 

REWIND(u,ERR=LABEL,IOSTAT=iocheck)

u,  文件编号

ERR=LABEL    遇到错误转到LABEL语句

IOSTAT=iocheck   返回文件打开的状态,见OPEN语句。

7.6  BACKSPACE语句

Backspace语句用于在文件数据操作中,从当前数据位置回退到上一个数据位置。其语句格式为:
     BACKSPACE(UNIT=number,ERR=errlabel,IOSTAT=iostat)

7.7   ENDFILE语句

  把当前的文件位置变成文件的结尾。

7.8  INQUIRE语句

  查询文件状态命令

第八部分:常用的内部过程

8.1 通用名与专用名

调用通用名时,函数会根据参数的类型自动确定要调用的具体函数的专用名

例如,求根函数的通用名是SQRT,专用名有三个:SQRT、DSQRT和CSQRT,分别用于求单精度实型、双精度实型和复型数据的根。当调用SQRT时,如果输入的参数为单精度实型,则会调用专用名SQRT;如果输入的参数为双精度实型,则会调用专用名DSQRT;如果参数为复型,则会调用专用名CSQRT

之所以存在通用名与专用名共存的现象,是为了与早期的FORTRAN标准相兼容。很多早期的标准函数都是采用专用名的形式,例如在FORTRAN66中求实数相除的余数会调用AMOD函数而不是MOD函数。由于专用名一般仅限于FORTRAN子集中,在标准FORTRAN中,会通过接口将各种专用名写在同一个通用名的过程中,在代码执行时会自动调用与参数类型匹配的专用函数。因此在编写程序时,直接使用通用名就可以了

8.2 常用数学函数

8.2.1 绝对值函数

   函数原型如下:

                       C=ABS(X)

  其中,ABS是FORTRAN中绝对值函数的通用名。除了这个通用名之外,绝对值函数还有四个专用名,如下所示:

   ABS,专用于求默认种别的实型数据的绝对值,返回值也为默认种别的实型数据。

   IABS ,专用于求默认种别的整型数据的绝对值,返回值也为默认种别的整型数据。

DABS ,专用于求双精度的实型数据的绝对值,返回值也为双精度的实型数据。

   CABS ,专用于求默认种别的复型数据的绝对值,返回值也为默认种别的复型数据。

8.2.2 正弦函数

  1 函数原型如下:

                       C=SIN(X) (函数中参数的单位是弧度而不是度,注意!

  其中,SIN是FORTRAN中正弦函数的通用名。除了这个通用名之外,正弦函数还有三个专用名,如下所示:

   SIN ,专用于求默认种别的实型数据的正弦值,返回值也为默认种别的整型数据。

   DSIN ,专用于求双精度的实型数据的正弦值,返回值也为双精度的实型数据。

   CSIN ,专用于求默认种别的复型数据的正弦值,返回值也为默认种别的复型数据。

2 函数原型如下:

                       C=SIND(X) (函数中参数的单位是度而不是弧度,类似MATLAB,注意!

其中,SIND是FORTRAN中正弦函数的通用名。除了这个通用名之外,正弦函数还有三个专用名,如下所示:

   SIND ,专用于求默认种别的实型数据的正弦值,返回值也为默认种别的整型数据。

   DSIND ,专用于求双精度的实型数据的正弦值,返回值也为双精度的实型数据。

   CSIND ,专用于求默认种别的复型数据的正弦值,返回值也为默认种别的复型数据。

8.2.3 余弦函数

  1  函数原型如下:

                       C=COS(X) (函数中参数的单位是弧度而不是度,注意!

  其中,COS是FORTRAN中正弦函数的通用名。除了这个通用名之外,余弦函数还有三个专用名,如下所示:

   COS ,专用于求默认种别的实型数据的余弦值,返回值也为默认种别的整型数据。

   DCOS ,专用于求双精度的实型数据的余弦值,返回值也为双精度的实型数据。

   CCOS ,专用于求默认种别的复型数据的余弦值,返回值也为默认种别的复型数据。

2  函数原型如下:

                       C=COSD(X) (函数中参数的单位是度而不是弧度,类似MATLAB,注意!

  其中,COSD是FORTRAN中正弦函数的通用名。除了这个通用名之外,余弦函数还有三个专用名,如下所示:

   COSD ,专用于求默认种别的实型数据的余弦值,返回值也为默认种别的整型数据。

   DCOSD ,专用于求双精度的实型数据的余弦值,返回值也为双精度的实型数据。

   CCOSD,专用于求默认种别的复型数据的余弦值,返回值也为默认种别的复型数据。

8.2.4 反正弦函数

  1  函数原型如下:

                       C=ASIN(X) (函数中返回值的单位是弧度而不是度,注意!

  其中,ASIN是FORTRAN中正弦函数的通用名。除了这个通用名之外,正弦函数还有两个专用名,如下所示:

   ASIN ,专用于求默认种别的实型数据的反正弦值,返回值也为默认种别的整型数据。

   DASIN ,专用于求双精度的实型数据的反正弦值,返回值也为双精度的实型数据。

   2  函数原型如下:

                       C=ASIND(X) (函数中返回值的单位是度而不是弧度,注意!

  其中,ASIND是FORTRAN中正弦函数的通用名。除了这个通用名之外,正弦函数还有两个专用名,如下所示:

   ASIND ,专用于求默认种别的实型数据的反正弦值,返回值也为默认种别的整型数据。

   DASIND ,专用于求双精度的实型数据的反正弦值,返回值也为双精度的实型数据。

8.2.5 DMOD

 

 

 

8.3 常用其他函数

  1. DBLE

  语法:result=DBLE(a)

  作用:把数据转换为双精度实数,比如 dble(Fre) 相当于 Fre*1.0D0,也就是把 Fre 转换成双精度的数据

 

  参数类型:ALL

  函数值类型:real(8)

  1. date_and_time

在想获取日期和时间时,date,time,ctime,ltime都不标准,推举使用的是date_and_time,

这是一个 2000 年安全的 Fortran 95 内例程。

date_and_time子例程返回实时时钟的数据和日期。返回本地时间以及本地时间与通用协调时间 (UTC)(也称为格林威治标准时间,GMT)之间的时差。

 

 

8.4 常用库

1  USE DFPORT

为了使用portability library(DFPORT),可以使用这个语句。链接时会在DFPORT.LIB中查找需要的函数。

比如为了返回命令行参数就需要这个库。

 

在文件夹 D:\源文件\Visual Fortran 6.6(33106-060-1186591-00003)\X86\DF\LIB  中可以找到该库。

2  USE DFLIB

     使用Visual Fortran的绘图功能时需要module dflib.

 

 

 

第九部分:FORTRAN绘图

9.1 关于FORTRAN的绘图功能

Visual Fortran 的绘图功能不完全是以扩充函式的形态存在,使用它的绘图功能必須在选择Project 型态时,选择Standard Graphics QuickWin模式

Visual Fortran提供的绘图方法,跟SGL(笔者提供)比较起來算是各有利弊。SGL使用比較簡單的參數介面,使用效率比較好的DirectX,支援Double Buffer 動畫功能,而且並不限制只能在Visual Fortran 中使用。Visual Fortran 的QuickWin及Standard Graphics 模式在簡單的绘图使用上會比較方便,不像SGL 必須自行處理一些視窗訊息。它的绘图函式功能比較多樣,不過效率會比較差,而且不支援動畫功能。

Standard Graphics 和QuickWin 模式在繪圖方面的使用方法完全相同,它們都是呼叫相同的函式來繪圖。差別在於Standard Graphics 只能開啟一個視窗來繪圖、QuickWin 模式則可以開啟多個視窗來繪圖。QuickWin模式下可以有選單及對話窗的功能,StandardGraphics 則不行。Standard Graphics 模式的程式碼可以原封不動直接轉換到QuickWin模式下使用,但是QuickWin的程式碼並不一定可以直接拿到Standard Graphics 模式下使用。

9.2 第一个绘图例子

  编译程式时,请选择Fortran Standard Graphics or QuickWin Application这个模式。这个程式可以在Standard Graphics 或QuickWin模式下使用。建好Project后,再把下面的程式加入Project 中來编译:

 program Plot_Demo

! 使用Visual Fortran 的绘图功能時需要module dflib

    use DFLIB

   implicit none

  type(xycoord) :: t

  integer :: result

 

 call MoveTo(10,10,t) ! 把目前绘图的位置移动到座標(10,10)

 result=LineTo(100,50) ! (10,10)(100,50)間绘一条直线

 ! 画一个左上角為(110,10), 右下角為(150,50)的实心方形

  result=Rectangle( $GFILLINTERIOR, 110,10, 150, 50 )

! 画一个可以放入在(10,60)--(150,100)方形當中的空心椭圆

  result=Ellipse($GBORDER, 10, 60, 150, 100)

end program Plot_Demo

 

  • 65
    点赞
  • 473
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值