1.输入输出及声明
1.1 Fortran程序的主要结构
程序通常以program描述来开头,后接定义的程序名(可以省略,但建议使用并取有意义的名称,便于阅读),最后以end描述结尾,可以有三种方式:end、end program与end program main。
程序基本结构:
Program main
…….
Stop
End
1.2 输出命令(write、print)
1.write命令用法
格式:write(UNIT=6,FMT=*)a
UNIT:输出位置(*表示默认值,等同于6,代表屏幕)
FMT:输出格式(*表示不限定格式)
write(*,*)a !简写方法
注意:
(1)每次执行一次write命令,会自动换到下一行。
(2)用双引号或单引号来封装要输出的字符串。
(3)如果要输出双引号,则连续使用两个双引号。
(4)可以同时输出多个数据,中间用逗号隔开。
2.print命令用法
格式:print*,a
Print命令的用法和write大致相同,但是print后面不使用括号,而且只有一个星号。这个星号的意义是不限定输出格式,print相比于write的不同之处在于少了赋值输出位置的能力,print只能针对屏幕输出使用。
1.3 输入命令(read)
格式:read(unit=5,fmt=*)a !严谨的写法
Unit:输入设备(*表示默认值,等同于5,代表键盘)
Fmt:输入格式(*表示不赋值输出格式)
同一行程序代码一次读入多个数值
Read(*,*)a,b,c
输入时要注意对应的变量类型,若输入内容出现空格,输入的字符串会被截断,只能得到第一个字符串的内容,解决方法是用引号封装字符串,或者使用格式化输入输出。
1.4基本数据类型
1.整数类型(integer)
格式:integer a (或integer:: a)
可以同时声明多个变量,中间用逗号隔开。声明了一个整数变量,如果赋值有小数时会忽略不计。
整型又分长整型与短整型两种,下面是长整型的声明:
Integer(kind=4) a
Integer*4 b
Integer(4)c
下面是短整型的声明:
Integer(kind=2)a
Integer*2 b
Integer(2)c
2.浮点数(real)
格式:real a
不加上任何形容词时,通常会声明占用4字节的单精度浮点数,下面是单精度浮点数的声明:
Real(kind=4)a
Real*4 b
Real(4)c
下面是双精度浮点数的声明:
Real(kind=8)a
Real*8 b
Real(8)c
3.复数(complex)
格式:complex a
复数是由实部和虚部两部分组成,在fortran中保存复数的方法是用两个浮点数来保存,所以复数也可以分为单精度和双精度。单精度复数声明如下:
Complex(kind=4) a
Complex*4 b
Complex(4)c
双精度复数声明如下:
Complex(kind=8) a
Complex*8 b
Complex(8) c
要设置一个复数数值的方法如下:
a=(x,y) !x为实部,y为虚部,表示a=x+iy
4.字符及字符串(character)
格式:character a
声明时要求使用好几个字符,就是在声明字符串,声明方法如下:
Character(len=10) a
Character(10) b
Character*10 c
Character*(10) d
字符串类型除了直接设置之外,还可以改变字符串的某一部分,字符串可以一次只改变其中的几个字符。字符串也可以连接,连接方法是通过操作符“//”完成。
Fortran中有关字符串运行的函数:
Char(num):返回ASII字符表中数值num所代表的字符
Ichar(char):返回字符char的在ASCII字符表中的编号
Len(string):返回字符串string的声明长度
Len_trim(string):返回字符串string去除尾端空格后的实际长度
Trim(string):返回字符串string去除尾端空格后的字符串
5.逻辑变量(logical)
格式:logical a
它只用来保存两种数值:“真”或“假”
a=.true.
b=.false.
1.5 格式化输入输出(format)
格式化输入输出的目的就是吧数据经过“有计划”的版面设计显示出来。某些情况下要读取数据时,要设置恰当的输入格式。
例:write(*,“(1X,I5)”)a
- Iw[.m]:以w个字符宽度来输出整数,至少输出m个数字。
例:
(1)write(*,”(I5)”)100
表示以5个字符的长度来输出一个整数,输出结果前面会补2个空格。
1 | 0 | 0 |
(2)write(*,”(I3)”)1000
输出格式设置不足时,会输出*。
* | * | * |
(3)write(*,”(I5.3)”)10
以5个字符的长度来输出一个整数,至少输出3个数字,位数不足补0。
0 | 1 | 0 |
- Fw.d:以w个字符长来输出实数,小数部分占d个字符。
例:
(1)Write(*,”(F9.3)”)123.45
表示以9个字符长度来输出实数,小数部分占3个位数。
1 | 2 | 3 | . | 4 | 5 | 0 |
(2)write(*,”(F6.3)”)123.45
总长度减小数部分与小数点长度后,整数部分长度不足会输出*。
* | * | * | * | * | * |
(3)write(*,”(F9.1)”)123.45
以9个字符长度来输出实数,小数部分占1个位数。
1 | 2 | 3 | . | 4 |
3.Ew.d:用科学计数法,以w个字符长来输出实数,小数部分占d个字符长,指数部分最少输出e个数字。
例:
(1)write(*,”(E15.7)”)123.45
使用15个字符长度,小数部分占7位。总长度不足15位,前面补空格;小数部分不足7位,后面补0;指数 部分包括正负号与两位数字。
0 | . | 1 | 2 | 3 | 4 | 5 | 0 | 0 | E | + | 0 | 3 |
(2)write(*,”(E9.2E3)”)12.34
含空格共输出9个字符,其中2位小数,指数部分有三位数字。
0 | . | 1 | 2 | E | + | 0 | 0 | 2 |
4.Aw:以w个字符长来输出字符串
例:
(1)write(*,”(A10)”)“Hello”
使用10个字符长度输出字符串
H | e | l | l | o |
5.nX:输出位置像右移动n位(输出n个空格)
例:
(1)write(*,”(5X.I3)”)100
先填5个空格,再输出整数。
1 | 0 | 0 |
6.Lw:以w个字符长来输出T或F的真假值
例:
(1)write(*,”(L4)”).true.
使用4个字符长度输出逻辑变量
T |
7.Gw.d:以w个字符长来输出所有类型的数据,d不一定会使用,但不能省略。
8./:换行输出
例:
Write(*,”(I3//I3)”)10,10
结果得到三行输出,每一个“/”会换一行然后在该行继续输出。
输出结果:
1 | 0 | |
1 | 0 |
9.Tc:把输出的位置移动到本行的第c个字符
Write(*,”(T3,I3)”)100/write(*,”(10X,T3,I3)”)100
把输出位置移动到第3个字符/输出位置向右移动10个字符后,移动到第3个字符
输出结果:
1 | 0 | 0 |
10.可以重复地以同样的格式输出数据
例:
write(*,”(3(1X,F5.2))”)1.0,2.0,3.0
连续以3个1X,F5.2的格式来输出3个实数
1 | . | 0 | 0 | 2 | . | 0 | 0 | 3 | . | 0 | 0 |
11.可以放进要输出的字符串
例:Write(*,”(’3+4=’,I1)”)3+4、
1.6 implicit命令
变量并不一定要经过程序的声明才能使用,编译器会根据变量名称的第一个字母来自动决定这个变量的类型。第1个字母为I,J,K,L,M,N的变量会被视为整数类型,其他字母大多会被认为是实数。
可以使用IMPLICIT命令来设置“默认类型”
例:
设置以A,B,C开头的变量都视为整型数:
Implicit integer(A,B,C)
设置A到F及I,k开头的变量都视为整型数:
Implicit integer(A-F,I,K)
设置M到P开头的变量都视为实型数:
Implicit real(M-P)
Implicit none
关闭“默认类型”功能,所有变量必须进行声明,否则会出错。
Implicit命令必须放在program命令的下一行。
1.7常量的声明
程序中有些数据是永远固定、不会改变的常数。常数只能在声明时通过parameter来设置数值,而且只能设置一次。
例:
格式:
real,parameter::pi=3.1415926
或者
real pi
Parameter(pi=3.1415926)
1.8等价声明(equivalence)
把两个以上的变量,声明使用同一内存地址,就是“等价说明”。使用同一内存位置的变量,只要改变其中一个变量,只改变其中一个变量,就会同时改变其他变量的数值。
例:
Integer a,b
Equivalence(a,b) !a,b使用同一内存空间
优点:
节省内存:声明一些暂时使用的变量
精简代码:equivalence(array(1,1,5),a)
声明的位置应该放在程序代码的可执行命令之前,在程序代码开始出现数值计算和输入输出命令时,就不能再声明变量。
DATA也算声明的一部分
Program main
Implicit none
声明变量
可执行命令(赋值、计算、输入输出等)
End
1.9自定义数据类型
自定义数据类型:Fortran能够自由组合一些基本功能数据类型,创造出一个更复杂类型组合的功能“type”。
例:
Type::person !开始创造一个叫person的数据类型
Character(len=30)::name
Integer::age !记录年龄
Integer::length !记录身高
Integer::weight !记录体重
Character(len=80)::address !记录姓名
end type person !自定义数据类型结束
2.逻辑循环与逻辑运算
2.1 IF语句
流程控制:在程序执行中,视情况来选择是否要执行某一段程序代码。
IF语句:能够在程序执行当中自动选择转向,跳过某些程序模块来执行程序代码。
IF用法:
(1)一个IF模块(或语句)
例:
IF(逻辑判断式)THEN
……(逻辑成立时,才会执行这里面的程序代码;逻辑不成立时,会跳到END IF之后继续执行)
END IF
如果IF模块中只有一行程序代码时,可以把与这行代码写在同一行,并省略THEN 及END IF
IF(逻辑判断式)……..
(2)一个IF-ELSE模块
例:
IF(逻辑判断式)THEN
……(逻辑成立时,执行这一段程序代码)
ELSE
……(逻辑不成立时,则执行这一段程序代码)
END IF
(3)多个IF语句嵌套模块
例:
IF(……)THEN !第1层IF开始
IF(……)THEN !第2层IF开始
IF(……)THEN !第3层IF开始
Else IF(……)THEN
ELSE
END IF !第3层IF结束
END IF !第2层IF结束
END IF !第1层IF结束
(4)多重判断IF-ELSE IF模块
多重判断可以一次列出多个条件及多个程序模块,但是其中最多只有一个条件成立,即最多只有一个程序模块会执行。
例:
IF(条件1)then
……(条件1成立时,执行这个模块程序)
Else if(条件2)then
……(条件2成立时,执行这个模块程序)
Else if(条件3)then
……(条件3成立时,执行这个模块程序)
Else
……(每个条件都不成立时,才执行这个模块程序,此模块可省略)
End if
2.2逻辑运算符
(1)逻辑运算符:两个数字比大小
F90以上 | F77 | 说明 |
== | .EQ. | 判断是否“相等” |
/= | .NE. | 判断是否“不相等” |
> | .GT. | 判断是否“大于” |
>= | .GE. | 判断是否“大于或等于” |
< | .LT. | 判断是否“小于” |
<= | .LE. | 判断是否“小于或等于” |
(2)集合运算符:由两个或多个小的逻辑表达式组合成
.AND. | 交集,如果两边的表达式都成立,整个表达式就成立 |
.OR. | 并集,两边的表达式只要有一个成立,整个表达式就成立 |
.NOT. | 如果后面的表达式不成立,整个表达式就成立 |
.EQV. | 两边表达式的逻辑运算结果不同时,整个表达式就成立 |
.NEQV. | 两边表达式的逻辑运算结果不同时,整个表达式就成立 |
2.3 SELECT CASE 语句
Select case(变量) !放入所要判断的变量
Case(值1)
…… !变量等于值1时,执行此程序段
Case(值2)
…… !变量等于值2时,执行此程序段
Case(值n)
…… !变量等于值n时,执行此程序段
Case default
…… !变量不等于任何值时,执行此程序段
End select
CASE DEFAULT模块并不一定要出现,在case里的冒号前后放入两个数值时,代表这两个数字范围中的所有数值;还可以用逗号放入多个变量。
例:
Case(1) !变量=1时,会执行这个case中的程序模块
Case(1:5)!1<=变量<=5时,会执行这个case中的程序模块
使用select case来取代某些使用IF-ELSE IF的多重语句,会让程序代码看起来比较简洁。
Select case 有一些限制:
只能使用整数,字符和逻辑变量,不能使用浮点数和复数。每个case中所使用的数值必须是固定的常量,不能使用变量。
2.4 其他流程控制
1.goto命令
Goto命令提供给程序员一个任意跳跃到程序任意一行代码的能力,被跳过的代码则不会被执行。虽然这在某种情况下很方便,但是会影响代码的可读性,所以不太建议在程序中使用。
2.pause命令
程序执行到Pause时,会暂停执行,直到用户按下Enter键才会继续执行。这可以应用在当屏幕上要连续输出大量数据时,在适当的位置暂停程序,以便用户更好的阅读输出的内容。
3.continue命令
Continue命令没有什么实际的用途,它的功能
4.stop命令
终止程序。
3.循环
3.1 DO
格式:
Do counter=1,lines,1
……
End do
Counter是“计数器”,counter=1表示初始值为1,counter在使用之前需要先进行声明。
Lines是计数器的终止数值,counter<lines时会执行循环语句。
最后面的数值1代表counter变量的增量,每执行一次循环,counter就加1。
Do循环中,计数器的初值,循环终止值,以及循环增量值可以用常量或者变量来指定。
3.2 DO WHILE 循环
在循环次数未知但是循环条件已知的情况下,可以使用DO while 循环。
格式:
Do while(逻辑运算)
……
End do
3.3 循环的流程控制
1.cycle 命令
Cycle命令可以跳出本次循环,进行下一次循环,相当于c++中的continue。
2.exit 命令
Exit命令可以跳出当前循环,如果是循环嵌套的情况,则跳出的是exit语句所在的循环,面外层循环不会被其影响,相当于c++中的break。