FORTRAN90学习指导书_第1页
FORTRAN90学习指导书_第2页
FORTRAN90学习指导书_第3页
FORTRAN90学习指导书_第4页
FORTRAN90学习指导书_第5页
已阅读5页,还剩51页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、辅导资料fortran90 楚红fortran90学习指导一、fortran90基础知识1源程序及其构成 书写格式:主程序定义语句、结束语句注意:在没有程序名称的时候,程序开头的program也不要出现。如果使用了程序名称且在end语句中出现,则end语句中的program不能省略。语句行可以是0132个字符;除赋值语句外,每个语句都要使用关键字开头。如果希望一行中出现多个语句,语句一定要用分号隔开。空格不能随便使用,关键字、变量和常量名以及操作符中的空格会使字符失去其原有的含义。但它们之间一定要加空格。注释行:以感叹号为标记,或“c”、“*”(fortran90中不提倡此用法)续行标记:在句

2、末尾添加续行符&,如果将关键字分成两行,则下一行开头也要加续行标记。如果续行符出现在注释语句中,则失去了续行的功能。2fortran90字符集1 26个英文字母(大小写字母等价)2 10个阿拉伯数字3 下划线4 21个特殊字符:空格 = + - * / ( ) , . : ! “ % & ; ? $5 其他字符(只可以出现在字符常量、字符串编辑描述符、注释和输入输出记录中)3基本数据类型1 整型 kind值可以为1、2、4 类型说明关键字:integer kind值决定数据的范围。对于整数没有误差。 i=3/2=1;i=1/2=0 integer(kind=4):a integer*4:a i

3、nteger(4):a2 实型 kind值可以为4(单精度7位有效数字)、8(双精度1517位有效数字) 类型说明关键字:real 小数表示形式、指数表示形式 (规格化的指数形式)错误表示形式:e34、.e34、0.14e2.3 8开3次方:8.0*(1.0/3.0)3 复型 kind值为4、8 是实数的有序对,将两个实数中间用逗号分隔,然后放在一对括号中 类型说明关键字:complex 复数的运算:+、*、/4 字符型 kind值为国家语言种类 由一对单撇号或一对双撇号之间的字符序列组成。 字符串内大小写字母均可使用,但识别为不同字符。撇号不是字符串的组成部分。 类型说明关键字:charac

4、ter character(len=10,kind=):a character(10):a character*10:a character*(*),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、不能出现空格。5 变量名不能与全局名(程序单位名,数组名)同名,也不要与关键字同名。6 名称不区分大小写。二、基本语句1类型说明语句a 显式说明:b 隐含说明:implicit integer (a-c) !fortran90不再使用c i-n规则:d 屏蔽i-n规则:implicit none2种别说明program ex0435implicit none! 判断可以记录9个位数的整数kind值integer, parameter : long_int = selected_int_kind( 9 ) ! 判断可以记录3个位数的整数kind值integer, parameter : shor

6、t_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

7、_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, dstopendprogram ex0436implicit nonereal(kind=4) : areal(kind=8) : ba=1.0_4 ! 确定1.0这个数字是使用单精度b=1.0_8

8、 ! 确定1.0这个数字是使用双精度write(*,*) a,bstopend3属性说明: external:当用户过程作为实元时 intrinsic:当内在函数名作为实元时 save:保存外部过程变量的值 intent:决定虚元值的传递方向 parameter:符号常量声明equivalence:等价声明 !equivalence(a,b)表示a,b使用同一内存空间optional:可选择属性的变元allocatable:动态属性的变元assign:赋值语句entry:为函数子程序或子例子程序提供多个入口4算术表达式 a算术运算符:* * 、/ +、 注意:同级运算左结合,乘方运算右结合 b

9、内在函数: 数值函数: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);b5) 或 all(

10、ab)!a、b是类型相同的数组,检查a中是否每一个元素都比数组b中任何一个元素大,返回一个逻辑值。any():对数组进行逻辑判断,只要有一个元素满足条件就返回真值count():返回数组中合乎条件的元素数目。product():返回数组中所有元素的相乘值。sum():计算数组元素的总和。 数组查询函数:allocated():检查一个可变大小的数组是否已经声明大小。lbound():返回数组声明时的下限值shape():返回数组的维数及大小。如:integer a(2,3,4) integer b(3) b=shape(a) 执行结果:b(1)=2 b(2)=3 b(3)=4size():返回

