fortran77程序设计简介.ppt

上传人:tia****nde 文档编号:11496178 上传时间:2020-04-25 格式:PPT 页数:281 大小:1.86MB
返回 下载 相关 举报
fortran77程序设计简介.ppt_第1页
第1页 / 共281页
fortran77程序设计简介.ppt_第2页
第2页 / 共281页
fortran77程序设计简介.ppt_第3页
第3页 / 共281页
点击查看更多>>
资源描述
FORTRAN77语言-结构化程序设计,主讲:王飞江苏科技大学,教材:FORTRAN语言FORTRAN77结构化程序设计谭浩强等编著,第一章FORTRAN语言程序设计初步,1.1FORTRAN语言发展概况1.2简单的FORTRAN77程序分析1.3FORTRAN源程序的书写格式,1.1FORTRAN语言发展概况,FORTRAN语言是世界上第一个被正式推广使用的高级语言。它是1954年被提出来的,1956年开始正式使用,至今已有五十多年历史,但仍历久不衰,它始终是数值计算领域所使用的主要语言。FORTRAN是英文FORmulaTRANslation的缩写,意为“公式翻译”。它是为科学、工程问题或企事业管理中的那些能够用数学公式表达的问题而设计的,其数值计算的功能较强。FORTRAN77还不是完全结构化的语言,但由于增加了一些结构化的语句,特别是“块if”语句,提供了IF-ELSE-ENDIF形式的判断控制语句,使FORTRAN77能用于编写结构化程序。此外,还扩充了字符处理功能,使FORTRAN不仅可用于数值计算领域,还可以使用于非数值运算领域。目前,FORTRAN77已在国内外广泛使用,大多数计算机系统都已配置了FORTRAN77。FORTRAN语言的不同版本:FORTRANI、FORTRANII、FORTRANIV、FORTRAN66、FORTRAN77、FORTRAN90,1.2简单的FORTRAN77程序分析,为了使读者从一开始就了解什么是FORTRAN77程序,下面先介绍两个很简单的FORTRAN77源程序。例1.1求三个数的平均数程序代码:CCALCULATETHEAVERAGEOFTHREENUMBERSX=90.5Y=87.0Z=68.5AVER=(X+Y+Z)/3.0PRINT*,THETHREENUMBERSARE,X,Y,ZPRINT*,AVERAGE=,AVEREND,例1.2分别求R=1,3,12,5时的圆周长,可以用一个子程序来求圆周长。源程序由两部分组成:(1)主程序CMAINPROGRAMPROGRAMEX2PRINT*,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)子程序CSUBPROGRAMFUNCTIONC(R)PI=3.1415926C=2*PI*RRETURNEND,从以上例子中可以看出:1、一个程序由一个或若干个程序单位组成。主程序和每一个子程序分别是一个独立的程序单位。在解决一个比较复杂的问题时,可以分别将每个功能编为一个子程序,然后按搭积木一样将各有关程序单位组成一个程序。一个程序单位就是一个模块,结构化程序设计需要采用模块化方法,在FORTRAN中,子程序是实现模块化的有效方法。2、每一个程序单位都是以“END”结束的。在FORTRAN77中,END既是一个程序单位的结束标志,又是一个独立的语句(结束语句)。主程序中的END语句的作用是使程序“停止运行”,子程序中的END语句是“使流程返回调用程序”。请注意在一个程序单位中只能有一个END语句,如果需要,可以用STOP语句使程序终止或用RETURN语句从子程序返回。,3、一个程序单位包括若干行。FORTRAN行分为两类:(1)语句行。由一个FORTRAN语句组成,它对程序运行情况是有影响的。FORTRAN语句分为:执行语句和非执行语句。执行语句使计算机在运行时产生某些操作,如赋值语句、打印语句等。非执行语句(包括说明语句,数据语句等)将有关信息通知编译系统,以便在编译时作出相应的处理,例如类型说明语句、函数子程序语句等。(2)非语句行,即注释行。它不是FORTRAN语句,它不被翻译成机器目标指令,不产生任何机器操作。它仅仅是为了人们阅读程序的方便而加到程序中的。一个程序中注释行的数目不受限制,根据需要而定。但一个程序单位不能只由注释行组成。注释行是程序的一部分,在打印程序清单时,注释行也照样打印出来。注释行的内容完全是根据程序设计人员需要而写的,一般是为程序(或程序中某一部分)的作用作注释。注释可以用英文或汉语拼音文字,还可以用汉字作注释。在一些实用程序中,注释行的篇幅有时占整个程序的三分之一以上。,4、FORTRON程序中的语句可以没有标号,也可以有标号,根据需要而定。标号的作用是标志一个语句以便被其它语句引用。在同一个程序单位中不能有两个相同标号的语句。标号不影响语句的执行顺序。程序中语句执行的顺序一般依照它们在程序中的位置而定,即写在前面的语句先执行,写在后面的语句后执行。5、一个程序单位中各类语句的位置是有一定规定的,例如PROGRAM语句应是主程序的第一个语句,FUNCTION语句是函数子程序的第一个语句,END语句只能是程序单位中最后一行。6、FORTRAN源程序必须按一定的格式书写。哪些内容写在一行中的哪一列都有严格的规定。,1.3FORTRAN源程序的书写格式,FORTRAN源程序必须严格地按照一定的格式书写。在编译时对一行中不同位置上的内容分别处理。标准的FORTRAN程序纸格式见下图。,1、第l5列为标号区:可以写l至5位整数。也可以没有标号。标号区中的空格不起作用。如l00与100或100作用相同。标号应是无符号整数(不应包括正负号或小数点)。标号大小顺序没有任何要求。假如第二行的标号为1000,第三行的标号可以是10,也可以是10000。标号区内不得出现标号以外的内容,但注释行例外。注释行的内容可以写在标号区内,一行中第一列为“C”或“*”的,该行即被认为注释行。如果在第一列上出现的不是数字、空格或“C”和“*”的字符,编译时按出错处理。,2、第6列位续行标志区:如果在一行的第6列上写一个非空格和非零的字符,则该行作为其上一行的续行。3、第772列为语句区:语句可以从第7列以后的任何一列开始写,但一行只能写一个语句。语句区中的空格(除引号内的字符串内的空格)在编译时被忽略,例如SIN(X)与SIN(X)等效。4、第7380列为注释区:程序员一般利用此8列为程序行编序号以便查找。,3.1常量,所谓常量是指其值始终不变的量,例如3,5.6,-8在FORTRAN中允许使用下面六种常量:(1)整型常量(2)实型常量(3)双精度常量(4)复型常量(5)逻辑型常量(6)字符型常量。,3.1.1整型常量,整型常量,又称整型常数或整数(integer)。它是一个正的或负的或零的数。例如5,-8,+123。FORTRAN中的整数不应包括小数点。整数可以包括数符,也可以不包括数符。常数中各数字之间的空格不起作用。常数中不允许加入逗号。,3.1.2实型常量,实型常量,又称实数(real)。实数有两种表示形式:(一)小数形式:例如+12.3,-68.56,3.75,0.0等。它由一个或多个数字和一个小数点组成。小数点前或小数点后可以不出现数字,但不能小数点前后都不出现数字。例如+0.8,-8.0,0.0,60.,.36,.0合法18,36,7,.非法。,(二)指数形式:数字部分和指数部分,例如:12.3E8,0.91E-30。数字部分可以是不带小数点的整数形式,也可以是带小数点的实数,例如3E5,3.0E5均合法。指数不能为小数,例如3E5.6,8.6E-3.7不合法。指数部分不能单独用来代表一个常数,例如E12。,3.2变量3.2.1变量的概念,变量是指在程序运行期间其值是可以变化的量。系统为程序中的每一个变量开辟一个存储单元,用来存放变量的值。在程序中用到的变量,应该给它赋予确定的值,否则它有一个不确定的值。,3.2.2变量名,一个变量需要用一个名字(变量名)来识别。FORTRAN的变量名按以下规定选定:1、第一个字符必须是字母;2、在一个字母后面可以跟15位数字或字母。例如:A,X1,ABCD,CHINA,RATE,TOTAL,G861是合法的,而3X,X+Y,WAN-LI,-6B,U.S.A,DR.LI是不合法的。,选用变量名时注意:(1)在变量名中大写与小写是等价的,例如TOTAL,Total,total都代表同一个变量。(2)变量名的字符之间可以插入空格,例如:AMOUNT和AMOUNT都代表同一个变量AMOUNT。(3)变量名应尽量做到见名知义,例如:GRADE代表等级,AVER代表平均值,AMOUNT代表金额。,(4)FORTRAN77没有规定保留字,即可以用FORTRAN中的函数名或语句定义符作变量名,例如:SIN=3.5PRINT*,SIN或READ*,PRINTPRINT*,PRINT,3.2.3变量类型,常量是分为类型的,而变量是用来存放常量的,因此变量也相应地区分为整型变量、实型变量、双精度型变量、复型变量、逻辑型变量、字符型变量。整型变量用来存放整型常量,实型变量用来存放实型常量。,在程序中应当说明哪些变量是整型变量,哪些变量是实型变量。变量在内存中所占的字节数和数据存储形式与相应类型的常数相同。,规定变量的类型可以用以下几种方法:1、隐含约定-I-N规则FORTRAN规定:在程序中的变量名,凡以字母I,J,K,L,M,N六个字母开头的,即认为该变量为整型变量。以其它字母开头的变量为实型变量。例如下面变量为整型变量:I,J,IMAX,NUMBER,LINE,JOB,K1而下面的变量为实型变量:B1,COUNT,AMOUNT,YOUNG,TOTAL,BOOK,DG34,2、用类型说明语句确定变量类型FORTRAN中有六个类型说明语句:INTEGER语句(整型说明语句)REAL语句(实型说明语句)DOUBLEPRECISION语句(双精度说明语句)COMPLEX语句(复型说明语句)LOGICAL语句(逻辑型说明语句)CHARACTER语句(字符型说明语句)例如:INTEGERA,SUM,TOTAL,3.隐含说明语句IMPLICIT语句IMPLICITINTEGER(A,C,T-V)IMPLICITREAL(I,J)IMPLICITINTEGER(A,B),REAL(I,K),说明:,1、类型说明语句最优先,IMPLICIT语句次之,I-N规则最低。例如:IMPLICITREAL(I,J)INTEGERIMAX2、IMPLICIT语句和类型说明语句应该出现在程序单位中的所有执行语句的前面,IMPLICIT语句又应该在所有的类型说明语句的前面。,在编写程序时不仅需要考虑程序本身的结构,即操作语句间的结构关系,还要考虑数据的结构,要清楚数据的特性及数据间的联系,设计出适当的数据结构,然后考虑用什么样的算法。例如学生记录那样的数据结构可以用数组来实现。对于同一个问题的求解,可以采用不同的数据结构和不同的算法。对不同的数据结构有不同的算法,它们的复杂程度不同。选择合适的数据结构,可以降低算法的复杂程度,因此,在程序设计中应重视数据结构的设计。在计算机高级语言中提供实现各种数据结构的功能,用数据类型表示不同的数据结构。每种高级语言都规定它可以使用的数据类型。,三类数据结构:1)基本类型:最基本的数据项,是不可再分的。基本类型包括整型、实型、双精度型、复型、逻辑型等类型2)构造类型:由已知类型,按一定规则构造而成的复合类型数据,包括数组、记录、文件和集合等3)指针类型:用于构造各种形态的动态数据结构,如链表、队、栈、树、图等在FORTRAN77中基本类型有以下六种:整型实型双精度型复型逻辑型字符型,6.2双精度类型数据,实型提供7位有效数字,双精度型提供1517位有效数字。双精度常数要用指数形式表示,将实数中表示指数的字母E改成字母D即可。例如:1.23456789表示为1.23456789D+00.123表示为1.23D-01,例6.1分数序列2/1,3/2,5/3,8/5,13/8,21/13,求出这个序列的前20项之和。Fibonacci数列:1、1、2、3、5、8、13、21.。,DOUBLEPRECISIONA,B,C,SS=0.0D0A=1.0D0B=1.0D0C=A+BDO10,I=1,20,1S=S+C/BA=BB=CC=A+B10CONTINUEPRINT*,S=,SEND,6.4四种数值型数据之间的转换和运算6.4.1不同类型数据之间运算的规则,表6.1给出不同类型数据之间进行加减乘除运算的规则(C=A+B或C=A*B),其中表示FORTRAN77标准是不允许的。但有的FORTRAN编译系统作了放宽,允许双精度型数据和复型数据之间运算,结果为复型,6.4.2不同类型数据的赋值规则,表6.2不同类型数据的赋值规则(v=e),6.4.3类型转换函数,FORTRAN77提供一些函数,使不同类型的数据能相互转换,见表6.3。,6.4.4不同类型数据的比较规则,表6.4是比较规则。将A与B进行关系运算,星号表示只有用.EQ.或.NE.时才可以进行比较,6.5字符型数据,FORTRAN不仅能用于数值计算,而且具有处理文字的能力。计算机的用途已日益扩展到非数值运算领域,必须能有效地对文字信息进行处理。例如,对一个班学生名字按字母顺序排列,从一批书籍中找出指定书名的那一本等等。只有以前介绍过的五种类型(整型、实型、双精度型、复型、逻辑型)是不够的,FORTRAN77提供了字符类型。,6.5.1字符型常量,字符型常量亦称字符串(characterstring),它是用引号(单引号或双引号)括起来的若干个字符。字符型常量允许使用系统可以使用的字符,只要能从键盘输入给计算机系统的字符都可以出现在字符串中。例如下面的字符串都是合法的:CHINA“U.S.A”LIDAN“FUN-LI”Howareyou?“X=?”A+B;C+D;E+F;*$?#“您好”FORTRAN规定:字符串如出现引号要用两个连续的引号表示,例如:THATSRIGHT!,6.5.2字符型变量,用来存放字符型常量的变量称为字符型变量。在程序中必须先定义字符型变量才能使用它。定义字符型变量用CHARACTER语句或IMPLICIT语句,例如:CHARACTEER*5STR1,STR2,STR3CHARACTERNAME*20,ADDR*30,CODE*10如果语句统一指定的字符长度与变量个别指定的长度不一致,以个别指定优先于统一指定,例如:CHARACTER*5A,B*6,C,D*4,E,若CHARACTER语句中不指定长度,则隐含指定长度为1:CHARACTERA,B,C可以用IMPLICIT语句定义字符型变量:IMPLICITCHARACTER*5(A-C),CHARACTER*4(X)CHARACTER语句还可以定义符号常量:CHARACTER*5NAMEPARAMETER(NAME=CHINA),6.5.3字符型变量的赋值,用赋值语句对字符型变量赋值,例如:CHARACTER*5NAME1,NAME2,NAME3NAME1=CHINANAME2=BEIJINGNAME3=NEW也可以通过READ语句从键盘读入字符常量给字符变量,注意用表控格式输入字符串时要用撇号将字符串括起来,例如:READ*,NAME1,NAME2,NAME3,6.5.4子字符串,字符串的一部分称为字符串的子串。例如:字符变量A的值为NEWYEAR,则NEW,YEAR,EW,Y,AR都是A的子串。子串的形式表示:字符变量名(e1:e2)e1和e2是整型表达式,表示子字符串在字符串中的起止位置,例如:CHARACTER*33STRSTR=STRUCTUREDPROGRAMMINGINFORTRANPRINT*,STR(1:10),STR(27:33)e1和e2应满足关系:1e1e2LL为字符变量的长度,如省略e1表示e1为1,如省略e2,则表示e2=L,如e1,e2都不写(但不能省写冒号),表示e1=1,e2=L。,子字符串子串的值STR(12:22)PROGRAMMINGSTR(27:)FORTRANSTR(:10)STRUCTURESTR(5:5)CSTR(:)STRUCTUREDPROGRAMMINGINFORTRAN可以将一个子字符赋给一个字符变量或另一个子字符串,例如:NAME=STR(27:33)STR(1:10)=STR(27:33)STR(23:29)=STR(27:33),6.5.5字符表达式,字符型数据也可以进行运算。FORTRAN77只提供一种字符运算符字符连接符,用“/”符号表示将两个字符型数据连接起来。例如:A/B得到AB。A/B就是一个字符表达式。字符表达式的值是字符型常量。,例6.3将读入的名字和地址打印出来,CHARACTERNAME*10,ADDR*20,LINE*50READ*,NAME,ADDRLINE=MR./NAME/ADDRESS:/ADDRPRINT*,LINEEND,6.5.6字符关系表达式,两个数值型数据可以进行比较,两个字符型数据也可以进行比较,例如:A.GT.B字符比较的规则:按其ASCII代码的值进行比较。从附录可以看到不同字符的先后次序。常用的字符顺序:数字0小9大;数字比字母小;大写字母比小写字母小;字母A小Z大,a小z大;空格字符最小;其它专用字符有的比数字小,有的比数字大。,在进行关系运算时遵循以下规律:(1)两个单个字符比较,以其代码比较,代码大者为大。如AB(2)两个字符型变量比较,将两个字符串中的字符自左向右进行比较,如果所有字符都相等就认为两个字符串相等。如果两者中有不相同的字符,以最左面的第一对不同字符的比较结果为准。如:SHANGHAISHANKONG前四个字符相同,第5个字符GK,故知:SHANGHAI=B,则函数值为真,否则为假。LLT(A,B):若AG,C-H,即将一个字母变成其后第五个字母。取字母的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。只对字母进行转换,对字母之外的字符维持原样。例如:“HEISINBEIJING.”-“MJNXNSGJNONSL.”,CHARACTER*80LINE1,LINE2CHARACTERL1,L2READ*,LINE1DO10,K=1,80L1=LINE1(K:K)IF(LGE(L1,A).AND.LLE(L1,Z).OR.(LGE(L1,a).AND.LLE(L1,z)THENI=ICHAR(L1)J=I+5IF(J.GT.122.OR.(J.GT.90.AND.J.LT.96)J=J-26L2=CHAR(J)LINE2(K:K)=L2ELSELINE2(K:K)=L110CONTINUEPRINT*,LINE2END,例6.6从10个书名中查找有FORTRAN的书名,CHARACTER*7NAME,BOOK*30NAME=FORTRANDO10,I=1,10READ*,BOOKIF(INDEX(BOOK,NAME).NE.0)PRINT*,BOOK10CONTINUEEND,例6.7从一篇文章中查出包含多少个CHINA。假设文章有K行,每行80个字符。,CHARACTERLINE*80,WORD*5PARAMETER(WORD=CHINA)N=0READ*,KDO10,I=1,KREAD*,LINEJ=120L=INDEX(LINE(J:80),WORD)IF(L.EQ.0)THENJ=81ELSEN=N+1J=J+L+5-1ENDIFIF(J.LE.76)GOTO2010CONTINUEPRINT*,THENUMBEROFCHINAIS,NEND,习题,用双精度数据计算sinx=x-x3/3!+x5/5!-+(-1)n-1*x2n-1/(2n-1)!。直到第n项的绝对值小于10-15为止。输入一个单词,将它按逆序打印出来(如输入FORTRAN应打印NARTROF)。打印出以下图案,要求用字符型变量。*4.输入10个国家名,将其中按字母顺序在最前面的打印出来。,第七章数组,数组是一种数据结构,每个数组代表一组具有同一类型的变量,把数组中所包含的变量称为数组元素。在程序中通过说明语句声明数组。例如:INTEGERA(1:6)每个变量都在内存中占有一个独立的存储单元。例如:INTEGERA1,A2,A3,A4,A5,A6这六个变量所代表的六个存储单元在内存中的位置是彼此独立、互不相关的。,从终端读入六个数放到这六个存储单元中,则需要用以下输入语句:READ(*,*)A1,A2,A3,A4,A5,A6从这六个数中找出最小数,则需要以下一系列语句:MIN=A1IF(A2.LT.MIN)MIN=A2IF(A3.LT.MIN)MIN=A3IF(A4.LT.MIN)MIN=A4IF(A5.LT.MIN)MIN=A5IF(A6.LT.MIN)MIN=A6,数组是由一组相同类型的变量组成的,每个元素当然也在内存中占用一个存储单元。与A1、A2、A6不同的是,A数组的这六个存储单元在内存中是一个接着一个排列、彼此紧密相关的。数组名A是六个存储单元的总名字。同一个数组中的各个元素用不同的下标来区别,它们的表示形式为A(1)、A(2)、A(3)、A(4)、A(5)、A(6),下标放在紧跟在数组名后的一对圆括号内。在内存中A(2)元素的位置必定紧挨在A(1)之后,A(3)元素的位置紧挨在A(2)之后,其它依次类推。只要给出数组名和下标值就可以确定该数组元素在内存中的位置从而对其进行存取。在程序中通过改变下标值的方法来引用数组中不同的存储单元。例如,可以通过以下语句从终端给前面说明的A数组中的六个变量赋值:DO10,I=1,6READ(*,*)A(I)10CONTINUE,通过以下语句找出它们之中最小的那个数:IP=1MIN=A(IP)DO20,I=2,6IF(A(I).LT.MIN)THENIP=IMIN=A(IP)ENDIF20CONTINUE通过以上例子可以看到,数组的使用将使程序变得简洁、灵活、易读,它是程序设计中一种十分有用的工具。使用数组可以使许多复杂的算法得以实现,这些算法用简单变量是无法实现的。,7.1数组的说明和数组元素的引用,使用数组必须在类型说明语句或在DIMENSION语句中先对数组进行说明。说明数组的一般形式如下:类型说明或DIMENSION数组说明符,其中数组说明符的形式如下:数组名(维说明符,)维说明符的组成形式如下:下标下界:下标上界,7.1.1用类型语句说明数组,数组通常在类型说明语句中说明:REALIA(1:10),ND(80:99),W(1:3,1:2)INTEGERNUM(-1:0),A(0:2,0:1,0:3),7.1.2用DIMENSION语句说明数组,在上一小节中说明的IA、ND、W、NUM、A数组也可以用以下语句说明:DIMENSIONIA(10),ND(80:99),W(3,2)DIMENSIONNUM(-1:0),A(0:2,0:1,0:3)INTEGERAREALIA,ND,DIMENSION语句用来说明数组,数组的类型则根据数组名的第一个字母由隐含类型规则来决定,否则应该在类型语句中对数组名进行显示说明。例如,以上IA、ND是实型数组,所以应该在REAL语句中说明,而W则可以不在REAL语句中说明,因为按隐含类型规则,名字W的隐含类型就是实型;A数组(整型)应该在INTEGER语句中说明,而NUM数组则可以不必另行说明。,7.1.3数组元素的引用,数组元素的引用形式:数组名(下标,.),7.2数组的逻辑结构和存储结构,7.3数据的输入和输出,假定有以下数组说明语句:REALW(3,2)INTEGERA(10)将以A数组和W数组为例介绍对数组进行输入和输出操作的三种方式。,7.3.1利用DO循环对数组进行输入和输出,从终端键盘输入十个数,按顺序逐个放入A(1)到A(10)中DO10,I=1,10READ(*,*)A(I)10CONTINUE,把A(1)、A(3)、A(5)、A(7)、A(9)输出到终端屏幕上。DO20I=1,10,2WRITE(*,*)A(I)20CONTINUE,双重循环将从终端读入数据赋给W数组中各元素DO10I=1,3DO20J=1,2READ(*,*)W(I,J)20CONTINUE10CONTINUE,按列的顺序输出W数组中的元素值:DO30,I=1,2DO40,J=1,3WRITE(*,*)W(J,I)40CONTINUE30CONTINUE,按A数组元素排列的逆序打印数组元素的值:N=10DO20,I=N,1,-1WRITE(*,*)A(I)20CONTINUE打印出A数组中前五个元素的值:N=5DO20,I=1,NWRITE(*,*)A(I)20CONTINUE,每行输出五个元素的值:DO20,I=1,10,5WRITE(*,*)A(I),A(I+1),A(I+2),A(I+3),A(I+4)20CONTINUE,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),7.3.3在输入输出语句中使用隐含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),相当于:WRITE(*,*)A(1),A(3),A(5),A(7),A(9)下面的输出语句在每次循环时将同时输出下标的值:WRITE(*,*)(I,A(I),I=1,10,2)隐含DO循环可以多层嵌套,例如下面的输出语句将首先输出W数组第一行中的元素,然后输出第二行、第三行的元素。WRITE(*,*)(W(I,J),J=1,2),I=1,3),由以上所举例子可以看出,利用隐含DO循环时,输入输出的次序和格式可由程序员来控制。隐含DO循环通常用于对数组的输入或输出,但也可用于对一般变量的输入或输出。例如:WRITE(*,*)(A,B,I=1,3)相当于:WRITE(*,*)A,B,A,B,A,B又如以下语句:WRITE(*,*)(I,I=1,10)相当于:WRITE(*,*)1,2,3,4,5,6,7,8,9,10,7.4给数组赋初值(使用DATA语句),通过DATA语句给变量或数组赋初值。例如:DATAA,B,C/-1.0,-1.0,-10/或者写成:DATAA/-1.0/,B/-10/,C/-1.0/DATA语句的一般形式如下:DATA变量表/初值表/,变量表/初值表/,变量表中可以出现变量名、数组名、数组元素名、隐含DO循环;初值表中只允许出现常量,不允许出现任何形式的表达式。变量表中的变量个数与对应初值表中常量的个数必须相同,类型按从左到右的顺序一一对应相同。变量表中变量之间、初值表中初值之间都用逗号隔开。,对于以上所举的DATA语句,由于A、B、C三个变量都赋初值-1.0,所以可简写如下:DATAA,B,C/3*-1.0/当在DATA语句中的变量表中出现数组名时,初值表中常量的个数必须与元素的个数相同。例如:CHARACTER*6CHN(10)DATACHN/10*abcdef/,给数组中部分元素置初值,可以在变量表中利用隐含DO循环。例如:INTEGERNUM(1000)DATA(NUM(I),I=1,500)/500*0/,(NUM(I),I=501,1000)/500*1/DATA语句是非执行语句,可以出现在程序中说明语句之后、END语句之前的任意行上。程序在编译期间给变量赋初值,因为程序中一个变量只能有一个初值,如果程序中有多个DATA语句给同一个变量赋初值,则以最后一条DATA语句所赋初值为准。在程序执行期间DATA语句不起任何作用。以下程序中给I所赋的实际初值为10:DATAI/0/WRITE(*,*)1.I=,II=I+1DATAI/10/WRITE(*,*)2.I=,IEND,7.5程序举例例7.1输入10名学生的学号和一门课的考试成绩,把高于平均分的学生学号和成绩打印出来,PARAMETER(NUMST=10)CHARACTER*7NUM(NUMST)DIMENSIONS(NUMST)REALAVE,SUMREAD(*,*)(NUM(I),S(I),I=1,NUMST)SUM=0.0DO10,I=1,NUMST,1SUM=SUM+S(I)10CONTINUEAVE=SUM/NUMSTDO20,I=1,NUMST,1IF(S(I).GE.AVE)WRITE(*,*)NUM(I),S(I)20CONTINUEEND,例7.2输入10名学生一门课的考试成绩,统计各分数段的人数,用数组的元素作为各分数段的计数器。凡是0-9分用下标为0的计数器统计,11-19分用下标为1的计数器统计,故成绩与数组下标的关系如下:READ(*,*)SK=S/10C(K)=C(K)+1,PARAMETER(NS=10)INTEGERCOUNTER(0:10)DIMENSIONS(NS)DATACOUNTER/11*0/READ(*,*)(S(I),I=1,NS)DO10,I=1,NS,1IF(S(I).LE.100.AND.S(I).GE.0)THENK=S(I)/10COUNTER(K)=COUNTER(K)+1ENDIF10CONTINUEWRITE(*,*)COUNTEREND,例7.3顺序查找,PARAMETER(NA=10)INTEGERA(NA),X,PDATAA/55,62,93,87,10,23,38,71,35,91/READ(*,*)XWRITE(*,*)(A(I),I=1,NA)P=1DO10WHILE(X.NE.A(P).AND.P.LT.NA)P=P+110CONTINUEIF(X.EQ.A(P)THENWRITE(*,*)X,PELSEWRITE(*,*)X,CouldnotbefoundENDIFEND,例7.4折半查找,序号A数组元素值查找x(x=68)110-TOP217320422531644751859-MID968-TOP-TOP-TOP-BOT-MID1073-MID1189-BOT1295-MID131201413315137-BOT.GE.GreaterthanorEqualto.LT.LessThan3.5A+B.LE.0.0A+B0SIN(X).GE.0.5SIN(X)0.5A-B.NE.C+DA-BC+DI.LT.J/2I0。但遇到一些比较复杂条件,如0X=0,表示输入了一个正常的成绩,应该统计和处理;当SCORE2)初始条件为:F1=1(n=1)F2=1(n=2)解上述Fibonacci数列的思路是:从F1,F2推出下一个数F。再将原来的F2作为F1,原来的F作为F2再推出新的F,如此一直推下去。,1,1,2,3,5,8,13,21,34,F1=1.0F2=1.0PRINT*,F1PRINT*,F2N=3F=F1+F210PRINT*,FF1=F2F2=FF=F1+F2N=N+1IF(N.LE.30).AND.(F.LE.1E5)GOTO10END,5.5几种循环形式的关系和比较,(一)DO循环用来处理已确定循环次数的问题。WHILE循环和UNTIL循环既可用来处理已知循环次数的循环问题,也可用来处理不确定循环次数的问题。对事先已确定循环次数的问题,用DO循环比较方便,它能使循环变量自动增值,不需用户写逻辑表达式,只需写出循环变量的初值、终值和步长即可,使用方便。(二)DO循环实质上也是一种“当型循环”,它也是“先判断条件”,后执行循环体,但这种“当型循环”的循环条件只能是“当r不等于0”。(三)几种形式的循环可以互相转换,或者说,同一个问题可用任一种循环来处理。例如求5!,即可以用DO循环处理,也可用UNTIL循环处理。(四)各种循环可以互相嵌套。但必须一个循环完整地包含在另一个循环之内。,例5.22求3-100之间的全部素数。由于3以上的素数必然是奇数,而且奇数的因子只能是奇数,DO10,N=3,100,2J=SQRT(REAL(N)I=3DO20WHILE(I.LE.J).AND.(MOD(N,I).NE.0)I=I+220CONTINUEIF(I.GT.J)PRINT*,N10CONTINUEEND,例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为止。,INTEGERN,A,B,WDO10,N=6,100,2DO20,A=3,N/2,2W=0J=SQRT(REAL(A)I=3DO30,WHILE(I.LE.J).AND.(W.EQ.0)IF(MOD(A,I).EQ.0)THENW=1ELSEI=I+2ENDIF30CONTINUEIF(W.EQ.0)THENB=N-AW=0J=SQRT(REAL(B)I=3DO40,WHILE(I.LE.J).AND.(W.EQ.0)IF(MOD(B,I).EQ.0)THENW=1ELSEI=I+2ENDIF40CONTINUEIF(W.EQ.0)PRINT*,N,=,A,+,BENDIF20CONTINUE10CONTINUEEND,习题,求1-1/2+1/3-1/4+1/5-+1/99-1/100。求1/(1*2)+1/(2*3)+1/(3*4)+1/(n(n+1),n=20。用/2=(2*2/(1*3)*(4*4/(3*4)*(2*n)2/(2*n-1)*(2*n+1),求的近似值,设n=100。用台劳多项式sinx=x/1-x3/3!+x5/5!-x7/7!+(-1)n-1*x2*n-1/(2*n-1)!求sinx的近似值。求100200间能被3或7整除的各自然数。找出100999之间的所有“水仙花数”。所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数本身,例如,153=13+53+33,故153是水仙花数。求Sn=a+aa+aaa+的值(aaa.a为n个a)。a,n由键盘输入,a的值为1-9之间的一个数。打印由1,2,3,4这四个数字组成的所有可能的四位数,并统计它们的个数(允许出现各位数字相同的数,如111,2222)。1989年我国有11亿人口,如果人口增长率分别为1%,1.5%,2%,2.5%,3%,问从1989年起经过几年人口会翻一番?输入10个学生的成绩,要求打印出成绩最高者和最低者的成绩,以及总平均成绩。,第九章子程序,应用程序由一个主程序和若干个子程序组成。程序中可以只有主程序而没有子程序,但是不能没有主程序而只有子程序。以前程序举例都只是由主程序组成的。程序在运行时总是从主程序开始执行,所以如果没有主程序,程序就无法运行。子程序有函数子程序、子例行程序和数据块子程序三种。数据块子程序仅用来给公用区中的变量赋初值,故将它放在后面与公用区的使用同时介绍。,子程序可以被主程序调用,也可以被其它子程序调用,但是子程序不能直接或间接地自己调用自己,不允许递归调用。把调用子程序的主程序和子程序统称为调用程序,把被调用的子程序统称为被调用程序。,9.1函数子程序,函数实例:f(x)=x4+x3+2x-7+1(x0)Y=0(x=0)-1(x0)函数子程序:FUNCTIONY(X)IF(X.GT.0.0)THENY=1.0ELSEIF(X.EQ.0.0)THENY=0.0ELSEY=-1.0ENDIFEND,三种函数:内部函数、语句函数、函数子程序(外部函数)。函数子程序是一个单独的程序单位,它不属于调用程序所在的程序单位,因此它称为外部函数。语句函数则属于其所在的程序单位,只能被本程序单位中表达式引用。内部函数是FORTRAN提供的系统标准函数,可以为任何程序单位引用。,例9.1编写求实型数绝对值的函数,REALFUNCTIONMYABS(X)REALXIF(X.LT.0)THENMYABS=-1*XRETURNELSEMYABS=XENDIFENDPROGRAMMAINREALMYABS,X,AWRITE(*,*)Enteranumber:READ(*,*)AX=MYABS(A)WRITE(*,*)A=,A,X=,XEND,9.1.1函数子程序的定义,格式1:类型说明FUNCTION函数名(虚拟参数表)格式2:FUNCTION函数名(虚拟参数,)类型说明函数名格式3:类型说明FUNCTION函数名()虚参可以是变量名、数组名、子程序名。,9.1.2函数子程序的调用,外部函数的调用形式与内部函数的调用形式完全相同,其形式如下:函数名(实在参数,)或者函数名(),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),PROGRAMMAIN2N=3Y=(SUM(N)+SUM(N+1)+SUM(N+2)/(SUM(N+3)+SUM(N+4)WRITE(*,*)Y=,YENDFUNCTIONSUM(X)INTEGERXSUM=0DO10I=1,XSUM=SUM+I10CONTINUEEND,例9.3已知sinh(x)=(ex-e-x)/2,由程序输入x的值,求出sinh(x),其中ex=1+x+x2/2!+x3/3!+.+xn/n!,PROGRAMMAIN3REALMYEXPREAD(*,*)XY=(MYEXP(X)-MYEXP(-X)/2.0WRITE(*,*)SINH(,X,)=,YENDFUNCTIONMYEXP(X)REALMYEXPN=0T=1S=1DO10WHILE(ABS(T).GT.1E-5)N=N+1T=T*X/NS=S+T10CONTINUEMYEXP=SEND,9.2子例行程序,子例行程序和函数子程序都是子程序,它们的区别在于:函数子程序的名字代表一个值,在函数子程序中求出的函数值存放在函数名中。因此,函数名是函数值的体现者,对函数名应作类型说明。而子例行程序的名字只供调用,它不代表某个值,当然也不属于某个类型。在子例行程序中求得的值不是由子程序名带回调用单位,而是通过实参与虚参的联系带回调用单位。,例9.4使用子例行程序求1+2+.+n,SUBROUTINESUM(N,S)INTEGERNREALSS=0DO10I=1,NS=S+I10CONTINUEENDPROGRAMMAIN4CALLSUM(3,Y1)CALLSUM(4,Y2)CALLSUM(5,Y3)CALLSUM(6,Y4)CALLSUM(7,Y5)Y=(Y1+Y2+Y3)/(Y4+Y5)WRITE(*,*)Y=,YEND,11.2.1子例行程序的定义,子例行程序必须以SUBROUTINE语句开头,以END语句结束。形式如下:SUBROUTINE子例行程序名(虚拟参数,)SUBROUTINE子例行程序名,9.2.2子例程程序的调用,必须用一条独立的CALL语句来调用子例行程序,CALL语句的形式如下:CALL子例行程序名(实在参数,)当子例行程序没有虚参时,则调用形式可以以下两种形式之一:CALL子例行程序名或CALL子例行程序名(),子例行程序和函数子程序的主要差别:,1、名字的作用不同。子例行程序名只供调用时使用,不得在子程序体内赋值;函数子程序名除了供调用时使用外,还代表着函数值,因此必须在返回前在函数体内给函数名赋予函数值。2、调用的方式不同。函数子程序的调用总是出现在表达式中,并将所得的函数值参与表达式的运算;子例行程序必须用一条独立的CALL语句调用。,在程序设计中,如果只需得到一个计算值,一般采用函数子程序的形式。在设计函数子程序时通常不主张在函数体内改变形参的值,从而保证不使对应的实参发生变化。如果希望通过子程序的运算操作得到一批数组(例如矩阵相加的结果),则应该采用子例行程序,将得到的新值通过实参与虚参的结合传送回调用单位,这是由在子例行程序体内给形参赋值实现的。另外,还通过使用子例行程序来完成一些特定的操作。,例9.5编写子例行程序用来在一行上打印20个星号,SUBROUTINEASTERISKCHARACTER*20STARSTAR=*PRINT*,STARENDPROGRAMMAIN5CALLASTERISKCALLASTERISKEND,例9.6编写子例行程序分别求出5*5矩阵两个对角线上元素值和,PROGRAMMAIN6REALW(5,5)CALLREADIN(W)CALLOPP(W,X1,X2)ENDSUBROUTINEREADIN(A)REALA(5,5)WRITE(*,*)Enter5*5matrix:DO10I=1,5READ(*,*)(A(I,J),J=1,5)10CONTINUEEND,SUBROUTINEOPP(A,S1,S2)REALA(5,5)S1=0DO10I=1,5S1=S1+A(I,I)10CONTINUES2=0DO20I=1,5J=5-I+1S2=S2+A(I,J)20CONTINUEEND,9.3实参和虚参之间的数据传送,函数子程序和子例行程序中的虚参可以是变量名、数组名、函数名、子例行程序名,在子例行程序中还可用星号作为虚参。当函数子程序和子例行程序被调用之前,所有虚参都无定义,所有虚参既没有具体的存储单元也没有具体的值,只是起到形式上的作用,所以人们也经常将虚拟参数称为形式参数(或简称形参)。当执行的流程转向子程序时,实参和虚参按地址结合,这时实参的存储单元就是对应虚参的存储单元。当执行的流程退出子程序时,该子程序的虚参又变成无定义的。,9.3.1变量作为虚参,当虚参是变量时对应的实参可以是用一类型的常量、变量、数组元素和表达式。如果实参是变量或数组元素,在调用子程序时,对应的虚参实际上将与之共用同一个存储单元。因此,虚参的值就是实参的值,虚参的值改变时,对应实参的值也就同时改变。,PROGRAMMAINSUBROUTINESUB(X,A)INTEGERA,C(3)INTEGERX,ADATAC/3*0/A=2*XA=100X=2*ACALLSUB(A,C(2)ENDWRITE(*,*)A=,A,C(2)=,C(2)END,如果实参是常量或表达式,则子程序中对应的虚参变量的值不应当改变,也就是说在这种情况下虚参变量不应当在子程序中被赋值,否则会引起不可预料的结果。如果虚
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!