Fortran 程序设计基础_第1页
Fortran 程序设计基础_第2页
Fortran 程序设计基础_第3页
Fortran 程序设计基础_第4页
Fortran 程序设计基础_第5页
已阅读5页,还剩44页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Fortran程序设计入门基础本课程学习目的1.熟悉基本的Fortran77的语法,能够阅读简单的有限元程序代码2.熟悉CompaqVisualFortran编译器的使用以及了解IntelFortranCompile的使用3.熟悉上述编译器的调试功能4.能够写简单的有限元程序并调试已有的测试程序,找出其中的错误学习内容1.Fortran77程序结构2.数据类型3.逻辑循环结构4.数组与数据公用存储单元(公用区)5.子程序6.程序调试参考资料1《Fortran语言—Fortran77结构化程序设计》(清华大学出版社)(谭浩强、田淑清)2《Fortran90教程》(浙江大学出版社)(潘在元、张素素)3CompaqVisualFortranhelp当前文档主要参考了科大“Fortran77和90/95编程入门

”学习方法:1.多看别人写的有限元代码2.多查编译器帮助文档3.多上网搜索语法或代码资料。使用Baidu或Google查找代码4.每天都坚持写Fortran代码1.FORTRAN77程序结构1.FORTRAN77程序结构C语言版Ex011-1字符集“字符集”是指编写Fortran程序时,所能使用的所有字符及符号。Fortran所能使用的字符集有:英文26个字母A-Z及a-z(英文大小写不分)数字0~922个特殊符号:=+*/,.’!”%&;<>?$_(还有一个显示不出来的空格符)Fortran标准中规定,编译器只需要认得大写的英文字母,而如果程序代码中使用小写英文字母,则会把它们视同为大写字母。1-2书面格式Fortran程序代码的编写有两种,FreeFormat(自由格式)和FixedFormat(固定格式)。FixedFormat(固定格式)是属于旧式的写法,它在编写版本上有很多限制。FreeFormat(自由格式)是Fortran90之后的新写法,取消了许多旧的限制。Fortran程序代码扩张名为*.F或*.FOR的文件。就是指以FixedFormat来编写的程序;以*.F90为扩张名的文件,就是以FreeFormat来编写的程序。建议全部用FreeFormat来编写的程序。1-2-1FIXEDFORMAT(固定格式)第一个字符如果是字母C、c或星号*,这一行文本会被当成批注,不会被编译第1~5个字符如果是数字,就是用来给这一行程序代码取个代号。不然只能是空格第6个字符如果是“0”以外的任何字符,表示这一行程序会接续上一行第7~72个字符Fortran程序代码的编写区域第73个字符后不使用,超过的部分会被忽略,有的编译器会发出错误信息

在“固定格式”中,规定了程序代码每个字段的意义。第7~72个字符,是可以用来编写程序的字段.每一行的前5个字符只能是空格或是数字,数字用来作为“行代码”。每一行的第6个字符只能是空格或“0”以外的字符。程序格式示例1.CFIXEDFORMATDEMO2.programmain3.write(*,*)‘Hello,world!’4.write(*,*)5.1‘Hello,world!’6.100write(*,*)‘Hello,world!’7.10stopend第1行的第1个字符是C,这一行的文本会被当成批注。每一行程序代码的最前面,最少都会留有6个字段。因为前6个字段不能用来作为程序代码。第4、5行事实上是把第3行程序拆成两半的结果,第5行的第6个字符是一非“0”的字符,所以第5行会被当成是连接在第4行后面。第6、7行的最前面都有一个数字,这个数字用来给第6、7行个取一个代码。行代码可以是数值大小在5位数范围的整数。这个数字纯粹是用来给定一个代码,不需要和程序代码的执行先后顺序有关系例如该程序第6行的代码就比第7行的代码大,却先执行。程序代码命令之间的空格,不会有任何意义,举例来说:

WRITE(*,*)‘Hello’WRITE(*,*)‘Hello’

