您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 薪酬管理 > FORTRAN学习中的一些小心得
FORTRAN心得第一部分:一些小心得1Fortran不区分大小写2Fortran有5种基本数据类型,integer,real,character,logical,complex3fortranfixedformat格式中的变量赋初值一般用DATA,因为它不能用::4real(kind=8)a这种格式只使用于Fortran90,Fortran77中要使用real*8或real(8)5FORTRAN中FREE与FIXED两种格式do循环的区别:Fortran95使用enddo来结束循环。Fortran77使用DO循环要麻烦一点,它不使用ENDDO来结束循环,而是使用行号来结束循环,程序代码要在DO的后面写清楚这个循环到哪一行程序代码结束。Fortran77中,经常会使用CONTINUE这个命令来结束循环。因为CONTINUE这个命令没有实际的用途,刚好可以拿来做封装使用。6循环的流程控制:循环中的cycle命令相当于c++里的continue命令,用于结束一次循环循环中的exit命令好比c里面的break,用于结束循环7不使用do循环,单纯用GOTO语句也能设计循环程序,但不推荐使用GOTO语句7fortran有等价声明:即用equivalence(a,b),这样使得a,b使用同一块内存,这样可以节省内存,有时可精简代码。8fortran77中只能用单引号。(还有疑问,因为fixedformat能用双引号)9逻辑运算符==/===!Fortran90用法.EQ..NE..GT.GE..LT..LE.!Fortran77用法9PAUSE,CONTINUE,STOPpause暂停程序执行,按enter可继续执行continue貌似没什么用处,可用作封装程序的标志STOP命令用来结束程序,要谨慎使用10数组元素之间要用逗号分隔,而不能像matlab一样既可以用逗号也可以用空格,fortran的数组元素之间不能用空格。11数组的声明:Fortran77中数组的声明,必须使用DIMENSION命令Integera;!先声明a是整型Dimensiona(10)!再声明a是大小为10的数组Fortran95中可以用简单的方法:Integera(10)!最简单的方法Integer,dimension(10)::a!另一种方法12数组的赋值:Fortran77中数组的声明,可以使用DATA命令或隐含式循环来赋初值;Fortran95中可以直接设置初值;如:integer::a(5)=(/1,2,3,4,5/);此时,括号和除号之间不能有空格;13与C不同,Fortran数组索引值默认从1开始,而且可以在声明时改变该规则,如integera(-3:1)!索引值为-3,-2,-1,0,113数组在内存中的存放顺序也与C不同(正好相反),如a(2,2)在内存中的存放顺序为a(1,1),a(2,1),a(1,2),a(2,2);原则是放低维的元素,再放高维的元素,此规则称为columnmajor矩阵输出时也是按列输出。。14Fortran的特色:隐含式循环15a,b都为数组,则可以这样用a=sin(b),(内部函数都可以这样用)16数组专用:where命令形式上类似于if,但只用于设置数组where.....elsewhere...elsewhere...endwhere(没有then)FORALL是Fortran95添加的功能,只能用于数组操作forall可以嵌套使用,还可以在forall中使用where,但where中不能使用forall15Fortran中传递参数的原理与c++不同,Fortran中是传址调用,就是传递时用参数和子程序接受时用的参数使用一个地址,尽管命名可以不同。16调用自定义函数前需要做声明,调用子程序则不需要。17Module中有函数时必须在contains命令之后18全局变量(有的书上叫无名公用区、有名公用区)全局变量用来定义一块共享的内存空间;全局变量不能声明成常量全局变量不能直接使用data命令赋初值,要在blockdata模块中使用data来设置初值。COMMON语句是说明语句,因此它应该出现在相应程序单元中的所有可执行语句之前。取用全局变量时,是根据它们的相对位置关系来作对应,而不是根据变量名称来对应。19传递参数与使用全局变量都可以在不同程序之间共享数据,那什么时候该使用参数,还有什么时候该使用全局变量呢?简单地说,当需要共享的变量不多,而且只有少数几个程序需要使用这些数据时,那就使用参数,需要共享大笔数据,或是有很多不同程序都需要使用这些数据时,就使用全局变量。20INCLUDE命令1INCLUDE命令可以写在任何地方,它只是单纯地用来插入一个文件的内容。2有时候也会应用在声明全局变量,先把声明全局变量的程序代码编写在某个文件中,需要使用全局变量的函数再去INCLUDE这个文件,这样可以减少程序代码。第二部分:格式化输入输出1表控输入输出(即表控格式输入输出)1注意点:不同计算机系统对表控格式输出的规定不同,例如对一个整型数,有的系统规定输出占13列,有的系统规定输出占10列,也有的系统不规定固定的列数而按照数据的实际长度输出,再用一个空格作分隔符。2如果在输入数据行中出现”/”号,表示对READ语句的输入到此结束,未被赋值的变量将不予赋值。2FORMAT语句语句格式:标号FORMAT(格式描述符)例如:write(*,100)i,j,k;100FORMAT(1X,I3,I5,I7),其中,1X是换行控制符(走纸控制),I3表示i变量的值输出占3列,I5表示j变量的值输出占5列1格式描述符主要介绍:I、F、E、X、纵向走纸、'(撇号)、r(重复系数)、/(斜杠)等(1)X描述符作用:用于输出空格一般形式:nX(2)I描述符作用:用于整型数据的输出一般形式:Iw或Iw.n(3)F描述符作用:用于实数的小数形式输出一般形式:Fw.d(4)E描述符作用:用于实数的指数形式输出一般形式:Ew.d其中:E—实数的指数形式输出;w—字段宽度;d—数字部分的小数位数。数值部分<1(5)A描述符作用:用于字符型数据的格式描述一般形式:Aw或A,其中w是字段宽度。(6)‘号描述符作用:用于输出字符常量,即把撇号内的字符串原样照打例如:write(*,100)i,j100format(1x,'i=',i3,'j=',i4)(7)H描述符作用:它的作用与撇号描述符类似,也可以输出字符型常量一般形式:nH建议:建议最好不要使用H描述符,而是使用撇号描述符,避免错误例如:I=123WTRITE(*,100),I100FORMAT(1X,2HI=,I3);(8)斜杠描述符反斜杠\描述符和美元$描述符的作用相同,都是在输出一个记录行后取消回车符,常用于输出字符串与输入数据显示于屏幕同一行的情形。例如:write(*,'(pleaseenteryourname,$)');Read(*,*)My_age(9)重复系数r在format语句中,如果出现几个(或几组)相同的格式编辑符,则可以利用重复系数而只写一个(或一组)编辑符。r——可重复使用的次数。例:write(*,100)n1,n2,x,y1,y2,y3100format(1x,i10,i10,f8.3,f7.2,f7.2,f7.2)↓Format(1x,2i10,f8.3,3f7.2)第三部分:函数操作1语句函数1语句函数的定义REAL(KIND=8)X,FF(X)=X**2+X+12语句函数的调用语句函数一旦被定义后,就可以在本程序单元中被调用。调用的形式和调用内容函数形同,即:语句函数名(实参)2说明语句函数定义语句是非执行语句,它应该放在所有可执行语句之前和所有的说明语句之后。语句函数只能在本程序单元中被使用。2函数子程序1定义的一般形式:类型说明符FUNCTION函数名(形参表)函数主体函数名=表达式;END或者:FUNCTION函数名(形参表)函数主体函数名=表达式;END3子例行程序子例行程序定义的一般形式:SUBROUTINE函数名(形参表)。。。end子例行程序的调用:CALL子程序名(实参)4函数子程序与子例行程序的区别1子例行程序的名称不用来返回函数的处理结果,因此是没有类型的。所以不能定义子例行程序的类型。2子例行程序必须以SUBROUTINE语句开头,以END语句结束。3能用函数子程序实现的功能,都能用子例行程序来实现,反之亦然。因此在程序设计时,要对具体问题选择哪种方式。4由于不能给子例行程序名赋值,所以在将函数子程序转换为子例行程序时,应该增加一个变量用来带回在函数子程序中由函数名带出的子例行程序处理结果。5子例行程序的调用需要专门的CALL语句。5数据块子程序(BLOCKDATA)1数据块子程序是非执行程序单元,因而在其中不能出现任何可执行语句,也不能被别的程序调用。2它是专门用来给有名公用区中的项目赋初值的子程序。注意:COMMON变量不能直接在子程序或主程序中使用DATA命令来设置初值,要在BLOCKDATA程序模块中使用DATA命令来设置初值。3数据块子程序是一个完整的程序单元。它由BLOCKDATA语句开始,END语句结束。4BLOCKDATA只能用来设置全局变量的初值,而且在主程序执行前,全局变量的初值内容就会设置完毕,事实上这一段程序会在主程序执行前就会生效;5全局变量不能声明成常量,所以BLOCKDATA中不能出现PARAMETER。6MODULE1MODULE可以用来封装程序模块,通常是用来把程序中具备相关功能的函数及变量封装在一起。例如需要使用全局变量时,可以把全局变量都声明在MODULE中,需要使用这些变量的函数只要USE这个MODULE就可以使用它们。2MODULE中的变量如果不是声明成全局变量,这些变量被函数使用时,只会是函数中的局部变量。3MODULE中还可以容纳函数,语法如下:Modulemodule_name………!先写声明相关程序代码………contains!从contains后开始写作函数subroutinesub_name………endsubroutine[sub_name]!subroutine不能省略functionfunction_name…………..endfunction[function_name]!function不能省略end这个做法比较符合模块化概念,编写大程序时,可以把程序中属于绘图功能的部分放在moduleGraphics中,把数值计算的部分放在moduleNumerical中。VisualFortran中所提供的一些扩充函数库就用这个方法来归类,像是数值函数库IMSL就放在moduleIMSL,3D绘图程序库OpenGL的函数就放在moduleOpengGL中。使用它们之前都要先useIMSL,useOpenGL。第四部分:FORTRAN的文件操作1记录结构(什么是记录结构)一个数据文件在磁盘上的存放格式确定了文件的记录结构。例如,在DOS或windows下用现有的编辑器建立一个文件S.DAT,其数据存放方式如下:1,2,3,4,56,7,8,9,1011,12,13,14,1516,17,18,19,20文件中存有4行数据,每行5个数据。在建立这些数据时,当每行最后一个数据输完后,打入了一个回车或换行标记(当然这是不可见标记)。以上文件有4行,每行末尾都有一个标记。因此,将每一行称为一个记录。可以这样说,一个记录包括多个数据,以回车或换行标记作为记录的结束。这就是记录的概念。文件中的记录多少,每个记录的数据多少就是这个文件的记录方式—也称为记录结构。由多个数据记录按一定的结构形式存入磁盘,就组成了文件。2open语句的使用:OPEN语句的功能是打开一个文件,其语句的基本格式为:(前后位置可以变化)OPEN(UNIT=number,FILE=filename,STATUS=status,ACCESS=access,…)其中,1.UNIT=numbernumber必须是一个正整数,用来给
本文标题:FORTRAN学习中的一些小心得
链接地址:https://www.777doc.com/doc-6681702 .html