Fortran简明自学手册
因为CSDN不支持对Fortran代码的高亮显示,这儿贴出
学习手册PDF版百度网盘的下载链接:
https://pan.baidu/s/1A_6N0TQERg2nrnxkh3UnGQ
Fortran即Formula Translation(公式翻译)。是世界上诞生最早的高级语言之一,其易读,好写,很适合科学计算,一诞生便很快统治了数值计算界。因此也不难理解为何Fortran中保留了一些特殊的基础类型,如虚数。过去学习Fortran也是一种风尚。很多科学界的前辈,往往就是从这门语言开始了对编程的学习。
如其字面意,本手册是一本简明扼要学习Fortran基础知识的手册。
本手册所有Fortran代码均基于Fortran95版。
本手册适合两类人群:1.有其他程序语言基础,对Fortran感兴趣的人。2.有Fortran基础,想要巩固的人。
话不多说,下面开始。
文章目录
- Fortran简明自学手册
- 第一章,开始
- 注释
- Hello World
- 帮助网址
- 第二章,变量
- 声明规则
- 变量类型
- 常数
- 声明位置
- 命名风格
- 隐式声明
- 批量赋值
- 第三章,计算和运算函数
- 运算符
- 运算函数
- 运算优先级
- 字符串运算
- 类型转换
- 第四章,输入输出
- 输入输出函数
- 示例:从控制台输入输出
- 格式符
第一章,开始
注释
Fortran使用!表示单行注释,其没有多行注释。
合理的书写注释是优秀的程序员的好习惯。
Hello World
学习编程从HelloWorld的心态做起。
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。 |
常数
常数书写与其他程序无异。
需要注意:
-
表示进制
±r#数字(r表示进制,36≥r≥2)
例如下面的代码是合法的:
print*,2#11110000 print*,7#345543
-
科学计数法
±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要好的多。
-
关键字和内部函数建议使用小写。如if,end,do
-
自定义长变量建议使用如下风格之一作为主要风格:
PASCAL风格:首字母大写。如IsTrue,CityName,GetTheTime
**驼峰风格:**单词之间以_区分。如X_Postion,City_Population
同时也建议混搭使用匈牙利命名法来作为辅助:
**匈牙利命名法:**前缀变量类型以便区分变量。如IntDistance,RealDistance
-
短变量和常用变量建议时候使用小写。如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
图-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
图-2
更多推荐
Fortran简明自学手册
发布评论