Fortran简明自学手册

Fortran简明自学手册

因为CSDN不支持对Fortran代码的高亮显示,这儿贴出
学习手册PDF版百度网盘的下载链接:
https://pan.baidu.com/s/1A_6N0TQERg2nrnxkh3UnGQ

Fortran即Formula Translation(公式翻译)。是世界上诞生最早的高级语言之一,其易读,好写,很适合科学计算,一诞生便很快统治了数值计算界。因此也不难理解为何Fortran中保留了一些特殊的基础类型,如虚数。过去学习Fortran也是一种风尚。很多科学界的前辈,往往就是从这门语言开始了对编程的学习。

如其字面意,本手册是一本简明扼要学习Fortran基础知识的手册。

本手册所有Fortran代码均基于Fortran95版。

本手册适合两类人群:1.有其他程序语言基础,对Fortran感兴趣的人。2.有Fortran基础,想要巩固的人。

话不多说,下面开始。

第一章,开始

注释

Fortran使用!表示单行注释,其没有多行注释。

合理的书写注释是优秀的程序员的好习惯。

Hello World

学习编程从HelloWorld的心态做起。

扫描二维码关注公众号,回复: 4489621 查看本文章
    program HelloWorld
    	!这是一个Fortran的HelloWorld的程序。
        print *, 'Hello World'
    end program HelloWorld

所有程序为了更好的流程控制和阅读,必有语句结束符,表述一个语句的结束;必有区块标识符,表示一个区块的位置。

语言 语句结束符 区块标识符
C语言体系 {}
Python 一行书写且只书写一个语句 缩进来标识区块
Fotran 一行只书写一个语句 KeyWord (内容) End Keyword

三者各自输出1,10到屏幕上的代码如下。

C语言版。

int main()
{
    int i;
    for(i = 1; i <= 10; i ++)
    {
        printf("%d ", i);
    }
	return 0;
}

Python版。

Fotran版。

program Print1to10
    integer i
    do i=1,10
        print *,i
    end do
end program Print1to10

本代码中包括的两个区块,外层program…end program,内层do…end do。

请记住在Fortran中表示一个区块时。凡开始必有结束。将do…end do一起书写,再补全其中的内容是个好习惯。

帮助网址

前人栽树后人乘凉。你可能会需要这些帮助网址。

Fcode编译器下载,一些Fortran源代码,专门讨论Fortran的网址。

易百教程|Fortran学习:详细的分条目的Fortran手册。

请善用搜索引擎。

第二章,变量

声明规则

变量声明的如下:

Kind(占用字节长) 变量名1,变量名2…

或者是

Kind*占用字节长 变量名1 ,变量名2…

例如

integer(4) i,j
!声明了一个长度为4个字节的整数i,j
real*8 income,outcome
character*13 name
!声明了一个可以存储十三个字节字符信息的字符串name

添加::表示允许后续变量在声明时同时初始化,当然也可不初始化。

形如:

Kind(占用字节长) :: 变量名1=初值,变量名2,变量…

logical::istrue=.false.
!声明了一个布尔型变量istrue,初始值为.false.
complex::a=(1,1.5),b=(3,3.5),ab
!声明了复数a,b和ab,a,b赋予了初始值。

变量类型

(主要,次要类型是我为了便于大家理解而总结的,并非官方承认的)

主要类型 符号 备注
整数 integer(不能缩写为int) integer不给字节长时默认长为4。可接受的长度为1,2,4,8。
实数 real real不给字节长时默认长为4。可接受的长度为4,8。 也可用,double precision替代real*8。
字符串 character 可接受长度为所有自然数。若长度为0则始终为空串。其必须使用” “或‘ ’将内容包起来。如”中国“。ASCII码占用一个字节,中文占用两到三个字节。
次要类型 符号 备注
逻辑(布尔类型) logical 可接受长度为1,2,4,8。不建议给定给长度。 接受的取值只有.true.和.false.。注意不要拼错单词,两边点号不可省略。
复数 complex 两个real实数的有序对。a+bi书写成(a,b)。可接受的长度为4,8。

常数

常数书写与其他程序无异。

需要注意:

  1. 表示进制

    ±r#数字(r表示进制,36≥r≥2)

    例如下面的代码是合法的:

    print*,2#11110000
    print*,7#345543
    
  2. 科学计数法

    ±n.mE±S (其中n.m表示任意实数或整数,S为整数,数据精度为real*4)

    例如下面的代码是合法的:

    
    

    也可以将E替换成D表示real*8的科学记数法。(其他语言没有D的表示方法!)

    注意1.d0就等于1.0。

声明位置

Fortran的变量声明都只能在程序最开始进行。

例如这样的代码是错误的:

program GetSforCircle
    print*,"请输入圆的半径"
    integer r
    read*,r  !从外部读取一个数字到r
    real s
    s=3.14*r*r
    print*,s !输出s
end program GetSforCircle

应该将之改成如下形式:

program GetSforCircle
	!变量定义
    integer r
	real s
	!程序主体
    print*,"请输入圆的半径"
    read*,r  !从外部读取一个数字到r    
    s=3.14*r*r
    print*,s !输出s
end program GetSforCircle

所以我建议将Fortran的程序分为变量定义和程序主体两个部分,用注释分开。

命名风格

Fortran不区分大小写。如real和REAL是等效的。

你需要保证你的变量命名有意义。例如day,month,year就比a,b,c要好的多。

  1. 关键字和内部函数建议使用小写。如if,end,do

  2. 自定义长变量建议使用如下风格之一作为主要风格:

    PASCAL风格:首字母大写。如IsTrue,CityName,GetTheTime

    **驼峰风格:**单词之间以_区分。如X_Postion,City_Population

    同时也建议混搭使用匈牙利命名法来作为辅助:

    **匈牙利命名法:**前缀变量类型以便区分变量。如IntDistance,RealDistance

  3. 短变量和常用变量建议时候使用小写。如i,j,k作为循环变量。n,sum作为计数变量等。

