【Fortran】基础知识汇总

Fortran相关基础


1. 语言字符

英文字母大小写不敏感programPROGRAM、变量 a 与变量 A 的效用是一样的。


2. 语句结构

  1. 每一行可以输入132个字符,可以用&,置于行末或行首,用于连接下一行或上一行;
  2. 注释符号!,属于不编译语句,用于说明,可以放在任何位置;
  3. 语句标号,用于行首,代表是该行的“名字”,具有唯一性,如下所示。一般不建议使用,影响程序可读性。
100 write(*,*) "Hello, World !"   ! 100 即是本行语句的名字
999 write(*,*) "Hello, Fortran !"  !  999 即是本行语句的名字

3. 程序结构

1) 组成
  1. Fortran程序单元由三个部分构成:声明部分、执行部分、终止部分,如下方所示;
  2. 声明部分:声明程序名称、描述程序用途、声明变量类型;
  3. 执行部分:程序运算过程;
  4. 终止部分:通知程序编译结束。
 ! 声明部分
PROGRAM my_test  ! 程序名,最多可长达63个字符
	! test 
INTEGER::i,j   ! 声明两个整形变量

! 执行部分,将输入屏幕的两个数相加并打印出来
WRITE(*,*)"Please enter the figures to add together"
READ(*,*)i,j
res = i + j
WRITE(*,*)"Result = ",res

! 终止部分
STOP
END PROGRAM my_test
2) 书写格式

不是硬性要求,因为程序对字母大小写不敏感,目的为了保持程序书写格式的前后一致,提高可阅读性。

  1. 保留字、常量均大写,如PROGRAMWRITEPI等;
  2. 变量名、过程名、程序名均小写,如ijmy_test等。

4. 常量与变量

1) 基本特性
  1. 常量(常数)需事先定义(初始化),在执行过程中不可变,需要保持前后一致,用属性PARAMETER声明;
  2. 在声明部分中,变量可以初始化,也可不初始化(在执行部分中再定义),在执行过程中可变;
    1. 变量命名最长可达63个字符;
    2. 首字符为字母,由字母、数字、下划线 _构成 ;
    3. 命名尽量要有意义,提高可读性;
  3. 数据类型较为常用的主要有5种,INTEGERREALCOMPLEXLOGICALCHARACTER
2) INTEGER 整数
  • 整数部分,如果是正数,+可加可不加;
  • 不能含有小数点,如100.是不合理的;
  • 逗号不能嵌入整数中,如100,100是不合理的。
3) REAL 实数
  • 用小数部分来表示,如果是正数,+可加可不加,用十进制来表示;如100.111.23+200.等;
  • 可用或不用指数E(对应的幂是10)来表示,如2.5E10(表示2.5×1010),3.2E-3(表示3.2×10-3)等;
  • 逗号同样不能嵌入实数中,如100,100.是不合理的。
4) COMPLEX 复数
  • 由实部和虚部两个部分组成,两部分的数字必须是实数;
  • 采用(a , b)的形式进行计算,表示为a+bi
5) LOGICAL 逻辑
  1. 常用于分支结构循环结构的控制

  2. 仅包括两个数值 .TRUE..FALSE.,注意数值两边有两个点。有两种运算类型:

    • 关系运算
      用于两个数字或字符的逻辑运算,有:
      == 等于
      /= 不等于
      > 大于
      < 小于
      >= 大于或等于
      <= 小于或等于
      最终返回一个逻辑结果(T / F)。
    • 组合运算
      用于一个或多个逻辑对象(.TRUE..FALSE.)的逻辑运算(注意符号左右同样有两点),有:
      .AND. 逻辑与
      .OR. 逻辑或
      .EQV. 逻辑等
      .NEQV. 逻辑不等
      .NOT. 逻辑非
      最终返回一个逻辑结果(T / F)。
  3. 由于逻辑运算也有一定的计算顺序,在不明确计算先后顺序时,最好使用()

  4. 逻辑值通过READ来输入时,真值可输入.TRUE.T开头的字符串假值可输入 .FALSE.F开头的字符串,输入其它对象则会报错。

6) CHARACTER 字符
  • 由字母字符串组成,用单引号'或双引号"括住;
  • 字符串中有着重符号,可使用如'Xiaomao''s friend'或者"Xiaomao's friend"
  • 用单引号括住含有双引号的字符串,可使用如'"What?"'
  • 字符的操作运算可参考:链接
7) 变量声明显式和默认式
  • 如没有显式声明,则通过变量的“样子”的推测其具体的数据类型;
  • 如没有显式声明,可通过默认方式确定(只与整型和实型相关):

任何以字母ijklmn 开头的变量名假定为整型INTEGER,其余字母开头的变量假定为实型REAL

  • 变量声明语句:
