fortran77程序设计简介课件

上传人:桔**** 文档编号:571333229 上传时间:2024-08-10 格式:PPT 页数:281 大小:873.50KB
返回 下载 相关 举报
fortran77程序设计简介课件_第1页
第1页 / 共281页
fortran77程序设计简介课件_第2页
第2页 / 共281页
fortran77程序设计简介课件_第3页
第3页 / 共281页
fortran77程序设计简介课件_第4页
第4页 / 共281页
fortran77程序设计简介课件_第5页
第5页 / 共281页
点击查看更多>>
资源描述

《fortran77程序设计简介课件》由会员分享,可在线阅读,更多相关《fortran77程序设计简介课件(281页珍藏版)》请在金锄头文库上搜索。

1、FORTRAN 77语言语言-结构化程序设计结构化程序设计主讲:王 飞江苏科技大学fortran77程序设计简介教材:FORTRAN语言FORTRAN77结构化程序设计谭浩强等编著fortran77程序设计简介第一章 FORTRAN语言程序设计初步 1.1 FORTRAN语言发展概况1.2 简单的FORTRAN 77程序分析1.3 FORTRAN源程序的书写格式fortran77程序设计简介1.1 FORTRAN语言发展概况 lFORTRAN语言是世界上第一个被正式推广使用的高级语言。它是1954年被提出来的,1956年开始正式使用,至今已有五十多年历史,但仍历久不衰,它始终是数值计算领域所使

2、用的主要语言。lFORTRAN是英文FORmula TRANslation的缩写,意为“公式翻译”。它是为科学、工程问题或企事业管理中的那些能够用数学公式表达的问题而设计的,其数值计算的功能较强。lFORTRAN 77还不是完全结构化的语言,但由于增加了一些结构化的语句,特别是“块if”语句,提供了IF-ELSE-ENDIF形式的判断控制语句,使FORTRAN 77能用于编写结构化程序。此外,还扩充了字符处理功能,使FORTRAN不仅可用于数值计算领域,还可以使用于非数值运算领域。l目前,FORTRAN77已在国内外广泛使用,大多数计算机系统都已配置了FORTRAN 77。lFORTRAN语言

3、的不同版本:FORTRAN I、FORTRAN II、FORTRAN IV、FORTRAN 66、FORTRAN 77、FORTRAN 90fortran77程序设计简介1.2 简单的FORTRAN 77程序分析 为了使读者从一开始就了解什么是FORTRAN 77程序,下面先介绍两个很简单的FORTRAN 77源程序。 例1.1求三个数的平均数程序代码:C CALCULATE THE AVERAGE OF THREE NUMBERSX=90.5Y=87.0Z=68.5AVER=(X+Y+Z)/3.0PRINT *, THE THREE NUMBERS ARE, X, Y, ZPRINT *,

4、AVERAGE=, AVERENDfortran77程序设计简介例1.2分别求R=1,3,12,5时的圆周长可以用一个子程序来求圆周长。源程序由两部分组成:(1)主程序C MAIN PROGRAMPROGRAM EX2PRINT *, R=, 1.0, C=, C(1.0)PRINT *, R=, 3.0, C=, C(3.0)PRINT *, R=, 12.0, C=, C(12.0)PRINT *, R=, 5.0, C=, C(5.0)END (2)子程序C SUBPROGRAMFUNCTION C(R)PI=3.1415926C=2*PI*RRETURNENDfortran77程序设计

5、简介从以上例子中可以看出:1、一个程序由一个或若干个程序单位组成。主程序和每一个子程序分别是一个独立的程序单位。在解决一个比较复杂的问题时,可以分别将每个功能编为一个子程序,然后按搭积木一样将各有关程序单位组成一个程序。一个程序单位就是一个模块,结构化程序设计需要采用模块化方法,在FORTRAN中,子程序是实现模块化的有效方法。2、每一个程序单位都是以“END”结束的。在FORTRAN 77中,END既是一个程序单位的结束标志,又是一个独立的语句(结束语句)。主程序中的END语句的作用是使程序“停止运行”,子程序中的END语句是“使流程返回调用程序”。请注意在一个程序单位中只能有一个END语句

6、,如果需要,可以用STOP语句使程序终止或用RETURN语句从子程序返回。fortran77程序设计简介3、一个程序单位包括若干行。FORTRAN行分为两类:(1)语句行。由一个FORTRAN语句组成,它对程序运行情况是有影响的。FORTRAN语句分为:执行语句和非执行语句。执行语句使计算机在运行时产生某些操作,如赋值语句、打印语句等。非执行语句(包括说明语句,数据语句等)将有关信息通知编译系统,以便在编译时作出相应的处理,例如类型说明语句、函数子程序语句等。(2)非语句行,即注释行。它不是FORTRAN语句,它不被翻译成机器目标指令,不产生任何机器操作。它仅仅是为了人们阅读程序的方便而加到程

7、序中的。一个程序中注释行的数目不受限制,根据需要而定。但一个程序单位不能只由注释行组成。注释行是程序的一部分,在打印程序清单时,注释行也照样打印出来。注释行的内容完全是根据程序设计人员需要而写的,一般是为程序(或程序中某一部分)的作用作注释。注释可以用英文或汉语拼音文字,还可以用汉字作注释。在一些实用程序中,注释行的篇幅有时占整个程序的三分之一以上。fortran77程序设计简介4、FORTRON程序中的语句可以没有标号,也可以有标号,根据需要而定。标号的作用是标志一个语句以便被其它语句引用。在同一个程序单位中不能有两个相同标号的语句。标号不影响语句的执行顺序。程序中语句执行的顺序一般依照它们

8、在程序中的位置而定,即写在前面的语句先执行,写在后面的语句后执行。5、一个程序单位中各类语句的位置是有一定规定的,例如PROGRAM语句应是主程序的第一个语句,FUNCTION语句是函数子程序的第一个语句,END语句只能是程序单位中最后一行。6、FORTRAN源程序必须按一定的格式书写。哪些内容写在一行中的哪一列都有严格的规定。fortran77程序设计简介1.3 FORTRAN源程序的书写格式 FORTRAN源程序必须严格地按照一定的格式书写。在编译时对一行中不同位置上的内容分别处理。标准的FORTRAN程序纸格式见下图。 fortran77程序设计简介fortran77程序设计简介1、第l

9、5列为标号区: 可以写l至5位整数。也可以没有标号。标号区中的空格不起作用。如 l00与100 或1 0 0作用相同。标号应是无符号整数(不应包括正负号或小数点)。标号大小顺序没有任何要求。假如第二行的标号为1000,第三行的标号可以是10,也可以是10000。标号区内不得出现标号以外的内容,但注释行例外。注释行的内容可以写在标号区内,一行中第一列为“C”或“*”的,该行即被认为注释行。如果在第一列上出现的不是数字、空格或“C”和“*”的字符,编译时按出错处理。fortran77程序设计简介2、第6列位续行标志区: 如果在一行的第6列上写一个非空格和非零的字符,则该行作为其上一行的续行。3、第

10、772列为语句区: 语句可以从第7列以后的任何一列开始写,但一行只能写一个语句。语句区中的空格(除引号内的字符串内的空格)在编译时被忽略,例如SIN(X)与S IN( X )等效。4、第7380列为注释区: 程序员一般利用此8列为程序行编序号以便查找。fortran77程序设计简介3.1 常量所谓常量是指其值始终不变的量,例如3,5.6,-8在FORTRAN中允许使用下面六种常量: (1)整型常量(2)实型常量(3)双精度常量(4)复型常量(5)逻辑型常量(6)字符型常量。fortran77程序设计简介3.1.1 整型常量 整型常量,又称整型常数或整数(integer)。它是一个正的或负的或零

11、的数。例如5,-8,+123。 FORTRAN中的整数不应包括小数点。整数可以包括数符,也可以不包括数符。 常数中各数字之间的空格不起作用。常数中不允许加入逗号。 fortran77程序设计简介3.1.2 实型常量实型常量,又称实数(real)。实数有两种表示形式:(一)小数形式:例如+12.3,-68.56,3.75,0.0等。它由一个或多个数字和一个小数点组成。小数点前或小数点后可以不出现数字,但不能小数点前后都不出现数字。例如+0.8,-8.0,0.0,60.,.36,.0 合法 18,36,7,. 非法。fortran77程序设计简介(二)指数形式:数字部分和指数部分,例如:12.3E

12、8,0.91E-30。数字部分可以是不带小数点的整数形式,也可以是带小数点的实数,例如3E5,3.0E5均合法。指数不能为小数,例如3E5.6,8.6E-3.7不合法。指数部分不能单独用来代表一个常数,例如E12。fortran77程序设计简介3.2 变量3.2.1 变量的概念变量是指在程序运行期间其值是可以变化的量。系统为程序中的每一个变量开辟一个存储单元,用来存放变量的值。在程序中用到的变量,应该给它赋予确定的值,否则它有一个不确定的值。fortran77程序设计简介3.2.2 变量名一个变量需要用一个名字(变量名)来识别。FORTRAN的变量名按以下规定选定:1、第一个字符必须是字母;2

13、、在一个字母后面可以跟15位数字或字母。例如:A,X1,ABCD,CHINA,RATE,TOTAL,G861是合法的,而3X,X+Y,WAN-LI,-6B,U.S.A,DR.LI是不合法的。fortran77程序设计简介选用变量名时注意:(1)在变量名中大写与小写是等价的,例如TOTAL,Total,total都代表同一个变量。(2)变量名的字符之间可以插入空格,例如:AMOUNT和A M O U N T都代表同一个变量AMOUNT。(3)变量名应尽量做到见名知义,例如:GRADE代表等级,AVER代表平均值,AMOUNT代表金额。fortran77程序设计简介(4)FORTRAN 77没有规

14、定保留字,即可以用FORTRAN中的函数名或语句定义符作变量名,例如:SIN=3.5PRINT *, SIN 或READ *, PRINTPRINT *, PRINTfortran77程序设计简介3.2.3 变量类型 常量是分为类型的,而变量是用来存放常量的,因此变量也相应地区分为整型变量、实型变量、双精度型变量、复型变量、逻辑型变量、字符型变量。整型变量用来存放整型常量,实型变量用来存放实型常量。fortran77程序设计简介在程序中应当说明哪些变量是整型变量,哪些变量是实型变量。变量在内存中所占的字节数和数据存储形式与相应类型的常数相同。fortran77程序设计简介规定变量的类型可以用以

15、下几种方法:1、隐含约定- I-N规则FORTRAN规定:在程序中的变量名,凡以字母I,J,K,L,M,N六个字母开头的,即认为该变量为整型变量。以其它字母开头的变量为实型变量。例如下面变量为整型变量:I,J,IMAX,NUMBER,LINE,JOB,K1而下面的变量为实型变量:B1,COUNT,AMOUNT,YOUNG,TOTAL,BOOK,DG34fortran77程序设计简介2、用类型说明语句确定变量类型 FORTRAN中有六个类型说明语句:INTEGER语句(整型说明语句)REAL语句(实型说明语句)DOUBLE PRECISION语句(双精度说明语句)COMPLEX语句(复型说明语句

16、)LOGICAL语句(逻辑型说明语句)CHARACTER语句(字符型说明语句)例如: INTEGER A, SUM, TOTALfortran77程序设计简介3. 隐含说明语句IMPLICIT语句IMPLICIT INTEGER (A, C, T-V)IMPLICIT REAL (I, J)IMPLICIT INTEGER (A, B), REAL (I, K)fortran77程序设计简介说明:1、类型说明语句最优先,IMPLICIT语句次之,I-N规则最低。例如:IMPLICIT REAL (I, J)INTEGER IMAX2 、IMPLICIT语句和类型说明语句应该出现在程序单位中的所

17、有执行语句的前面,IMPLICIT语句又应该在所有的类型说明语句的前面。 fortran77程序设计简介在编写程序时不仅需要考虑程序本身的结构,即操作语句间的结构关系,还要考虑数据的结构,要清楚数据的特性及数据间的联系,设计出适当的数据结构,然后考虑用什么样的算法。例如学生记录那样的数据结构可以用数组来实现。对于同一个问题的求解,可以采用不同的数据结构和不同的算法。对不同的数据结构有不同的算法,它们的复杂程度不同。选择合适的数据结构,可以降低算法的复杂程度,因此,在程序设计中应重视数据结构的设计。在计算机高级语言中提供实现各种数据结构的功能,用数据类型表示不同的数据结构。每种高级语言都规定它可

18、以使用的数据类型。 fortran77程序设计简介三类数据结构:1)基本类型:最基本的数据项,是不可再分的。基本类型包括整型、实型、双精度型、复型、逻辑型等类型2)构造类型:由已知类型,按一定规则构造而成的复合类型数据,包括数组、记录、文件和集合等3)指针类型:用于构造各种形态的动态数据结构,如链表、队、栈、树、图等在FORTRAN 77中基本类型有以下六种: 整型 实型 双精度型 复型 逻辑型 字符型fortran77程序设计简介6.2 双精度类型数据实型提供7位有效数字,双精度型提供1517位有效数字。双精度常数要用指数形式表示,将实数中表示指数的字母E改成字母D即可。例如:1.23456

19、789表示为1.23456789D+0 0.123 表示为1.23D-01fortran77程序设计简介例6.1 分数序列2/1,3/2,5/3,8/5,13/8,21/13,求出这个序列的前20项之和。Fibonacci数列:1、1、2、3、5、8、13、21.。DOUBLE PRECISION A, B, C, SS=0.0D0A=1.0D0B=1.0D0C=A+BDO 10, I=1, 20, 1S=S+C/B A=B B=C C=A+B10CONTINUEPRINT *, S=, SEND fortran77程序设计简介6.4 四种数值型数据之间的转换和运算6.4.1 不同类型数据之间

20、运算的规则 表6.1给出不同类型数据之间进行加减乘除运算的规则(C=A+B或C=A*B) C的类型 整型 实型 双精度型 复型 整型 整 实 双 复 实型 实 实 双 复 双精度型 双 双 双 复 复型 复 复 复 复 其中表示FORTRAN 77标准是不允许的。但有的FORTRAN编译系统作了放宽,允许双精度型数据和复型数据之间运算,结果为复型 fortran77程序设计简介6.4.2 不同类型数据的赋值规则表6.2 不同类型数据的赋值规则(v=e) v e整型 实型 双精度型 复型 整型 直接赋值 取整,舍去小数再赋值 取整,舍去小数再赋值 实部取整 实型 化成实型,赋值 直接赋值 舍掉多

21、余的有效数字,变成实型,赋值 实部赋值 双精度型 先化成双精度型,赋值 先化成双精度型,赋值 直接赋值 实部化成双精度型,赋值 复型 化成实数,加上虚部0,变成复数,赋值 实部赋值,虚部赋零 化成实数,虚部赋零 直接赋值 fortran77程序设计简介6.4.3 类型转换函数FORTRAN 77提供一些函数,使不同类型的数据能相互转换,见表6.3。整型 实型 双精度型 复型 INT(A) 不转换,仍得A将A的小数部分舍掉,取整 将A的小数部分舍掉,取整 将实部的小数部分舍去,取整 REAL(A) A化成实型 仍为A本身 舍去多余的有效数字 取A的实部 DBLE(A) A化成双精度型 A化成双精

