《FORTRAN 95程序设计》学习笔记

  • 格式:doc
  • 大小:84.50 KB
  • 文档页数:16

《FORTRAN 95程序设计》学习笔记66RPG gg★目录★《FORTRAN 95程序设计》学习笔记 (1)基础知识(基础、字符串、FORMAT、隐式、TYPE) (1)流程与控制(if、select、do) (4)数组(声明、隐式循环、整体操作、可变数组) (5)函数与子程序(子程序、函数、全局变量) (6)MODULE与面向对象(重载操作符、虚函数) (9)文件相关(OPEN、WRITE、READ) (10)指针(指向变量、数组、函数) (11)Visual Fortran 编译器(DLL,VB调用) (12)数值算法与IMSL(数值算法插件) (14)常用库函数(数学、数组、零碎、子程序) (15)基础知识(基础、字符串、FORMAT、隐式、TYPE)★【小玩意】二进制观察器:装在M.. Visual Studio\DF98\bin,有一个Bitviewer,可以观察变量储存方式★【语法】续行:行结尾或行开头使用& 符号;注释:使用! 符号★【语法】数学表达式:+ ;- ;* ;/ ;( ;) ;**乘幂★【语法】程序结束:STOP (Ruby的exit)★【语法】输出:write(*,*),完整写法:write(unit=*,fmt=*)⏹建议:少用print,尽量用write★【语法】声明⏹整型:integer(kind=4) a ;其中kind是使用的bytes数,4 or 2◆其他写法:integer*4 a; 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 接收的时候可自动长度★【规范格式】FORMA T格式化⏹ e.g.◆write (*,100) A◆100 format(I4) ←这里是100号标识调用的格式⏹参数控制符(前面加数字为重复次数,如4I6或<a>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为整数,其余浮点(不好)⏹隐式声明:◆implicit integer(A,B,C) :A、B、C开头的自动为整型,无需单独声明◆implicit integer(A-F,I,K) :A-F、I、K开头的自动为整型◆implicit real(M-P) :M-P开头自动视为浮点数◆implicit none :无隐式声明,最常用,但个人认为在自己有把握的情况下还是可以自定义一些隐式来方便程序书写★【语法】常数parameter的声明⏹方法1:real,parameter :: pi=3.14⏹方法2:◆real pi◆parameter(pi = 3.14)★【常用功能】类型转换(real ←→ integer)⏹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◆end type person⏹声明:type(person) :: a⏹使用: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)<误差的方法◆程序执行内容◆else if(逻辑) then◆程序执行内容◆else◆程序执行内容◆end if⏹单行if:if(逻辑) then 内容★【语法】逻辑标志:== .EQ.;/= .NE.;> .GT.;>= .GE.;< .LT.;<= .LE.;.and. ;.or. ;.not.★【语法】select case功能◆select case (某) ←这个某可以是整数和字符,Logical◆case (70:90) ←这个case只能用常数◆内容◆case(60:69)◆内容◆case default◆内容◆end select★【语法】两个小东西:pause:暂停;stop:退出★【语法】二进制的逻辑运算iand 和ior⏹举例:a = 2(二进制10);b=4(二进制100);c=iand(a,b) 则c=6★【语法】循环结构◆do I=1,5,1 ←分别是开始,结束,step,亦可do while(条件)◆执行内容◆enddo★【流程控制语法】⏹cycle:执行下次循环(Ruby:next)⏹exit:循环中断(Ruby:break)★【署名的循环】◆outdo: do I=1,3◆inner: do J=2,4◆内容←署名后可以使用诸如if (..) exit outdo;if(..) cycle inner这种◆end do inner◆end do outdo★【语法】臭名昭著的:goto 行数数组(声明、隐式循环、整体操作、可变数组)★【语法】数组的声明:Datatype name(size) ←其中Datatype是类型也可是自定义的type⏹比如:integer a(10) 或integer , dimension(10) :: a⏹类似声明多维数组:integer a(3,3) ←亦可a(0:3 , -3:3)这样自定义某维范围★【诡异东东】隐式循环与赋初值:Data A /1,2,3,4,5/ ;Data A /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同大小◆else where ←亦可elsewhere (a>5)这样的东西◆ b = 2◆end where★【语法】FORALL:使用方法forall(范围1,范围2…条件)◆forall (I=1:5,J=1:5,a(I,J)/=0) a(I,J) = 1/a(I,J)◆相当于:do I=1,5 ;do j=1,5; if a(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个东西。