INTEGER::var1[,var2,var3,...]  ! 整型  []为可选参数,不声明可默认
REAL::var1[,var2,var3,...]         ! 实型  []为可选参数,不声明可默认
LOGICAL::var1[,var2,var3,...]    ! 逻辑型  []为可选参数,必须显式声明
CHARACTER(len=<len>)::var1[,var2,var3,...]   ! 字符型,必须显式声明。[]为可选参数,len用于声明字符变量的长度,也是可选参数,缺省时代表字符变量长度为1
type,PARAMETER::name1=var1[,name2=var2,name3=var3,...] ! 常量声明,type是具体的类型,如整型、实型等。如果是字符型,不需声明字符长度len,因为编译器自动计算

5. 赋值与运算

1)赋值 =

name = value,将value存储至变量name中。

2) 运算符号

+
-
*
/
** 指数

  • 两个操作符不能连续出现。如6*-5是不合理的,要用括号,即6*(-5)
  • 乘法不能隐式运算。如6(5*10)是不合理的,要显式,即6*(5*10)
  • 表达式中含多个括号,先计算最里面的括号,从内往外计算(与常规使用相一致)。
3) 运算规则
  1. 整数运算。输出结果也是整型,如5/3计算结果为1.000000,后面的0是精度。一般用于计算和索引
  2. 实数运算。需要注意的是,计算由于有精度的限制,结果可能与理论值有些许差别。
  3. 符号运算顺序如下。尽可能使用括号(),使计算式清晰明了。
    ①括号先运算,内括号优于外括号;
    ②再从右往左做**运算;
    ③从左往右做*/ 运算;
    ④从左往右做+- 运算。
4) 混合运算

在一个表达式中含有一个或多个整数和实数之间的运算操作。由于计算过程难以理解,在实际使用时尽量避免

  1. 可以对表达式中的整数和实数变量进行类型转换操作。
  2. 指数进行操作时,最好是采用整型指数,而不是实数型指数。如ab ,即b最好是整型,因为是有ba进行相乘,b用整型来描述是符合真实意义的。如果用实数b,运算是通过ab=eblna来间接运算,计算时间长、精度降低。
    因此,当计算(-5.2)2.1时,会计算出错,因为负数不存在对数。

6. 输入输出与初始化变量

1) 输入

主要有两种输入方式:

  • 键盘交互输入
  • 文件输入
    主要通过语句READ来输入,具体可参考:READ链接
2) 输出

主要通过语句WRITE来输出,具体可参考:WRITE链接

3) 变量初始化

在使用变量之前,必须要先对其初始化,否则编译器会将变量初始化为0或任意值,甚至会运行报错。

常用初始化的方法有三种:

  1. 赋值语句 =。在程序执行时初始化。
  2. 输入语句 READ。在程序执行时初始化。
  3. 类型声明语句,type::var1[,var2,var3,...]。在程序开始之前初始化。

在定义变量之前,最好使用IMPLICIT NONE语句

  • 用处:PROGRAM语句之后,type::var1[,var2,var3,...]语句之前。

  • 作用:每个变量必须显式声明(参考上述4.7小节),优点:

    • 避免变量名打字错误,即前后变量名字及数值一致,不会由于打字错误从而产生新的变量;
    • 如果变量名打字错误,程序会报错并标识错误所在的位置。
  • 每个变量都必须要声明其类型,能够帮助检查错误,包括程序在执行部分新增短暂使用的“间接过程变量”,如下所示则会报错:

    PROGRAM my_test2
    IMPLICIT NONE  ! 所有变量须显式声明
    REAL::i = 5.0 , j =2.0
    
    res = i ** j
    WRITE(*,*)"Result = ",res
    
    STOP 
    END PROGRAM my_test2
    

    报错内容为:

    error #6404: This name does not have a type, and must have an explicit type.   [RES]		
    

    提示res变量没有声明类型。因此需要在声明部分对其进行类型声明REAL::res,此时程序就能顺利运行。


7. 减少debug的编程习惯

  1. 尽量在所有程序中使用IMPLICIT NONE语句;
  2. 如果使用READ语句来对变量进行初始化,则可以通过WRITE语句及时返回相应变量输入值,减少错误;
  3. 对所有变量都进行初始化处理,避免程序预设定或报错;
  4. 运算公式尽量使用(),使其结构清晰明了。

8. 程序设计思路(常规)

  1. 清楚地陈述需要解决的问题;

  2. 定义程序所需的输入和程序产生的输出;

  3. 设计要在程序中实现的算法,可通过两种方式:

    • 伪代码(Fortran语句和符号掺杂在一起的混合体)
    • 流程图
  4. 将算法转换成Fortran语句;

  5. 测试Fortran程序。

  • 19
    点赞
  • 103
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值