22、度型 仍为A本身 取A的实部并将它转为双精度型 CMPLX(A) 将A化实型,作为实部,虚部为0 将A作为实部,虚部为零 将A的多余有效数字去掉,作为实部,虚部为零 仍为A本身 CMPLX(A1, A2) A1,A2先化实型,然后分别作为实部和虚部 A1作实部,A2作虚部 将A1,A2先舍去多余有效数字,再分别作实部、虚部 实部是REAL(A1),虚部是REAL(A2) fortran77程序设计简介6.4.4 不同类型数据的比较规则表6.4是比较规则。将A与B进行关系运算 A B 整型 实型 双精度型 复型 整型 允许 允许 允许 实型 允许 允许 允许 双精度型 允许 允许 允许不允许 复

23、型 不允许 星号表示只有用.EQ.或.NE.时才可以进行比较 fortran77程序设计简介6.5 字符型数据FORTRAN不仅能用于数值计算,而且具有处理文字的能力。计算机的用途已日益扩展到非数值运算领域,必须能有效地对文字信息进行处理。例如,对一个班学生名字按字母顺序排列,从一批书籍中找出指定书名的那一本等等。只有以前介绍过的五种类型(整型、实型、双精度型、复型、逻辑型)是不够的,FORTRAN 77提供了字符类型。fortran77程序设计简介6.5.1 字符型常量字符型常量亦称字符串(character string),它是用引号(单引号或双引号)括起来的若干个字符。字符型常量允许使用

24、系统可以使用的字符,只要能从键盘输入给计算机系统的字符都可以出现在字符串中。例如下面的字符串都是合法的: CHINA “U.S.A” LI DAN “FUN-LI” How are you ? “X=?” A+B; C+D; E+F; *$?# “您好”FORTRAN规定:字符串如出现引号要用两个连续的引号表示,例如:THATS RIGHT!fortran77程序设计简介6.5.2 字符型变量用来存放字符型常量的变量称为字符型变量。在程序中必须先定义字符型变量才能使用它。定义字符型变量用CHARACTER语句或IMPLICIT语句,例如:CHARACTEER*5 STR1, STR2, STR

25、3CHARACTER NAME*20, ADDR*30, CODE*10如果语句统一指定的字符长度与变量个别指定的长度不一致,以个别指定优先于统一指定,例如:CHARACTER*5 A, B*6, C, D*4, Efortran77程序设计简介若CHARACTER语句中不指定长度,则隐含指定长度为1:CHARACTER A, B, C可以用IMPLICIT语句定义字符型变量:IMPLICIT CHARACTER*5 (A-C), CHARACTER*4 (X)CHARACTER语句还可以定义符号常量:CHARACTER*5 NAMEPARAMETER (NAME=CHINA)fortran7

26、7程序设计简介6.5.3 字符型变量的赋值用赋值语句对字符型变量赋值,例如:CHARACTER*5 NAME1, NAME2, NAME3NAME1=CHINANAME2=BEIJINGNAME3=NEW也可以通过READ语句从键盘读入字符常量给字符变量,注意用表控格式输入字符串时要用撇号将字符串括起来,例如:READ *, NAME1, NAME2, NAME3fortran77程序设计简介6.5.4 子字符串字符串的一部分称为字符串的子串。例如:字符变量A的值为NEW YEAR,则NEW,YEAR,EW,Y,AR都是A的子串。子串的形式表示: 字符变量名(e1 : e2)e1和e2是整型表

27、达式,表示子字符串在字符串中的起止位置,例如: CHARACTER*33 STR STR=STRUCTURED PROGRAMMING IN FORTRAN PRINT *, STR(1:10), STR(27:33)e1和e2应满足关系:1e1e2LL为字符变量的长度,如省略e1表示e1为1,如省略e2,则表示e2=L,如e1,e2都不写(但不能省写冒号),表示e1=1,e2=L。 fortran77程序设计简介 子字符串 子串的值 STR(12:22) PROGRAMMING STR(27: ) FORTRAN STR(:10) STRUCTURE STR(5:5) C STR(:) ST

28、RUCTURED PROGRAMMING IN FORTRAN可以将一个子字符赋给一个字符变量或另一个子字符串,例如:NAME=STR(27:33)STR(1:10)=STR(27:33)STR(23:29)=STR(27:33)fortran77程序设计简介6.5.5 字符表达式字符型数据也可以进行运算。FORTRAN 77只提供一种字符运算符字符连接符,用“/”符号表示将两个字符型数据连接起来。例如:A/B得到AB。A/B就是一个字符表达式。字符表达式的值是字符型常量。fortran77程序设计简介例6.3将读入的名字和地址打印出来CHARACTER NAME*10, ADDR*20, L

29、INE*50READ *, NAME, ADDRLINE=MR./NAME/ADDRESS:/ADDRPRINT *, LINEENDfortran77程序设计简介6.5.6 字符关系表达式两个数值型数据可以进行比较,两个字符型数据也可以进行比较,例如:A .GT. B字符比较的规则:按其ASCII代码的值进行比较。从附录可以看到不同字符的先后次序。常用的字符顺序:数字0小9大;数字比字母小;大写字母比小写字母小;字母A小Z大,a小z大;空格字符最小;其它专用字符有的比数字小,有的比数字大。fortran77程序设计简介在进行关系运算时遵循以下规律:(1)两个单个字符比较,以其代码比较,代码大

30、者为大。如AB(2)两个字符型变量比较,将两个字符串中的字符自左向右进行比较,如果所有字符都相等就认为两个字符串相等。如果两者中有不相同的字符,以最左面的第一对不同字符的比较结果为准。如:SHANGHAISHANKONG前四个字符相同,第5个字符GK,故知:SHANGHAISHANKONG(3)如果两个字符串长度不等,则系统会自动将短串的尾部补以空格,使两者等长再比较,例如:theB,则函数值为真,否则为假。3.LGE(A, B):若A=B,则函数值为真,否则为假。4.LLT(A, B):若AB,则函数值为真,否则为假。5.LLE(A, B):若AF,B-G,C-H,即将一个字母变成其后第五个

31、字母。取字母的ASCII代码,加上5,再按其ASCII码转换为另一个字母,如A的ASCII码为65,加5,得70,将70转换成字母得F。为此可用ICHAR函数和CHAR函数。ICHAR(A)=65,CHAR(70)=F。当字母为V时,加5就超过了Z,故应使之转换为A,同理,W-B、X-C、Y-D、Z-E。只对字母进行转换,对字母之外的字符维持原样。例如:“HE IS IN BEIJING.”-“MJ NX NS GJNONSL.” fortran77程序设计简介CHARACTER*80 LINE1, LINE2CHARACTER L1, L2READ *, LINE1DO 10, K=1, 8

