Fortran程序总结
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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.常量的定义:常量是程序执行过程中不能变化的量。
基本数据类型有五种:整型、实型、复型、字符型和逻辑型
前三种属于数值类型,后两种为非数值类型,主要用于文字处理和控制。
FORTRAN 90通过KIND值确定整数的存储开销、最大位数和取值范围,如表所示。
缺省KIND 值则取默认值4。
KIND值字节数二进位数取值范围
1 1 8 -128~127
2 2 16 -32768~32767
4 4 32 -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或BLOCK DATA语句作为其第一条语句的程序单元。
主程序其他限制
•主程序的可执行部分不能包含有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(字符类型)
•
•
•各种基本类型种别可取值
•I NTEGER:1,2,4(默认)
•R EAL:4(单精度,默认),8(双精度)
•L OGICAL:1,2,4(默认)
•C OMPLEX:4(单精度,默认),8(双精度)
•C HARACTER:1
•PARAMETER 属性
•(1)功能:用一个符号代表一个常量,称为符号常量(常数)
•(2)写法:Real,Parameter ::G=9.8 &&说明类型时赋值
•(3)位置:位于可执行语句之前
•使用规则
•①程序中不得改变其值
•② 与普通常量的区别:不作语句标号和FORMAT中重复系数
•③ 类型:一般采用I-N规则,否则,需先定义其类型
•例:parameter(n=5)
•
**
* /
+-(正,负,加,减)
3.5+2*A/B+V**2
④②③⑤①
•
FORTRAN 90配置的函数称为内在函数。
内在函数分为三种:
•基本函数
•转换函数
•查询函数
•⑴三角函数单位为弧度sinD cosD TAND 可以为度(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=2 1/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-time error F6601:Read(con)-Invalid Integer 含义:输入了无效的整数
4.输入数据个数:
1)不得少于变量的个数;
2)可分行输入;
3)多余的数据不起作用
空格可以多个,/表示输入数据结束,后面的数据被取消,没有输入数据的变量值为原值;
Read*,A,B,C
输入:2,1/3
结果:A=2 B=1 C=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.6 Y=-378.456 Z=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列
X Y
E编辑符
Ew.d[Ee]
格式:数符+0+小数点+小数部分+E+符号+指数部分2位
3 d 4
指数部分宽度固定4列,w>=d+3+4
优点:不必事先估计数的大小,能容纳任意大小的数据。
Ew.dEe e—指定指数的宽度
例:用E格式输出数据
X=-84.31 Y=3.141592 Z=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.7 7+7+2(2个空格,以便阅读)
改写该格式为:
X=-84.31 Y=3.141592 Z=0.0187
WRITE(*,200)X,Y,Z
200 FORMAT(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.1 2.abs(A)>10d
使用E格式输入输出
条件:10d>abs(A)>=0.1
使用F格式输入输出
A=758321.6 G14.7 ABS(A)<107用F格式
□□758321.6□□□□
A=75.83216E+06 ABS(A)>107用E格式
□0.7583216E+08
注意:采用F格式,d为全部数字的位数
优先满足整数位
双精度数的输入输出
格式:
Dw.d
数符+0+小数点+小数部分+D+符号+指数部分2位
3 d 4
方法同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*5 A,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
100 FORMAT(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
则按如下顺序打印各项数据:
A B C
D E F
G H
例: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
输出: •••T•••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
⏹出口语句为:
END IF FIRST
注意:
⏹入口、出口写结构名时,其结构名应该一致。
⏹IF结构名与入口语句间要用冒号分隔,出口语句(ENDIF语句)与结构名之间要空1
格,不能有冒号。
⏹ELSEIF语句与ELSE语句后可以写结构名,也可以不写,如果写,其结构名一定要与
入口语句处的结构名一致。
⏹SELECT CASE(情况表达式)
情况表达式:
❑整型变量、逻辑变量、字符型变量或相应的表达式
❑不能是实型或复型表达式
⏹表达式列表(情况选择器):
❑只能是常量,不能为变量,可有多条语句;
❑类型与情况表达式类型应一致,尤其字符型时种别参数必须一致,但长度可以不同;
❑,(逗号)分隔符表示分隔单个值的列表。
例:case(3,5,7)值不能重复
❑:(冒号)分隔符表示值的范围,连续的值
◆例:case(5:10); case(‘i’:‘n’)
◆下界、上界可省略
❑Case default:最多出现一次
循环均由Do结构表示,其Do结构共有三种形式:
1.不带循环变量的DO结构
2.带循环变量的DO结构
3.Do WHILE循环结构
DO循环变量在循环体内不能赋以新值,但可以引用。
即循环变量在循环体中不能出现在赋值号的左边。
例:
DO I=3,6
I=I+1 !!错误
J=I+1;PRINT*,I
ENDDO 循环变量在循环体内不能被重新赋值,但在循环体外可以被重新赋值。
两个并列的DO循环可以使用相同的循环变量
DO I=1,10,2
…
ENDDO
I=20
…
DO I=1,5
…
ENDDO
循环可以不经ENDDO终止,但是不能从循环体外转入循环体内(GOTO)。
例,以下结构是非法的:
DO I=1,N
…
10: A=A+1
…
ENDDO
…
GOTO 10
循环正常退出时,v的值超过循环变量的终值;循环非正常退出时,v保持当前值。
输入M、N,求最大公约数分析:辗转相除法(欧几里德算法)PROGRAM GCD IMPLICIT NONE
INTEGER::M,N,R
PRINT*,'INPUT M,N:'
READ*,M,N
R=MOD(M,N)
DO WHILE (R/=0)
M=N
N=R
R=MOD(M,N)
ENDDO
PRINT*,'THE GCD IS',N
END
最小公倍数=M*N/最大公约数
循环嵌套中各层的循环控制变量不能同名;
3、执行到EXIT语句,没有指明结构名时,转到当前循环体外;若指定了结构名,则转出该结构名代表的循环体外;
4、可以从循环体内转到循环体外,但不允许从DO结构外转到DO结构内!
隐DO、显DO执行过程的区别输出一行
注意:分母不能为零!
1、一个Fortran90程序主程序单元个数:1个
2、子程序单元:0-n个
子程序单元不能独立存在,只能被主程序单元或被其它子程序单元调用,甚至可以递归调用(调用本身)
1、函数子程序
分为内部函数子程序
外部函数子程序
用于完成复杂的计算
返回一个或多个值
2、子例行子程序
分为内部子例行子程序
外部子例行子程序
用于完成复杂计算,返回一个或多个值,或用于其它数据处理
虚元表:子程序的所有输入,及除函数值之外的其他计算结果的输出。
虚元之间用逗号分隔,都要在说明语句中说明类型。
如果没有虚元,函数名后是一对空括号。
虚元的含义:编写子程序时没有具体值(调用时或调用结束后才获得数值),因此只是一个符号,表示输入、输出,名字可随便用户取。
说明部分应对程序体内一切变量、数组等实体(包括虚元)作出说明,同时还要说明函数结果变量名,但不可说明函数名。
2、执行部分中必须对函数结果名至少赋值一次。
●程序单位定义
●虚元表子程序所有输入和除结果名以外的输出
●结果名不能和函数名同名
●说明语句
●虚元表中的所有虚元、函数结果名;其它中间变量
●不能说明函数名
●执行语句
●完成子程序单位的所有功能
●至少有一次对结果名赋值
●程序单位结束语句
●END Function
●注意:实元与虚元一般必须在个数、次序、类型上保持一致;但实元与虚元名字可
以不同。
当虚元在模块中时,括号内就可以省略。
●4、函数子程序的调用是表达式形式。
●而子例子程序必须通过CALL语句来调用。
●CALL 子程序名(实元表)
●下例情形必须使用接口块
●1、实元是关键字变元
●2、实元是缺省的可选变元。
●3、一个外部函数使系统中的内在操作符扩展了原有的功能。
●4、外部过程扩展了赋值号的使用范围。
●5、用一个类属名调用过程。
●6、调用的外部过程是一个函数,且函数结果是一个数组;或函数结果值是一个字
符型,且长度不是常数,也不是假定长度(*);或被调用过程中的虚元是一个假定形状数组、一个指针变量、一个目标变量。
●一般原则:实元与虚元个数相等,类型一致,按位置结合
●灵活原则关键字变元、可选择变元、虚元改名
当部分实元用关键字调用子程序时,第一个关键字变元前面的所有实元都必须与相应的虚元一一对应,一旦使用一个关键字,其后面的变元也必须使用关键字变元。
可选择变元
调用时可根据实际需要,只对虚元表中部分虚元作虚实结合(即虚元可无对应的实元)。
虚元必须在过程中被说明成是可选择的。
即要求它具有OPTIONAL属性。
OPTIONAL属性:若一个虚元的类型说明语句中有该属性,便是可选的,没有该属性的是必选变元。
PRESENT(X)函数:用来检查虚元X是否在程序执行时结合到对应实元,有对应实元则返回为“真”。
虚过程:虚元是一个过程名,对应的实元可以是内在函数或外部过程。
1、如果实元为内在函数: 主调程序中用INTRINSIC属性说明。
(属性见课本P38)
2、如果实元为外部过程:主调程序中用EXTERNAL属性或接口块说明,以便让编译系统清楚该实元不是一般变量。
3、虚实过程的结合规则是:等价
虚过程的使用增加了程序的功能,使程序更灵活!
各程序单位共享信息的途径:①虚实结合②模块单位
功能:提供共享常量、变量、类型定义和过程;即公用的信息可放入模块单位。
模块(1)模块应先定义,
(2)模块不给其它单位调用,而用USE语句引用
(3)模块中无可执行语句
可以对模块内说明的变量、派生类型及其成员的使用范围进行限制。
加PRIVATE(专用)属性,模块以外的程序单元不
能使用。
加PUBLIC(公用)属性。
外部过程:未包含在主程序单元(或过程、模块)中的过程。
外部过程独立成为一个程序单元,与主程序单元分别编译。
内部过程:写在主程序单元(或过程、模块)之内,作为主程序(或某一过程、某一模块)内包含的一个过程。
内部过程与外部过程的区别:1)内部过程通常没有说明语句,使用的变量等实体的说明应统一放在包含它的程序单元的说明部分。
2)内部过程一般没有虚元。
主调程序调用时也不需要虚实结合。
变量可以直接使用。
调用过程名也只要简单的写一个过程名。
在一些特殊场合,内部过程也可保留自己单独说明的少量虚元。
如果变量是在内部子程序中单独说明的,它只是局部变量。
通过特定过程扩展普通运算符的功能,使其具有新的含义。
具有新含义的运算符仍
符合规定的运算优先等级。
program conect
implicit none
interface operator(+)
function concat(str1,str2) result(concat_result)
character(len=200)::concat_result
character(len=100),intent(in)::str1,str2
end function
end interface
character(len=100)::ch1,ch2
character(len=200)::y
read *,ch1,ch2
y=ch1+ch2 !y=concat(ch1,ch2)
print *,y
end program
①由类型决定是内在运算还是超载运算
如上述“+”运算符可以用于连接两个字符串,但仍可以做数值的加法运算。
操作数为数值,做加法运算
操作数不为数值,操作含义要到
function concat 中找
②子程序的虚元一定要有INTENT属性
③阅读画虚实表时注意顺序(第一操作数为第一个实元,第二操作数为第二个实
元……)
超载赋值是指把赋值的含义扩展到新的数据类型。
按规定赋值号两边的类型必须相容。
用超载赋值时,可以进行类型不同的数据间赋值。
例:把.true. 赋给一个整型变量得值1;
把.false.赋给一个整型变量得值0。
实现赋值号超载的方法是:
1、先编写一个不同类型变量之间一一对应关系的子例子程序。
子程序只有两个虚元,第一个虚元具有intent(out)属性,第二个虚元具有intent (in)属性
2、再在主调程序中编写一个接口,接口语句的形式为:interface assignment(=)
3、超载赋值的执行:调用子程序
注意:①子程序的虚元一定要有INTENT属性
②阅读画虚实表时注意顺序(左进行超载赋值运算时,必须编写成子例子程
序形式;
要实现超载运算符功能时,必须简单变量是用来存储一个数据,占据独立的存储单元,彼此之间没有直接联系;
数组是用来存储一批类型相同的被称为元素的有序数据,在内存中占据连续的存储单元。
编成函数子程序形式。
操作数为第一个实元,右操作数为第二个实元)
通过下标引用数组元素
下标表达式应是整型表达式,允许出现+ - * 等算数运算符。
操作数可以是常数、变量,也可以是简单的内在函数或数组元素,但表达式的值一定是整数。
d1 <= 下标表达式的值<= d2
例:A(3*2),A(ABS(-3)),A(5+I),A(A(I))
6、数组元素的下标取值必须在相应的维界偶范围内
数组构成器是左右两端用“(/ ”和“/)”定界的同类型数据的集合。
数组构成器用于多维数组一般赋值,必须用RESHAPE函数改变形状后赋值
例:INTEGER,DIMENSION(2,3)::B
B=RESHAPE(SOURCE=(/1,2,3,4,5,6/),SHAPE=(/2,3/))
如使数据按行优先的原则存放,需要使用ORDER选项。
例:INTEGER,DIMENSION(2,3)::B
B=RESHAPE(SOURCE=(/1,2,3,4,5,6/),SHAPE=(/2,3/),ORDER=(/2,1/))
注意:“ORDER=”不能省略
可调数组:
说明可调数组时,大小说明中出现了整型变量。
REAL,DIMENSION(M,N)::C
使用范围:只在子程序中作虚数组使用。
注意点:调用含可调数组的子程序时,须确定维界变量的值(虚实结合、模块单位)
SUBROUTINE SUB(C,M,N)
INTEGER::M,N
REAL,DIMENSION(M : N)::C
说明假定形状数组时,不出现上下维界,只用一个冒号“:”表示或只写上或下维界。
REAL,DIMENSION(:)::D1
INTEGER,DIMENSION(:,:)::D2
REAL,DIMENSION(3:)::D3
使用范围:假定形状数组只能在子程序中作虚数组用。
注意点:调用时,必须写接口块且调用时它从实数组获得形状参数,要求虚实维数一致(维界可不一致)。
动态数组:
说明时大小用冒号,且有ALLOCATABLE属性。
动态的含义:说明时不分配存储单元,运行时由语句分配对应大小的内存,且大小可按需要变化。
使用范围:主程序、各子程序(不能作为虚元)
把n个整数中最大的数找出来,并指出它在队列中的位置。
当数组大小未知,可用动态数组实现
IMPLICIT NONE
INTEGER,DIMENSION(:),allocatable::A !①说明动态数组
INTEGER::MAX,K,I,n
Read*,n
Allocate(a(n)) !②分配存储空间
READ*,(A(I),I=1,N)
MAX=A(1);K=1
DO I=2,n。