收藏 分销(赏)

《FORTRAN95程序设计》学习笔记.docx

上传人:a199****6536 文档编号:2398579 上传时间:2024-05-29 格式:DOCX 页数:19 大小:37.18KB
下载 相关 举报
《FORTRAN95程序设计》学习笔记.docx_第1页
第1页 / 共19页
《FORTRAN95程序设计》学习笔记.docx_第2页
第2页 / 共19页
《FORTRAN95程序设计》学习笔记.docx_第3页
第3页 / 共19页
《FORTRAN95程序设计》学习笔记.docx_第4页
第4页 / 共19页
《FORTRAN95程序设计》学习笔记.docx_第5页
第5页 / 共19页
点击查看更多>>
资源描述

1、FORTRAN95程序设计学习笔记FORTRAN95程序设计学习笔记 编辑整理:尊敬的读者朋友们:这里是精品文档编辑中心,本文档内容是由我和我的同事精心编辑整理后发布的,发布之前我们对文中内容进行仔细校对,但是难免会有疏漏的地方,但是任然希望(FORTRAN95程序设计学习笔记)的内容能够给您的工作和学习带来便利。同时也真诚的希望收到您的建议和反馈,这将是我们进步的源泉,前进的动力。本文可编辑可修改,如果觉得对您有帮助请收藏以便随时查阅,最后祝您生活愉快 业绩进步,以下为FORTRAN95程序设计学习笔记的全部内容。第 19 页 共 19 页FORTRAN 95程序设计学习笔记66RPG gg

2、 目录 FORTRAN 95程序设计学习笔记1基础知识(基础、字符串、FORMAT、隐式、TYPE)1流程与控制(if、select、do)4数组(声明、隐式循环、整体操作、可变数组)5函数与子程序(子程序、函数、全局变量)6MODULE与面向对象(重载操作符、虚函数)9文件相关(OPEN、WRITE、READ)10指针(指向变量、数组、函数)11Visual Fortran 编译器(DLL,VB调用)12数值算法与IMSL(数值算法插件)14常用库函数(数学、数组、零碎、子程序)15基础知识(基础、字符串、FORMAT、隐式、TYPE) 【小玩意】二进制观察器:装在M.。 Visual St

3、udioDF98bin,有一个Bitviewer,可以观察变量储存方式 【语法】续行:行结尾或行开头使用 符号;注释:使用 ! 符号 【语法】数学表达式:+ ; ; ;/ ;( ;) ;*乘幂 【语法】程序结束:STOP (Ruby的exit) 【语法】输出:write(,),完整写法:write(unit=,fmt=*)n 建议:少用print,尽量用write 【语法】声明n 整型:integer(kind=4) a ;其中kind是使用的bytes数,4 or 2u 其他写法:integer4 a; integer(4) an 浮点:real(kind=4) a ;有效数位6位(1234

4、5678存为1。234567E7),如果是kind8则为15位有效数字u 此外:1E10:单精1010,1D10:双精1010n 复数:complex : a=(2,3)u 实部:real(a) ;虚部:imag(a)n 布尔型:Logical,.true。 和 .false. 【语法与函数】字符串:character(20) stringn 注意理解,fortran的弱智字符串就是一个长度不能变的一维的东西,极其猥琐,和Java、Ruby不能相提并论的n string(13:13) = “a” :对第13个字节的读、存n string(2:3) = “gon string(6) = “我的妈

5、呀:从第6个位置开始设置为“我的妈呀”n a = string_a / string_b:用“/”连接两个字符串n 【常用函数】char(num),ichar(char):ASCII码的转换相关功能n 【常用函数】len(string),len_trim(string):长度,去掉尾部空格后的长度n 【常用函数】index(string,key):找key在string首出现的位置n 【常用函数】trim(string):返回去掉尾部空格的字符串(用途不大)n 【函数】repeat(char,int):返回一个重复int次的char串n character(len=20) string 普通声

