Fortran程序总结Word下载.docx
《Fortran程序总结Word下载.docx》由会员分享,可在线阅读,更多相关《Fortran程序总结Word下载.docx(24页珍藏版)》请在冰点文库上搜索。
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:
•COMPLEX:
•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
(4F10.1)'
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位
若w<
d+7则显示w个*,出错。
2.尾数部分正号省,负号则打印,记入w内
3.尾数位数>
d四舍五入取d位
尾数位数<
d其后用0补齐
一般格式E16.77+7+2(2个空格,以便阅读)
改写该格式为:
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位
方法同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次,运算符两侧都是表达式;
错例:
2<
X<
3(2.LT.X.LT.3)或(a>
b)<
c
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
输出:
F
L2表示逻辑I/O,
字段宽度为2
右边通常为一条且只一条可执行语句。
IF(A<
B)T=A;
A=B;
B=T
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(