辅导资料——FORTRAN90楚红第1页共55页FORTRAN90学习指导一、FORTRAN90基础知识1.源程序及其构成书写格式:主程序定义语句、结束语句注意:在没有程序名称的时候,程序开头的PROGRAM也不要出现。如果使用了程序名称且在END语句中出现,则END语句中的PROGRAM不能省略。语句行可以是0~132个字符;除赋值语句外,每个语句都要使用关键字开头。如果希望一行中出现多个语句,语句一定要用分号隔开。空格不能随便使用,关键字、变量和常量名以及操作符中的空格会使字符失去其原有的含义。但它们之间一定要加空格。注释行:以感叹号为标记,或“C”、“*”(FORTRAN90中不提倡此用法)续行标记:在句末尾添加续行符&,如果将关键字分成两行,则下一行开头也要加续行标记。如果续行符出现在注释语句中,则失去了续行的功能。2.FORTRAN90字符集126个英文字母(大小写字母等价)210个阿拉伯数字3下划线421个特殊字符:空格=+-*/(),.‘:!“%&;?$5其他字符(只可以出现在字符常量、字符串编辑描述符、注释和输入输出记录中)3.基本数据类型1整型KIND值可以为1、2、4类型说明关键字:INTEGERKIND值决定数据的范围。对于整数没有误差。I=3/2=1;I=1/2=0INTEGER(KIND=4)::AINTEGER*4::AINTEGER(4)::A2实型KIND值可以为4(单精度7位有效数字)、8(双精度15~17位有效数字)类型说明关键字:REAL小数表示形式、指数表示形式(规格化的指数形式)错误表示形式:E34、.E34、0.14E2.38开3次方:8.0**(1.0/3.0)3复型KIND值为4、8是实数的有序对,将两个实数中间用逗号分隔,然后放在一对括号中类型说明关键字:COMPLEX复数的运算:+、—、*、/4字符型KIND值为国家语言种类由一对单撇号或一对双撇号之间的字符序列组成。字符串内大小写字母均可使用,但识别为不同字符。撇号不是字符串的组成部分。类型说明关键字:CHARACTERCHARACTER(LEN=10,kind=)::A辅导资料——FORTRAN90楚红第2页共55页CHARACTER(10)::ACHARACTER*10::ACHARACTER*(*),parameter::A=’aasdfasd’运算符://函数:CHAR(NUM);ICHAR(CHAR);LEN(STRING);LEN_TRIM(STRING)INDEX(STRING,KEY);TRIM(STRING)5逻辑型KIND值为2、4只有真(.TRUE.)和假(.FALSE.)两个值。4.命名规则1名字的长度不能超过31个字符。2名字的组成成分可以是字母、数字和下划线。3名字的第一个字符必须是字母。4要特别注意,在名字中不能出现空格。5变量名不能与全局名(程序单位名,数组名)同名,也不要与关键字同名。6名称不区分大小写。二、基本语句1.类型说明语句a.显式说明:b.隐含说明:IMPLICITINTEGER(A-C)!FORTRAN90不再使用c.I-N规则:d.屏蔽I-N规则:IMPLICITNONE2.种别说明programex0435implicitnone!判断可以记录9个位数的整数kind值integer,parameter::long_int=selected_int_kind(9)!判断可以记录3个位数的整数kind值integer,parameter::short_int=selected_int_kind(3)!判断可以有10个有效位数,指数可以记录到50的浮点数kind值integer,parameter::long_real=selected_real_kind(10,50)!判断可以有3个有效位数,指数可以记录到3的浮点数kind值integer,parameter::short_real=selected_real_kind(3,3)integer(kind=long_int)::a=12345678integer(kind=short_int)::b=12real(kind=long_real)::c=1.23456789D45real(kind=short_real)::d=1230write(*,(I3,1X,I10))long_int,awrite(*,(I3,1X,I10))short_int,bwrite(*,(I3,1X,E10.5))long_real,cwrite(*,(I3,1X,E10.5))short_real,dstopend辅导资料——FORTRAN90楚红第3页共55页programex0436implicitnonereal(kind=4)::areal(kind=8)::ba=1.0_4!确定1.0这个数字是使用单精度b=1.0_8!确定1.0这个数字是使用双精度write(*,*)a,bstopend3.属性说明:EXTERNAL:当用户过程作为实元时INTRINSIC:当内在函数名作为实元时SAVE:保存外部过程变量的值INTENT:决定虚元值的传递方向PARAMETER:符号常量声明EQUIVALENCE:等价声明!EQUIVALENCE(A,B)表示A,B使用同一内存空间OPTIONAL:可选择属性的变元ALLOCATABLE:动态属性的变元ASSIGN:赋值语句ENTRY:为函数子程序或子例子程序提供多个入口4.算术表达式A.算术运算符:***、/+、—注意:同级运算左结合,乘方运算右结合B.内在函数:数值函数:ABS(x):对任何类型的数值求绝对值。类似的有CABS();IABS();DABS()AIMAG(z):返回复数Z的虚部。AINT(a[,kind]):返回舍去小数后的参数值。INT()ANINT(a[,kind]):返回最接近参数a的整数值。NINT()CEILING(a):返回一个等于或大于a的最小整数。CMPLX(x):复数类型转换;当复数赋值时实部或虚部为表达式,则要用该函数FLOOR(a):返回等于或小于a的最大整数。MOD(A,B):计算a/b的余数。当参数为浮点数时,返回(a-int(a/b)*b)SIGN(A,B):B=0返回abs(a);B0返回-abs(a)数学函数:三角函数;LOG(X);LOG10(X);EXP(X);SQRT(X);字符函数:ACHAR(I);CHAR();ADJUSTL(string);ASJUSTR(string);IACHAR();ICHAR();INDEX();LEN_TRIM(string);TRIM(string);辅导资料——FORTRAN90楚红第4页共55页LEN(string);LGT();LLT();LLE();LGE()REPEAT(S,I):返回一个重复I次S的字符串。数组约简函数:ALL(mask[,dim]):对数组进行逻辑判断,如果每个元素都满足条件则返回真值ALL(a5)或ALL(ab)!a、b是类型相同的数组,检查a中是否每一个元素都比数组b中任何一个元素大,返回一个逻辑值。ANY():对数组进行逻辑判断,只要有一个元素满足条件就返回真值COUNT():返回数组中合乎条件的元素数目。PRODUCT():返回数组中所有元素的相乘值。SUM():计算数组元素的总和。数组查询函数:ALLOCATED():检查一个可变大小的数组是否已经声明大小。LBOUND():返回数组声明时的下限值SHAPE():返回数组的维数及大小。如:integera(2,3,4)integerb(3)b=shape(a)执行结果:b(1)=2b(2)=3b(3)=4SIZE():返回数组大小UBOUND():返回数组上限UNPACK(vector,mask,field):根据逻辑运算的结果,返回一个变形的多维数组。结果会根据在内存中的顺序,如果逻辑为真,回填入vector的值,否则就回填入field的值。Integer::a(4)=(/1,2,3,4/)Integer::b(2,2)Logical::c(2,2)=reshape((/.true.,.true.,.false.,.false./),(/2,2/))B=unpack(a,c,0)执行后B=(/1,2,0,0/)数组变形函数:RESHAPE(data,shape):通过shape的设置,把一串数据“整形”后,再传给一个数组。例如:integer::a(3,3)=(/1,2,3,4,5,6,7,8,9/)integer::b(9)b=reshape(a,(/9/))a=reshape(b,(/3,3/))但是:integer::a(3,3)integer::b(9)a=(/1,2,3,4,5,6,7,8,9/)!编译出错,形状不同,必须用函数b=reshape(a,(/9/))a=reshape(b,(/3,3/))END辅导资料——FORTRAN90楚红第5页共55页TRANSPOSE():返回一个转置矩阵C.算术表达式书写表达式应注意几点:(教材41面1、2、3、4)注意表达式结果的类型和种别。5.赋值语句赋值语句的功能:计算、类型转换、赋值6.输入输出语句A.表控格式的输入输出:READ*,A,BREAD(*,*)A,B注意:⒈各数据间有分隔符:逗号或空格。⒉类型匹配:整数:不得带小数点;实数:可以为整数;小数形式;指数形式复数:(实部,虚部);实部和虚部可以为整型也可为实型字符:‘一串字符’,赋值时长度转化;一串字符,即‘’可省略。逻辑:以T或F作为第一个字母的字符串(点号、空格在前忽略)如果输入一个整型数,则偶数为假,奇数为真⒊个数:1)不得少于变量的个数;2)可分行输入;3)多余的数据不起作用4)每一个READ开始一个新的记录⒋无效值的输入⑴,,连续两个逗号,对变量值不影响。⑵空格可以多个,/表示输入数据结束,后面的数据被取消,没有输入数据的变量值为0;Read*,A,B,C输入:2,1/3结果:A=2B=1C=0⑶r*[c]:r为重复数4*0.5,2*3,2*’AB’,3*(1.0,-1.0)⒌多个Read语句每个Read必须从一个新的行输入数据PRINT*,A,BWRITE(*,*)A,B⒈固定的输出宽度⒉类型:复型:带()输出逻辑型:T,F输出一个字符字符型:‘’丢失,采用左对齐输出3.一行显示不下,数据自动换行输出4.多个PRINT语句:每个开始输出一个新的记录辅导资料——FORTRAN90楚红第6页共55页B.输入输出编辑符一般形式:READ(设备号,格式说明)输入表READ格式说明,输入表WRITE(设备号,格式说明)输出表PRINT格式说明,输出表格式说明:*、格式语句标号、整型变量、格式字符表达式、数组或数组元素作用:精确地说明每一个数据应该怎样输入或输出,包括类型、小数点位置、有效位数、输出结果的形式1、FORMAT语句标号(为提高程序的可读性,F90中一般不用)WRITE(*,900)INT1,REAL1(3),CHAR1900FORMAT(I5,3F5.4,A16)2、整型变量名(使用ASSIGN语句)ASSIGN900TOMYFMT900FORMAT(I5,3F5.4,A16)WRITE(*,MYFMT)IOLIST3、字符表达式或变量WRITE(*,’(I5,3F5.4,A16)’)IOLIST或:CHARACTER(80)MYLISTMYLIST=‘(I5,3F5.4,A16)’WRITE(*,MYLIST)IOLIST4、数组或数组元素名CHARACTER(6)array(3)DATAarray/'(I5',',3F5.2',',A16)'/WRITE(*,array)iolistCHARACTER(80)array(5)array(2)='(I5,3F5.2,A16)'WRITE(*,array(2))iolist