隐式声明

隐式声明必须放在程序最开始位置。其可批量定义某些字母开头的变量的类型。

如:

implicit real(a-f),integer(x,y,z)
!a到f之间的变量隐式声明为real变量。x,y,z变量隐式声明为x,y,z变量。

则之后无需声明对应变量。a1或者all就都会被视为real类型变量。xmlKind,year,z_postion

Fortran预先定义了隐式声明的I-N规则。即在你不添加用户的隐式规则时,I到N开头的被当作整数变量。其他开头的被当作实数变量。

优先级如下:

显式声明>用户定义隐式规则>默认隐式I-N规则

复杂程序的编写不建议使用隐式定义。可将下列语句写在程序最开头,去除之。为了培养良好的编程习惯,建议不论什么情况下均使用此语句。

implicit none

批量赋值

用data关键字来给已经声明过的变量批量赋值。

data 变量1,变量2…/初始值1,初始值2…/

如下列代码:

integer a,b,c
data a,b,c/1,2,3/
integer x,y,z
data x,y,z/3*5/!m*n:重复m个n

第三章,计算和运算函数

运算符

如表:

符号 备注
±*/ 同其他程序语言。整数间用除法结果保留到整数。
** 乘方。
= 赋值。

运算函数

函数名 备注
mod(x,y) 求x除以y的余数
sin(),cos(),tan(),asin(),acos(),atan() 以弧度为单位求对应数值。只接受real变量作为参数。
abs(),exp(),log(),log10(),sqrt() 求绝对值,e为底的乘方,e为底的对数,10为底的对数,开方。只接受real变量作为参数。
max(x1,x2…),min(x1,x2…) 求一串数中的最大值和最小值。
int(),real(),char(),ichar() 类型转换函数。char()将整数转为ASCII码对应字符。ichar相反。
sizeof() 获得对应变量的字节长度。

上述函数,很多语言通用。保持一个基本的映像,不会使用或未列到的搜索即可。

运算优先级

与其他语言无异。多用括号。遇到疑惑处搜索即可。

字符串运算

即字符串处理。Fortran只在字符串内部区分大小写。

符号或函数 备注
len() 获得字符串的长度。
字符串1//字符串2 连接两个字符串
字符串切片charatername(n:m) 如string=”我爱中华“,则name(2:4)表示”爱中华“。第一个下标从1开始。其中1≤n≤m≤len()

请务必注意字符串赋值。多余部分将被直接丢弃。不足部分以空格补齐。如:

character*4 ch1,ch2*1,ch3 !可以用这种方法来表示长度规定中的特例。
ch1='hello'
ch2=ch1
ch3='my'

执行后,ch1=‘hell’,ch2=‘h’,ch3='my '(my后接两个空格)

这很令人恼火。其他高级语言吸取Fortran教训后都规避了这一点,使用了引用变量达到任意扩充string的目的。

类型转换

Fortran无隐式转换。例如因为sin()只可以接受real类型的变量。所以直接写sin(1)是错误的。而写sin(1.0)或者sin(1.d0)却是正确的。

显式转换使用运算函数即可实现。

字符类型和数字类型之间的转换见第四章。

第四章,输入输出

简单程序=输入输出+计算。

输入输出函数

类型 格式 备注
默认输出 print *,等待输出的信息 始终输出到默认设备—控制台。等待输入的信息彼此之间以逗号分隔。*处可填写输出格式。不填写则按照默认格式。
默认输入 read *,等待接受输入的信息 始终从控制台读取信息。与print相反。
输出 write(*,*) 等待输出的信息 第一个*指示输出到的位置。不填写则默认输出到控制台。第二个*号指定格式。其他与print同。
读入 read(*,*) 等待接受输入的信息 第一个*指示读取信息的位置。不填写则默认从控制台读取信息。第二个*号指定格式。其他与read同。

示例:从控制台输入输出

program CreatePerson 
	implicit none
	!变量定义
	character*4 name
    integer year
	real height	
	!程序主体
    print*,"请为你的小人起一个名字" 	!输出到默认设备——控制台,没有指定输出格式。
    read*,name  	!执行此语时控制台等待输入。按下确定后继续。从控制台读取一个字符串到name。 
    print*,"请为你的",name,"确定一个年龄和身高"  	!等待输出的信息以空格分开
    read*,year,height	
    print*,name,"小人",year,"岁了,他的身高是",height
end program CreatePerson 

		1540617735116

图-1

默认输出因为没有指定格式。故而输出结果不够美观。使用格符就可以避免这点。

格式符

以print*,输出表为例。*可以被格式语句替代。

格式语句形式如下:

“(第一个变量的格式,第二个变量的格式…)”

例如:

print,"(F3.2)",1.333333

输出结果为:1.00

各格式符说明如下:

r为重复系数,不填为1。w为字符宽度,小数点算一位。[]中的表示可选参数。

类型 样式 说明
整数 rIw
小数 rFw.d d为小数部分宽d
指数

我们为上述代码增加输出格式。

program CreatePerson 
	implicit none
	!变量定义
	character*4 name
    integer year
	real height	
	!程序主体
    print*,"请为你的小人起一个名字" 	
    read*,name  	 
    print*,"请为你的",name,"确定一个年龄和身高"  	
    read*,year,height	
    print'(a4,a2,i3,a8,f5)',name,"小人",year,"岁了,他的身高是",height 
end program CreatePerson 

1540618445525

​ 图-2

猜你喜欢

转载自blog.csdn.net/qq_40938169/article/details/83445766