Fortran程序总结.docx
《Fortran程序总结.docx》由会员分享,可在线阅读,更多相关《Fortran程序总结.docx(24页珍藏版)》请在冰豆网上搜索。
Fortran程序总结
1.行的书写(行的长度、分行、续行)
一行可以是0~132个字符,空格有意义,
语句最长不超过2640个字符
一行可以有多个语句,用“;”分隔
一个语句可分行写,读行标记为&(放在尾部),但如为关键字,首尾均加&。
最多可有511个续行。
2.说明语句必须出现在可执行语句之前,格式说明语句(FORMAT语句)除外。
3.注释标志符:
自由格式:
!
固定格式:
C*
语句分隔符:
分号;(仅自由格式可以使用)
续行符:
自由格式:
&
申明标号:
1到5位无符号整数
空格:
关键字、变量、常量内部不能用空格,但相邻两者之间须用空格
4.信息处理的分类:
数值处理和信息处理
现代计算机工作原理:
程序存储和程序控制(冯·诺依曼)
1、运算器——算术运算、逻辑运算
2、控制器——根据指令控制计算机工作
运算器、控制器和寄存器称为中央处理器CPU
3、I/O设备——提供数据传输服务
4、总线——数据传输的公共通道
1.机器语言:
二进制代码形式,可以被计算机直接执行,不可移植
2.汇编语言:
用助记符来代替机器指令,容易记忆,不可移植
3.高级语言:
接近自然语言(英语)的程序设计语言,又称算法语言,易学、易用、易维护,可移植性好例:
FORTRAN、BASIC、PASCAL、C、LISP、PROLOG等
5.FORTRAN90程序是一种分块结构,由若干个程序单元块组成:
主程序、外部子程序、模块、块数据单元无论是主程序单元,还是子程序单元,都是独立的程序单位,应该独立编写,它们的形式相似。
非语句行:
注释语句:
!
后的所有字符都被编译器忽略。
可独占一行,也可在其它语句之后,空行为注释行(固定格式用C和*)
6.常量的定义:
常量是程序执行过程中不能变化的量。
基本数据类型有五种:
整型、实型、复型、字符型和逻辑型
前三种属于数值类型,后两种为非数值类型,主要用于文字处理和控制。
FORTRAN90通过KIND值确定整数的存储开销、最大位数和取值范围,如表所示。
缺省KIND值则取默认值4。
KIND值字节数二进位数取值范围
118-128~127
2216-32768~32767
4432-2147483648~2147483647
格式:
SELECTEND_INT_KIND(N):
功能:
返回范围在-10N~10N的整数的kind-Value
在FORTRAN90中,也可以表示二进制、八进制、十六进制形式的无符号整数。
其形式如下:
二进制数:
B’101101’或B”101101”
八进制数:
O’76210’
十六进制数:
Z’1FA2’
实型常量
指数形式
⑴数字部分:
小数形式实数或整数
⑵指数部分:
只能为整数错例:
4E5.6
⑶数字部分不能丢;例:
10-4:
E-4(错)1E-4(正确)
⑷以标准化形式(规格化指数)输出(<1或>=1,此处分为两类)
1。
数字部分的值小于1,且小数点后的第一位数字非0
例:
0.743643E-12(正确)21.835E-12(错)
2。
数字部分有且仅有一位非零的整数。
例:
7.43643E-12(正确)0.21835E-12(错)
一般实数范围:
-1038~+1038,有效位7~8位也有的系统允许数的范围更大,可以超过10100。
上溢:
overflow下溢:
当0处理
为了能得到理想的范围和有效数字,要求说明种别类型参数值。
(书上有误)
例:
INTEGER,PARAMETER:
:
long=SELECTED_REAL_KIND(8,88)
则符号常数long提供了至少8位精度,以及-1088~+1088的值的范围。
以此说明的实型常量:
1、PRECISION(4.37_long)精度至少为8
2、RANGE(4.37_long)范围至少88次冪
常用实数一般分为两种:
real(4)单精度(默认)
real(8)双精度
实数种别为8时常量的表示(双精度数)
有效位:
15位;数字部分D±指数
例:
1.2D2
字符常量长度:
字符串内字符的个数空格算一个,起止界不算,长度可为0。
(空串’’或"")
用于标识一个程序成分,例如符号常量、变量、派生类型等。
对于名字有下列要求:
1.名字的长度不能超过31个字符
2.名字的组成成分可以是字母、数字和下划线
3.名字的第一个字符必须是字母
4.在名字中不能出现空格
提倡使用具有一定含义的名字,提高程序的清晰度和可读性。
变量字母、数字、下划线组成
字母开头
长度1-31个
Fortran90关于变量说明的新功能:
1.在变量说明的同时,可以给变量赋初值。
INTEGER:
:
I=5,J=126
REAL:
:
X=7.2,Z,W=774.2
2.在说明变量的同时也可说明其种别
REAL(KIND=4):
:
X,Y或REAL(4):
:
X,Y
3.在说明变量的同时,还可说明变量的属性INTEGER,PARAMETER:
:
I=5,J=123
REAL,DIMENSION(1:
10):
:
A
程序单元概念
程序单元是FORTRAN语言的基本成分。
程序单元可以是主程序、子程序、模块或块数据程序单元。
子程序可以是函数子程序或子例行子程序。
模块包含的说明是对其它的程序单元形成可访问性。
块数据单元用来对有名公用区中的数据对象赋初值。
(F90中不提倡使用)
•主程序是不包含SUBROUTINE、FUNCTION、MODULE或BLOCKDATA语句作为其第一条语句的程序单元。
主程序其他限制
•主程序的可执行部分不能包含有RETURN语句或者ENTRY语句。
•程序名对可执行程序是全局的,而且不得于该可执行程序中的任何其它程序单元名、外部过程名或公用块名相同,也不得于主程序内的任何局部名相同。
•在主程序的作用范围内的说明不得包含OPTIONAL语句、INTENT语句、PUBLIC语句或它们的等价属性,在主程序内SAVE语句不起作用。
•主程序内的任何内部过程的定义必须跟在CONTAINS语句之后。
•子程序是可以完成某一独立算法或功能的程序单元,但它功能的具体体现要通过主程序(或子程序)的调用来实现。
•按子程序与主程序的位置关系分为内部过程和外部过程。
•内部过程可以出现在主程序、外部过程或模块内。
•模块也是一种在程序单元之外独立编写的程序单元。
它有独特的形式,即模块程序单元内没有可执行语句,除了说明语句外,最多包含内部过程。
模块的主要作用是供其它程序单元引用。
程序单元引用模块,实际是将模块内的全部语句复制到本程序单元。
因此模块起共享及复制的作用。
块数据程序单元对有名公用块内的数据对象提供初值。
•支持程序的最基本的语句主要有四种:
类型说明语句、赋值语句、输入语句、输出语句。
•整型数据运算速度快,在机内存储没有误差,但能表达的值的范围较小;
实型数据能表示小数、分数及不同的精度,表达的值的范围大,但数的外部表示和机器存储会有误差。
例,10.2,在机内表示可能为10.999998。
使用实数时,尽量避免作相等或不相等的比较例:
A是实型变量,对其与10.2作相等与否比较,不能写成:
IF(A==10.2)PRINT*,A应改写为:
IF(ABS(A-10.2)<1.0E-6)PRINT*,A
•有关种别的函数
•KIND(X)
•SELECTED_INT_KIND(N)
•SELECTED_REAL_KIND(N,M)
•测试标准种别:
•KIND(0)4(整型)
•KIND(0.0)4(实型)
•KIND(.FALSE.)4(逻辑类型)
•KIND(‘A’)1(字符类型)
•各种基本类型种别可取值
•INTEGER:
1,2,4(默认)
•REAL:
4(单精度,默认),8(双精度)
•LOGICAL:
1,2,4(默认)
•COMPLEX:
4(单精度,默认),8(双精度)
•CHARACTER:
1
•PARAMETER属性
•
(1)功能:
用一个符号代表一个常量,称为符号常量(常数)
•
(2)写法:
Real,Parameter:
:
G=9.8&&说明类型时赋值
•(3)位置:
位于可执行语句之前
•使用规则
•①程序中不得改变其值
•②与普通常量的区别:
不作语句标号和FORMAT中重复系数
•③类型:
一般采用I-N规则,否则,需先定义其类型
•例:
parameter(n=5)
**
*/
+-(正,负,加,减)
3.5+2*A/B+V**2
④②③⑤①
FORTRAN90配置的函数称为内在函数。
内在函数分为三种:
•基本函数
•转换函数
•查询函数
•⑴三角函数单位为弧度sinDcosDTAND可以为度(F90)
•
(2)某些函数参数只能为实型如:
log(2.0)(loG
(2)错)
•(4)自变量可以是有值的常量、变量、表达式例:
ABS(B**2+SIN(A+B))
•INT(X,KIND):
将X值转换为整型,以KIND的值作为种别参数
•REAL(X,KIND):
将X值转换为实型,以KIND的值作为种别参数
•CMPLX(X,Y,KIND):
将X,Y转换为复型,以KIND的值作为种别参数
•对于连续的乘方运算,采用先右后左的方式
•例:
3**2**3,先计算2**3=8,再进行3**8=6561
•运算对象类型相同时,运算结果的类型为同一类型注意有效位数的限制引起的误差
注意:
5/2=21/2=0!
!
•计算机存储数据的有效位数是有限的
•一般为十进制数的6至7位
•例:
1.0/3.0的结果在内存中不是0.3333333333333…,而是0.3333333
•注意溢出
•计算结果超出了存储单元所允许的数的范围
•程序中的表达式,要避免两个很大的数相乘、或一个很大的数除以一个很小的数
赋值号左边只能是变量名(或数组元素名、数组名),不能是表达式类型要求
■逻辑型、字符型的赋值语句要求“=”两边类型相同
■数值型赋值,不区别整型、实型和复型,允许两边的数值类型不同
执行赋值语句后,把e的值转化为V的类型后再赋值给V
V是整型、e是实型,把尾数丢掉化为整型后赋值
4、种别方面
■字符型要求种别相同
■其余类型的e、V种别允许不同
执行赋值语句后,e的值的种别转化为V的种别后再赋值
READ中的输入表的内容可以是:
变量名,数组名,数组片段名,结构成员名,隐循环表(隐DO表),不能是表达式
变量名,数组名,数组片段名,结构成员名,隐循环表(隐DO表),常数,函数和表达式。
输入的数据必须是常数,不能是变量和表达式
如输入2+1,则出错。
出错信息:
run-timeerrorF6601:
Read(con)-InvalidInteger
含义:
输入了无效的整数
4.输入数据个数:
1)不得少于变量的个数;
2)可分行输入;
3)多余的数据不起作用
空格可以多个,/表示输入数据结束,后面的数据被取消,没有输入数据的变量值为原值;
Read*,A,B,C
输入:
2,1/3
结果:
A=2B=1C=0
6、如果几个连续变量需要赋同一个值,可以使用重复因子r,即r*[c]:
r为重复数
4*0.5,2*3,2*’AB’,3*(1.0,-1.0)
表控输出的格式
类型:
复型:
带()输出
逻辑型:
T,F输出一个字符
字符型:
‘’丢失,采用左对齐输出
一行显示不下,数据自动换行输出
多个PRINT语句:
每个开始输出一个新的记录
riw输出
1.数字在指定的区域内右端对齐,不足w则左边补空格。
2.负数的符号也包含在字段宽度内
3.如果应输出的列数超过了规定的字段宽度,则不输出有效数据,以w个*填充。
Riw输入
543□5430
□210
210
23456
2345
1)实数的输入(三种方式)
READ(*,’(F4.1,2F10.6)’)A,B,C
输入:
□□12□□4567□□□□□□-83527□□
则a=1.2;b=45.67;c=-8.3527
!
!
不带小数点
输入不带小数点,由则编辑符指定位置自动加上小数点。
按w截取数据,由d决定小数点的位置,按右对齐,空格当0
READ(*,’(F4.1,2F10.6)’)A,B,C
□1.2□□□□□45.67□□□-8.3527
!
!
带小数点。
输入的数据本身带小数点,如果编辑符中规定的小数点位置和数据本身的小数点位置有矛盾,按“自带小数点优先”原则,d不起作用,小数点记入w中
(3)READ(*,’(F4.1,2F10.6)’)A,B,C
1.2,45.67,-8.3527(表控格式)
用自由格式,逗号分隔,但每个数连同后随逗号必须<=w,否则出错。
d可以为零但不能省略
X=25.6Y=-378.456Z=873.2
PRINT’(F5.1,2F8.2)’,X,Y,Z
□25.6□-378.46□□873.20
w包括数符和小数点两位
若数据小于w位,则左边补空格
输出值时舍入,而不是截断
如果是科学计数法则转换小数形式
REAL*4:
:
G,H,E,R
G=12345.678;H=12345678.;E=-4.56E+1;R=-365.
WRITE(*,'(F8.2)')G,H,E,R
WRITE(*,'(4F10.1)')G,H,E,R
END
结果:
12345.68!
!
舍入,取2位小数
********!
!
所给描述符整数位不够
-45.60!
!
输出时转换为定点数形式
-365.00!
!
输出时小数点占宽度
□□123456.712345678.0□□□□□-45.6□□□□-365.0
说明:
优点,输入时准备数据方便,和数学中实数的写法相同,输出时,数据便于阅读。
缺点,必须预先知道输出数据的范围。
另容易产生“大数印错”、“小数印丢”。
大数印错”、“小数印丢”
X=123567890.876543
Y=0.000001245
WRITE(*,’(1X,F15.6,F15.2)’)X,Y
输出结果:
***************□□□□□□□□□□□0.00
15列15列
XY
E编辑符
Ew.d[Ee]
格式:
数符+0+小数点+小数部分+E+符号+指数部分2位
3d4
指数部分宽度固定4列,w>=d+3+4
优点:
不必事先估计数的大小,能容纳任意大小的数据。
Ew.dEee—指定指数的宽度
例:
用E格式输出数据
X=-84.31Y=3.141592Z=0.0187
WRITE(*,‘(E10.3,E13.6,E15.6)’)X,Y,Z
结果-0.843E+02□0.314159E+01□□□0.187000E-01
规则:
1.w>d+7数据右对齐,左边用空格填满w位
若w2.尾数部分正号省,负号则打印,记入w内
3.尾数位数>d四舍五入取d位
尾数位数注意:
一般格式E16.77+7+2(2个空格,以便阅读)
改写该格式为:
X=-84.31Y=3.141592Z=0.0187
WRITE(*,200)X,Y,Z
200FORMAT(E10.3,E13.6,E15.6)
或
CHARACTER(30):
:
MYLIST
字符型的赋值
MYLIST=‘(E10.3,E13.6,E15.6)’
WRITE(*,MYLIST)X,Y,Z
G编辑符
功能:
根据输出实数大小决定用F或E格式输出。
较大或较小,自动按E格式
Gw.d
条件:
1.abs(A)<0.12.abs(A)>10d
使用E格式输入输出
条件:
10d>abs(A)>=0.1
使用F格式输入输出
A=758321.6G14.7ABS(A)<107用F格式
□□758321.6□□□□
A=75.83216E+06ABS(A)>107用E格式
□0.7583216E+08
注意:
采用F格式,d为全部数字的位数
优先满足整数位
双精度数的输入输出
格式:
Dw.d
数符+0+小数点+小数部分+D+符号+指数部分2位
3d4
方法同E格式
复型数据是用两个实型编辑符(例如,用2Fw.d或‘(Fw.d,Fw.d)’或2Ew.d[Ee]来分别描述该复型的实数部分与虚数部分的。
如:
COMPLEX:
:
X
X=(2.8,4.6)
PRINT'(2F4.1)',X
输出结果为:
□2.8□4.6复型的输出没有括号
复型编辑
rLw
功能:
逻辑值的输入输出
规则:
输出一个字母,在字段最右段,前面补空格
输入时按宽度读取,以第一个字母作为逻辑值
A用来编辑字符型变量,它不关心该字符串的长短如何。
例:
CHARATER*5A,B,C
READ(*,’(A,A,A)’)A,B,C
WRITE(*,’(A,2X,A,2X,A)’)A,B,C
END
输入:
ABC□DBASICFORMAT
对于字符型数据的输入:
1、在表控格式输入的时候,输入的字符串可以加上撇号,也可省略,撇号不起作用
2、在有格式输入的时候,输入的字符串的时候不需要加上撇号,如果输入带撇号,则撇号算入W宽度,
H编辑符:
描述字符串
nH<字符串>
注意:
1.N必定等于字符串长度,否则编译出错
2.字符串中空格有意义
X=45.7
Y=289.7
WRITE(*,100)X,Y
100FORMAT(2HX=,F5.1,4H□□Y=,F6.2)
END
结果:
X=□45.7□□Y=289.70
也可FORMAT(‘X=’,F5.1,‘□□Y=’,F6.2)
斜杠编辑描述符
作用:
结束本记录的输出并开始下一个记录的输出
WRITE(*,’(5HABCDE,/,5HBCDEF,/,1X,5HCDEFG)’)
结果如下所示:
ABCDE
BCDEF
□CDEFG
注意:
1.如两个连续斜杠,在输完前面记录后,空一行(或者用print*代替)再输出
2.如在编辑符的最后出现一个斜杠在输出完记录后,再输出一个空行
相同的编辑符串连续出现时,可简化为一串,用括号括起,前置重复系数。
例:
PRINT‘(1X,F6.1,2I4,F6.1,2I4,E10.3)’,A,B,C,D,E,F,G
可写为:
PRINT‘(1X,2(F6.1,2I4),E10.3)’,A,B,C,D,E,F,G
编辑符个数和变量个数应相等,如编辑符个数多余变量个数,则多余编辑符不起作用;如编辑符个数少于变量个数,则重复使用格式说明,每重复一次产生一个新纪录。
例:
PRINT‘(1X,I4,F5.1,E10.3)’,A,B,C,D,E,F,G,H
则按如下顺序打印各项数据:
ABC
DEF
GH
例:
WRITE(*,100)I
100FORMAT(‘I=‘)输出I=,永不停止,原因是漏写了I4编辑符
带控制信息的输出语句(P51)
WRITE(UNIT=6,FMT=‘(1X,2F8.2)’,IOS4TAT=M[这里就是一个指代没有特别的意义])X,Y
各部分与输入语句中基本相同。
输入输出语句
●表控格式
●自定格式(编辑符的使用:
I、F、E、G、A、L、X、H等)
●带控制信息表
每个关系表达式中的关系运算符只准出现1次,运算符两侧都是表达式;
错例:
2b)2、运算对象:
关系运算符两边的运算对象类型应相容:
错例:
A==.TRUE.2<‘A’
❑复型:
只能进行==、/=。
不能比较大小
❑字符型:
可以进行各种关系运算
❑实型量==或/=要小心使用
一般要改写:
A==B改写为ABS(A-B)<1E-6
A/=B改写为ABS(A-B)>=1E-6
❑.NOT.a:
求反运算,
❑a.AND.b:
a与b同时为真,表达式值才为真
❑a.OR.b:
a与b有一个为真,表达式值就为真
❑a.EQV.b:
a与b值相等,表达式值为真
❑a.NEQV.b:
a与b值不相等,表达式值为真
❑.NOT.、.AND.、.OR.、.EQV.、.NEQV.
高低
❑两个逻辑运算符不能直接相邻,但.NOT.除外:
.AND..NOT.B
混合表达式中运算符优先顺序:
(1)圆括号;
(2)算术运算符;
(3)关系运算符;
(4)逻辑运算符。
括号()1
算术运算**2
*,/3
+,-4
关系运算>,>=,<,<=,==,/=5
逻辑运算.NOT.6
.AND.7
.OR.8
.EQV.,.NEQV.9
注意顺序(优先级)
1、表控格式I/O
须先定义数据类型,再I/O
例:
LOGICAL:
:
L1,L2
READ(*,*)L1,L2
WRITE(*,*)L1,L2
输入时:
.TRUE.,.FALSE.
或:
T,F表控格式并不需要
输出:
?
?
?
T?
?
?
F
!
!
仅输出一个字符,T或F,左右没有点“.”,字段宽度由具体的计算机系统规定
格式I/O
例:
LOGICAL:
:
L1,L2
READ‘(2L2)’,L1,L2
PRINT’(1X,L4,2X,L4)’,L1,L2
运行时输入:
?
T?
F
输出:
?
?
?
T?
?
?
F
L2表示逻辑I/O,
字段宽度为2
右边通常为一条且只一条可执行语句。
错例:
IF(A
2.不能为以下语句:
END、另一个逻辑IF、块IF、ELSIF、ENDIF、DO
错例:
IF(X<2)END
3.常应用于简单的条件赋值或条件转移(在循环结构中)
4、不论条件真假都执行IF的下一个语句
⏹假设IF结构名为FIRST,则入口语句为:
FIRST:
IF(e1)THEN
⏹出口语句为:
ENDIFFIRST
注意:
⏹入口、出口写结构名时,其结构名应该一致。
⏹IF结构名与入口语句间要用冒号分隔,出口语句(ENDIF语句)与结构名之间要空1格,不能有冒号。
⏹ELSEIF语句与ELSE语句后可以写结构名,也可以不写,如果写,其结构名一定要与入口语句处的结构名一致。
⏹SELECTCASE(情况表达式)
情况表达式:
❑整型变量、逻辑变量、字符型变量或相应的表达式
❑不能是实型或复型表达式
⏹表达式列表(情况选择器):
❑只能是常量,不能为变量,可有多条语句;
❑类型与情况表达式类型应一致,尤其字符型时种别参数必须一致,但长度可以不同;
❑,(逗号)分隔符表示分隔单个值的列表。
例:
case(