11、数组大小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的设置,把一串数据“整形”后,再传给一个

12、数组。例如: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/)endtranspose():返回一个转置矩阵 c算术表达式 书写表达式应注意几点:(教材41面1、2、3、4) 注意表达式结果的类型和种别。5赋值语句 赋值语句的功能:计算、类型转换、赋值6输入输出语句a 表

13、控格式的输入输出:read *,a,bread(*,*)a,b 注意: 各数据间有分隔符: 逗号或空格。 类型匹配:整数:不得带小数点; 实数:可以为整数;小数形式;指数形式 复数:(实部,虚部);实部和虚部可以为整型也可为实型 字符:一串字符,赋值时长度转化;一串字符,即可省略。 逻辑:以t或f作为第一个字母的字符串(点号、空格在前忽略) 如果输入一个整型数,则偶数为假,奇数为真 个数: 1)不得少于变量的个数; 2)可分行输入; 3)多余的数据不起作用 4)每一个read开始一个新的记录 无效值的输入 , , 连续两个逗号,对变量值不影响。 空格可以多个,/ 表示输入数据结束,后面的数据被

14、取消, 没有输入数据的变量值为0;read*,a,b,c 输入: 2,1/3 结果: a=2 b=1 c=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语句:每个开始输出一个新的记录b 输入输出编辑符一般形式:read (,)read ,write (,)print ,格式说明:*、格式语句标号、整型

