fortran90 知识点整理.docx
《fortran90 知识点整理.docx》由会员分享,可在线阅读,更多相关《fortran90 知识点整理.docx(29页珍藏版)》请在冰点文库上搜索。
fortran90知识点整理
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
Ps:
PARAMETER属性
(1)功能:
用一个符号代表一个常量,称为符号常量(常数)
(2)写法:
Real,Parameter:
:
G=9、8&&说明类型时赋值
(3)位置:
位于可执行语句之前
REAL,DIMENSION(1:
10):
:
A
2、3、6派生数据类型
根据需要而由基本数据类型定义新得数据类型。
在一个派生类型中可包含多个基本类型。
如:
TYPESTUDENT(定义开始)
CHARACTER(LEN=20):
:
DEPARTMENT
CHARACTER(LEN=10):
:
CLASS
CHARACTER(LEN=15):
:
NAME
INTEGER:
:
NUMBER(成员定义)
ENDTYPESTUDENT(定义结束)
派生类型变量得定义:
TYPE(STUDENT):
:
PERSON
变量得赋值:
PERSON=(”PUTER”,”92_2”,”LILIN”,21)
成员得表示:
PERSON%CLASS=“92_2”
PERSON%NAME=“LILIN”
主程序其她限制
主程序得可执行部分不能包含有RETURN语句或者ENTRY语句。
程序名对可执行程序就是全局得,而且不得于该可执行程序中得任何其它程序单元名、外部过程名或公用块名相同,也不得于主程序内得任何局部名相同。
在主程序得作用范围内得说明不得包含OPTIONAL语句、INTENT语句、PUBLIC语句或它们得等价属性,在主程序内SAVE语句不起作用。
主程序内得任何内部过程得定义必须跟在CONTAINS语句之后。
2、3、2子程序
子程序就是可以完成某一独立算法或功能得程序单元,但它功能得具体体现要通过主程序(或子程序)得调用来实现。
按子程序与主程序得位置关系分为内部过程与外部过程。
2、4、3模块
模块也就是一种在程序单元之外独立编写得程序单元。
它有独特得形式,即模块程序单元内没有可执行语句,除了说明语句外,最多包含内部过程。
模块得主要作用就是供其它程序单元引用。
程序单元引用模块,实际就是将模块内得全部语句复制到本程序单元。
因此模块起共享及复制得作用。
模块得引用采用语句:
USE模块1,模块2,…
基本语句概述
程序得最基本得语句主要有四种:
类型说明语句、赋值语句、输入语句、输出语句。
运用这些基本得语句,就可以编写一些简单得程序。
内在函数
FORTRAN90配置得函数称为内在函数。
内在函数分为三种:
基本函数:
SIGN符号
函数值:
|A1|(若A2>0)
|A1|(若A2<0)SIGN(A1,A2)
Eg:
SIGN(3、0,2、0)=3、0
SIGN(3、0,2、0)=3、0
某些函数参数只能为实型
如:
log(2、0)(loG
(2)错)
转换函数
函数名
含义
FORTRAN举例
INT(X)
实型转换整型、
复型得实部转换整型
INT(2、3)=2
INT((1、2,3、5))=1
REAL(X)
整型转换实型、
复型得实部转换实型
REAL(8)=8、0
REAL((1、2,3、5))=1、2
PLEX(X,Y)
将X,Y合成为复型
PLEX(2、3,1、5)= (2、3,1、5)
INT(X,KIND):
将X值转换为整型,以KIND得值作为种别参数
REAL(X,KIND):
将X值转换为实型,以KIND得值作为种别参数
PLEX(X,Y,KIND):
将X,Y转换为复型,以KIND得值作为种别参数
查询函数
KIND
SELECTED_INT_KIND
SELECTED_REAL_KIND
PRECISION
RANGE
……
不轻易使用整型量除整型量1、0/22、0**
(1)
运算对象类型相同时,运算结果得类型为同一类型
注意:
5/2=21/2=0!
!
运算对象类型不同时,系统一般先转换成相同类型后再运算
转换规则就是:
较低级得类型转换为较高级得类型
数据类型隐含得高低次序为(由低到高):
整型→实型→双精度→复型
例:
8/5+2、0*5/2=6、0(逐步转化)
赋值语句
1、类型要求
逻辑型、字符型得赋值语句要求“=”两边类型相同
数值型赋值,不区别整型、实型与复型
2、种别方面
字符型要求种别相同
其余类型得e、V种别允许不同
输入输出语句
1、I/O得对象——列在中
I/O就是相对于内存而言得,
键盘属于输入设备,
显示器属于输出设备,
优盘、硬盘既就是输入设备,又就是输出设备。
2、I/O得方向及语句
READ(U,f)U:
设备(部件)f:
格式
WRITE
其中:
输入READ语句
输出PRINT语句,只输出到显示器
WRITE语句,适合任何输出设备
U(部件)*:
系统约定设备
某个值:
指定通道号(设备逻辑号、文件号)
表控格式I/O(*):
系统约定得格式。
f(格式)基本格式(自定格式)I/O:
按用户要求得格式组织I/0。
带控制信息表得I/O:
I:
碰到回车(ENTER)为一个记录。
O:
一行为一个记录。
程序执行过程中按表控格式输入数据
各数据间有分隔符:
或空格
类型匹配:
整型:
带小数点只取整数部分;
复数:
(实部,虚部);
字符:
‘一串字符’:
赋值时长度转化或一串字符即‘’可省略。
逻辑:
以T或F作为第一个字母得字符串(点号1个、空格多个在前忽略)
3、输入得数据必须就是常数,不能就是变量与表达式
如输入2+1,则出错。
4、输入数据个数:
1)不得少于变量得个数;
2)可分行输入;
3)多余得数据不起作用
5、空格可以多个,/表示输入数据结束,后面得数据被取消,没有输入数据得变量值为原值;
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)
输入输出得三种不同得格式:
1.表控格式得输入输出
2.有格式得输入输出
3.带控制信息表得输入输出
整型编辑符:
Iw[、m]
1.I编辑符控制输出:
功能:
用于整型数据得输入输出
格式:
IwIw、mrIw
w—输入输出数据字段总宽度
m—至少m位数字
r—为重复系数
例1.设 J=10,K=12,L=12
WRITE(*,”(I3,I5,I7)”)J,K,L
□10□□12□□□□123
注意:
1.数字在指定得区域内右端对齐,不足w则左边补空格。
2.负数得符号也包含在字段宽度内
3.如果应输出得列数超过了规定得字段宽度,则不输出有效数据,以w个*填充。
4、BN,BZ:
Blankinterpretation
Specifiesinterpretationofblanksinnumericfields(空格就是否当0处理)仅用于输入格式语句,如
read“(BN,2I3)”,I,J
例2.如果将格式串改为:
“(I3,I5、4,I7、5)”
则输出:
□100012□□00123
例3.如果L=123456
□100012□123456
!
!
Iw、m:
m<位数,则按照实际数输出
实型编辑符
1.编辑符格式
[r]Fw、d将数据按小数形式输出
[r]Ew、d将数据按指数形式输出
[r]Gw、d根据数据大小决定采用E或F格式
r—重复系数
w—字段宽度(总宽度)
d—小数部分宽度
F编辑符
功能:
用于实数编辑,小数形式得输出(定点数:
单精度实数,4个字节,7个有效数字)
当实型数值小于0、0(负数)时,则w>=n+d+2
当实型数值大于或等于0、0时,则w>=n+d+1
用此来确定w得宽度
注意:
1. w包括数符与小数点两位
2. 若数据小于w位,则左边补空格
3. 输出值时舍入,而不就是截断
4、如果就是科学计数法则转换小数形式
字符型编辑A
A用来编辑字符型变量,它不关心该字符串得长短如何。
例:
CHARATER*5A,B,C
READ(*,’(A,A,A)’)A,B,C
WRITE(*,’(A,2X,A,2X,A)’)A,B,C
END
输入:
ABC□DBASICFORMAT
结果:
ABC□D□□BASIC□□FORMA
!
!
!
2X表示□□
X编辑描述符
功能1:
在输出时产生空格,它得一般形式为:
nX
关系表达式与逻辑表达式
关系运算符:
>、>=、<、<=、==(等于)、/=(不等于)(常用)
、GT、、、GE、、、LT、、、LE、、、EQ、、、NE、
注意
1、每个关系表达式中得关系运算符只准出现1次,运算符两侧都就是表达式;
错例:
2b)2、运算对象:
关系运算符两边得运算对象类型应相容:
错例:
A==、TRUE、2<‘A’
复型:
只能进行==、/=。
不能比较大小
字符型:
可以进行各种关系运算
逻辑运算符(5个)
、NOT、a:
求反运算,
a、AND、b:
a与b同时为真,表达式值才为真
a、OR、b:
a与b有一个为真,表达式值就为真
a、EQV、b:
a与b值相等,表达式值为真
a、NEQV、b:
a与b值不相等,表达式值为真
类型运算符优先级
括号()1
算术运算**2
*,/3
+,4
关系运算>,>=,<,<=,==,/=5
逻辑运算、NOT、6
、AND、7
、OR、8
、EQV、,、NEQV、9
IF语句
使用范围:
特殊单分支
语句写法:
IF(条件)一条语句
例:
IF(X>0)PRINT*,X
执行过程:
1、计算条件表达式得值
2、真右边语句IF得下一个语句
3、假IF得下一个语句
注意:
1、右边通常为一条且只一条可执行语句。
错例:
IF(A
2、不能为以下语句:
END、另一个逻辑IF、块IF、ELSIF、ENDIF、DO
错例:
IF(X<2)END
3、常应用于简单得条件赋值或条件转移(在循环结构中)
4、不论条件真假都执行IF得下一个语句
IF结构
使用范围:
二分支结构
书写格式:
IF(条件)THEN!
块IF语句
语句体1(then块)!
由若干语句组成
ELSE!
ELSE语句
语句体2(else块)!
由若干语句组成
ENDIF!
ENDIF语句
IF结构执行过程:
计算条件得值
真THEN块ENDIF得下一个语句
假ELSE块ENDIF得下一个语句
注意:
1、IF—then标记语句得开始,ENDIF与之匹配,标记语句块结束
2、条件表达式写法
IF结构得缺省形式:
缺省ELSE块:
IF(lexp)THEN
语句体1
ENDIF
缺省THEN块:
IF(lexp)THEN
ELSE
语句体2
ENDIF
多分支结构
方法1:
转化为单分支,逻辑IF语句并列
方法2:
逐次二分,转化为块IF结构嵌套
嵌套过多容易出错,也不易维护,因此应尽量减少嵌套得层次;
方法就是把条件分细,列成多条ELSEIF语句,ELSEIF结构为:
Elseif结构:
IF(e1)THEN
block1
ELSEIF(e2)then
block2
ELSEIF(e3)then
block3
ELSE
blockn
ENDIF
IF结构得取名
IF结构可:
无名或有名
IF结构得取名与变量得取名方法相同
IF结构名:
IF(e1)THEN
块1
ELSEIF(e2)THEN[IF结构名]
块2
…
ELSEIF(en)THEN[IF结构名]
块n
ELSE[IF结构名]
块n+1
ENDIFIF结构名
同一IF结构中得结构名一定要一致!
CASE结构
使用范围:
多分支结构
SELECTCASE(情况表达式)
CASE(情况选择器1)
block1(块1)
CASE(情况选择器2)
block(块2)
CASE(情况选择器n)
blockn
[CASEDEFAULT
默认块]
ENDSELECT
执行过程:
1、计算情况表达式得值
2、顺序匹配各情况选择器,执行相应得block1,再到ENDSelect下一个语句
3、如果均不匹配,则执行默认块
4、执行ENDSelect得下一个语句
情况表达式:
整型变量、逻辑变量、字符型变量或相应得表达式
不能就是实型或复型表达式
表达式列表(情况选择器):
只能就是常量,不能为变量,可有多条语句;
类型与情况表达式类型应一致,尤其字符型时种别参数必须一致,但长度可以不同;
(逗号)分隔符表示分隔单个值得列表。
例:
case(3,5,7)值不能重复
:
(冒号)分隔符表示值得范围,连续得值
例:
case(5:
10);case(‘i’:
‘n’)
下界、上界可省略
Casedefault:
最多出现一次
例48输入一个数,判断能否被3整除,打印相关信息注意输出得格式为(*,’(I6,2X,A)’)
循环结构程序设计
循环得分类:
1、已知循环次数2、已知循环条件
循环得表示及适用范围:
循环均由Do结构表示,其Do结构共有三种形式:
1.不带循环变量得DO结构
2.带循环变量得DO结构
3.DoWHILE循环结构
不带循环变量得DO结构
一般形式
[结构名:
]DO!
循环开始语句
循环体!
循环体
ENDDO[结构名]!
循环结束语句
说明:
1、结构名可以省略,多层嵌套时,为使结构清晰才用;
2、循环体可以为0~n条语句或结构,包含以下语句:
重复语句,循环变量得变化,循环控制语句等;
3、DO循环入口语句,只能从该语句进入循环;
4、ENDDO循环终止语句,可以不经过该语句退出循环
使用范围:
循环次数未知,仅给定了循环终止条件
无循环变量得DO结构执行过程:
进入DO结构后,从DO语句下面第一句执行起顺次执行到ENDDO前得最后一句,
再返上来从DO语句下面第一句执行起,重复执行整个DO块。
对于不带控制变量得DO结构,DO块中必须有EXIT语句,使它停止循环,退出循环,转向执行ENDDO下面得语句。
EXIT与CYCLE语句
EXIT语句
循环出口语句,一般形式为:
EXIT
作用:
停止循环,将控制转移到当前循环(或指定do结构)之外。
一般用法
IF(逻辑表达式)EXIT[DO结构名]
CYCLE语句
短路语句,一般形式为:
CYCLE[DO结构名]
作用:
在循环执行到该语句时,跳过循环体在它后面得那些语句。
再从循环体得第一条语句开始执行。
一般用法:
IF(逻辑表达式)CYCLE[DO结构名]
带循环变量得DO结构
使用范围:
计数型循环——已知循环次数
一般形式:
[结构名:
]DO循环控制变量V=初值e1,终值e2[,步长值e3]
循环体!
重复执行得语句
ENDDO[DO结构名]
e1、e2、e3可以就是正值,也可以就是负值,最好就是整型。
例:
DOI=1,100,2
S=S+I
ENDDO
有关注意事项:
1、e1,e2,e3可为常量、已有值得变量或表达式e3=1时可省略
2、v与e1,e2,e3类型不一致,按赋值语句转化。
doI=1、5,3、6,1、2doI=1,3,1
3、语句执行次数:
do语句:
1次(负责赋初值与循环次数得计算)
循环体语句次数:
max(int((e2e1+e3)/e3),0)
4、e3不允许为零(可正、可负),否则程序出错
doI=1、5,6、5,0、5I得取值为:
?
5、循环变量可不在循环体内出现,仅控制循环次数。
doI=1,10
print*,’a’
Enddo
6、DO循环变量在循环体内不能赋以新值,但可以引用。
即循环变量在循环体中不能出现在赋值号得左边。
例:
DOI=3,6
I=5!
!
错误
J=I+I;print*,I
ENDDO
7、循环变量在循环体内不能被重新赋值,但在循环体外可以被重新赋值。
两个并列得DO循环可以使用相同得循环变量
DOI=1,10,2
…
ENDDO
I=20
…
DOI=1,5
…
ENDDO
9、在带循环变量DO结构中仍可使用EXIT与CYCLE语句。
10、在DO结构中包含得IF结构与CASE结构等必须就是完整得结构,不允许出现结构得交叉。
11、循环可以不经ENDDO终止,但就是不能从循环体外转入循环体内(GOTO)。
12、给定一个循环,首先要判断循环就是否一次也不做。
如果循环变量大于终止,循环一次也不做,直接输出结果。
13、循环正常退出时,v得值超过循环变量得终值;循环非正常退出时,v保持当前值。
DOWHILE结构
DOWHILE结构得一般形式:
[结构名:
]DOWHILE(逻辑表达式)
循环体
ENDDO[结构名]
相当于:
DO
IF(、NOT、逻辑表达式)EXIT
循环体
ENDDO
DO结构嵌套
DO结构嵌套:
一个DO结构循环体内可以包含另一个完整得DO循环结构,这就就是DO循环结构得嵌套
注意:
3、执行到EXIT语句,没有指明结构名时,转到当前循环体外;若指定了结构名,则转出该结构名代表得循环体外;
如:
II:
DOI=3,50
JJ:
DOJ=2,I1
IF(MOD(I,J)==0)EXIT
ENDDOJJ
IF(J>=I)PTINR*,I
ENDDOII
隐含DO循环
隐含DO循环实际上就是带控制变量得DO结构。
但简化成只有DO结构得第一句,且把DO关键字隐去。
隐含DO循环得形式为:
(list,v=u1,u2,u3)
说明:
1、左括号相当于DO,右括号相当于ENDDO;
2、List可以就是一个或多个常量、变量、数组元素等,甚至可以就是另外得隐含DO循环(隐含DO循环嵌套)
不能独立存在,主要用于输入输出语句,常用于数组得输入输出。
如:
READ*,(A(I),I=1,5)
READ*,A
(1),A
(2),A(3),A(4),A(5)
隐DO、显DO执行过程得区别
1、输入、输出格式得区别:
PRINT*,(I,I=1,3)PRINT*,1,2,3输出一行
DOI=1,3PRINT*,1
PRINT*,IPRINT*,2
ENDDOPRINT*,3
输出三行
几种常见得隐含DO循环得形式
1、按指定步长读写。
例如
PRINT*,(J,J=1,7,2)
2、隐含DO循环与普通变量混合使用。
例如
PRINT*,A,B,(X(I),I=1,3),C
3、用于输出一些特殊符号。
例如
PRINT*,(’’,I=1,80)
4、隐含DO循环可以并列出现。
例如
print*,(I,I=1,2),(J,J=1,2)
程序单元与过程
子程序单元不能独立存在,只能被主程序单元或被其它子程序单元调用,甚至可以递归调用(调用本身)
子程序(又称过程)得分类
1、函数子程序分为:
内部函数子程序,外部函数子程序
2、子例行子程序分为:
内部子例行子程序,外部子例行子程序
外部函数子程序
VisualFortran90得函数:
1、内在函数(系统函数、标准函数)
如:
sin、cos、sqrt、abs、kind……
2、Function语句编写得函数(自定义)
分为内部函数、外部函数
函数子程序得编写方法
[RECURSIVE]FUNCTION函数名(虚元表)RESULT(结果名)
说明部分
程序体:
具体计算
END[FUNCTION[函数名]]
如:
FUNCTIONFACT(N)RESULT(FACT_RESULT)
IMPLICITNONE
INTEGER:
:
N,I,FACT_RESULT
FACT_RESULT=1
DOI=1,N
FACT_RESULT=FACT_RESULT*I
ENDDO
ENDFUNCTIONFACT
PROGRAMMAIN
INTEGER:
:
FACT,SUM=0,I
DOI=1,5
SUM=SUM+FACT(I)
ENDDO
PRINT*,SUM
END
说明:
子程序END语句写法:
END[FUNCTION[函数名]]
子程序END语句功能:
1、函数单位得结束标志
2、将控制返回到主调程序。
子程序开始语句得写法
[RECURSIVE]FUNCTION函数名(虚元表)RESULT(结果名)
1、作为函数子程序得第一行(注释行除外)。
2、如果函数就是递归得,则应以RECURSIVE开头。
3、函数名与普通变量名得取法相同,且为全局名,即作用域为整个程序,不得与已有得全局名同名。
4、主调程序与被调程序两个单位之间得数据传递:
①RESULT(结果名):
子程序得一个输出结果
一般写法:
函数名_RESULT,用于保存一个计算结果,称为函数值。
且结果名有类型,必须在子程序说明部分说明类型。
②虚元表:
子程序得所有输入,及除函数值之外得其她计算结果得输出。
虚元之间用逗号分隔,都要在说明语句中说明类型。
如果没有虚元,函数名后就是一对空括号。
5、虚元得含义:
编写子程序时没有具体值(调用时或调用结束后才获得数值),因此只就是一个符号,表示输入、输出,名字可随便用户取。
6、虚元可以就是变量名、数组名、过程名、指针等。
7、虚元得可选属性INTENT:
INTENT(IN):
表示函数开始时,虚元从实元中获得值,作为子程序得输入(不得再改变其值)
INTENT(OUT):
表示函数结束时,把虚元得值传送给实元,作为子程序得输出(对应得实元不能就是表达式)
INTENT(INO