内容发布更新时间 : 2024/12/25 1:46:56星期一 下面是文章的全部内容请认真阅读。
《Fortran95 程序设计》学习笔记 by 柳柳
一行一行,iostat那个/=0就over了。(Ruby : readline)
? 直接访问文件的操作(还是分行的操作):open的时候设置recl的大小,然后类似:
? read(id , fmt , rec = 编号, ..)XX读编号内容即可。注意:recl=6则1行为4个
字符内容(有两个是”\\n”)
? 二进制文件的操作,与上面相比,改用form = “unformatted”
★ 【重要功能】内部文件与字符串,数字转换:把unit改为 = 字符串,读入数字即可做
到数字转字符串;反之亦可。
★ 【语法】namelist:namelist /na/ a,b,c 输入输出如下 (没用的功能)
? &na ? A=1 ? B=2 ? /
指针(指向变量、数组、函数)
★ 【语法与范例】指针指到变量
? integer, target :: a=1 ?声明一个可以当成目标的变量 ? integer, pointer :: p=1 ?声明一个可以指向整数的指针
? p => a ?设置指向(也可以不指,allocate(p)即可开地址,deallocate(p)干掉
地址。用起来像是个可释放的变量) ? p = 3 ?设置P位置的内存数据
★ 【语法】设置空指针:p => null() 或
? integer , pointer :: p ? nullify(p)
★ 【语法】判断指针是否已经设置内容:associated(pointer,[target]) 。这里如果有target可
以判断指针是否指向target内容。 ★ 【语法与例子】指针数组
? integer , pointer :: a( : ) 声明一维指针数组 ? integer , target :: b(5) = (/1,2,3,4,5/) ? a => b 即 a(1-5) = b(1-5)
第 11 页 共 16 页
《Fortran95 程序设计》学习笔记 by 柳柳
? a => b(1:5:2) 即a(1,2,3) = b(1,3,5)
? 同理,allocate(a(5)); a=(/1,2,3,4,5/) 注意这种和allocate的数组不同,必须手动
释放子程序霸占的内存。 ? 同理2,integer,pointer :: a( : , : )
★ 【语法】指针函数 :
? interface ?注:如果用了module就不用interface了 ? function getmin(p)
? integer, pointer :: p( : ) 输入一个指针 ? integer, pointer :: getmin 返回一个指针 ? end function ? end interface
★ 【数据结构】队列与堆寨(试误法)。举例:队列
? 定义类型
? type :: datalink ? integer :: I
? type(datalink) , pointer :: prev,next ?两个指针,可以指向datalink的type对象 ? end type datalink ? 使用
? type(datalink),target::node1,node2 ?声明两个新的类型,需要声明可做target ? 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) ?使用这种lib的时候:Fortran Concole Application里面加入*.lib即可。
★ 常用目录 / 文件设置
第 12 页 共 16 页
《Fortran95 程序设计》学习笔记 by 柳柳
? tool > options 选择Directories标签。Library files(*.lib) / include Files(*.mod,即
module)
? Project > Settings | Link标签,设置常用.lib,这里的|Debug可以设置output的.exe
相对位置
★ DLL动态链接库(Project : Fortran Dynamic Link Library)
? 这个.dll可以拿给别的程序用,无需重新编译。 ? 设置可被外界调用的程序
? subroutine sub()
? !DEC$ ATTRIBUTES DLLEXPORT :: SUB ?这个是注释,是给fortran看的
注释,用于被外界用的dll函数
? 编译后生成XXX.dll和XXX.lib
? 使用时,把XXX.lib加入自己的project并把xxx.dll放到最终的.exe同目录下。(注:
有时会出现要求手动设置)
★ 执行时间分析: Build > Profile
★ 优化程序的观念:加减快于乘除,乘法快于乘幂
★ Visual Basic和DELPHI中调用Fortran的程序(★重要★):
? Fortran:某函数中:
? !DEC$ ATTRIBUTES DLLEXPORT :: CIRCLE_AREA ,函数名编译后会变成
全部大写。
? !DEC$ ATTRIBUTES ALIAS : ”ca” :: CIRCLE_AREA , 强制把函数
CIRCLE_AREA编译为ca这个名字。
? 这样就行了。注意,别的很多语言中(C,VB,DELPHI)传递字符串要传字符
串和长度,所以Fortran输入字符串只有一个,别人要用两个。
? 举例:
? Fortran中
? subroutine Makelower(string)
? !DEC$ ATTRIBUTES DLLEXPORT :: MAKELOWER ? .. end subroutine ? VB中
? Private Declare Sub MAKELOWER lib “forlib.dll”(ByVal s As String , ByVal
第 13 页 共 16 页
《Fortran95 程序设计》学习笔记 by 柳柳
I As Long)
? 使用:call MAKELOWER(“aBcDe”,len(“aBcDe”)) ? DELPHI中
? Implementation
? Function MAKELOWER(r:String ; I:Longint);stdcall;external ?forlib.dll? ? {$R , *.dfm}
? 使用:MAKELOWER(Edit2.text, length(Edit2.text))
★ 【超重要功能】全文件搜索:Edit > Find in Files (RMXP的ctrl+shift+F) ★ 【快捷键】ctrl+L :删除一行
数值算法与IMSL(数值算法插件)
★ 常用算法(需要的时候自己搜索):
? 求解非线性函数:二分法Bisection,割线法Secant,牛顿法 ? 积分:梯形积分法,SIMPSON辛普森积分
? 插值与曲线近似:拉格朗日插值,牛顿插值法(Forward Interpolation),Least Square,
曲线近似法(Cubic Spline)
? 排序方法:冒泡排序法,选择排序法,Shell排序法,快速排序法 ? 搜索:顺序搜索,二元搜索(先排序),哈希Hashing搜索思想 ? 树状结构:二叉树等
★ IMSL函数库:位置:\\Microsoft Visual Studio\\DF98\\IMSL (\\HELP),使用前先设置路径。
之后Use IMSL即可 ? 矩阵运算
? A .x. B 矩阵相乘 ? .i.A 矩阵求逆 ? .t.A 矩阵转置
? A .ix. B 矩阵A逆乘以B;类似还有A.xi.B,A.tx.B ? R = CHOL(A) A = RTR
? Q = ORTH(A , [R=R]) A=QR,QTQ=I ? F = DEF(A) 求行列式值
第 14 页 共 16 页
《Fortran95 程序设计》学习笔记 by 柳柳
? K = RANK(A) 求矩阵的rank值 ? Z = EYE(N) 得到N*N的单位阵 ? A = DIAG(X) 以X Vector设置对角阵 ? X = DIAGONALS(A) 把A的对角线取出
? Y = FFT(X,[WORK=W]) ; X = IFFT(Y,[WORK=W]) 傅立叶变换 ? A = RAND(A) 把矩阵设置为0~1随机数
? 高斯方程组:AX=B:call lin_sol_gen(A,B,X),要求二维数组。
? 多项式函数:ZPLRC,ZPORC,ZPOCC,DZPLRC,DZPORC,DZPOCC。都差
不多,自己查帮助,举例:ZPLRC(integer NDEG, real COEFF(NDEG+1) , complex ROOT(NDEG)),分别是次数,各项系数,解(复数数组) ? 任意函数:(D)ZANLY,(D)ZBREN,(D)ZREAL
? 非线性方程组:(D)NEQNF, (D)NEQNJ, (D)NEQBF , (D)NEQBF
? 微积分:积分(D)QDAGS,(D)QDAGP,(D)QDAGI;多重积分(D)TWODQ,(D)AND,
微分:(D)DERIV
? 微分方程:常微分方程:IVPRK,IVMRK,IVPRG;(D)BVPFD、(D)BVPMS(难
用)
? 插值与曲线近似:曲线近似:(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),tanH(x),
exp(x),log(x),log10(x) ★ 零七八碎:
? ABS(x) 绝对值
? AIMAG(x) 返回复数C的虚部 ? AINT( r ) 返回射去小数的参数值
? CEILING(a) 等于或大于a的最小整数;FLOOR(a)等于或小于a的最大整数 ? INT(a) 转成整型
? Max(a,b,c…) , Min(a,b,c…) 最大最小值
第 15 页 共 16 页