上面的两行程序代码,WRITE命令跟后面的‘Hello’字符串间插入了不同数目的空格,不过这两行程序代码的含义是相同的,因为空格在程序代码命令间没有意义。

FixedFormat是为了配合早期使用穿孔卡片输入程序所发明的格式。现在都应该使用FreeFormat来编写程序。早期的计算机,还没有使用显示器作为输出设备,不能像现在一样直接利用键盘来修改程序。早期的程序是利用穿孔卡片一张一张地记录下来,再让计算机来执行。随着穿孔卡片的淘汰,FixedFormat也没有必要再继续使用下去。不过我们还是需要知道FixedFormat的使用规则,因为现在仍然可以找到很多使用这种格式来编写的旧程序。程序格式示例1.数据类型2数据类型

数据类型是指使用Fortran在计算机内存中记录文本,数值等数据的最小单位及方法.和其他程序语言一样,其主要有以下五种数据类型.1.整型(INTEGER)

整型的类型又分两种,长整型与短整型。在个人计算机中长整型占用32bits(4bytes)的空间,长整型可以保存的数值范围在-2147483648~+2147483647(-231+1231)之间,而短整型占用16bits(2bytes)的空间,保存的数值范围在-32768~+32767(-215+1215)之间。有的编译器还可以提供一种更短的整数类型,只占8bits(1byte)的空间,可以保存-128~+127之间的整数。2.浮点数(REAL)

浮点数也有两种类型,单精度及双精度。单精度浮点数在个人计算机中占用32bits(4bytes)的空间,有效位数为6~7位.可记录的最大值为

3.4*1038,最小数值为

1.18*10-38,双精度会占用64bits(8bytes),有效位数为15~16位。可记录的最大数值为

1.79*10308,最小数值为

2.23*10-308

。3.复数(COMPLEX)

就是以a+bi的形式来表示的数值.复数中的a、b值其实是由两个浮点数来做记录,所以复数同样也有两种类型,单精度复数及双精度复数。

2数据类型4.字符(CHARACTER)

计算机除了存储数字之外,也可以在内存中记录一段文本.字符类型可以记录的东西非常广,从键盘输入的任何东西,不论是数字,文本或任何特殊符号,它都可以记录。附录V的ASCII字符表就是这个类型所能记录的所有字符。只记录一个字母、符号时的数据类型称为“字符”,记录一连串的字符时,就称为“字符串”。记录一个字符需要一个字节的存储空间,记录n个字符长度的字符串则需要一个字节的存储空间,记录n个字符长度的字符串则需要n个字节的存储空间。5.逻辑判断(LOGICAL)(布尔)

逻辑判断只能保存两种逻辑结果,分别为“是”(TRUE)和(FALSE).也可以翻译成“对”,“错”,或是“真”,“假”等等.在二进制中,通常以1代表TRUE,0代表FALSE。

2数据类型1.FORTRAN77程序结构3逻辑循环结构3.1Fortran的数学表达式用Fortran来编写数学表达式的规则和方法都很”直观化”,和在纸上做四则运算只有一点点的差别.Fortran所使用的数学运算符号,根据运算优先级顺序排行如下:+加法-减法* 乘法/除法**乘幂(两个星号要连续)()括号(表示括号起来的部分优先计算)