15、变量、格式字符表达式、数组或数组元素作用:精确地说明每一个数据应该怎样输入或输出,包括类型、小数点位置、有效位数、输出结果的形式1、format语句标号 (为提高程序的可读性,f90中一般不用) write (*,900)int1,real1(3),char1900format(i5,3f5.4,a16)2、整型变量名(使用assign语句) assign 900 to myfmt900format( i5,3f5.4,a16 ) write(*,myfmt)iolist3、字符表达式或变量 write(*,( i5,3f5.4,a16 )iolist或:character(80)mylist

16、 mylist=( i5,3f5.4,a16 ) write(*,mylist)iolist4、数组或数组元素名character(6) array(3) data array / (i5, ,3f5.2, ,a16) / write (*, array) iolist character(80) array(5) array(2) = (i5, 3f5.2, a16) write (*, array(2) iolist1 整型编辑符 riw.m注意: 1数字在指定的区域内右端对齐,不足w则左边补空格。 2负数的符号也包含在字段宽度内 3如果应输出的列数超过了规定的字段宽度,则不输出有效数据,

17、以w个*填充。 4、bn, bz :blank interpretation specifies interpretation of blanks in numeric fields (空格是否当0处理)仅用于输入格式语句,如100 format(bn,2i3)2 实型编辑符 rfw.drew.drgw.d r重复系数w字段宽度(总宽度) d小数部分宽度f编辑符功能:用于实数编辑,小数形式的输出(定点数:单精度实数,4个字节,7个有效数字)f8.3,f6.21 不带小数点 1234567890123456 12345.678 9012.342 带小数点 123.4567345.8910 123

18、.4567 345.89 !d不起作用,取w个宽度,小数点计入w中3 以表控格式 123.12,456.23 123.12 456.23如果:123.4562,23.1436 123.4562 0 !第二个数读入时碰到逗号,表示该数输入结束指数形式的输入 f8.3 1234e3 !1234.000 0.1234e3 !123.400e编辑符功能:格式:数符+0+小数点+小数部分+e+符号+指数部分2位 3 d 4指数部分宽度固定4列,w=d+3+4优点:不必事先估计数的大小,能容纳任意大小的数据。g编辑符功能:根据输出实数大小决定用f或e格式输出。较大或较小,自动按e格式条件:abs(a)10

19、*d 使用e格式输入输出条件:10*dabs(a)=0.1 使用f格式输入输出注意:采用f格式,d为全部数字的总位数,且优先满足整数位数write(*,(g9.4)123.0 !g9.4=f5.1,4xwrite(*,(g9.2)123.0 !g9.2=e9.2 3 逻辑格式编辑符:rlw功能:逻辑值的输入输出规则:输出一个字母,在字段最右端,前面补空格输入时按宽度读取,以第一个字母作为逻辑值,如果第一个字母非t或f,则出错write(*,(l4).true. !输出三个空格和一个t 4 字符格式编辑符:raw a字符型数据的输入:字符变量的长度l对格式起一定的作用 若wl,仅保留右边的l个字

20、符 若wl,右边加l-w个空格 字符变量的输出:输出形式要有w个字符若wl 右对齐,左边补w-l个空格 character(len=5):a a=ab !ab a=abcdefg !abcde read *,a ab !ab abcdefg !abcde read (a3) ab !ab abcde !abc read (a7) abcdefgh !cdefg a=abcde print (a3),a !abc print (a7),a ! abcde 5 x编辑符功能:在输出时产生空格;输入时,表示跳过n个字符 1不需变量对应2.是不可重复的编辑符6 撇号编辑符功能:输入所需的字符串,描述字

21、符串常量。 print (i=,i3),i !错,应将其中一对引号改为双引号7 h编辑符nh注意:1. n 必定等于字符串长度,否则编译出错 print (2hi=,i3),i !正确 print (3hi=,i3),i !出错 2. 字符串中空格有意义 8 斜杠编辑描述符作用:结束本记录的输出并开始下一个记录的输出(换行输出)9 冒号编辑符作用:结束前一个编辑符的功能。注意:1用空格式语句来输出一个空行,如:format() 此时,write,print语句不应有变量输出,否则出现死循环2遇到右括号或斜杠/编辑符,表示结束本记录的输出,但不意味着停止全部输出,只要输出列表中还有未输出变量,将

22、重复使用格式说明或斜杠右边的格式说明组织输出。print (2hi=,/i3),iprint (2hi=,i3),i,j i= 1i= 23format语句和write语句的位置可以相邻,也可在程序的任何一个地方4用表控格式输出时,在write语句中的输出项可以包含字符串但在输出时用到format语句,则不能再包含字符串,否则必须加以说明。print (2hi=,i3),iprint (i3),i=,i !出错 应改为print (a,i3),i=,i 三、选择结构程序设计1关系表达式和逻辑表达式1 关系运算符:注意:相等 = = 不等 /=l 复型常量和变量:只能进行 .eq.、.ne.l

23、.eq.(= =)或.ne.(/=)要小心使用;实型量一般要改写:0.1*10.eq.1为.false. 应改为 abs(0.1*10-1)=1e-6l 两个整型表达式进行逻辑运算结果为整型,而不是逻辑型l 逻辑运算符之间的空格不能省略。特别是.not.与其他逻辑运算符相连时。2 逻辑表达式和计算: 逻辑运算符:not and or eqv(逻辑等)neqv(逻辑不等) xor(异或) 运算优先级:从左到右依次降低3 运算顺序: ( ) 函数 算术 关系 逻辑 高 低4 练习表达式的写法 1、 数学式 abcd !不能出现连不等式 2、 1x2+y206、逻辑型变量a值为真(或为假) !a7、

24、字符变量a为小写字母 !a=a .and. a=a .and. a=a .and. a=0 .and.x=1 .and.x=0)then if(x=1)then if(x=2)then print *,越界 elseif(x=1)then y=2.0 elseif(x=0)then y=1.0 else print *,越界 endifl 举例:任意输入4个整数,把它们按从小到大输出。program mainimplicit noneinteger:a,b,c,d,eread *,a,b,c,dif (ab) thene=a;a=b;b=eendifif(ca) thene=a;a=c;c=b

25、;b=eelseif(cb) thene=b;b=c;c=eendifif(da)thenprint *,d,a,b,celseif(db)thenprint *,a,d,b,celseif(d=0)then if(x=15)then if(x=30)then if(x=45)then if(x=75)then if(xe2且e30或e1e2且e30,则执行循环体直到循环终端语句。(5)执行终端语句后,v增加一个步长e3,循环次数减1,(6) 返回(4)重复执行(4)(5)注意事项:(1)e2不允许为最大整数值(2)e3不允许为零,否则循环不能终止 注意:是判断一个do语句是否成立的条件(3)

26、do循环变量在循环体内不能再次定义 do i=3,6 i=5 !错误 j=j+i enddo m=1do 10 i=1,3,m m=m+i 10 i=i+m(4)循环变量的初值e1、终值e2和步长e3只是在循环入口有效,进入循环后,它的值与循环次数无关。(5)在带循环变量do 结构中仍可使用exit和cycle语句。(6)循环正常退出时,v的值超过循环变量的终值。循环非正常退出时,v保持当前值。例5-4 判断一个整数n是否为素数。(教材85页)(7)循环变量在循环体内不能被重新赋值,但是在循环体外则可被重新赋值。(8)在do结构中包含的if结构和case结构等必须时完整的结构,不允许出现结构的

27、交叉。(9)循环可以不经enddo,但是不能从循环体外转入循环体内。6do while结构 do while结构的一般形式:结构名: do while(逻辑表达式) 循环体 end do 结构名 相当于 do if(.not.逻辑表达式)exit 循环体 end do7do 结构的嵌套一个do结构循环体内可以包含另一个do循环结构,这就是do结构循环嵌套注意:1 内循环必须完全嵌套在外循环体内,不能相互交叉2 循环嵌套中各层的循环控制变量不能同名8隐含do循环隐含do循环实际上是带控制变量的do结构。但简化成只有do结构的第一句,且把do关键字隐去。 隐含do循环的形式为: (list,v=u

28、1,u2,u3)几种常见的隐含do循环的形式:1.按指定步长读写。例如 print *,(x(j),j=1,19,2)2.隐含do循环与普通变量混合使用。例如 print *,a,b,(x(i),i=1,3),c3.用于输出一些特殊符号。例如 print *,(-,i=1,80)4.隐含do循环可以并列出现。例如 read *,(a(i),i=1,4),(b(i),i=1,4)5.隐含do循环可以嵌套使用。例如 print *,(a(i,j),j=1,5),i=1,3) read *,n,(a(i),i=1,n)注意:隐含do循环只能出现在输入和输出语句中9循环程序设计方法: 补充:循环控制的

29、设计方法:1 关键:找出循环体a) 求累加和s=s+tb) 求连乘积t=t*nc) 求x nt=t*xd) 求连加的循环次数s=s+1e) 其他s=s+a a=2 确定循环的初值a) 求累加和初值为0或所给数据的第一项b) 求连乘积初值为1或所给数据的第一项c) 求最大值初值为所给数据的第一项或足够小的量d) 求最小值初值为所给数据的第一项或足够大的量 注意:赋值语句的位置3 循环次数的选定a) 已知累加计算的项数nb) 未知计算项数n,当通项值小于一个值时停止,可取n为一个够大的值。例:歌德巴赫猜想(将一个100200的偶数分解成两个素数之和)program mainlogical:prim