6、明;character(len=*) string 接收的时候可自动长度 【规范格式】FORMAT格式化n e.g。u write (*,100) Au 100 format(I4) 这里是100号标识调用的格式n 参数控制符(前面加数字为重复次数,如4I6或aI6.(其中a为一个int))u A5 :输入/出 5个字符 常用功能u I5.4 :输5位整数,最少4位 常用功能u BN,BZ :定义空格为无东西或为0u F5.4,D5。4 :5位浮点数,小数占4位 其中前面一个常用u E5。1E2 :5位浮点,小数占1位,指数占2位u 4X :4个空格 常用功能u / 与 :/为中止本行,为强制

7、不换行 强制不换行常用u Tn,TLn,TRn :移动到第n列 / 左移n列 / 右移n列n Write(,”(2X,I5) a ;一般使用这种方法进行格式化即可,推荐。u 注意,complex要用两个浮点数来输出 IMPLICIT命令(隐式表达) n 默认:I、J、K、L、M、N为整数,其余浮点(不好)n 隐式声明:u implicit integer(A,B,C) : A、B、C开头的自动为整型,无需单独声明u implicit integer(A-F,I,K) :AF、I、K开头的自动为整型u implicit real(MP) : MP开头自动视为浮点数u implicit none

8、: 无隐式声明,最常用,但个人认为在自己有把握的情况下还是可以自定义一些隐式来方便程序书写 【语法】常数parameter的声明n 方法1:real,parameter :: pi=3。14n 方法2:u real piu parameter(pi = 3.14) 【常用功能】类型转换 (real integer)n real (int_a) :返回int_a的浮点数n int(real_a) :返回real_a的整型 【语法】设初值:integer :: a=1 【语法】等价声明:equivalence(array(1,1,5) , A)n 两者使用同一块内存,如上,调用A就是调用array

9、(1,1,5),但是调用A比较快 【语法】type,自定义数据类型,可组合integer,real,char等,类似一个只有公开变量的类u type : personu character(20) :: nameu integer:ageu end type personn 声明:type(person) : an 使用:aname,a.name (Ruby:一个全是attr_accessor的class) 【用途不大的函数】kind的使用:select_ind_kind(n):返回记录n位整数所需的kind;select_real_kind(n,e)n位有效,指数e位所需的kind流程与控制

10、(if、select、do) 【语法】if条件分歧:u if(逻辑) then 注意,避免浮点数相等,浮点用abs(a-b)误差的方法u 程序执行内容u else if(逻辑) thenu 程序执行内容u elseu 程序执行内容u end ifn 单行if:if(逻辑) then 内容 【语法】逻辑标志:= .EQ. ;/= 。NE。 ; 。GT. ;= .GE. ; .LT. ;= 。LE. ;.and. ;。or. ;.not。 【语法】select case功能u select case (某) 这个某可以是整数和字符,Logicalu case (70:90) 这个case只能用常数

11、u 内容u case(60:69)u 内容u case defaultu 内容u end select 【语法】两个小东西:pause:暂停;stop:退出 【语法】二进制的逻辑运算 iand 和 iorn 举例:a = 2(二进制10);b=4(二进制100);c=iand(a,b) 则c=6 【语法】循环结构u do I=1,5,1 分别是开始,结束,step,亦可do while(条件)u 执行内容u enddo 【流程控制语法】n cycle:执行下次循环 (Ruby:next)n exit:循环中断 (Ruby:break) 【署名的循环】u outdo: do I=1,3u inn

12、er: do J=2,4u 内容 署名后可以使用诸如if (。) exit outdo;if(.) cycle inner这种u end do inneru end do outdo 【语法】臭名昭著的:goto 行数数组(声明、隐式循环、整体操作、可变数组) 【语法】数组的声明:Datatype name(size) 其中Datatype是类型也可是自定义的typen 比如:integer a(10) 或 integer , dimension(10) :: an 类似声明多维数组:integer a(3,3) 亦可a(0:3 , -3:3)这样自定义某维范围 【诡异东东】隐式循环与赋初值:

13、Data A /1,2,3,4,5/ ;Data A /53/ 5个3,不是计算n Data(A(I),I=2,4,2) /2,4/ I=2,4,2隐式循环,起、末、STEP,类似do循环n Integer : a(5) = (/1, (2, I=2,4), 5/) 连续3次2,如果(I, I=2,4)则是2,3,4n Write隐式循环:write(,”(I3,I3,/I3,I3)”)(m(r,c),c=1,2),r=1,2) 连续输出m(1,1), m(2,1), m(1,2), m(2,2)n 初始化统一赋值:ingeter : a(5) = 5 ;相当于a(1)=a(2)=。.=a(5

14、) = 5 【语法】数组整体操作:n a = 5 ;将左右值设置为5n a = (/1,2,3/);重设数值,大小要相同n a = b;同位置的这是为相等数值.注意,不是地址连接,是赋值!n a = b + c;a = b c;a = b * c ;a = b / c;a = sin(b) :也是对位置整体的操作 【技巧】其他数组操作:n a(3:5) = 5 ; a(3: ) = 5 ;a(1:3) = b(4:6);a(:,:)=b(:,:,1) 如a(1-5,15)=b(1-5,1-5,1)n a(1:10) = a(10:1:1) 类隐式循环翻转a。注意这里的操作过程,先寄存右式,再赋