越是下面的符号,运算优先级越高,所以算式中会先计算乘除,后计算加减.在程序中编写表达式和手写的差别主要有三点:(1)乘幂要连用两个星号,不能像手写的时候只要把数字写成上标就行了,例如22必须写成2**2(2)乘号不能省略,手写的算式中(A+B)(C+D)和(A+B)*(C+D)是一样的,但写程序时只容许第2种写法,所以像2*A也不能写成2A.(3)除法用计算机编写时要用下面这种表示方法(线形式-科技论文的写法):((A+B)*(C+D))/(2*(E+F)),而不能写成:3.2关系表达式关系运算符英语含义所代表的数学符号.GT..GE..LT..LE..EQ..NE.>>=<<===/=GreaterThanGreaterthanorEqualtoLessThanLessThanorEqualtoEqualtoNotEqualto>(大于)≥(大于或等于)<(小于)≤(小于或等于)=(等于)≠(不等于)逻辑运算符含义逻辑运算举例例子含义.AND..OR..NOT..EQV..NEQV.逻辑与逻辑或逻辑非逻辑等价逻辑不等价A.AND.BA.OR.B.NOT.AA.EQV.BA.NEQV.BA,B为真时,则A.AND.B为真A,B之一为真,则A.OR.B为真A为真,则.NOT.A为假A和B值为同一逻辑常量时,A.EQV.B为真A和B的值为不同的逻辑常量,则A.NEQV.B为真注意不要将.AND.与.EQV.混淆:A.AND.B是当A和B均为真时才为真;A.EQV.B是当A和B均为真或均为假时为真。逻辑表达式举例说明(A<B).AND.(A>C)(X<0).OR.(X>100.).NOT.(X<=O)(A>B).EQV.(C>D)L1.NEQV.L2当A<B和A>C时表达式值为真当X<0或X>100时,表达式值为真当X≤0时,表达式值为假当两括弧内的值都为真或假时,表达式的值为真当L1与L2的逻辑值不相同时,表达式的值为真3.2逻辑运算符可用下表表示各种运算符的优先级别:运算类别运算符优先级括号()1算术运算**2*/3+-4关系运算>>=<<===/=5逻辑运算.NOT.6.AND.7.OR.8.EQV..NEQV.93.3循环结构ISUM=0DO100I=1,100ISUM=ISUM+1100

CONTINUE循环体CONTINUE语句本身不进行任何机器操作,只是将流程转到逻辑上的下一个语句,因此,CONTINUE语句又称为“空语句”,即进行“空操作”。格式1有标号循环3.3循环结构ISUM=0DO100I=1,100DO100J=1,3ISUM=ISUM+I*J100

CONTINUE循环体格式1有标号循环子循环体3.3循环结构ISUM=0DO100I=1,100DO150J=1,3ISUM=ISUM+I*J150

CONTINUE100

CONTINUE格式1有标号循环子循环体3.3循环结构ISUM=0DO100I=1,100100ISUM=ISUM+1格式2有标号循环3.3循环结构ISUM=0DOI=1,100ISUM=ISUM+1ENDDO格式3无标号循环ISUM=0DOI=1,100DOJ=1,3ISUM=ISUM+I*JENDDOENDDO多重循环时建议子循环体向右缩进4个字符书写子循环体3.3循环结构DOI=1,100,2......ENDDO其他DO循环格式DO10,I=1,10,2DO20N=1,5DO100,X=1.2,2.4,0.2DOT=2.5*2,5O./3.,0.3DOM=1.5,12.5,15下面的DO语句是合法的:

3.4流程控制AB

顺序结构

ABp不成立成立选择结构流程控制的三种基本结构

Ap成立当型(While)循环结构Ap不成立直到型(Until)循环结构IF结构IF(逻辑判断式)THEN

……

……←逻辑成立时,才会执行这里面的程序代码

……

ENDIF3.4流程控制DOI=1,100IF(I.NE.5)THENISUM=ISUM+1ENDIFENDDOIF-ELSE结构3.4流程控制IF-ELSEIF结构3.4流程控制IF-ELSEIF多重结构3.4流程控制4.数组与数据公用存储单元(公用区)4.1数组与公用区4.1数组的定义

REALIADIMENSIONIA(5)CHARACTER*10CHAR_ARRDIMENSIONCHAR_ARR(5)

IMPLICITREAL*8(A-H,O-Z)

