《FORTRAN 95程序设计》学习笔记.docx
- 文档编号:25570754
- 上传时间:2023-06-09
- 格式:DOCX
- 页数:20
- 大小:28.35KB
《FORTRAN 95程序设计》学习笔记.docx
《《FORTRAN 95程序设计》学习笔记.docx》由会员分享,可在线阅读,更多相关《《FORTRAN 95程序设计》学习笔记.docx(20页珍藏版)》请在冰豆网上搜索。
《FORTRAN95程序设计》学习笔记
《FORTRAN95程序设计》学习笔记
66RPGgg
★目录★
基础知识(基础、字符串、FORMAT、隐式、TYPE)
★【小玩意】二进制观察器:
装在M..VisualStudio\DF98\bin,有一个Bitviewer,可以观察变量储存方式
★【语法】续行:
行结尾或行开头使用&符号;注释:
使用!
符号
★【语法】数学表达式:
+;-;*;/;(;);**乘幂
★【语法】程序结束:
STOP(Ruby的exit)
★【语法】输出:
write(*,*),完整写法:
write(unit=*,fmt=*)
⏹建议:
少用print,尽量用write
★【语法】声明
⏹整型:
integer(kind=4)a;其中kind是使用的bytes数,4or2
◆其他写法:
integer*4a;integer(4)a
⏹浮点:
real(kind=4)a;有效数位6位(12345678存为1.234567E7),如果是kind8则为15位有效数字
◆此外:
1E10:
单精10^10,1D10:
双精10^10
⏹复数:
complex:
:
a=(2,3)
◆实部:
real(a);虚部:
imag(a)
⏹布尔型:
Logical,.true.和.false.
★【语法与函数】字符串:
character(20)string
⏹注意理解,fortran的弱智字符串就是一个长度不能变的一维的东西,极其猥琐,和Java、Ruby不能相提并论的
⏹string(13:
13)=“a”:
对第13个字节的读、存
⏹string(2:
3)=“go”
⏹string(6)=“我的妈呀”:
从第6个位置开始设置为“我的妈呀”
⏹a=string_a//string_b:
用“//”连接两个字符串
⏹【常用函数】char(num),ichar(char):
ASCII码的转换相关功能
⏹【常用函数】len(string),len_trim(string):
长度,去掉尾部空格后的长度
⏹【常用函数】index(string,key):
找key在string首出现的位置
⏹【常用函数】trim(string):
返回去掉尾部空格的字符串(用途不大)
⏹【函数】repeat(char,int):
返回一个重复int次的char串
⏹character(len=20)string普通声明;character(len=*)string接收的时候可自动长度
★【规范格式】FORMAT格式化
⏹e.g.
◆write(*,100)A
◆100format(I4)这里是100号标识调用的格式
⏹参数控制符(前面加数字为重复次数,如4I6或I6。
(其中a为一个int))
◆A5:
输入/出5个字符常用功能
◆I5[.4]:
输5位整数,最少4位常用功能
◆BN,BZ:
定义空格为无东西或为0
◆F5.4,D5.4:
5位浮点数,小数占4位其中前面一个常用
◆E5.1[E2]:
5位浮点,小数占1位,指数占2位
◆4X:
4个空格常用功能
◆/与\:
/为中止本行,\为强制不换行强制不换行常用
◆Tn,TLn,TRn:
移动到第n列/左移n列/右移n列
⏹Write(*,”(2X,I5)”)a;一般使用这种方法进行格式化即可,推荐。
◆注意,complex要用两个浮点数来输出
★IMPLICIT命令(隐式表达)
⏹默认:
I、J、K、L、M、N为整数,其余浮点(不好)
⏹隐式声明:
◆implicitinteger(A,B,C):
A、B、C开头的自动为整型,无需单独声明
◆implicitinteger(A-F,I,K):
A-F、I、K开头的自动为整型
◆implicitreal(M-P):
M-P开头自动视为浮点数
◆implicitnone:
无隐式声明,最常用,但个人认为在自己有把握的情况下还是可以自定义一些隐式来方便程序书写
★【语法】常数parameter的声明
⏹方法1:
real,parameter:
:
pi=3.14
⏹方法2:
◆realpi
◆parameter(pi=3.14)
★【常用功能】类型转换(realinteger)
⏹real(int_a):
返回int_a的浮点数
⏹int(real_a):
返回real_a的整型
★【语法】设初值:
integer:
:
a=1
★【语法】等价声明:
equivalence(array(1,1,5),A)
⏹两者使用同一块内存,如上,调用A就是调用array(1,1,5),但是调用A比较快
★【语法】type,自定义数据类型,可组合integer,real,char等,类似一个只有公开变量的类
◆type:
:
person
◆character(20):
:
name
◆integer:
:
age
◆endtypeperson
⏹声明:
type(person):
:
a
⏹使用:
a%name,a.name(Ruby:
一个全是attr_accessor的class)
★【用途不大的函数】kind的使用:
select_ind_kind(n):
返回记录n位整数所需的kind;select_real_kind(n,e)n位有效,指数e位所需的kind
流程与控制(if、select、do)
★【语法】if条件分歧:
◆if(逻辑)then注意,避免浮点数相等,浮点用abs(a-b)<误差的方法
◆程序执行内容
◆elseif(逻辑)then
◆程序执行内容
◆else
◆程序执行内容
◆endif
⏹单行if:
if(逻辑)then内容
★【语法】逻辑标志:
==.EQ.;/=.NE.;>.GT.;>=.GE.;<.LT.;<=.LE.;.and.;.or.;.not.
★【语法】selectcase功能
◆selectcase(某)这个某可以是整数和字符,Logical
◆case(70:
90)这个case只能用常数
◆内容
◆case(60:
69)
◆内容
◆casedefault
◆内容
◆endselect
★【语法】两个小东西:
pause:
暂停;stop:
退出
★【语法】二进制的逻辑运算iand和ior
⏹举例:
a=2(二进制10);b=4(二进制100);c=iand(a,b)则c=6
★【语法】循环结构
◆doI=1,5,1分别是开始,结束,step,亦可dowhile(条件)
◆执行内容
◆enddo
★【流程控制语法】
⏹cycle:
执行下次循环(Ruby:
next)
⏹exit:
循环中断(Ruby:
break)
★【署名的循环】
◆outdo:
doI=1,3
◆inner:
doJ=2,4
◆内容署名后可以使用诸如if(..)exitoutdo;if(..)cycleinner这种
◆enddoinner
◆enddooutdo
★【语法】臭名昭著的:
goto行数
数组(声明、隐式循环、整体操作、可变数组)
★【语法】数组的声明:
Datatypename(size)其中Datatype是类型也可是自定义的type
⏹比如:
integera(10)或integer,dimension(10):
:
a
⏹类似声明多维数组:
integera(3,3)亦可a(0:
3,-3:
3)这样自定义某维范围
★【诡异东东】隐式循环与赋初值:
DataA/1,2,3,4,5/;DataA/5*3/5个3,不是计算
⏹Data(A(I),I=2,4,2)/2,4/I=2,4,2隐式循环,起、末、STEP,类似do循环
⏹Integer:
:
a(5)=(/1,(2,I=2,4),5/)连续3次2,如果(I,I=2,4)则是2,3,4
⏹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)
⏹初始化统一赋值:
ingeter:
:
a(5)=5;相当于a
(1)=a
(2)=..=a(5)=5
★【语法】数组整体操作:
⏹a=5;将左右值设置为5
⏹a=(/1,2,3/);重设数值,大小要相同
⏹a=b;同位置的这是为相等数值。
注意,不是地址连接,是赋值!
⏹a=b+c;a=b–c;a=b*c;a=b/c;a=sin(b):
也是对位置整体的操作
★【技巧】其他数组操作:
⏹a(3:
5)=5;a(3:
)=5;a(1:
3)=b(4:
6);a(:
:
)=b(:
:
1)如a(1-5,1-5)=b(1-5,1-5,1)
⏹a(1:
10)=a(10:
1:
-1)类隐式循环翻转a。
注意这里的操作过程,先寄存右式,再赋值左边
★【语法】WHERE
◆where(a<3)对所有a<3的位置
◆b=1设置b=1,注意,a、b同大小
◆elsewhere亦可elsewhere(a>5)这样的东西
◆b=2
◆endwhere
★【语法】FORALL:
使用方法forall(范围1,范围2…条件)
◆forall(I=1:
5,J=1:
5,a(I,J)/=0)a(I,J)=1/a(I,J)
◆相当于:
doI=1,5;doj=1,5;ifa(I,J)/=0…
★【内存细节】数组保存:
假设一个A(3,3),则内存排列:
⏹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)。
注意,为了使用告诉cache,应尽量使用编号相近的内容,选用内存相近的内容。
所以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个东西。
★【语法】可变数组
⏹声明:
integer,allocatable:
:
a(:
)allocatable表示可变数组;a(:
)表示可变一维数组;多维的可以a(4,:
),a(:
:
)这样。
⏹分配内存:
allocate(a(大小),stat=error)这个error整型,=0为成功,否则失败
⏹释放内存:
deallocate(a)
⏹判断是否已经分配内存:
allocated(某),能够return.true./.false.(Ruby:
ifxx!
=nil)
函数与子程序(子程序、函数、全局变量)
★【子程序】Subroutine
◆programmain主程序
◆内容主程序代码
◆endprogrammain主程序结束
◆subroutinesub1(参数)子程序1,调用方法:
callsub1
◆内容,注:
可以使用return(Rubyreturn)
◆endsubroutinesub1子程序1结束
⏹说明:
子程序独立拥有属于自己的变量声明,同时子程序和Ruby一样也是传进来地址,所以可以在子程序中修改传入内容的数值。
⏹有关字符串:
character(*):
:
first,传进来的时候可以用*,大小任意。
这种功能用于子程序接受字符串或者初始化给定常量字符串,如:
character(*),parameter:
:
a=”123”
★【函数】function
⏹声明函数:
real,external:
:
add,分别定义返回类型,声明为函数,以及函数名。
注意,声明的时候不带参数。
◆functionadd(a,b)
◆real:
:
add,a,badd为返回的参数
◆endfunctionadd
⏹使用函数时的一个不成文规定:
传递进来的东西,只读他的数值就好了,不要去改变他的数值。
★【不推荐的方法】全局变量(建议使用module)
◆integer:
:
a,b
◆commona,b
⏹使用的时候
◆integer:
:
n1,n2
◆commonn1,n2(只能和位置对应,和名字不对应,所以common多了比较无奈。
此时可以用比如commona
(2)这样数组一类的,不过都不如用module)
◆此外还可以用比如common/group1/a这样来分组,初始化需要用blockdata写在主程序之外,如:
●blockdata主程序之前就执行,只能赋初值,注意全局变量不能做常量
●integera,b
●common/group1/a,b
●dataa,b/3,4/
●endblockdata
★【小技巧】函数传递参数中的小技巧,不赋值初大小的数值
◆subroutineuserA(num,n2)
◆integer:
:
num(*)不赋值大小
◆integer:
:
n2(6)取地址中的前6个东西,汗。
此处也可重设范围,如(-2,2)
★【提示】变量生存周期提示:
VisualFortran不自动释放变量内存,所以函数中使用变量的时候一定要使用明显的初始化,不要设置integer:
:
a=1这样的初始化,因为这个是分配内存时的初始化,第二次执行函数会被无视。
★【语法技巧】传递函数:
◆real,external:
:
func声明自定义函数
◆real,intrinsic:
:
sin声明sin是库函数
◆callexecfun(sin)
◆subroutineexecfun(f)子程序定义
◆real,external:
:
f
◆write(*,*)f(1.0)
◆endsubroutine
★【猥琐】子程序中的特殊参数:
integer,intent(in):
:
a;integer,intent(out):
:
b表示a只读,b应被重新赋值。
这只是编程的时候让编译器帮忙检查错误,对实际没有意义。
★【语法】函数的使用接口(Interface)
⏹用途:
1、返回数组,2、参数数目不定,3、返回指针,4、制定参数位置等
⏹举例:
返回数组
◆interface
◆functionrand10(lbound,ubound)
●real:
:
lbound,ubound
●real:
:
rand10(10)返回数组
◆endfunction;endinterface
⏹举例:
不定参个数
◆interface
◆functionsub(a,b)
◆integer,optional:
:
b,a多态,表示a,b可以省略
◆定义function时:
if(present(b))then…(Ruby:
ifb!
=nil)
◆此外optional之后可以改变位置,比如上面:
result=sub(b=2,a=1),意义不大
★【常用函数】随机数功能
⏹取种子:
callRandom_Seed()
⏹制造:
callRandom_number(t)t是0-1的随机数,注意也可以是直接生成数组
★【语法】递归:
声明:
recursiveintegerfunctionf(n)result(as);其中recursive表示可以递归,result(as)这样表示可以用另一个名字做返回的内容,类型还是integer
★【语法】内部函数,只能在某范围内调用的函数,contains里面写内容(如函数、子程序定义)即可。
★【少用语法】并行处理:
pure,elemental,使用有很多限制,如所有参数为intent(in),不能改变全局变量等。
声明在定义处,如purefunctionfc()。
个人认为暂时用不上这个,以前并行处理不是这么实现……
★【有用函数】记录时间:
character(20):
datatime;calldata_and_time(data,time)
MODULE与面向对象(重载操作符、虚函数)
★【语法与范例】module用来封装程序模块范例
⏹module模块名
◆privatea可以把a私有化,类内的,Ruby@
◆integera,b
◆commona,b这样就可以使用全局变量名。
或:
integer,save:
:
a,b
◆typeplea..这样即可常用type(plea):
:
XXXX为一个类型定义
◆type的定义内容
◆endtype
◆Use父模块名继承机制
◆Contains
◆定义函数、子程序。
像是类的方法,默认均为public,如果需要私有化似乎也可在前面(声明变量之前)private函数名
⏹endmodule
⏹特别提示:
当变量重名,可以useA,aa=>va(把A的va改名为aa用)
★【面向对象】同名函数重载。
module中:
⏹interfacefu虚函数,调用的时候自动从下面选一个参型合适的
◆moduleprocedurefu1
◆moduleprocedurefu2
⏹endinterface
★【面向对象】重定义操作符
⏹interfaceoperator(+)特别说明,赋值号也可重载,用assignment(=)
◆moduleprocedureadd候选的函数
⏹endinterface
⏹contains
⏹integerfunctionadd(a,b)比如a,b都是自定义type类型,返回一个integer,则可c=a+b这样了。
⏹说明:
定义可以是已有的各种运算符也可是自定义的类型,比如.dot.(两边有点),等号默认为赋值(参见数组那种),亦可自定义。
文件相关(OPEN、WRITE、READ)
★【编译器】VF中都放在一个SourceFiles中,可分别编译为*.obj,最后连接为一个.EXE(RMXP的ScriptEditor,只是多了一个分别编译的过程)
★【语法】include‘文件名.后缀’,相当于把该文件的内容全部ctrl-c过来,对编译和执行并没有什么意义
★【语法与操作】open打开文件
⏹open(unit=编号,file=“hello.txt”)即可打开文件,使用时:
write(编号,*)“Hello”
★细节:
open(unit=编号,file=filename,form=‘formated文本格式/unformated二进制格式’,status=‘new第一次打开/old已存在文件/replace重建/scratch弄个暂存盘可以不要file’,access=‘sequential顺序/direct直接’,recl=长度,err=label出错跳转标签,IOStat=var这个数字>0出错,<0文件终了,=0正常,action=‘readwrite/read/write’)
★【重要语法】write/read(unit=number,fmt=Format,NML=namelist(专读某个namelish,无用),rec=record(直读文件终,设置所读写文件模块位置),Iostat=var,ERR=label,END=label(遇到文件结尾的跳转标签),ADVANCE=‘yes/no是否读写后换行’)
★【语法】判断文件存在:
inquire:
inquire(file=filename,exist=alive)
★【语法】关闭文件close(fileid,status=‘keep/delete是否删除文件’)
★【其他极少用的】rewind(编号):
把读写位置返回开头;backspace(..),endfile()
★【操作】文件操作:
顺序文件、直接访问文件、二进制
⏹顺序文件:
read(unit=id,fmt=“..”,iostat=..)接受read的东西;这样反复循环读一行一行,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)
◆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了
◆functiongetmi
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- FORTRAN 95程序设计 FORTRAN 95程序设计学习笔记 FORTRAN 95 程序设计 学习 笔记