15、值左边 【语法】WHEREu where (a3) 对所有a5)这样的东西u b = 2u end where 【语法】FORALL:使用方法forall(范围1,范围2条件)u forall (I=1:5,J=1:5,a(I,J)/=0) a(I,J) = 1/a(I,J)u 相当于:do I=1,5 ;do j=1,5; if a(I,J) /=0 【内存细节】数组保存:假设一个A(3,3),则内存排列:n A(1,1) = A(2,1) = A(3,1) = A(1,2) = A(2,2) = A(3,2) = A(1,3) = A(2,3) = A(3,3)。注意,为了使用告诉cach

16、e,应尽量使用编号相近的内容,选用内存相近的内容。所以integer::a(2,2)=(/1,2,3,4/)就是a(1,1)=1;a(2,1)=2;a(1,2)=3;a(2,2)=4,按内存分配4个东西。 【语法】可变数组n 声明: integer,allocatable :: a( : ) allocatable表示可变数组;a( : )表示可变一维数组;多维的可以a(4,: ),a(: , : )这样。n 分配内存: allocate(a(大小), stat=error) 这个error整型,=0为成功,否则失败n 释放内存: deallocate(a)n 判断是否已经分配内存:alloc

17、ated(某),能够return .true。 / 。false。 (Ruby: if xx != nil)函数与子程序(子程序、函数、全局变量) 【子程序】Subroutineu program main 主程序u 内容 主程序代码u end program main 主程序结束u subroutine sub1(参数) 子程序1,调用方法:call sub1u 内容,注:可以使用return (Ruby return)u end subroutine sub1 子程序1结束n 说明:子程序独立拥有属于自己的变量声明,同时子程序和Ruby一样也是传进来地址,所以可以在子程序中修改传入内容的数

18、值。n 有关字符串:character(*) : first,传进来的时候可以用,大小任意。这种功能用于子程序接受字符串或者初始化给定常量字符串,如:character(*),parameter :: a=123 【函数】functionn 声明函数:real,external :: add ,分别定义返回类型,声明为函数,以及函数名。注意,声明的时候不带参数。u function add(a,b)u real : add,a,b add为返回的参数u end function addn 使用函数时的一个不成文规定:传递进来的东西,只读他的数值就好了,不要去改变他的数值。 【不推荐的方法】全局

19、变量 (建议使用module)u integer::a, bu common a, bn 使用的时候u integer: n1,n2u common n1,n2 (只能和位置对应,和名字不对应,所以common多了比较无奈。此时可以用比如common a(2)这样数组一类的,不过都不如用module)u 此外还可以用比如common /group1/ a这样来分组,初始化需要用block data写在主程序之外,如:l block data 主程序之前就执行,只能赋初值,注意全局变量不能做常量l integer a, bl common /group1/ a,bl data a,b /3,4/