32、0L1=LINE1(K:K)IF (LGE(L1,A).AND.LLE(L1,Z) .OR. (LGE(L1,a).AND.LLE(L1,z) THEN I=ICHAR(L1) J=I+5 IF (J .GT. 122 .OR. (J .GT. 90 .AND. J .LT. 96) J=J-26 L2=CHAR(J) LINE2(K:K)=L2ELSE LINE2(K:K)=L110 CONTINUEPRINT *, LINE2ENDfortran77程序设计简介例6.6从10个书名中查找有FORTRAN的书名CHARACTER*7 NAME, BOOK*30NAME=FORTRANDO 1

33、0, I=1, 10READ *, BOOKIF (INDEX(BOOK, NAME) .NE. 0) PRINT *, BOOK10CONTINUEENDfortran77程序设计简介例6.7从一篇文章中查出包含多少个CHINA。假设文章有K行,每行80个字符。CHARACTER LINE*80, WORD*5PARAMETER (WORD=CHINA)N=0READ *, KDO 10, I=1, K READ *, LINE J=120 L=INDEX(LINE(J:80), WORD) IF (L .EQ. 0) THEN J=81 ELSE N=N+1 J=J+L+5-1 END I

34、F IF (J .LE. 76) GOTO 2010CONTINUEPRINT *, THE NUMBER OF CHINA IS, NENDfortran77程序设计简介习题1.用双精度数据计算sinx=x-x3/3!+x5/5!-+(-1)n-1*x2n-1/(2n-1)!。直到第n项的绝对值小于10-15为止。2.输入一个单词,将它按逆序打印出来(如输入FORTRAN应打印NARTROF)。3.打印出以下图案,要求用字符型变量。 * * * * * * * * *4. 输入10个国家名,将其中按字母顺序在最前面的打印出来。fortran77程序设计简介第七章 数组 数组是一种数据结构,每

35、个数组代表一组具有同一类型的变量,把数组中所包含的变量称为数组元素。在程序中通过说明语句声明数组。例如:INTEGER A(1:6) 每个变量都在内存中占有一个独立的存储单元。例如:INTEGER A1, A2, A3, A4, A5, A6 这六个变量所代表的六个存储单元在内存中的位置是彼此独立、互不相关的。fortran77程序设计简介从终端读入六个数放到这六个存储单元中,则需要用以下输入语句:READ (*, *) A1, A2, A3, A4, A5, A6从这六个数中找出最小数,则需要以下一系列语句:MIN=A1IF (A2 .LT. MIN) MIN=A2IF (A3 .LT. M

36、IN) MIN=A3IF (A4 .LT. MIN) MIN=A4IF (A5 .LT. MIN) MIN=A5IF (A6 .LT. MIN) MIN=A6fortran77程序设计简介数组是由一组相同类型的变量组成的,每个元素当然也在内存中占用一个存储单元。与A1、A2、A6不同的是,A数组的这六个存储单元在内存中是一个接着一个排列、彼此紧密相关的。数组名A是六个存储单元的总名字。同一个数组中的各个元素用不同的下标来区别,它们的表示形式为A(1)、A(2)、A(3)、A(4)、A(5)、A(6),下标放在紧跟在数组名后的一对圆括号内。在内存中A(2)元素的位置必定紧挨在A(1)之后,A(3

37、)元素的位置紧挨在A(2)之后,其它依次类推。只要给出数组名和下标值就可以确定该数组元素在内存中的位置从而对其进行存取。在程序中通过改变下标值的方法来引用数组中不同的存储单元。例如,可以通过以下语句从终端给前面说明的A数组中的六个变量赋值:DO 10, I=1, 6 READ (*, *) A(I)10CONTINUEfortran77程序设计简介通过以下语句找出它们之中最小的那个数:IP=1MIN=A(IP)DO 20, I=2, 6IF (A(I) .LT. MIN) THENIP=IMIN=A(IP)END IF20CONTINUE通过以上例子可以看到,数组的使用将使程序变得简洁、灵活、

38、易读,它是程序设计中一种十分有用的工具。使用数组可以使许多复杂的算法得以实现,这些算法用简单变量是无法实现的。fortran77程序设计简介7.1 数组的说明和数组元素的引用 使用数组必须在类型说明语句或在DIMENSION语句中先对数组进行说明。说明数组的一般形式如下:类型说明或DIMENSION 数组说明符, 其中数组说明符的形式如下:数组名 (维说明符, )维说明符的组成形式如下:下标下界 : 下标上界fortran77程序设计简介7.1.1 用类型语句说明数组数组通常在类型说明语句中说明:REAL IA(1:10), ND(80:99), W(1:3, 1:2)INTEGER NUM(

39、-1:0), A(0:2, 0:1, 0:3)fortran77程序设计简介7.1.2 用DIMENSION语句说明数组在上一小节中说明的IA、ND、W、NUM、A数组也可以用以下语句说明:DIMENSION IA(10), ND(80:99), W(3,2)DIMENSION NUM(-1:0), A(0:2,0:1,0:3)INTEGER AREAL IA, NDfortran77程序设计简介DIMENSION语句用来说明数组,数组的类型则根据数组名的第一个字母由隐含类型规则来决定,否则应该在类型语句中对数组名进行显示说明。例如,以上IA、ND是实型数组,所以应该在REAL语句中说明,而W

40、则可以不在REAL语句中说明,因为按隐含类型规则,名字W的隐含类型就是实型;A数组(整型)应该在INTEGER语句中说明,而NUM数组则可以不必另行说明。fortran77程序设计简介7.1.3 数组元素的引用数组元素的引用形式: 数组名(下标, .)fortran77程序设计简介7.2 数组的逻辑结构和存储结构 fortran77程序设计简介fortran77程序设计简介7.3 数据的输入和输出 假定有以下数组说明语句:REAL W(3, 2)INTEGER A(10)将以A数组和W数组为例介绍对数组进行输入和输出操作的三种方式。fortran77程序设计简介7.3.1 利用DO循环对数组进

41、行输入和输出从终端键盘输入十个数,按顺序逐个放入A(1)到A(10)中DO 10, I=1, 10 READ (*, *) A(I)10CONTINUEfortran77程序设计简介把A(1)、A(3)、A(5)、A(7)、A(9)输出到终端屏幕上。DO 20 I=1, 10, 2WRITE (*, *) A(I)20 CONTINUEfortran77程序设计简介双重循环将从终端读入数据赋给W数组中各元素DO 10 I=1, 3 DO 20 J=1, 2 READ (*, *) W(I, J)20 CONTINUE10CONTINUEfortran77程序设计简介按列的顺序输出W数组中的元素

42、值:DO 30, I=1, 2DO 40, J=1, 3WRITE (*, *) W(J, I)40CONTINUE30CONTINUEfortran77程序设计简介按A数组元素排列的逆序打印数组元素的值:N=10DO 20, I=N, 1, -1 WRITE (*, *) A(I)20CONTINUE打印出A数组中前五个元素的值:N=5DO 20, I=1, N WRITE (*, *) A(I)20CONTINUEfortran77程序设计简介每行输出五个元素的值:DO 20, I=1, 10, 5 WRITE (*, *) A(I), A(I+1), A(I+2), A(I+3), A(

43、I+4)20CONTINUEfortran77程序设计简介7.3.2 在输入输出语句中用数组名来输入输出整个数组FORTRAN规定在输入输出语句中可以出现数组名。如:WRITE (*, *) A相当于:WRITE (*, *) A(1), A(2), A(3), A(4), , A(10)输入输出语句中的数组名可以是任意维数的。例如以上说明的3*2的W数组是二维的,可以用以下语句输出W数组:WRITE (*, *) W相当于:WRITE (*, *) W(1, 1), W(2, 1), W(3, 1), W(1, 2), W(2, 2), W(3, 2)fortran77程序设计简介7.3.3

44、 在输入输出语句中使用隐含DO循环以下输出语句的输出项中包含了一个隐含的DO循环,它将输出A数组中A(1)到A(5)元素。N=5WRITE (*, *) (A(I), I=1, N)相当于:WRITE (*, *) A(1), A(2), A(3), A(4), A(5)下面的输出语句将输出A数组中下标为奇数的五个元素的值:WRITE (*, *) (A(I), I=1, 10, 2)fortran77程序设计简介相当于:WRITE (*, *) A(1), A(3), A(5), A(7), A(9)下面的输出语句在每次循环时将同时输出下标的值:WRITE (*, *) (I, A(I),

45、I=1, 10, 2)隐含DO循环可以多层嵌套,例如下面的输出语句将首先输出W数组第一行中的元素,然后输出第二行、第三行的元素。WRITE (*, *) (W(I, J), J=1, 2), I=1, 3)fortran77程序设计简介由以上所举例子可以看出,利用隐含DO循环时,输入输出的次序和格式可由程序员来控制。隐含DO循环通常用于对数组的输入或输出,但也可用于对一般变量的输入或输出。例如:WRITE (*, *) (A, B, I=1, 3)相当于:WRITE (*, *) A, B, A, B, A, B又如以下语句:WRITE (*, *) (I, I=1, 10)相当于:WRITE

46、 (*, *) 1, 2, 3, 4, 5, 6, 7, 8, 9, 10fortran77程序设计简介7.4 给数组赋初值(使用DATA语句)通过DATA语句给变量或数组赋初值。例如:DATA A, B, C/-1.0, -1.0, -10/或者写成:DATA A/-1.0/, B/-10/, C/-1.0/DATA语句的一般形式如下:DATA 变量表/初值表/, 变量表/初值表/, 变量表中可以出现变量名、数组名、数组元素名、隐含DO循环;初值表中只允许出现常量,不允许出现任何形式的表达式。变量表中的变量个数与对应初值表中常量的个数必须相同,类型按从左到右的顺序一一对应相同。变量表中变量之

47、间、初值表中初值之间都用逗号隔开。fortran77程序设计简介对于以上所举的DATA语句,由于A、B、C三个变量都赋初值-1.0,所以可简写如下:DATA A, B, C/3*-1.0/当在DATA语句中的变量表中出现数组名时,初值表中常量的个数必须与元素的个数相同。例如:CHARACTER*6 CHN(10)DATA CHN/10*abcdef/fortran77程序设计简介给数组中部分元素置初值,可以在变量表中利用隐含DO循环。例如:INTEGER NUM(1000)DATA (NUM(I), I=1, 500) /500*0/, (NUM(I), I=501, 1000) /500*1

48、/DATA语句是非执行语句,可以出现在程序中说明语句之后、END语句之前的任意行上。程序在编译期间给变量赋初值,因为程序中一个变量只能有一个初值,如果程序中有多个DATA语句给同一个变量赋初值,则以最后一条DATA语句所赋初值为准。在程序执行期间DATA语句不起任何作用。以下程序中给I所赋的实际初值为10:DATA I/0/WRITE (*, *) 1. I=, II=I+1DATA I/10/WRITE (*, *) 2. I=, IENDfortran77程序设计简介7.5 程序举例 例7.1输入10名学生的学号和一门课的考试成绩,把高于平均分的学生学号和成绩打印出来 PARAMETER

49、(NUMST=10) CHARACTER*7 NUM(NUMST) DIMENSION S(NUMST) REAL AVE, SUM READ (*, *) (NUM(I), S(I), I=1, NUMST) SUM=0.0 DO 10, I=1, NUMST, 1 SUM=SUM+S(I) 10 CONTINUE AVE=SUM/NUMST DO 20, I=1, NUMST, 1 IF (S(I) .GE. AVE) WRITE (*, *) NUM(I), S(I)20 CONTINUE ENDfortran77程序设计简介例7.2输入10名学生一门课的考试成绩,统计各分数段的人数用数

50、组的元素作为各分数段的计数器。凡是0-9分用下标为0的计数器统计,11-19分用下标为1的计数器统计,故成绩与数组下标的关系如下:READ (*, *) SK=S/10C(K)=C(K)+1fortran77程序设计简介PARAMETER (NS=10)INTEGER COUNTER(0:10)DIMENSION S(NS)DATA COUNTER/11*0/READ (*, *) (S(I), I=1, NS)DO 10, I=1, NS, 1 IF (S(I) .LE. 100 .AND. S(I) .GE. 0) THEN K=S(I)/10 COUNTER(K)=COUNTER(K)+

51、1 END IF10CONTINUE WRITE (*, *) COUNTERENDfortran77程序设计简介例7.3顺序查找PARAMETER (NA=10)INTEGER A(NA), X, PDATA A/55, 62, 93, 87, 10, 23, 38, 71, 35, 91/READ (*, *) XWRITE (*, *) (A(I), I=1, NA)P=1DO 10 WHILE (X .NE. A(P) .AND. P .LT. NA) P=P+110CONTINUEIF (X .EQ. A(P) THEN WRITE (*, *) X, PELSE WRITE (*,

52、 *) X, Could not be foundEND IFENDfortran77程序设计简介例7.4折半查找序号序号A数组元素值数组元素值查找查找x(x=68)1 10 -TOP2 173 204 225 316 447 518 59 -MID9 68 -TOP -TOP -TOP-BOT-MID10 73 -MID11 89 -BOT12 95 -MID13 12014 13315 137 -BOT -BOT (a) (b) (c) (d)fortran77程序设计简介PARAMETER (NA=15)INTEGER A(NA), TOP, BOT, MID, XLOGICAL FIN

53、DDATA A/10, 17, 20, 22, 31, 44, 51, 59, 68, 73, 89, 95, 120, 133, 137/READ (*, *) XFIND=.FALSE.TOP=1BOT=NADO 10 WHILE (TOP .LE. BOT .AND. .NOT. FIND) MID=(TOP+BOT)/2 IF (X .EQ. A(MID) THEN FIND=.TRUE. WRITE (*, *) X, Has be found, on , MID, th position ELSE IF (X .LT. A(MID) THEN BOT=MID-1 ELSE TOP=

54、MID+1 ENDIF10CONTINUEIF (.NOT. FIND) WRITE (*, *) X, Has not be foundEND fortran77程序设计简介例7.5把数组中所有的数都向后移动一个位置,最后一个数移到最前面fortran77程序设计简介PARAMETER (NA=10)INTEGER A(NA), XDATA A/55, 62, 93, 87, 10, 23, 38, 71, 35, 91/WRITE (*, *) (A(I), I=1, NA)X=A(NA)DO 10, I=NA-1, 1, -1A(I+1)=A(I)10CONTINUEA(1)=XWRIT

55、E (*, *) (A(I), I=1, NA)ENDfortran77程序设计简介例7.6把一个数插到有序数列中,插入后数列仍然有序fortran77程序设计简介INTEGER A(20), XDATA (A(I), I=1, 10) /14, 25, 28, 33, 45, 56, 68, 72, 81, 95/WRITE (*, *) Enter a number to insert:READ (*, *) XNA=10WRITE (*, *) (A(I), I=1, NA)P=1DO 10 WHILE (X .GT. A(P) .AND. P .LE. NA) P=P+110CONTI

56、NUEDO 20, I=NA, P, -1 A(I+1)=A(I)20CONTINUEA(P)=XNA=NA+1WRITE (*, *) (A(I), I=1, NA)ENDfortran77程序设计简介例7.7从存有N个字符的字符数组中删去指定的字符PARAMETER (NC=20)CHARACTER C(NC), CHINTEGER P, NDATA C/NC* /READ (*, *) NREAD (*, *) (C(I), I=1, N)READ (*, *) CHN0=NP=1DO 10 WHILE (P .LE. N) DO 20 WHILE (CH .NE. C(P) .AND.

57、 P .LE. N) P=P+120 CONTINUE IF (CH .EQ. C(P) THEN DO 30 I=P, N-1 C(I)=C(I+1)30 CONTINUE N=N-1 END IF10CONTINUEIF (N .NE. N0) THEN WRITE (*, *) (C(I), I=1, N)ELSE WRITE (*, *) CHEND IFENDfortran77程序设计简介例7.8选择法排序fortran77程序设计简介PARAMETER (N=8)INTEGER A(N), PDATA A/15, 8, 4, 13, 6, 10, 17, 1/WRITE (*, *

58、) (A(I), I=1, N)DO 10 J=1, N-1 P=J DO 20 I=J+1, N IF (A(I) .LT. A(P) THEN P=I ENDIF20 CONTINUE K=A(J) A(J)=A(P) A(P)=K10CONTINUEWRITE (*, *) (A(I), I=1, N)ENDfortran77程序设计简介例7.9输入若干名学生的学号和四门课的考试成绩,计算出每位学生的平均分,打印出成绩表(学生人数不多于35人)PARAMETER (NR=35, NC=4)REAL S(NR, NC), AVE(NR)CHARACTER*6 NUM(NR)N=1READ

59、(*, *) NUM(N), (S(N, J), J=1, NC)DO 60 WHILE (NUM(N) .NE. .AND. N .LT. NR) N=N+1 READ (*, *) NUM(N), (S(N, J), J=1, NC)60 CONTINUEN=N-1DO 10, I=1, N SUM=0 DO 20, J=1, NC SUM=SUM+S(I, J)20 CONTINUE AVE(I)=SUM/NC10CONTINUEWRITE (*, *)DO 30, I=1, N WRITE (*, *) NUM(I), (S(I, J), J=1, NC), AVE(I)30CONTI

60、NUEENDfortran77程序设计简介例7.10打印出以下形式的杨辉三角形11112 113 3 114 6 4 115 10 10 5 1矩阵的第1列上元素和对角线上元素的值都为1。此外,三角形中第i行上第2列到第i-1列上的元素值与上一行上的元素值有如下的关系: A(I, J)=A(I-1, J-1)+A(I-1, J)fortran77程序设计简介PARAMETER (NM=6)INTEGER PST(NM, NM)DO 10, I=1, NM PST(I, 1)=1 PST(I, I)=110CONTINUEDO 20, I=3, NM DO 30, J=2, I-1 PST(I,

61、 J)=PST(I-1, J-1)+PST(I-1, J)30 CONTINUE20CONTINUEDO 40, I=1, NM WRITE (*, *) (PST(I, J), J=1, I)40 CONTINUEENDfortran77程序设计简介3.3 FORTRAN函数用FORTRAN解题往往要用到一些专门运算,如求三角函数sinx,cosx,求,绝对值|x|,对数lnx,指数ex,求一组数中最大数和最小数。FORTRAN提供了一些系统函数来完成这些运算。程序设计者不必自己设计进行这些运算的语句组(即程序段或子程序),只需写出一个函数的名字以及给出一个或若干个自变量,就可以得到所需的值

62、。例如:SQRT(4.0) SIN(2.0) EXP(3.5) LOG(3.0)fortran77程序设计简介例3-1PROGRAM FUNCTIONSPRINT *, SIN(1.0)PRINT *, TAN(1.0)PRINT *, ATAN(1.0)PRINT *, LOG(3.0)PRINT *, INT(8.6)PRINT *, INT(-8.6)PRINT *, MOD(8,3)PRINT *, SIGN(4.0,-0.5)PRINT *, SIGN(-4.0,0.5)PRINT *, REAL(8)PRINT *, MAX(8,6,7,15,-1)PRINT *, MIN(8,6

63、,7,15,-1)ENDfortran77程序设计简介3.4 FORTRAN算术表达式 3.4.1 算术运算符和运算优先级五种算术运算符号:+ - * / *不同的运算符按以下优先级次序:*最高 *, /次之 +, -最低同一优先级的两个运算,按“先左后右”原则。例如:3+5-6.0*8.0/4*2 fortran77程序设计简介3.4.2 FORTRAN算术表达式的含义和表示方法 所谓表达式是指一个或多个运算的组合。表达式是由运算符和括号将各运算元素(常量、变量、函数、数组元素)连接起来的一个有值的式子。FORTRAN允许使用四种表达式:算术表达式关系表达式逻辑表达式字符表达式 fortra

64、n77程序设计简介算术表达式中各运算元素都是算术量,使用的运算符只能是算术运算符,表达式的值也是一个算术量(即数值)。例如: (A-B)/C*2+SIN(X+Y) 表3.4是对表达式书写的正误比较,供读者参考。fortran77程序设计简介3.4.3 表达式运算中的类型问题FORTRAN允许不同类型的算术量(包括整型、实型、双精度、复型)之间的算术运算,但不允许在算术量和非算术量(如逻辑型、字符型)之间进行算术运算。例如2*3.5是允许的。2为整型量,3.5为实型量,那么它的乘积是什么类型的呢? fortran77程序设计简介FORTRAN作如下规定:1、同类型的算术量之间运算的结果仍保持原类

65、型。2、如果参加运算的两个算术量为不同类型,则将它们转换成同一类型,然后进行运算。转换的规律是:将低级类型转换为高级类型。类型的级别如下:整型低,实型高。如果有:5*6.5,则系统先将5转换为5.0,然后乘以6.5得32.5,为实型数。5*6.0的值为30.0。fortran77程序设计简介3.4.4 运算的误差问题整型量的运算是准确的,没有任何误差(只要在整数范围内)。而实型量的运算会出现一些误差。例如:11111.1*1111.11 0.001+1246825.0-1246820.0 总之,在实数运算中应充分考虑到其可能出现的误差,而且在运算过程中误差会不断积累而增大,有时可能达到一个可观

66、的程度。整型量的运算速度比实数快而且不出现误差,但整数的范围有限。用实数运算速度慢而且有误差。如果想保持大的表数范围又有较高的准确度,应增加有效位数,可采用双精度型数,其有效位数可达1617位以上。 fortran77程序设计简介3.5 赋值语句3.5.1 赋值语句的性质和作用 赋值语句的作用是将一个确定的值赋给一个变量。其一般格式为: v=e 变量=表达式例如A=3.14159*R*2fortran77程序设计简介赋值语句有三类:算术赋值语句;逻辑赋值语句;字符赋值语句。赋值语句中的“=”号是“赋值”的符号。将赋值号右边的表达式的值赋给左边的变量。例如:A=3.6的作用是3.6A。算术赋值语

67、句兼有计算和赋值双重功能。即先计算出表达式的值;然后将该值赋给一个变量。根据赋值语句的性质可以看出:赋值号左边只能是变量名(或数值元素名),而不能是表达式,赋值号右边可以是常量、变量或表达式(常量或变量是表达式的最简单的形式)。fortran77程序设计简介赋值号两侧的内容不能任意调换。下面两个程序作用是不同的: 程序1PROGRAM ASIGNMENTA=1.0B=2.0A=BPRINT *, A, BEND程序2PROGRAM ASIGNMENTA=1.0B=2.0B=APRINT *, A, BEND fortran77程序设计简介3.5.2 执行赋值语句时的类型转换问题一个算术赋值语句

68、中的被赋值的变量和表达式的类型可以相同,也可以不相同。FORTRAN作如下规定:1、如果变量与表达式的类型相同,则直接进行赋值。如:I=3A=5.7*T2、如果类型不同,则应先进行表达式的求值,然后将该表达式的值转换为被赋值变量的类型。如:I=3.5*2.1T=3*5/73、当赋值号两侧的类型不同时,往往会产生预想不到的结果。如:IMAX=13.7*2.5fortran77程序设计简介3. 简单的输出语句3.6.1 输出语句的作用和分类 程序的作用是对输入的数据进行加工处理,然后将结果输出。最常用的输出是显示。可用PRINT语句实现打印输出。输出一个或多个数据时需要通知系统以下信息:(1)输出

69、哪些数据;(2)用什么格式输出(如每个数据占多少列,小数部分占多少列,是用小数形式输出还是用指数形式输出?)(3)在什么设备上输出。如果已确定用显示器输出,可以用PRINT语句,用PRINT语句意味着只能在显示器输出。在PRINT语句中将上面提到的第1、2个信息告之系统。fortran77程序设计简介FORTRAN的输出格式有以下三类:(1)按用户指定的格式输出;(2)系统隐含的标准格式输出(又称表控格式);(3)无格式的输出,即以二进制形式输出,只适用于向磁盘、磁带等输出。fortran77程序设计简介3.6.2 表控输出语句表控输出是表控格式输出的简称。即由计算机系统隐含规定了输出的格式。

70、用这种方式输出数据时,系统自动地分别为每一个不同类型的数据规定所占的列数和表数形式(例如实数是用小数形式输出还是用指数形式输出,小数点位置在何处等)。fortran77程序设计简介例如:假若I=45, J=128PRINT *, I, J假若A=13.567, B=-186.75PRINT *, A, B假若A=1621025,-11.7210-13 PRINT *, A, Bfortran77程序设计简介3.7 简单的输入语句 3.7.1 输入语句的作用和分类所谓输入是指从外部设备上将数据输到计算机内存中。向计算机输入数据又叫做“计算机从外部设备读入数据”,输出数据又叫做“向外部设备写数据”

71、。fortran77程序设计简介FORTRAN用READ语句实现输入数据。与输出一样,有三种类型的输入:(1)数据按用户规定的格式输入;(2)用自由格式输入(又称表控输入);(3)无格式输入,即以二进制形式输入,只适用从磁盘或磁带输入。fortran77程序设计简介3.7.2 表控输入语句表控输入又称自由格式输入,用户不必指定输入数据的格式,只需将数据按其合法形式依次输入即可,数据间以逗号或空格间隔。例如有一输入语句:READ *, I , J, A, B“*”号表示“表控输入”,要求从系统隐含指定的输入设备上读入两个整型数给I和J,读入两个实数给A和B。可以从键盘输入以下数据:3, 10,

72、7.5, -15.8或:3 10 7.5 -15.8fortran77程序设计简介注意:(1)应该保证从输入设备输入READ语句中所要求的数据:1)输入数据的个数应当不少于READ语句中变量的个数;2)输入数据的类型要与READ语句中相应的变量的类型一致。如果在输入的第一个数据行上数据个数少于READ语句变量的个数,则系统会继续从第二个输入的数据行中读数,依此类推。 fortran77程序设计简介(2)若输入的数据个数多于所需的个数,则多余的数据不起作用。例如,输入以下数据:3, 10, 7.5, -15.8, 30, 70.6(3)每一个READ语句都是从一个新的输入行开始读数的。例如REA

73、D *, I, JREAD *, A, BREAD *, X, Y如果输入:3, 10, 7.5, -15.870.6, 8.5fortran77程序设计简介(4)如果在输入数据行中出现“/”号,表示对READ语句的输入到此结束,未被赋值的变量不予赋值。如:READ *, I, J, A, B输入数据为:3, 10 / 7.5, -15.8(5)在一个数据的数字之间不要插入空格,因此空格是数据间的分隔符。例如对上述READ语句输入以下数据:15, 71 8, 76.3, 65.8(6)前已提及:数据类型应与变量类型一致,如果变量为整型而输入数据为实型数,则按出错处理。如果变量为实型,输入数据为

74、整型数,许多系统是通融的,先自动将它变成实数然后输入给实型变量,如:READ *, A, B输入:168, 247fortran77程序设计简介3.8 参数语句(PARAMETER语句)在程序中常要多次用到某些常数,例如=3.1415926,若每次用到时都重复写3.1415926,是不方便的,FORTRAN 77允许用一个名字来代表一个常量,例如可以指定用PI来代表3.1415926,在本程序单位中用到PI时,它就代表3.1415926,这个PI称为“符号常量”或“符号常数”,即用一个符号来代表一个常量。FORTRAN规定用PARAMETER语句来定义符号常量。例如:PARAMETER (PI

75、=3.1415926) fortran77程序设计简介PARAMETER语句与赋值语句不同,它是非执行语句,在程序定义一个符号常量后,不能再改变它的值。例如下面这样是错误的:PI=0.5 或 READ *, PIPARAMETER语句应写在所有执行语句之前。符号常量的定名规则与定变量名相同。名字本身隐含类型,也遵循I-N规则。可以用类型语句定义符号常量的类型,例如:INTEGER PPARAMETER (P=5)注意,先写类型语句,后写参数语句。在一个参数语句中可以定义多个符号常量。如PARAMETER (A=0.5, N=50, J=30)fortran77程序设计简介用符号常量好处是:若需

76、要改变某一常量,不需一一改变这个常量,只需改变参数语句中符号常量的值则可。例如:PARAMETER (PRICE=3.5)COST1=PRICE*NUM1COST2=PRICE*NUM2COST3=PRICE*NUM3单价PRICE调整时,不必一一修改赋值语句,只需将参数语句中的PRICE=3.5改为PRICE=5.1即可,一改全改,不会由于遗漏某一处未改而出错。符号常量可以是数值型、逻辑型、字符型。符号常量不能作为语句标号,也不能出现在FORMAT语句中代替常数。除此之外,凡出现常量处均可用符号常量代替。 fortran77程序设计简介3.9 END语句、STOP语句和PAUSE语句3.9.

77、1 END语句FORTRAN 77中END语句的作用:(1)结束程序单位的运行;(2)作为程序单位的结束标志。END语句应该出现在本程序单位中的最后一行。一个程序单位中只能有一个END语句。在主程序中的END语句是使程序停止运行,控制回到操作命令状态。在子程序中的END,一方面作为子程序的结束标志,一方面使流程返回到调用程序(接着执行调用程序中的其它语句)。即它兼有RETURN语句的功能。fortran77程序设计简介3.9.2 STOP语句STOP语句是“停止运行”,一个程序单位中可以有多个STOP语句,执行到任一个STOP语句时程序即停止运行。在子程序中如果有STOP语句,使整个程序停止运

78、行而不是使控制返回主程序。在一个程序中含有多个STOP语句时,为了使程序员能清晰地辨别出是哪一个STOP语句使程序停止运行的,需要在执行STOP时,输出所需的信息。STOP语句的形式:STOP n例如:STOP 123或STOP A则在程序停止运行时输出信息“123”或“A”,由此辨别程序的流程。注意:STOP语句中的“n”是写一个不超过5位的无符号整数或一个字符串。而且它是可选的。fortran77程序设计简介3.9.3 PAUSE语句PAUSE语句是暂停语句,使程序“暂时停止执行”,但不是“结束运行”。系统只是把程序的执行暂时“挂起来”,等待程序操作员输入其它操作命令。在程序设计中,有时有

79、意在程序中加几个PAUSE语句,即设几个“断点”,把程序分成几段,调试程序时一段一段地检查,比如第一段验证无误后再继续调试第二段,若第一段有错则不应接着运行第二段而应改正第一段后再从头运行。在调试完成后,再将所有的PAUSE语句删去。PAUSE语句的一般形式为:PAUSE nn的含义同STOP语句中的n。暂停后使程序恢复运行的方法和命令是不同的,对IBM-PC只需打入“回车”键则可使之恢复运行。fortran77程序设计简介3.10 程序举例3.4求三角形面积已知三角形面积=SQRT(S(S-A)(S-B)(S-C),其中S=(A+B+C)/2,A,B,C为三边之长。PROGRAM EXAM1

80、READ (*, *) A, B, CS=(A+B+C)/2.0AREA=SQRT(S*(S-A)*(S-B)*(S-C)WRITE (*, *) A=, A, B=, B, C=, CWRITE (*, *) AREA=, AREAENDfortran77程序设计简介例3.5送入五个数,要求打印出其中绝对值最大的数。PROGRAM EXAM2READ (*, *) A, B, C, D, ELARGE=MAX(ABS(A), ABS(B), ABS(C),ABS(D), ABS(E)WRITE (*, *) THE GREATER NUMBER IS, LARGEENDfortran77程序

81、设计简介例3.6我国人口在1982年统计为10.3亿,如果年增长率为1.5%,求公元2010年末的人口数。计算人口公式为:p1=p0(1+r)n,p1为n年后人口,p0为人口初始值,r为年增长率,n为年数。程序为:PROGRAM EXAM3R=0.015N=2010-1982P0=10.3E8P1=P0*(1.0+R)*NWRITE (*, *) THE POPULATION OF 2010 IS, P1ENDfortran77程序设计简介习题2、5、6、7、8fortran77程序设计简介第四章 逻辑运算和选择结构4.1 引言 在第三章介绍了最简单FORTRAN程序,在程序中各语句是顺序执行

82、的,这种程序只包括顺序结构。这种程序只能解决逻辑关系比较简单的问题。在解决数值计算和非数值计算的问题时,常常遇到这样问题:需要对给定条件作逻辑判断,根据判断的结果决定执行哪种操作。这需要用到选择结构。fortran77程序设计简介用块IF结构实现选择结构,其形式为: IF (条件) THEN then块 ELSE else块 END IFfortran77程序设计简介例4.1计算职工工资。工人每小时计时工资为RATE,如果一周工作时间超过40小时,加班部分的工资按正常时间工资的1.5倍计算。fortran77程序设计简介C Payroll with overtimePROGRAM PAYROL

83、LREAD (*, *) RATE, HOURSIF (HOURS .GT. 40.0) THENREGPAY=RATE*40.0OVTPAY=1.5*RATE*(HOURS-40.0)ELSEREGPAY=RATE*HOURSOVTPAY=0.0END IFPAY=REGPAY+OVTPAYPRINT *, RATE=, RATE, HOURS=, HOURSPRINT *, REGULAR PAY=, REGPAY, OVERTIME PAY=, OVTPAYPRINT *, TOTAL PAY=, PAYEND fortran77程序设计简介4.2 关系表达式关系表达式是最简单的一种逻辑

84、表达式。 算术量可以是数值常数、数值型变量、数值函数,也可以是算术表达式。FORTRAN中有六个关系运算符。见下表。fortran77程序设计简介关系运算符 英语含义 数学符号 .GT. Greater Than .GE. Greater than or Equal to .LT. Less Than 3.5 A+B .LE. 0.0 A+B0 SIN(X) .GE. 0.5 SIN(X)0.5 A-B .NE. C+D A-BC+D I .LT. J/2 I0。但遇到一些比较复杂条件,如0X5,是0X和X5两个简单条件的组合,可以把它看作一个复合条件。可以写成以下逻辑表达式:X .GE. 0

85、.0 .AND. X .LT. 5.0 fortran77程序设计简介所谓逻辑表达式是对逻辑量进行逻辑运算的表达式。逻辑表达式的形式: FORTRAN 77的逻辑量:逻辑常量逻辑型变量关系表达式逻辑表达式的值是一个逻辑值,它不是真便是假。fortran77程序设计简介4.3.1 逻辑常量逻辑常量只有两个:.TRUE. .FALSE. 例如,当X=3时 X .LT. 5 的值为.TRUE.,而 X .LE. 0.0 的值为.FALSE.。逻辑常量可以在程序中出现,可以将它们赋给逻辑型变量。逻辑常量又称逻辑常数,它的性质与其它类型的常量相类似,代表一个常值。fortran77程序设计简介4.3.2

86、 逻辑型变量逻辑型变量存放逻辑常量。它的值也只能是.TRUE.或.FALSE.之一。可以将一逻辑常量赋予一个逻辑变量。假定A,B已被定义为逻辑型变量,则可以用赋值语句对它们赋值:A=.TRUE.B=.FALSE.这种赋值语句称为逻辑赋值语句。它的一般形式为:逻辑变量=逻辑表达式程序中对每一个逻辑变量都应加以说明,可用LOGICAL语句,如:LOGICAL A, Bfortran77程序设计简介4.3.3 逻辑运算符逻辑运算符 含义 逻辑运算举例 .AND. 逻辑与 A .AND. B .OR. 逻辑或 A .OR. B .NOT. 逻辑非 .NOT. A .EQV. 逻辑等 A .EQV. B

87、 .NEQV. 逻辑不等 A .NEQV. Bfortran77程序设计简介逻辑表达式示例:(A .LT. B) .AND. (A .GT. C) (X .LT. 0.0) .OR. (X .GT. 100.0) NOT. (X .LE. 0.0)(A .GT. B) .EQV. (C .GT. D)L1 .NEQV. L2fortran77程序设计简介4.3.4 逻辑表达式的运算次序一个逻辑表达式中可以包括多个逻辑运算符。即多个逻辑量经过逻辑运算后可以得到一个逻辑值。例如以下逻辑表达式:A .LE. 0.0 .AND. A+C .GT. B+D .OR. .NOT. .TRUE.FORTRA

88、N 77规定按以下次序进行运算:先计算算术表达式的值再求关系表达式的值最后进行逻辑运算fortran77程序设计简介运算类型运算类型运算符运算符优先级优先级 括号 ( ) 1算术运算 * 2 * / 3 + - 4关系运算 .GT. .GE. .LT. 5 .LE. .EQ. .NE. 逻辑运算 .NOT. 6 .AND. 7 .OR. 8 .EQV., .NEQV. 9fortran77程序设计简介4.4 用块IF实现选择结构4.4.1 块IF的组成 块IF的形式:IF (逻辑表达式) THEN 块1ELSE 块2END IFfortran77程序设计简介4.4.2 块IF的执行过程若逻辑表

89、达式的值为真,则执行块1,否则执行块2。fortran77程序设计简介4.4.3 块IF的嵌套例4.2学生考试成绩,大于等于80分的为A等,大于等于60分而小于80分的为B等,小于60分的为D等。READ (*, *) GRADEIF (GRADE .GE. 60.0) THENIF (GRADE .GE. 80.0) THENPRINT *, AELSEPRINT *, BEND IFELSEPRINT *, DEND IFfortran77程序设计简介例4.3如果在上例的基础上将80分以上定为A等,7079分定为B等,6069分定为C等,小于60分的为D等。READ (*, *) GRAD

90、EIF (GRADE .GE. 60.0) THENIF (GRADE .GE. 70) THENIF (GRADE .GE. 80.0) THENPRINT *, AELSEPRINT *, BEND IFELSEPRINT *, CEND IFELSEPRINT *, DEND IFfortran77程序设计简介例4.4 三个数A、B、C,按升序排序。READ (*, *) A, B, CIF (A .LE. B) THENELSET=AA=BB=TEND IFIF (B .LE. C) THENELSET=BB=CC=TIF (A .LE. B) THENELSET=AA=BB=TEND

91、 IFEND IFfortran77程序设计简介4.4.4 ELSE IF语句FORTRAN提供ELSE IF语句来处理逻辑“否则,如果” 。fortran77程序设计简介例4.6例4.3可以用ELSE IF语句来实现。READ (*,*) GRADEIF (GRADE .GE. 80.0) THENWRITE (*,*) AELSE IF (GRADE .GE. 70.0) THENWRITE (*,*) BELSE IF (GRADE .GE. 60.0) THENWRITE (*,*) CELSEWRITE (*,*) DEND IFfortran77程序设计简介例4.7有一函数:Y=0

92、 (X-10)2X+20(-10=X0)20(0=X20)30-0.5X(20=X40)50-X(40=X=50)READ (*,*) XIF (X .LT. -10.0) THENY=0.0ELSE IF (X .LT. 0.0) THENY=2.0*X+20.0ELSE IF (X .LT. 20.0) THENY=20.0ELSE IF (X .LT. 40.0) THENY=30.0-0.5*XELSE IF (X .LT. 50.0) THENY=50.0-XELSEY=0.0END IFPRINT *, Y=, YENDfortran77程序设计简介4.5 逻辑IF语句 逻辑IF语

93、句实现选择结构,但它与块IF不同:(1)它只有条件为真时才有操作,为假时不进行任何操作;(2)条件为真时只能执行一个语句而不能执行若干个语句。例如:IF (X .GT. 0.0) PRINT *, Xfortran77程序设计简介例4.8计算READ (*, *) XIF (X .GE. 0.0) Y=3.0*X+6.0IF (X .LT. 0.0) Y=-X*X+2.0*X-8.0PRINT *, X=, X, Y=, YENDfortran77程序设计简介例4.9有三个数A,B,C,打印其中最大数。READ (*, *) A, B, CBIG=AIF (B .GT. BIG) BIG=BI

94、F (C .GT. BIG) BIG=CPRINT *, BIGfortran77程序设计简介习题fortran77程序设计简介第五章 循环结构的实现 l重复执行一组指令称为循环操作。在程序中存在两类循环:无条件循环和有条件循环。无条件循环是无休止地执行一个程序段,而有条件循环是在满足一定条件时才执行循环。l经常会遇到循环类型的问题,例如需要对全班学生求平均成绩,求n的阶乘,求 n个数的和等都需要用到循环处理的方法。fortran77程序设计简介5.1 用GOTO语句实现循环 GOTO语句的形式:GOTO 例如:“GOTO 10”表示流程转去标号为10的语句行继续执行。由于GOTO语句破坏了语

95、句顺序执行的正常状态,不符合结构化程序设计原则,因此一般不提倡使用GOTO语句。只有在一个基本结构内部可以使用GOTO语句。利用GOTO语句可以实现循环处理。fortran77程序设计简介例:读入学生的学号和成绩并且打印无条件循环:10READ *, NUM, GRADEPRINT *, NUM, GRADEGOTO 10有条件循环:N=110READ *, NUM, GRADEPRINT *, NUM, GRADEN=N+1IF (N .LE. 5) GOTO 10fortran77程序设计简介5.2 用DO语句实现循环 当需要执行的循环次数为已知时用DO语句实现循环比较方便。例如,上节读5

96、个学生的学号和成绩,要执行READ语句和PRINT语句5次。可以改用DO语句实现:DO 10, N=1, 5, 1READ *, NUM, GRADE 10PRINT *, NUM, GRADEfortran77程序设计简介5.2.1 循环语句(DO语句)和循环次数的计算 DO循环由一个DO语句和循环体组成: DO 10, I=1, 10, 1(循环语句) J=I*I(循环体) 10 PRINT *, I, JDO语句的一般形式为: DO 标号 , 循环变量= 初值, 终值, 步长 s v = e1, e2, e3循环次数可以从循环初值、终值和步长计算出来:r=INT(e2-e1+e3)/e3

97、)例如:DO 10, I=1, 10, 2DO 20, N=1, 5 DO 100, X=1.2, 2.4, 0.2DO 150, T=2.5*2, 50.0/2.0, 0.5 DO 200, M=1.5, 12.5, 1.5 fortran77程序设计简介5.2.2 循环执行过程 循环执行过程执行以下步骤:计算表达式e1,e2,e3的值,并将它们转换成循环变量的类型。将初值e1赋予循环变量v。计算应循环的次数r。检查循环次数,若r=0或r0,则执行循环体。执行终端语句时循环变量v增值,即v=v+e3。循环次数r减1。返回步骤4,重复执行步骤4、5、6、7。从以上流程图和上述步骤可知,终端语句

98、的作用,除了完成该语句本身的功能,还有两个作用:(1)使循环变量v增值e3,(2)使循环次数r减1。 fortran77程序设计简介5.2.3 循环终端语句和继续语句(CONTINUE语句)l循环终端语句可以是除了GOTO、块IF、ELSE、ELSE IF、END IF、END、STOP和RETURN语句之外的任一可执行语句,如打印语句、赋值语句、输入语句等都可以作为终端语句l非执行语句不能作为循环的终端语句fortran77程序设计简介为了使循环的起止范围清晰,使终端语句与一般执行语句所区别,用CONTINUE语句作为终端语句。继续语句CONTINUE的形式为:CONTINUE例如:READ

99、 *, A, BCONTINUEPRINT *, A, B DO 20, I=1, 10, 2 PRINT *, I20CONTINUEfortran77程序设计简介例5.1求5!INTEGER FACTFACT=1DO 10, I=1, 5FACT=FACE*I10 CONTINUEPRINT *, FACTENDfortran77程序设计简介例5.2求1!+2!+N!READ *, NSUM=0.0FACT=1.0DO 100, I=1, N FACT=FACE*I SUM=SUM+FACT100 CONTINUEPRINT *, SUMENDfortran77程序设计简介例5.3一个整数

100、I,求另一个整数J,使I和J在用8位二进制表示时互为逆序。例如I=3,用8位二进制表示为00000011,应求出J=192,其二进制数形式为11000000。即根据b7b1b0得到b0b1b7。思路:依次求出b0,b1,b2,b7,然后,将b0*27, b1*26, , b7*20相加,得到J。给定I后,用函数MOD(I, 2)即可求出b0,例如MOD(3, 2)的值为1,得b0=1。再将I/2=I得到新的I,如此继续下去,直到求出b7为止。fortran77程序设计简介C OBTAIN THE BIT-REVERSE OF IPRINT *, NUMBER TO REVERSE:READ *

101、, IJ=0DO 10, K=1, 8 J=2*J+MOD(I, 2) I=I/210CONTINUEPRINT *, REVERSE IS, JENDfortran77程序设计简介例5.4求ex=1+x+x2/2!+x3/3!+xn/n!READ *, N, XTERM=1.0E=1.0DO 10, I=1, NTERM=TERM*X/IE=E+TERM10CONTINUEPRINT *, EXP(, X, )=, EENDfortran77程序设计简介5.2.5 DO循环的嵌套在一个DO循环中又完整地包含另一个DO循环,称为DO循环的嵌套。 DO 10, I=1, 10 DO 20, J=

102、1, 5 20 CONTINUE 10 CONTINUE内循环应当完整地嵌套在外循环之内,内外循环不能交叉。 DO 10, I=1, 10 DO 20, J=1, 5 10 CONTINUE 20 CONTINUEfortran77程序设计简介例5.5求1!,3!,5!,7!C CALCULATES 1!, 3!, 5!, 7!DO 20, J=1, 7, 2 FACT=1.0 DO 10, K=1, J FACT=FACT*K10 CONTINUE PRINT *, J, !=, FACT20 CONTINUEENDfortran77程序设计简介例5.6例5.4程序可以改用DO循环嵌套实现R

103、EAD *, N, XE=1.0DO 10, I=1, NFACT=1.0P=1.0DO 20, J=1, I FACT=FACT*J P=P*X20CONTINUETERM=P/FACTE=E+TERM10 CONTINUEPRINT *, EXP(X)=, EENDfortran77程序设计简介例5.7打印“九九乘法表”DO 10, I=1, 9 DO 20, J=1, IK=I*JPRINT *, I, *, J, =, K20 CONTINUEPRINT *, 10 CONTINUEENDfortran77程序设计简介例5.8百钱买百鸡问题公元五世纪末,我国古代数学家张丘建在算经中提出

104、了“百鸡问题”:“鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一。百钱买百鸡,问鸡翁、母、雏各几何?”。意为:公鸡每只5元,母鸡3元,小鸡一元三只。100元买100只鸡。设X为公鸡数,Y为母鸡数,Z为小鸡数。根据题意:X+Y+Z=1005X+3Y+Z/3=100 - 15X+9Y+Z=3003个未知数,2个方程式,是一个不定方程,它没有唯一解,而有多组解。对这类问题无法用解析法解,只能将所有可能的X,Y,Z值一个一个地去试,看是否满足上面两个方程式,如满足就是一组解。fortran77程序设计简介原始版:INTEGER X, Y, ZDO 10, X=0, 100 DO 20, Y=0, 10

105、0 DO 30, Z=0, 100 IF (X+Y+Z) .EQ. 100) THEN IF (15*X+9*Y+Z .EQ. 300) PRINT *, X, Y, Z END IF30 CONTINUE20 CONTINUE10CONTINUEENDfortran77程序设计简介改进版:INTEGER X, Y, ZDO 10, X=0, 19 DO 20, Y=0, 33 Z=100-X-Y IF (15*X+9*Y+Z .EQ. 300) PRINT *, X, Y, Z20 CONTINUE10CONTINUEENDfortran77程序设计简介5.3 当型循环的实现 lDO循环用来

106、处理循环次数确定的情况是比较方便的。但是在处理的问题中,有许多是事先无法确定循环次数的,而是只给出一个条件,满足此条件时就继续执行循环体,若不满足,则循环停止。例如统计得分并计算平均成绩的程序。事先不知道有多少人得分,只能用SCORE的值来控制循环是否继续:当SCORE=0,表示输入了一个正常的成绩,应该统计和处理;当SCORE2) 初始条件为: F1=1 (n=1) F2=1 (n=2)解上述Fibonacci数列的思路是:从F1,F2推出下一个数F。再将原来的F2作为F1,原来的F作为F2再推出新的F,如此一直推下去。fortran77程序设计简介1,1,2,3,5,8,13,21,34

107、F1=1.0 F2=1.0 PRINT *, F1 PRINT *, F2 N=3 F=F1+F210 PRINT *, F F1=F2 F2=F F=F1+F2 N=N+1 IF (N .LE. 30) .AND. (F .LE. 1E5) GOTO 10 ENDfortran77程序设计简介5.5 几种循环形式的关系和比较 (一)DO循环用来处理已确定循环次数的问题。WHILE循环和UNTIL循环既可用来处理已知循环次数的循环问题,也可用来处理不确定循环次数的问题。对事先已确定循环次数的问题,用DO循环比较方便,它能使循环变量自动增值,不需用户写逻辑表达式,只需写出循环变量的初值、终值和步

108、长即可,使用方便。(二)DO循环实质上也是一种“当型循环”,它也是“先判断条件”,后执行循环体,但这种“当型循环”的循环条件只能是“当r不等于0”。(三)几种形式的循环可以互相转换,或者说,同一个问题可用任一种循环来处理。例如求5!,即可以用DO循环处理,也可用UNTIL循环处理。(四)各种循环可以互相嵌套。但必须一个循环完整地包含在另一个循环之内。fortran77程序设计简介例5.22求3-100之间的全部素数。由于3以上的素数必然是奇数,而且奇数的因子只能是奇数 DO 10, N=3, 100, 2 J=SQRT(REAL(N) I=3 DO 20 WHILE (I .LE. J) .A

109、ND. (MOD(N, I) .NE. 0) I=I+220 CONTINUE IF (I .GT. J) PRINT *, N10 CONTINUE ENDfortran77程序设计简介例5.23验证哥德巴赫猜想。哥德巴赫提出一个不小于6的偶数必定能表示为两个素数之和。例如:6=3+3,8=3+5,10=3+7将6100之间的全部偶数表示为两个素数之和。思路:一个数N,可分解为A和B两个数,分别检查A和B是否素数,如都是,则为一组解。如A不是素数,就不必再检查B是否素数。先从A=3开始,检验A和B(B=N-A)是否素数。然后使A+2=A,再检验A,B是否素数,直到A=N/2为止。fortra

110、n77程序设计简介INTEGER N, A, B, WDO 10, N=6, 100, 2 DO 20, A=3, N/2, 2W=0J=SQRT(REAL(A)I=3DO 30, WHILE (I .LE. J) .AND. (W .EQ. 0) IF (MOD(A, I) .EQ. 0) THENW=1 ELSEI=I+2 END IF30CONTINUEIF (W .EQ. 0) THEN B=N-A W=0 J=SQRT(REAL(B) I=3 DO 40, WHILE (I .LE. J) .AND. (W .EQ. 0)IF (MOD(B, I) .EQ. 0) THEN W=1E

111、LSE I=I+2END IF40 CONTINUE IF (W .EQ. 0) PRINT *, N, =, A, +, BEND IF20 CONTINUE10 CONTINUE ENDfortran77程序设计简介习题l求1-1/2+1/3-1/4+1/5-+1/99-1/100。l求1/(1*2)+1/(2*3)+1/(3*4)+1/(n(n+1), n=20。l用/2=(2*2/(1*3)*(4*4/(3*4)*(2*n)2/(2*n-1)*(2*n+1),求的近似值,设n=100。l用台劳多项式sinx=x/1-x3/3!+x5/5!-x7/7!+(-1)n-1*x2*n-1/(2

112、*n-1)!求sinx的近似值。l求100200间能被3或7整除的各自然数。l找出100999之间的所有“水仙花数”。所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数本身,例如,153=13+53+33,故153是水仙花数。l求Sn=a+aa+aaa+的值(aaa.a为n个a)。a,n由键盘输入,a的值为1-9之间的一个数。l打印由1,2,3,4这四个数字组成的所有可能的四位数,并统计它们的个数(允许出现各位数字相同的数,如111,2222)。l1989年我国有11亿人口,如果人口增长率分别为1%,1.5%,2%,2.5%,3%,问从1989年起经过几年人口会翻一番?l输入10个学生的

113、成绩,要求打印出成绩最高者和最低者的成绩,以及总平均成绩。fortran77程序设计简介第九章 子程序 应用程序由一个主程序和若干个子程序组成。程序中可以只有主程序而没有子程序,但是不能没有主程序而只有子程序。以前程序举例都只是由主程序组成的。程序在运行时总是从主程序开始执行,所以如果没有主程序,程序就无法运行。子程序有函数子程序、子例行程序和数据块子程序三种。数据块子程序仅用来给公用区中的变量赋初值,故将它放在后面与公用区的使用同时介绍。fortran77程序设计简介子程序可以被主程序调用,也可以被其它子程序调用,但是子程序不能直接或间接地自己调用自己,不允许递归调用。把调用子程序的主程序和

114、子程序统称为调用程序,把被调用的子程序统称为被调用程序。fortran77程序设计简介9.1 函数子程序 函数实例:f(x)=x4+x3+2x-7 +1(x0) Y= 0(x=0) -1(x0)函数子程序:FUNCTION Y(X)IF (X .GT. 0.0) THENY=1.0ELSE IF (X .EQ. 0.0) THENY=0.0ELSE Y=-1.0END IFENDfortran77程序设计简介三种函数:内部函数、语句函数、函数子程序(外部函数)。函数子程序是一个单独的程序单位,它不属于调用程序所在的程序单位,因此它称为外部函数。语句函数则属于其所在的程序单位,只能被本程序单位中

115、表达式引用。内部函数是FORTRAN提供的系统标准函数,可以为任何程序单位引用。fortran77程序设计简介例9.1编写求实型数绝对值的函数REAL FUNCTION MYABS(X) REAL XIF (X .LT. 0) THEN MYABS=-1*X RETURNELSE MYABS=XENDIFENDPROGRAM MAINREAL MYABS, X, AWRITE (*, *) Enter a number:READ (*, *) AX=MYABS(A)WRITE (*, *) A=, A, X=, XENDfortran77程序设计简介9.1.1 函数子程序的定义格式1:类型说明

116、 FUNCTION 函数名(虚拟参数表)格式2:FUNCTION 函数名(虚拟参数, ) 类型说明 函数名格式3:类型说明 FUNCTION 函数名()虚参可以是变量名、数组名、子程序名。fortran77程序设计简介9.1.2 函数子程序的调用 外部函数的调用形式与内部函数的调用形式完全相同,其形式如下: 函数名(实在参数, )或者函数名()fortran77程序设计简介9.2编写求1+2+n的函数子程序,调用此函数求以下表达式的值Y=(1+2+3)+(1+2+3+4)+(1+2+3+4+5)/(1+2+3+4+5+6)+(1+2+3+4+5+6+7)PROGRAM MAIN2N=3Y=(S

117、UM(N)+SUM(N+1)+SUM(N+2)/(SUM(N+3)+SUM(N+4)WRITE (*, *) Y=, YENDFUNCTION SUM(X)INTEGER XSUM=0DO 10 I=1, X SUM=SUM+I10CONTINUEENDfortran77程序设计简介例9.3已知sinh(x)=(ex-e-x)/2,由程序输入x的值,求出sinh(x),其中ex=1+x+x2/2!+x3/3!+.+xn/n!PROGRAM MAIN3REAL MYEXPREAD (*, *) XY=(MYEXP(X)-MYEXP(-X)/2.0WRITE (*, *) SINH(, X, )=

118、, YENDFUNCTION MYEXP(X)REAL MYEXPN=0T=1S=1DO 10 WHILE (ABS(T) .GT. 1E-5) N=N+1 T=T*X/N S=S+T10 CONTINUEMYEXP=SENDfortran77程序设计简介9.2 子例行程序 子例行程序和函数子程序都是子程序,它们的区别在于:函数子程序的名字代表一个值,在函数子程序中求出的函数值存放在函数名中。因此,函数名是函数值的体现者,对函数名应作类型说明。而子例行程序的名字只供调用,它不代表某个值,当然也不属于某个类型。在子例行程序中求得的值不是由子程序名带回调用单位,而是通过实参与虚参的联系带回调用单位

119、。fortran77程序设计简介例9.4使用子例行程序求1+2+.+nSUBROUTINE SUM(N, S)INTEGER NREAL SS=0DO 10 I=1, N S=S+I10CONTINUEENDPROGRAM MAIN4CALL SUM(3, Y1)CALL SUM(4, Y2)CALL SUM(5, Y3)CALL SUM(6, Y4)CALL SUM(7, Y5)Y=(Y1+Y2+Y3)/(Y4+Y5)WRITE (*, *) Y=, YENDfortran77程序设计简介11.2.1 子例行程序的定义子例行程序必须以SUBROUTINE语句开头,以END语句结束。形式如下:

120、SUBROUTINE 子例行程序名(虚拟参数, )SUBROUTINE 子例行程序名fortran77程序设计简介9.2.2 子例程程序的调用必须用一条独立的CALL语句来调用子例行程序,CALL语句的形式如下:CALL 子例行程序名(实在参数, )当子例行程序没有虚参时,则调用形式可以以下两种形式之一:CALL 子例行程序名 或 CALL 子例行程序名()fortran77程序设计简介子例行程序和函数子程序的主要差别:1、名字的作用不同。子例行程序名只供调用时使用,不得在子程序体内赋值;函数子程序名除了供调用时使用外,还代表着函数值,因此必须在返回前在函数体内给函数名赋予函数值。2、调用的方

121、式不同。函数子程序的调用总是出现在表达式中,并将所得的函数值参与表达式的运算;子例行程序必须用一条独立的CALL语句调用。fortran77程序设计简介在程序设计中,如果只需得到一个计算值,一般采用函数子程序的形式。在设计函数子程序时通常不主张在函数体内改变形参的值,从而保证不使对应的实参发生变化。如果希望通过子程序的运算操作得到一批数组(例如矩阵相加的结果),则应该采用子例行程序,将得到的新值通过实参与虚参的结合传送回调用单位,这是由在子例行程序体内给形参赋值实现的。另外,还通过使用子例行程序来完成一些特定的操作。fortran77程序设计简介例9.5编写子例行程序用来在一行上打印20个星号

122、SUBROUTINE ASTERISKCHARACTER*20 STARSTAR=*PRINT *, STARENDPROGRAM MAIN5CALL ASTERISKCALL ASTERISKENDfortran77程序设计简介例9.6编写子例行程序分别求出5*5矩阵两个对角线上元素值和PROGRAM MAIN6REAL W(5, 5)CALL READIN(W)CALL OPP(W, X1, X2)ENDSUBROUTINE READIN(A)REAL A(5, 5)WRITE (*, *) Enter 5*5 matrix:DO 10 I=1, 5READ (*, *) (A(I, J)

123、, J=1, 5)10 CONTINUE END SUBROUTINE OPP(A, S1, S2) REAL A(5, 5) S1=0 DO 10 I=1, 5 S1=S1+A(I, I)10 CONTINUE S2=0 DO 20 I=1, 5J=5-I+1S2=S2+A(I, J)20 CONTINUE ENDfortran77程序设计简介9.3 实参和虚参之间的数据传送 函数子程序和子例行程序中的虚参可以是变量名、数组名、函数名、子例行程序名,在子例行程序中还可用星号作为虚参。当函数子程序和子例行程序被调用之前,所有虚参都无定义,所有虚参既没有具体的存储单元也没有具体的值,只是起到形式

124、上的作用,所以人们也经常将虚拟参数称为形式参数(或简称形参)。当执行的流程转向子程序时,实参和虚参按地址结合,这时实参的存储单元就是对应虚参的存储单元。当执行的流程退出子程序时,该子程序的虚参又变成无定义的。fortran77程序设计简介9.3.1 变量作为虚参当虚参是变量时对应的实参可以是用一类型的常量、变量、数组元素和表达式。如果实参是变量或数组元素,在调用子程序时,对应的虚参实际上将与之共用同一个存储单元。因此,虚参的值就是实参的值,虚参的值改变时,对应实参的值也就同时改变。fortran77程序设计简介PROGRAM MAIN SUBROUTINE SUB(X, A)INTEGER A

125、, C(3) INTEGER X, ADATA C/3*0/ A=2*XA=100 X=2*ACALL SUB(A, C(2) ENDWRITE (*, *) A=, A, C(2)=, C(2)ENDfortran77程序设计简介 如果实参是常量或表达式,则子程序中对应的虚参变量的值不应当改变,也就是说在这种情况下虚参变量不应当在子程序中被赋值,否则会引起不可预料的结果。 如果虚参是字符变量,则它的长度定义应当遵循以下两条规则之一: (1)虚参字符变量的长度定义必须小于等于对应实参变量的长度。 (2)虚参字符变量的长度可用(*)来定义,表示长度不定。当调用子程序时,具有不定长度的虚参变量自动

126、定义成为与对应实参具有同样长度。fortran77程序设计简介例如以下程序中:PROGRAM MAIN SUBROUTINE SUB(CH)CHARACTER STR1*8, STR2*40CHARACTER* (*)CH.CALL SUB(STR1) ENDCALL SUB(STR2).ENDfortran77程序设计简介9.3.2 数组作为虚参当虚参是数组名时,对应的实参可以是同一类型的数组名或数组元素。以下将区分各种情况加以说明。(1)如果虚参数组是数值类型或逻辑类型,并且对应实参也是相同的类型,在调用子程序时将把实参数组第一个元素的地址传送给子程序作为虚参数组的第一个元素的地址,从而导

127、致了它们共用一个存储单元。由于每个数组占一串连续的存储单元,因此虚参数组的第二个元素必须按存放次序与实参数组的第二个元素共用存储单元,其它依次类推。图9.2给出了一维数组情况下虚参和实参数组结合的示意图。 fortran77程序设计简介PROGRAM MAINDIMENSION A(8)CALL SUB(A)ENDSUBROUTINE SUB(B)DIMENSION B(-1, 5).ENDfortran77程序设计简介图9.3给出了不同维数情况下,虚参和实参数组结合的示意图PROGRAM MAINDIMENSION A(2, 4).CALL SUB(A).ENDSUBROUTINE SUB(

128、B)DIMENSION B(6).ENDfortran77程序设计简介图9.4给出了3*3的实参数组与2*2的虚参数组结合的情况PROGRAM MAINDIMENSION A(3, 3)CALL SUB(A)ENDSUBROUTINE SUB(B)DIMENSION B(2, 2)ENDfortran77程序设计简介注意,在子程序中说明虚参数组时,它的元素个数必须小于等于对应实参数组中元素的个数。虚参数组总是按照内存排列次序与实参数组结合。虽然虚实结合的数组允许维数不同,下标的上下界不同,但在这种情况下由于对应元素使用的下标完全不同使程序很难读懂,也很容易造成一些隐藏的错误,因此应该尽量避免出

129、现这种情况。fortran77程序设计简介(2)如果虚参数组是数值类型或逻辑类型;并且对应实参是一个相同类型的数组元素,在调用子程序时,将把该元素的地址传送到子程序作为虚参数组第一个元素的地址,从而使它们共用一个存储单元;并且虚参数组的其余元素将与该实参数组元素后的元素按排列顺序一一对应结合。在这种情况下,子程序中实际用到的虚参数组最后一个元素必须落在对应实参数组的范围内,而且与数组维数无关。fortran77程序设计简介图9.5给出了当虚参为数组名,对应实参为数组元素时,两个数组结合的情况。 PROGRAM MAINDIMENSION A(8)CALL SUB(A(3).ENDSUBROUT

130、INE SUB(B)DIMENSION B(4)ENDfortran77程序设计简介图9.6给出了当虚参为数组名,对应实参为不同维数的实参数组元素时两个数组结合的情况。 PROGRAM MAINDIMENSION A(3, 3)CALL SUB(A(1, 2)ENDSUBROUTINE SUB(B)DIMENSION B(4)ENDfortran77程序设计简介图9.7中虚参数组的元素已超出对应实参数组的范围。这将引起运行时出错。 PROGRAM MAINDIMENSION A(6)CALL SUB(A(3)ENDSUBROUTINE SUB(B)DIMENSION B(6)ENDfortra

131、n77程序设计简介(3)当数组是字符类型时,虚参和实参数组不是按数组元素的顺序一一对应结合,而是按字符位置一一对应结合。虚参数组中允许的字符总数必须小于等于实参数组中允许的字符总数。在此条件下,虚、实数组的维数可以不同,下标的上、下界可以不同,数组元素的字符长度可以不同。图9.8给出了字符类型数组结合的示意图。PROGRAM MAINCHARACTER*4 B(6)CALL SUB(B)ENDSUBROUTINE SUB(C)CHARACTER*5 C(4)ENDfortran77程序设计简介 除非特殊需要,虚参字符数组元素的长度应该与对应实参相同,这样的程序不仅可读性好,而且易于调试检查。与

132、虚参字符数组对应的实参也可以是一个字符数组元素,虚参字符数组的第一个字符与该元素的第一个字符结合,其它按次序依次类推,只是虚参字符数组中最后一个字符必须落在对应实参数组的范围之内。fortran77程序设计简介(4)在子程序中,允许虚参数组是可调数组。可调数组的使用大大提高了子程序的通用性和灵活性。读者在了解数组虚实结合情况的基础上应该充分利用可调数组这一强有力的工具来进行程序设计。PROGRAM MAINDIMENSION A(10), B(4, 3)M1=4M2=3CALL SUB(A, 10, B, M1, M2)ENDSUBROUTINE SUB(X, NX, Y, N1, N2)DI

133、MENSION X(NX), Y(N1, N2).ENDfortran77程序设计简介可调数组名必须是虚参。可调数组中每一维的上下界可以是整型虚参变量,其值通过对应的实参传送过来;也可以是公用区中变量。为了使程序清晰易读,建议采用虚参变量来说明可调数组的上、下界而不用公用区变量。另外可调数组也遵循前述1、2、3中的有关规定。对于初学者来说要特别注意,只能在子程序中使用可调数组,而且对于那些只是在子程序中局部使用的(并非通过虚实结合传送的)数组不允许是可调的。fortran77程序设计简介(5)虚实数组中最后一维的上界可以用星号(*)表示。例如:PROGRAM MAINSUBROUTINE SU

134、B(X, Y)DIMENSION A(10), B(4, 3)DIMENSION X(0, *), Y(2, *).CALL SUB(A, B)END.END用这种方式定义的数组称为不定长数组。以上SUB子程序中的X、Y数组在调用之前其大小不固定,当调用该子程序时,它们的大小由对应的实参数组来确定。因此在上例中当执行了CALL SUB(A, B)调用语句后,SUB子程序中X、Y的实际说明为:DIMENSION X(0, 9), Y(2, 3)fortran77程序设计简介9.3.3 子程序名作为虚参 在虚参表中允许出现函数名和子例行程序名。FORTRAN编译程序完全根据某个虚参名字在子程序中出

135、现时的上下文关系来确定它是函数名还是子例行程序名。函数名在必要时应该进行类型说明。 例如以下子例行程序中:SUBROUTINE SUB(A, N, X, F)DIMENSION A(N).Y=F(I)+1X=A(I)+1.END 虚参A由说明语句可知是一个数组名,子程序表达式中A(I)的形式是数组元素的引用。N和X分别是整型和实型变量名。虚参中,F是以F(I)的形式出现在表达式中,在FORTRAN中,F(I)的形式可能是数组元素的引用或者可能是函数的调用。由于在SUB子程序中并没有说明F为数组名,因此FORTRAN编译程序根据上下文关系确定F为实型函数名。又如以下子例行程序中:l fortra

136、n77程序设计简介SUBROUTINE SUB(X, P).CALL P.END由于虚参P出现在CALL语句中,因此确定P为子例行程序名。在虚参中的函数名、子例行程序名(如以上的F、P)只是一个虚设的名字,它并不代表程序中实际存在的某个函数名或子例行程序名,实际的函数名或子例行程序名要在调用时通过实参传送给它。如果虚参是一个函数名,要求对应的实参代表一个在程序中实际存在的尾部函数名或内部函数名。如果虚参是一个子例行程序名,则要求对应的实参代表一个在程序中实际存在的子例行程序名。当在调用的程序单位中,实在参数中出现外部函数名或子例行程序名时,必须在调用程序的说明部分用EXTERNAL语句说明这些

137、名字。如果在实在参数表中出现内部函数名时,必须在调用程序的说明部分用INTRINSIC语句说明这些名字。以下我们通过例子来说明函数名和子例行程序名的虚实结合以及EXTERNAL和INTRINSIC语句的使用。fortran77程序设计简介例9.7编写一个函数子程序,通过函数名的传送,使之既能求正切值TAN(X)又能求余切值CTN(X)PROGRAM MAIN7INTRINSIC SIN, COSX=3.14159/5.0Y1=TRIANGLE(SIN, COS, X)Y2=TRIANGLE(COS, SIN, X)WRITE (*, *) TAN(, X*180/3.14159, )=, Y1

138、WRITE (*, *) CTN(, X*180/3.14159, )=, Y2ENDFUNCTION TRIANGLE(F1, F2, X)TRIANGLE=F1(X)/F2(X)ENDfortran77程序设计简介例9.8以下程序由你选择对输入的两个数(X1, X2)进行加法(Add)运算还是减法(Subtract)。当你打入字母A(或a)时,则对随后输入的两个数进行加法运算并输出结果;当你打入字母S(或s)时,则对随后输入的两个数进行减法运算并打印出结果。PROGRAM MAIN8EXTERNAL ADD, SUBCHARACTER CHWRITE (*, *) Enter A(Add)

139、 or S(Subtract):READ (*, (A) CHWRITE (*, *) Enter X1, X2:READ (*, *) X1, X2IF (CH .EQ. A .OR. CH .EQ. a) THENCALL TEST(ADD, X1, X2, Y)WRITE (*, 100) X1, +, X2, =, YELSE IF (CH .EQ. S .OR. CH .EQ. s) THENCALL TEST(SUB, X1, X2, Y)WRITE (*, 100) X1, -, X2, =, YELSEWRITE (*, *) Select error!END IFFORMAT

140、 (1X, 2(F6.1, A), F6.1)ENDSUBROUTINE TEST(T, X2, X2, X)CALL T(X1, X2, X)ENDSUBROUTINE ADD(A, B, C)C=A+BENDSUBROUTINE SUB(A, B, C)C=A-BENDfortran77程序设计简介9.3.4 星号作为虚参当形参表中出现一个*号时,对应的实参应该是一个冠有*号的语句标号。例如: PROGRAM MAIN SUBROUTINE EXAM(A, *, *) . IF (.) THEN120 X=X1+X2. . RETURN 1 CALL EXAM(X, *120, *140)

141、 ELSE IF () THEN 140 RETURN 2 ENDENDIF ENDfortran77程序设计简介在CALL EXAM(X, *120, *140)语句中,与虚参第一个*号对应的语句标号为120,与虚参第二个*号对应的语句标号为140。在执行EXAM子例行程序时,如果遇到END语句,执行的流程将按正常情况返回到调用语句的后继语句去继续执行。当遇到RETURN 1语句时,执行的流程返回主程序并跳到与第1个*号对应的语句标号120去继续执行。当遇到RETURN 2语句时,执行的流程返回主程序并跳到与第3个星号对应的语句标号140去继续执行。用星号作为形参将使子程序有一个入口而有多个

142、出口,这种返回方式不符合结构化程序设计的要求,因此除非特殊需要,一般不主张采用。fortran77程序设计简介9.4 利用子程序实现程序的模块化设计 函数子程序和子例行程序都是独立的程序单位,可以单独进行编译。除了函数子程序名和子例行程序名外,子程序内所用的语句标号、变量、数组、符号常量等都只局限于本程序单位;子程序中可以通过虚实结合使用可调数组,可以通过虚实结合传送子程序名,这都为结构化程序设计提供了有力的工具。fortran77程序设计简介在开发程序的时候,总是把一个大任务分解成若干个小子任务,并且更进一步把子任务分解成更小的子任务,一直细分到每一个子任务只完成比较简单的操作为止。当把所有

143、的子任务都由子程序来完成时,通常细分的程度以每个子程序不超过50-60语句行为宜。子程序可以多次调用,这使得一些相同的操作都可调用同一个子程序来完成而不必重复编程。用这种方法设计出现的程序不仅可读性好而且容易调试、修改和维护。在调试程序时可以一个个模块逐块进行;当需要修改程序时,对一个模块的修改往往不会影响到其它模块。fortran77程序设计简介主程序子程序1子程序nfortran77程序设计简介9.5 在子程序中的SAVE语句和DATA语句 函数子程序或子例行程序中用到的所有变量,在被调用前通常都没有确定的存储单元,每当子程序被调用时才临时分配存储单元,而且在退出子程序时这些存储单元又都被

144、释放并重新分配另作它用。所以这些变量的值不被保留。在下次进入子程序时,给这些变量分配的可能是另外的一些存储单元,上次调用时这些变量所具有的值已不复存在。称这些变量在子程序未调用时是无定义的。在函数或子例行程序中可以使用SAVE说明语句来指定子程序中的某些变量的存储单元不被释放,它们的内容在退出子程序期间保持不变,在下次调用时仍可使用。fortran77程序设计简介SAVE语句的形式如下:SAVE 变量表 或 SAVE变量表可以是本子程序中的变量名、数组名,若变量或数组名不止一个,它们之间用逗号隔开。在SAVE语句中不允许出现虚拟参数名。当SAVE语句中带有变量表时,则为变量表中指定的变量和数组

145、保留存储单元,如果SAVE语句中没有变量表,则表示让子程序中所有的变量和数组在程序执行期间都占有确定的存储单元,不因退出子程序而被释放。fortran77程序设计简介例9.9 求阶乘的函数,每次调用此函数时,把最后一项乘数放在变量N0中,把阶乘的值放在变量F中。当下次调用此函数时,如果N大于等于N0,则不必再从头开始进行连乘运算,只需把上次的函数值再乘以N0+1、N0+2、N即可。PROGRAM MAIN9WRITE (*, *)WRITE (*, *) ENTER N:READ (*, *) NDO 10 WHILE (N .GE. 0)WRITE (*, *) FUN=, FUN(N)WR

146、ITE (*, *) ENTER N:READ (*, *) N10 CONTINUEENDFUNCTION FUN(N)SAVE N0, FDATA N0/0/, F/1/IF (N .LT. 0) THENWRITE (*, *) DATA ERROR!FUN=-1RETURNELSE IF (N .LE. N0) THENF=1N0=1END IFDO 10 I=N0+1, NF=F*I10 CONTINUEFUN=FN0=NENDfortran77程序设计简介对于只需在第一次调用时赋初值,后续调用不必赋初值的情况,使用DATA语句是合适的。当用DATA语句给子程序中的变量或数组赋初值时

147、,这些变量和数组元素只是在子程序第一次调用时才有初值。如果没有SAVE语句说明,DATA语句中的变量和数组在第一次调用退出后就变成无定义的了。不要误解为调用一次子程序DATA语句就赋一次初值,因为DATA是非执行语句。如果每调用一次就需要赋一次相同的初值,这应该用赋值语句来实现。fortran77程序设计简介 FUNCTION FAC(N) FUNCTION FAC(N) DATA F/1/ F=1 IF (N .LT. 0) THEN IF (N .LT. 0) THEN WRITE (*, *) ERROR WRITE (*, *) DATA ERROR! FAC=-1 FAC=-1 RE

148、TURN RETURN ELSE ELSE DO 10 I=1, N DO 10 I=1, N F=F*I F=F*I10 CONTINUE 10 CONTINUE ENDIF ENDIF FUN=F FUN=F END ENDfortran77程序设计简介例9.10 给出一个产生伪随机数的函数RAND(),函数没有自变量,产生的随机数在0到1之间,不包括0和1 PROGRAM MAIN10 DIMENSION A(10) DO 10 I=1, 10 A(I)=RAND()10 CONTINUE WRITE (*, *) A END FUNCTION RAND()SAVE SEEDINTEGE

149、R SEED, C1, C2, C3PARAMETER (C1=29, C2=217, C3=1024)DATA SEED/0/SEED=MOD(SEED*C1+C2, C3)RAND=REAL(SEED)/C3ENDfortran77程序设计简介从程序运行的结果可以看到,每次产生相同的随机数序列。这是因为每次运行开始,随机数的种子SEED的初值总是为0。如果每次运行时想从终端输入种子SEED的初值,从而使每次运行时产生不同的随机数序列,可把函数改写如下:FUNCTION RAND()SAVE SEEDINTEGER SEED, C1, C2, C3PARAMETER (C1=29, C2=2

150、17, C3=1024)DATA SEED/0/IF (SEED .EQ. 0) THENWRITE (*, *) ENTER RAND NUMBER SEED:READ (*, *) SEEDENDIFSEED=MOD(SEED*C1+C2, C3)RAND=REAL(SEED)/C3ENDfortran77程序设计简介9.6 程序举例 例9.11编写函数求去掉尾部空格后字符串的长度PROGRAM MAIN11CHARACTER*80 LINEREAD (*, *) LINEL=LENGTH(LINE)WRITE (*, *) LEND FUNCTION LENGTH(LINE) CHARA

151、CTER*(*) LINE I=LEN(LINE) DO 10 WHILE (I .GT. 0 .AND. LINE(I:I) .EQ. ) I=I-110 CONTINUE LENGTH=I ENDfortran77程序设计简介例9.12编写子例行程序把字符串中的小写字母转换成大写字母,其它字符不变 SUBROUTINE TOUPCASE(STR) CHARACTER*(*) STR, CH*1 L=LEN(STR) DO 10 I=1, L, 1 IF (STR(I:I) .GE. a .AND. STR(I:I) .LE. z) THEN CH=CHAR(ICHAR(STR(I:I)+I

152、CHAR(A)-ICHAR(a) STR(I:I)=CH ENDIF10 CONTINUE ENDPROGRAM MAIN12CHARACTER*80 LINEREAD (*, *) LINEWRITE (*, *) LINECALL TOUPCASE(LINE)WRITE (*, *) LINEENDfortran77程序设计简介例9.13编写函数,从字符串中找出指定子串在该字符串中第一次出现的位置。此位置用子串第一个字符在字符串中的位置来表示PROGRAM MAIN13CHARACTER*8 STR, SUBSTRREAD (*, *) STRREAD (*, *) SUBSTRK=MYI

153、NDEX(STR, SUBSTR)WRITE (*, *) K ENDFUNCTION MYINDEX(STR, SUBSTR)CHARACTER*(*) STR, SUBSTRL=LENGTH(SUBSTR)L0=LENGTH(STR)I=1L1=L0-L+1DO 10 WHILE (I .LE. L1 .AND. STR(I:I+L-1) .NE. SUBSTR(1:L)I=I+110 CONTINUEIF (I .LE. L1) THENMYINDEX=IELSEMYINDEX=0ENDIFEND FUNCTION LENGTH(LINE) CHARACTER*(*) LINE I=LE

154、N(LINE) DO 10 WHILE (I .GT. 0 .AND. LINE(I:I) .EQ. ) I=I-110 CONTINUE LENGTH=I ENDfortran77程序设计简介例9.14编写函数判断字符串是否是回文。所谓回文是指从左到右或从右到左读字符串时都一样。例如LEVEL是回文,MADAM也是回文。要求不计空格,例如L EVEL、LE VE L也是回文。PROGRAM MAIN14CHARACTER*80 STRLOGICAL PALIN, YESWRITE (*, *) ENTER A STRING:READ (*, *) STRYES=PALIN(STR)IF (Y

155、ES) THENWRITE (*, *) YESELSEWRITE (*, *) NOENDIFENDLOGICAL FUNCTION PALIN(STR)CHARACTER*(*) STRINTEGER R, LPALIN=.TRUE.R=LEN(STR)+1L=0DO 10 WHILE (PALIN .AND. L .LT. R)L=L+1DO 20 WHILE (STR(L:L) .EQ. ) L=L+120 CONTINUE R=R-1 DO 30 WHILE (STR(R:R) .EQ. ) R=R-130 CONTINUE IF (STR(L:L) .NE. STR(R:R) PA

156、LIN=.FALSE.10 CONTINUE ENDfortran77程序设计简介第十一章 文件FORTRAN程序可以通过文件操作语句,经过指定的外部设备把数据输出到外部介质上,或者从外部介质上输入数据。对文件的一系列操作(包括打开、关闭、定位、输入输出等)称为对文件的存取、访问。FORTRAN数据文件由记录组成,FORTRAN中对文件的存取以记录为单位。输入时,从文件一次输入一个记录;输出时,一次把一个记录输出到文件中。fortran77程序设计简介FORTRAN数据文件可以按存取的方式分成顺序存取文件和直接存取文件。顺序文件的特点是:对文件的存取操作必须从头到尾顺序进行。程序中要读(写)第

157、n个记录时,必须已经对前n-1个记录进行过读(写)。而直接文件则可以在程序执行的过程中对任意一个指定的记录进行读(写)。无论是顺序文件还是直接文件,数据在文件中可以用两种形式存放:字符形式(ASCII代码),二进制形式。前者称为有格式存放,后者称为无格式存放。fortran77程序设计简介11.1 有格式顺序存取文件 READ (*, *) AREAD (*, *) BC=A+BWRITE (*, *) A=, AWRITE (*, *) B=, BWRITE (*, *) C=, CENDfortran77程序设计简介例11.1从预先准备好的数据文件中输入数据,并将输出数据写到文件中OPEN

158、(UNIT=1, FILE= F1.DAT, STATUS=OLD, ACCESS=SEQUENTIAL, FORM=FORMATTED)READ (1, *) A READ (1, *) BC=A+BOPEN(UNIT=2, FILE=F2.DAT, STATUS=NEW, ACCESS=SEQUENTIAL, FORM=FORMATTED)WRITE (2, *) A=, A WRITE (2, *) B=, BWRITE (2, *) C=, CCLOSE(1)CLOSE(2) ENDfortran77程序设计简介例11.2把1至10以及它们的平方数、立方数以表格形式放到TAB.DAT文

159、件中OPEN(UNIT=2, FILE=TAB.DAT, STATUS=NEW, ACCESS=SEQUENTIAL, FORM=FORMATTED)DO 10 X=1, 10, 1 WRITE (2, *) X, X*X, X*X*X10 CONTINUEREWIND(2)WRITE (*, *) X X*X X*X*X20 READ (2, *, END=30) A, B, CWRITE (*, *) A, B, C30GOTO 20 CLOSE(2)ENDfortran77程序设计简介对顺序文件进行输入输出的基本规则:(1)当用READ语句去读入文件时,为了正确输入,READ语句中各输入

160、项在类型上、在采用的格式说明上必须与输出语句的输出项按位置一一对应。(2)当对顺序文件进行读入时,在OPEN或者REWIND语句之后总是从文件的第一个记录开始去输入。每执行一次READ语句,总是从一个新的记录开始去读入。(3)当用READ语句去读文件记录时,如果READ语句中的输入项少于记录中的数据项,则记录中剩余的数据就被忽略,下一个READ语句从一个新的记录开始去读入。如果READ语句中的输入项多于记录中的数据项时,它将接着去读入一个记录,直到所有的输入项都得到数据或者遇到文件结束标志为止。fortran77程序设计简介(4)当对顺序文件进行输出时,在OPEN或者REWIND语句之后总是把

161、第一个WRITE语句输出的记录放在文件的开头,作为文件的第一个记录。当前WRITE语句所输出的记录总是作为文件的最后一个记录。如果所写的文件是一个老文件,则原来的内容全部丢失。因此在程序设计中对一个顺序文件不可能做到重写前半部分而保留后半部分。(5)可以采用以下方法把新的内容添加到老文件的后面。 10 READ (2, *, END=20)GOTO 10 20BACKSPACE(2)WRITE (2, ) (6)一个WRITE语句总是开始一个新的记录。记录的形成与在终端上输出的新行一致。fortran77程序设计简介(7)对一个顺序文件在读操作后立刻进行写操作,则当前写的这个记录就成了文件的最

162、后一个记录,此记录后的原来的记录全部丢失。在写操作后立刻进行读操作,则必须遇到文件结束标志。对同一个文件在进行写操作后要进行读操作时,必须先用文件定位语句(OPEN、REWIND、BACKSPACE)重新设置指针位置。(8)可用表控输入输出语句对文件进行格式输入输出。例如:WRITE (2, *) I, I*I格式由计算机系统来规定。当用表控输入输出语句对文件进行输入输出操作时,可以用REWIND语句使文件指针指向文件的开头;但不允许使用BACKSPACE使文件指针回退一个记录。由于各计算机系统对表控输入输出语句规定的格式互不相同,使这类数据文件不能在各种计算机上通用,因此通常不用表控输入输出

163、语句对文件进行操作。fortran77程序设计简介11.2 有格式直接存取文件直接存取只适用于磁盘文件,不能对磁带文件进行直接存取。对直接文件进行存取的基本操作步骤与对顺序文件进行存取的基本操作步骤相同,只是在OPEN语句中的说明项和READ、WRITE语句中的控制项有所不同。fortran77程序设计简介例11.3把1到10和它们的平方根数放入一个直接存取文件中。然后随意查找1到10的平方根数PARAMETER (N=10)OPEN(12, FILE=DATB.DAT, STATUS=NEW, ACCESS=DIRECT, FORM=FORMATTED, RECL=15)DO 10 I=1,

164、 N WRITE (12, 100, REC=I) I, SQRT(REAL(I)10CONTINUECLOSE(12)OPEN(10, FILE=DTAB.DAT, STATUS=OLD, ACCESS=DIRECT, FORM=FORMATTED, RECL=15)CALL FROMKEY(K)fortran77程序设计简介DO 20 WHILE (K .GT. 0) IF (K .LE. N .AND. K .GE. 1) THEN READ (10, 100, REC=K) IS, S WRITE (*, *) IS, S ELSE WRITE (*, *) INPUT ERROR!

165、ENDIF CALL FROMKEY(K)20CONTINUECLOSE(10)100FORMAT (I2, E13.6)ENDSUBROUTINE FROMKEY(K)WRITE (*, *) ENTER A NUMBER(0X11)READ (*, *) KENDfortran77程序设计简介对直接文件存取应遵循以下规则:(1)直接存取文件中每个记录的长度必须相等。如果实际输出的记录长度不等,则应该取最大的记录长度作为文件每个记录的长度。记录长度由相应FORMAT语句格式规定的输出所占域宽来决定。(2)如果是一个老文件,在OPEN语句中说明的记录长度必须与实际的记录长度一致。特别要注意尾随

166、的空格符,一个空格符占一个字节。回车换行符不计入记录长度。(3)用直接方式建立的文件可以采用顺序方式打开进行读。用顺序方式建立的文件,只要记录长度相等也可用直接方式打开进行读。(4)表控输入输出语句由于记录长度不能人为控制,因此一般不用于直接文件的存取。fortran77程序设计简介11.3 无格式文件的存取 在数据处理过程中,输出的大量数据往往并不是给人阅读的,而是作为中间数据为下次输入作准备,再由计算机去读它。在这种情况下把内部数据转换成字符串、再把字符串转换成内部数据的步骤是多余的,并且大大降低了输入输出的效率。用无格式输入输出则可避免格式输入输出中的这种多余步骤。它把输出中的各数据项直

167、接以机器内部的二进制数据形式存放到文件中,也从文件中把以机器内部形式存放的二进制数据直接读入到计算机内。fortran77程序设计简介无格式输入输出文件也可以按顺序和直接两种方式进行存取。不管存取方式如何,在OPEN语句中FORM=ce说明项中,等号右边的字符串表达式必须是字符串UNFORMATTED。在直接存取时,记录长度只与输出项的类型有关。一个整数和一个实数占4个字节,字符串中一个字符和一个逻辑值占一个字节,双精度数和复型数占8个字节。进行无格式输入输出时,输入输出语句中没有格式说明这一项,其它都和前两节介绍的一样。如:WRITE (10) I, JWRITE (2, REC=K), I

168、, JREAD (10, END=100)fortran77程序设计简介无格式文件只能进行无格式读或写。每执行一次输出语句,就输出一个记录,每执行一次READ语句就从文件中去读入一个记录。读文件记录时,输入项表中各项的类型必须与写记录时输入项表中各项的类型一一对应。任何文件中,记录要么都是无格式的,要么都是有格式的。无格式数据文件中数据是按机器内部的二进制代码形式存放的,而各计算机内部代码的形式互不相同,因此无格式数据文件一般只供本计算机系统读。如果要把输出数据提供给其它计算机系统,则应该采用格式文件。fortran77程序设计简介11.4 文件操作语句 一、OPEN语句OPEN语句用来把设备

169、号与文件名连接起来,并且对文件的各项性质进行指定。一个OPEN语句只能打开一个文件。语句形式如下:OPEN (说明项)说明项包括以下各项:(1)设备号说明。UNIT=ie。ie是一个值为正整数的算术表达式(当然可以是常量或变量)。其值由用户给出。数值范围为1到99。如果设备说明是OPEN语句中的第一项,则UNIT=可以省略不写。(2)文件名指定。FILE=ce。ce是一个字符串表达式(当然可以是字符串常量或变量)。其值(不计尾随空格)是由用户给出的数据文件名。此文件名与同一OPEN语句中的设备号连接起来。在OPEN语句中可以省略这一项。这时由计算机系统来确定文件名并把此文件名与设备号连接。fo

170、rtran77程序设计简介(3)文件状态说明。STATUS=ce。ce是一字符串表达式,其值由用户给出,可以是以下四种字符串之一。NEW:表示指定的文件尚不存在。当执行OPEN语句时,将在磁盘上建立该文件的同时,使文件的状态改变成OLD。NEW状态用于写操作。如果指定的文件名已经存在,将给出出错信息,但是有些计算机系统并不给出信息,而是把此已经存在的老文件冲空,使原来内容不复存在。OLD:表示指定的文件是已经存在的老文件。这一状态用于读操作,如果用于写操作则意味着重写文件或对文件进行添加。如果指定的文件并不存在,则计算机将给出出错信息。SCRATCH:表示与通道号连接的文件在关闭文件时将自动删

171、除。此状态不能与FILE=ce说明项共存。这一状态只能用于由计算机系统指定的文件名,使该文件作为程序运行过程中的一个临时性文件。UNKNOWN:这一指定表示由计算机系统来规定文件的状态。各计算机系统有不同的规定,请读者查阅所用计算机的有关手册。当省略STATUS=ce这一说明项时,则意味着指定的是UNKNOWN。fortran77程序设计简介(4)存取方式说明。ACCESS=ce。ce是一个字符串表达式,由用户给出。不计尾随空格,此表达式的值可以是以下两种之一。SEQUENTIAL:说明存取方式为顺序方式。DIRECT:说明存取方式是直接方式。当省略此说明项时,则代表顺序存取方式。(5)记录格

172、式说明。FORM=ce。ce是一个字符串表达式,由用户给出。不计尾随空格,此表达式的值可以是以下两种之一。FORMATTED:说明记录按有格式的形式存放。UNFORMATTED:说明记录按无格式的形式存放。当省略此项说明时,对于顺序存取文件,隐含是有格式的;多于直接存取文件,则隐含是无格式的。fortran77程序设计简介(6)记录长度说明。RECL=ie。ie是一个值为正整数的算术表达式,其值由用户指定。记录长度的单位为字节。对于直接存取文件必须指定记录长度。对于顺序存取文件,这项说明必须省略。(7)说明数字值格式输入字段中空格的含意。BLANK=ce。ce是一个字符串表达式,由用户给出其值

173、,当去掉尾部空格后其值必须是以下两种字符串之一。NULL:说明输入字段上的全部空格忽略不计,如果全部是空格,其值为零。ZERO:说明输入字段上的全部空格处理成数字零。当省略此项说明时,意味着指定的是NULL。此说明只能用于格式输入。fortran77程序设计简介(8)出错处理说明。ERR=I。I代表本程序单位中的一个语句标号,由用户指定。当OPEN语句操作出错(如指定的老文件并不存在等等)并不终止程序运行而是转向用户指定的这个语句标号去继续执行。如果省略此项说明,则没有这一功能。若同时不存在“IOSTAT=”项,遇到OPEN语句执行出错,系统将给出出错信息,终止程序运行。(9)出错状态说明。I

174、OSTAT=iv。iv是一个整型变量。当执行此OPEN语句时,将由计算机系统自动给此变量赋一个整数。当OPEN语句执行没有发生错误时iv得零值;若发生错误,则具有一个正整数值,具体的数值由计算机系统规定。当OPEN语句中省略这一项时,就没有上述功能。fortran77程序设计简介二、CLOSE语句CLOSE语句解除设备号与文件的连接,又称关闭文件。语句形式如下:CLOSE (说明项)说明项包括以下各项:(1)设备号说明。UNIT=ie。ie是值为正整数的算术表达式,由用户给出,说明所关闭文件的设备号。UNIT=可以省略不写,但ie绝不能省略。(2)关闭后文件状态说明。STATUS=ce。ce是

175、一个字符串表达式,由用户给出。去掉尾部空格其值应该为以下两种之一:KEEP:说明在关闭操作后,与设备号连接的文件保留下来不被删除。DELETE:说明在关闭操作后,与设备号连接的文件不予保留,被删除。当OPEN语句中的状态说明为SCRATCH(清除)时,不能使用KEEP。当CLOSE语句中省略这一说明项时,除了在OPEN语句中指定为SCRATCH的文件外全部保留。(3)出错处理说明。ERR=I。与OPEN语句中的作用相同。(4)出错状态说明。IOSTAT=iv。与OPEN语句中的作用相同。fortran77程序设计简介三、REWIND语句和BACKSPACE语句REWIND语句称为反绕语句,它使

176、指定设备号的文件指针指向文件的开头,用于顺序存取文件的操作。语句形式如下:REWIND (说明项)说明项包含以下各项:设备号说明。UNIT=ie。出错处理说明。ERR=I。出错状态说明。IOSTAT=iv。它们的含意与OPEN语句中的相同。BACKSPACE语句称为回退语句,它使指定设备号的文件指针退回一个记录位置,一般用于顺序存取文件。语句形式为:BACKSPACE (说明项)说明项的内容与REWIND的相同。fortran77程序设计简介四、输入语句输入操作由READ语句实现,它的语句形式为READ (说明项) 输入项表 输入项表中各项可以是变量名、数组元素名、数组名。各项之间用逗号隔开。

177、在READ语句中也可以没有输入项表,这时,每执行一次READ语句就跳过一个记录,每执行一次READ语句文件指针向文件尾部方向移动一个记录位置。 说明项包括以下各项:(1)设备号说明。UNIT=ie。除了可以用星号外,其它与OPEN语句中的设备号说明相同。(2)格式说明FMT=格式标识符。格式标识符可以是*号、FORMAT语句标号或者格式字符串。只有在对格式文件进行输入时才需要格式说明。对无格式文件进行输入操作时不允许出现格式说明。FMT=可以省略不写。(3)记录号说明。REC=ie。ie是一个值为正整数的算术表达式,由用户给出。对于直接存取文件进行输入时,此项必不可少,READ语句从文件中去读

178、由ie指定的那个记录号开始的记录。对于顺序存取文件,在READ语句中不得出现这一项。fortran77程序设计简介(4)文件结束说明。END=I。I代表本程序单位中一个语句标号。当READ语句中具有这一项说明时,当读到文件结束标志时将自动转向带有该标号的那条语句去继续执行,否则,若同时不存在IOSTAT=项,程序将终止执行,由系统给出出错信息。(5)出错信息。ERR=I。I代表本程单位中的一个语句标号。当READ语句执行过程中发生错误时(如格式不符等)程序将自动转向带有该标号的那条语句去继续执行,否则,若同时不存在IOSTAT=项,程序将终止执行,由系统给出出错信息。当发生错误时,文件指针处在

179、什么位置不能确定。(6)输入状态说明。IOSTAT=iv。iv代表一个整型变量,当执行READ语句时,将给iv赋一个整型值。当READ正确执行时,iv得零值;当遇到文件结束时iv得一小于零的负整数;当遇到出错条件时iv得一正整数,整数的值由各计算机系统规定。fortran77程序设计简介五、输出语句输出操作由WRITE语句实现,它的语句形式为WRITE (说明项) 输出项表输出项表可以是常量、变量、数组元素、数组名、表达式。各项之间用逗号隔开。每执行一次输出语句就输出一个新的记录。输出项表可以没有输出项。输出语句中的说明项包括以下各项:设备说明。UNIT=ie。格式说明。FMT= 格式说明符。记录号说明。REC=ie。出错说明。ERR=I。输出状态说明。IOSTAT=iv。它们的具体作用与READ语句中对应的项相似。fortran77程序设计简介11.5 程序举例例11.4利用随机函数产生若干个整数放在一个无格式顺序文件中,然后删除其中所有的奇数例11.5文件中的数已按由小到大的顺序排列。一个记录中放一个整数。请将任意个数插入到文件中去,插入后文件中的数仍然有序例11.6把两个存放有序数的文件归并成一个文件,此文件中的数仍按序存放。fortran77程序设计简介

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 教学/培训

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号