……DIMENSIONB(3,3),K(16,16)字符数组K(1,1)K(1,2)K(1,3)K(2,1)K(2,2)K(2,3)K(3,1)K(3,2)K(3,3)K(4,1)K(4,2)K(4,3)K(5,1)K(5,2)K(5,3)K(5,3)K(1,1)K(2,1)K(3,1)K(4,1)K(5,1)K(1,2)K(2,2)K(3,2)K(4,2)K(5,2)K(1,3)K(2,3)K(3,3)K(4,3)K(5,3)Fortran程序中多维数组按照列排列,而在C/C++中按照行排列4.2数组元素的排列顺序4.3数组的内存排列与程序的执行效率计算机硬件充分利用了高速缓存,当前执行数据邻近的几笔数据通常也在Cache中,这样可以加快下一个命令的执行速度。在写程序时要利用好这个原则来安排数据。4.3数组的内存排列与程序的执行效率DOJ=1,100DOI=1,100ISUM=ISUM+K(I,J)ENDDOENDDODOI=1,100DOJ=1,100ISUM=ISUM+K(I,J)ENDDOENDDOK(1,1),K(1,2)在内存中相隔100个元素,CPU要不断在内存中跳跃式地来读取数据,可能无法利用Cache的便利。左下图是较好的写法4.4公用区1)COMMON语句用于在不同程序单元之间进行实体的数据批量传递,它比子程序之间进行参数数据传递的速度要快。其作用是开辟一个公共块(公用内存),公共块可以是无名的(只能有一个),也可以是有名称的2)其一般形式为:COMMON[/[公共块名1]/]变量名表1[[,]/[公共块名2]/变量名表2]...

其中的公共块名可以和变量名相同,变量实体名不得是哑元、可分配数组、自动对象、函数名或函数结果名,并且不得有PARAMETER属性。不同程序单元中相同公用名下的变量名可以是不同的。相同公用名中的变量在不同程序单元中,按位置一一对应共享同一存储单元中的数值。由于COMMON语句是说明语句,它的位置必须在可执行语句之前,通常是紧跟在程序单元的起始句之后,一个程序单元可以有多条COMMON语句。4.4公用区例如:下面的COMMON语句段COMMON/BLOCKA/M,N(5),R1,T(5)COMMON/BLOCKB/A(500),K(100)COMMON//M1,M2,M3,M4其中,前两条是有名公共块语句,而‘//’是无名的。4.4公用区由于各个程序单元中的变量名是独立的,它们并不会因为名字相同而建立起数值的联系。例如,主程序中名为X的变量和子程序中的X变量虽然同名,但它们各有自己的存储单元,互不相关。但如果我们在主程序和子程序的说明部分各自都增加一条无名共用区语句:COMMONX,则FORTRAN编译程序在存储区中开辟了一个公用数据区,主程序和子程序中的COMMON语句中的第一个变量共同占用公共块的第一个存储单元,达到数据共享。例如:主程序中的语句COMMONX,Y,Z(3),I和子程序中的语句COMMONA,B,C(3),J使得无名公共块中变量X和A,Y和B,数组Z和C,I和J分别被分配在相同的存储单元中。占同一个存储单元的那些变量在不同的程序单位中,它们的名字不需要相同。4.4公用区COMMON语句还可用来声明数组,例如:COMMON/SUBJECT/MATH(3),ENGLISH(4)这条语句已经按I-N规则声明了实型数组和整型数组,无需用DIMENSION语句或属性对数组名重新说明。如果要重新定义类型的话,则数组大小不得在COMMON语句和类型说明语句中重复出现。例如:SUBROUTINEUNIT1()REAL(8)X(5)INTEGERJCHARACTERSTR*12COMMON/BLOCK/X,J,STR...SUBROUTINEUNIT2REAL(8)Z(5)INTEGERMCHARACTERCHR*12COMMON/BLOCK/Z,M,CHR4.5动态数据分配Fortran77中不支持类似于C语言中的动态内存分配。在实际编程程序时,一般预先分配足够大的公用区,然后在公用区上分配不同的数据块。Fortran90支持动态数组分配。4.5动态数据分配ALL(1)ALL(2)ALL(3)ALL(4)ALL(5)ALL(6)ALL(7)ALL(8)ALL(9)ALL(10)ALL(11)ALL(12)ALL(13)ALL(14)IMPLICITREAL*8(A-H,O-Z)

COMMONALL(100000)sizeof(ALL)=100000*

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论