20、l end block data 【小技巧】函数传递参数中的小技巧,不赋值初大小的数值u subroutine userA(num,n2)u integer : num() 不赋值大小u integer :: n2(6) 取地址中的前6个东西,汗。此处也可重设范围,如(-2,2) 【提示】变量生存周期提示:Visual Fortran不自动释放变量内存,所以函数中使用变量的时候一定要使用明显的初始化,不要设置integer : a=1这样的初始化,因为这个是分配内存时的初始化,第二次执行函数会被无视。 【语法技巧】传递函数:u real,external :: func 声明自定义函数u re

21、al,intrinsic :: sin 声明sin是库函数u call execfun(sin)u subroutine execfun(f) 子程序定义u real,external : fu write(*,) f(1。0)u end subroutine 【猥琐】子程序中的特殊参数:integer,intent(in) : a; integer,intent(out): b 表示a只读,b应被重新赋值.这只是编程的时候让编译器帮忙检查错误,对实际没有意义。 【语法】函数的使用接口(Interface)n 用途:1、返回数组,2、参数数目不定,3、返回指针,4、制定参数位置等n 举例:返回

22、数组u interfaceu function rand10(lbound,ubound)l real : lbound,uboundl real : rand10(10) 返回数组u end function; end interfacen 举例:不定参个数u interfaceu function sub(a,b)u integer,optional : b,a 多态,表示a,b可以省略u 定义function时:if(present(b) then(Ruby: if b!=nil)u 此外optional之后可以改变位置,比如上面:result = sub(b=2,a=1),意义不大 【

23、常用函数】随机数功能n 取种子:call Random_Seed()n 制造:call Random_number(t) t是01的随机数,注意也可以是直接生成数组 【语法】递归:声明:recursive integer function f(n) result(as);其中recursive表示可以递归,result(as)这样表示可以用另一个名字做返回的内容,类型还是integer 【语法】内部函数,只能在某范围内调用的函数,contains里面写内容(如函数、子程序定义)即可。 【少用语法】并行处理:pure,elemental,使用有很多限制,如所有参数为intent(in),不能改变

24、全局变量等。声明在定义处,如pure function fc().个人认为暂时用不上这个,以前并行处理不是这么实现 【有用函数】记录时间:character(20):datatime;call data_and_time(data,time)MODULE与面向对象(重载操作符、虚函数) 【语法与范例】module用来封装程序模块范例n module 模块名u private a 可以把a私有化,类内的,Rubyu integer a,bu common a,b 这样就可以使用全局变量名.或:integer,save :: a,bu type plea. 这样即可常用type(plea) : X

25、XXX为一个类型定义u type的定义内容u end typeu Use 父模块名 继承机制u Containsu 定义函数、子程序。像是类的方法,默认均为public,如果需要私有化似乎也可在前面(声明变量之前)private函数名n end modulen 特别提示:当变量重名,可以use A,aa=va (把A的va改名为aa用) 【面向对象】同名函数重载。module中:n interface fu 虚函数,调用的时候自动从下面选一个参型合适的u module procedure fu1u module procedure fu2n end interface 【面向对象】重定义操作符

26、n interface operator(+) 特别说明,赋值号也可重载,用assignment(=)u module procedure add 候选的函数n end interfacen containsn integer function add(a,b) 比如a,b都是自定义type类型,返回一个integer,则可c=a+b这样了。n 说明:定义可以是已有的各种运算符也可是自定义的类型,比如.dot。 (两边有点),等号默认为赋值(参见数组那种),亦可自定义。文件相关(OPEN、WRITE、READ) 【编译器】VF中都放在一个Source Files中,可分别编译为。obj,最后连

27、接为一个。EXE(RMXP的Script Editor,只是多了一个分别编译的过程) 【语法】include 文件名。后缀,相当于把该文件的内容全部ctrlc过来,对编译和执行并没有什么意义 【语法与操作】open 打开文件n open(unit = 编号, file = “hello。txt”)即可打开文件,使用时:write(编号, ) “Hello” 细节:open(unit = 编号, file = filename , form = formated文本格式/unformated二进制格式 , status = new第一次打开/old已存在文件/replace重建/scratch弄

28、个暂存盘可以不要file , access = sequential顺序 / direct 直接, recl = 长度, err=label出错跳转标签, IOStat = var这个数字0出错, b 即 a(15) = b(15)u a = b(1:5:2) 即a(1,2,3) = b(1,3,5)u 同理,allocate(a(5)); a=(/1,2,3,4,5/) 注意这种和allocate的数组不同,必须手动释放子程序霸占的内存.u 同理2,integer,pointer : a( : , : ) 【语法】指针函数 :u interface 注:如果用了module就不用interf

29、ace了u function getmin(p)u integer, pointer :: p( : ) 输入一个指针u integer, pointer : getmin 返回一个指针u end functionu end interface 【数据结构】队列与堆寨(试误法).举例:队列n 定义类型u type :: datalinku integer :: Iu type(datalink) , pointer :: prev,next 两个指针,可以指向datalink的type对象u end type datalinkn 使用u type(datalink),target::node1

30、,node2 声明两个新的类型,需要声明可做targetu node1 = datalink(1,null(),node2) 初始化node1这个type对象,这个地方很有特色,记住.Visual Fortran 编译器(DLL,VB调用) DEBUG & RELEASE:Build Set Active Configuration选择编译模式。Release和Debug的执行效率有几倍的差距.所以发布的版本最好要用Release格式。 静态链接库:选择Fortran Static Library格式的new Project,这种东西编译后生成*.lib (只有函数没有program) 使用这

31、种lib的时候:Fortran Concole Application里面加入*.lib即可。 常用目录 / 文件设置n tool options 选择Directories标签。Library files(*.lib) / include Files(.mod,即module)n Project Settings | Link标签,设置常用。lib,这里的Debug可以设置output的。exe相对位置 DLL动态链接库(Project : Fortran Dynamic Link Library)n 这个。dll可以拿给别的程序用,无需重新编译。n 设置可被外界调用的程序u subrout

32、ine sub()u !DEC$ ATTRIBUTES DLLEXPORT :: SUB 这个是注释,是给fortran看的注释,用于被外界用的dll函数n 编译后生成XXX。dll和XXX。libn 使用时,把XXX.lib加入自己的project并把xxx.dll放到最终的.exe同目录下。(注:有时会出现要求手动设置) 执行时间分析: Build Profile 优化程序的观念:加减快于乘除,乘法快于乘幂 Visual Basic和DELPHI中调用Fortran的程序(重要):n Fortran:某函数中:u !DEC ATTRIBUTES DLLEXPORT :: CIRCLE_AR

33、EA ,函数名编译后会变成全部大写。u !DEC$ ATTRIBUTES ALIAS : ”ca” : CIRCLE_AREA , 强制把函数CIRCLE_AREA编译为ca这个名字。u 这样就行了。注意,别的很多语言中(C,VB,DELPHI)传递字符串要传字符串和长度,所以Fortran输入字符串只有一个,别人要用两个。n 举例:u Fortran中l subroutine Makelower(string)l !DEC ATTRIBUTES DLLEXPORT :: MAKELOWERl .。 end subroutineu VB中l Private Declare Sub MAKELO

34、WER lib “forlib.dll”(ByVal s As String , ByVal I As Long)l 使用:call MAKELOWER(“aBcDe”,len(“aBcDe))u DELPHI中l Implementationl Function MAKELOWER(r:String ; I:Longint);stdcall;external forlib.dlll R , *.dfml 使用:MAKELOWER(Edit2.text, length(Edit2.text) 【超重要功能】全文件搜索:Edit Find in Files (RMXP的ctrl+shift+F)

35、 【快捷键】ctrl+L :删除一行数值算法与IMSL(数值算法插件) 常用算法(需要的时候自己搜索):n 求解非线性函数:二分法Bisection,割线法Secant,牛顿法n 积分:梯形积分法,SIMPSON辛普森积分n 插值与曲线近似:拉格朗日插值,牛顿插值法(Forward Interpolation),Least Square,曲线近似法(Cubic Spline)n 排序方法:冒泡排序法,选择排序法,Shell排序法,快速排序法n 搜索:顺序搜索,二元搜索(先排序),哈希Hashing搜索思想n 树状结构:二叉树等 IMSL函数库:位置:Microsoft Visual Studi

36、oDF98IMSL (HELP),使用前先设置路径。之后Use IMSL即可n 矩阵运算u A .x. B 矩阵相乘u .i。A 矩阵求逆u .t。A 矩阵转置u A .ix. B 矩阵A逆乘以B;类似还有A.xi。B,A。tx。Bu R = CHOL(A) A = RTRu Q = ORTH(A , R=R) A=QR,QTQ=Iu F = DEF(A) 求行列式值u K = RANK(A) 求矩阵的rank值u Z = EYE(N) 得到N*N的单位阵u A = DIAG(X) 以X Vector设置对角阵u X = DIAGONALS(A) 把A的对角线取出u Y = FFT(X,WOR

37、K=W) ; X = IFFT(Y,WORK=W) 傅立叶变换u A = RAND(A) 把矩阵设置为01随机数n 高斯方程组:AX=B:call lin_sol_gen(A,B,X),要求二维数组。n 多项式函数:ZPLRC,ZPORC,ZPOCC,DZPLRC,DZPORC,DZPOCC.都差不多,自己查帮助,举例:ZPLRC(integer NDEG, real COEFF(NDEG+1) , complex ROOT(NDEG),分别是次数,各项系数,解(复数数组)n 任意函数:(D)ZANLY,(D)ZBREN,(D)ZREALn 非线性方程组:(D)NEQNF, (D)NEQNJ,

38、 (D)NEQBF , (D)NEQBFn 微积分:积分(D)QDAGS,(D)QDAGP,(D)QDAGI;多重积分(D)TWODQ,(D)AND,微分:(D)DERIVn 微分方程:常微分方程:IVPRK,IVMRK,IVPRG;(D)BVPFD、(D)BVPMS(难用)n 插值与曲线近似:曲线近似:(D)CSIEZ、(D)CSINT、(D)CSVAL;最小方差:(D)RLINE线性,(D)RCVRV多项式,(D)FNLSQ常用库函数(数学、数组、零碎、子程序) 数学:sin(x),cos(x),asin(x),acos(x),tan(x),atan(x),sinH(x)正切,cosH(x

39、),tanH(x),exp(x),log(x),log10(x) 零七八碎:n ABS(x) 绝对值n AIMAG(x) 返回复数C的虚部n AINT( r ) 返回射去小数的参数值n CEILING(a) 等于或大于a的最小整数;FLOOR(a)等于或小于a的最大整数n INT(a) 转成整型n Max(a,b,c) , Min(a,b,c) 最大最小值n MOD(a,b) ,取余abn REAL(a) ,转成浮点n Epsilon(x) 给一个特小的数,输入x无所谓.用于浮点数相等的误差n HUGE(x) x可记录的最大值n PRESENT(x) 看看x是否有参数传递进来 (Ruby :

40、if x!= nil) 数组专用:n ANY (a=3) ,a中是否有等于3的? ANY(mask ,dim)n ALL(a5) a中全大于5, ALL(a4,2) 二维全小于4n Count(a=3 ,dim) 看看a中有多少等于3的n CSHIFT(array, shift ,dim) 循环平移shift位n DOT_PRODUCT(a,b) 求a和b的内积n EOSHIFT(array, shift ,boundary ,dim) 移位后用boundary填充空位n LBOUND(array ,dim) 求下限;UBOUND(array ,dim) 求上限n Size(array ,dim) 返回数组的大小n MATMUL(a,b) 矩阵a*bn Minval / Maxval (array ,dim ,mask) 找最小值最大值,mask可以有条件n MinLOC / MaxLOC (array ,dim ,mask) 找最小值最大值的位置 两个常用子程序n Data_and_time(data,time,zone,value) 获得时间。其中data,time是字符串n Random_Seed(),Random_number(r) 随机数,可输入数组

展开阅读全文
相似文档                                   自信AI助手自信AI助手
猜你喜欢                                   自信AI导航自信AI导航
搜索标签

当前位置:首页 > 考试专区 > 中考

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        获赠5币

©2010-2024 宁波自信网络信息技术有限公司  版权所有

客服电话:4008-655-100  投诉/维权电话:4009-655-100

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服