30、e do n=100,200,2 n1=1 do if(n13)then n1=n1+1 else n1=n1+2 endif prime=.true.kend=sqrt(real(n1) do k=2,kend if(mod(n1,k)= =0)prime=.false. enddo if(.not.prime) cycle n2=n-n1;prime=.true. kend=sqrt(real(n2) do k=2,kend if(mod(n2,k)=0) prime=.false. enddo if(.not.prime) cycle write (*,100) n,n1,n2 exit

31、 enddo enddo100 format(1x,i3,=,i3,+,i3) end10加密解密程序:program ex0612implicit none integer i integer strlen integer, parameter : key = 2 character(len=20) : string write(*,*) string: read(*,*) string strlen = len_trim(string) do i = 1, strlen string(i:i) = char( ichar(string(i:i) + key ) end do write(*

32、,(encoded:,a20) string stopendprogram ex0613implicit none integer i integer strlen integer, parameter : key = 2 character(len=20) : string write(*,*) encoded string: read(*,*) string strlen = len_trim(string) do i = 1, strlen string(i:i) = char( ichar(string(i:i) - key ) end do write(*,(string:,a20)

33、 string stopend五、程序过程1函数子程序编写规则:1 函数开始语句的一般形式recursive function 函数名(虚元表)result(结果名)如果函数是递归的,则应以recursive开头。2 函数结束语句是函数的结束标志,将控制返回到主调程序。 end function 函数名 内部子程序必须加上关键字function或subroutine3 函数过程体是函数语句和函数结束语句之间的程序段,分为说明部分和执行部分。说明部分应对程序体内一切变量、数组等实体(包括变元)作出说明,同时还要说明函数结果变量名,但不可说明函数名。4 执行部分中必须对函数结果名至少赋值一次。5

34、虚元只能是变量名、数组名、过程名、指针等。虚元还有可选属性 optional 相关函数present()2接口块功能:用于通知编译程序主调程序调用过程时所需要的接口信息,记录外部子程序的信息,如名字、数字、参数类型等,写在主调程序的说明部分,写在类型说明语句之前,内容是被调用过程的有关说明部分。结构形式:interface ;接口入口 interface body;说明内容end interface ;接口出口说明:接口块是外部子程序头的精确拷贝,定义了它的参数和结果,以及它的end语句。功能简单的程序,不必写接口块。但下列情形必须使用接口块:1、调用的外部过程是一个函数,且函数结果是一个数组

35、;或函数结果值是一个字符型,且长度不是常数,也不是假定长度(*);或被调用过程中的哑元是一个数组片段。2、实际参数是关键字变元,或实际参数是缺省的可选变元。3、一个外部函数使系统中的内在操作符扩展了原有的功能。 interface operator (+) interface operator (.concat.)4、外部过程扩展了赋值号的使用范围。5、用一个类属名调用过程。 interface name3子例子程序结构的一般形式:recusivesubroutine 子程序名(虚元表)declaration statements !说明部分executable statements !执行部

36、分containsinternal subprograms !内部过程end subroutine 子程序名 !过程结束语句过程的另一种形式是子例子程序,它和函数子程序的区别:1. 函数子程序必须有返回值,有result关键字。而子例子程序本身并不返回值,它的计算结果全部都通过虚实结合传递给主调程序。一般用来完成某一个操作,如矩阵的转置、排序等。函数子程序和子例行子程序都不一定只返回一个结果,其他的结果可以通过虚元传递。2.函数子程序的调用就像通常的函数引用一样,出现在表达式中。而子例子程序必须通过call语句来调用。 call 子程序名(实元表)3.从形式上看,子例子程序的结构除第一句和最后

37、一句外,其余部分的编写形式与函数子程序完全相同。4关键字变元:通常在调用过程中要记住虚元名及其位置,而使用关键字变元后,就不必记住虚元的次序了,填写的实元次序可以是任意的。一般形式: 虚元名=实元表达式例如:subroutine sum(m,sum1,sum2)注意:不是每一个实元都必须有确定的值。使用关键字变元调用可写成: call sum(m=n,sum2=sumy,sum1=sumy)注意:关键字变元不需考虑虚元的位置和次序,但必须知道虚元的名字。当部分变元使用关键字变元调用子程序时,第一个关键字变元前面的所有变元都必须与相应的虚元一一对应,一旦使用一个关键字变元,其后面的变元也必须使用

38、关键字变元。(例如:教材110页)program ex0827 implicit none interface real function func(x,a,b,c) ! 定义子程式func的接口 implicit nonereal x real, optional : a,b,c end function end interface write(*,*) func(2.0, c=1.0) ! f(2)=0*22 + 0*2 + 1 = 1 write(*,*) func(2.0, a=2.0, b=1.0) ! f(2)=2*22 + 1*2 + 0 = 10 stopend! 计算func

39、(x)=a*x2+b*x+c! a,b,c不传入的话为0real function func(x,a,b,c) implicit none real x ! x值一定要传入 real, optional : a,b,c ! a,b,c可以不传入 real ra, rb, rc ! 实际计算的数字 if ( present(a) ) then ra=a else ra=0.0 ! 默认值为0 end if if ( present(b) ) then rb=b else rb=0.0 ! 默认值为0 end if if ( present(c) ) then rc=c else rc=0.0 ! 默认值为0 end if ! func(x)=a*x2+b*x+c func = ra*x*2 + rb*x + rc returnend6可选变元:调用时可根据实际需要,只对虚元表中部分虚元作虚实结合。可选择变元必须在过程中被说明成是可选择的。即要求它具有optio

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论