fortran77程序设计简介.ppt
FORTRAN 77语言语言-结构化程序设计结构化程序设计主讲:王 飞江苏科技大学教材:FORTRAN语言FORTRAN77结构化程序设计谭浩强等编著第一章 FORTRAN语言程序设计初步 1.1 FORTRAN语言发展概况1.2 简单的FORTRAN 77程序分析1.3 FORTRAN源程序的书写格式1.1 FORTRAN语言发展概况 lFORTRAN语言是世界上第一个被正式推广使用的高级语言。它是1954年被提出来的,1956年开始正式使用,至今已有五十多年历史,但仍历久不衰,它始终是数值计算领域所使用的主要语言。lFORTRAN是英文FORmula TRANslation的缩写,意为“公式翻译”。它是为科学、工程问题或企事业管理中的那些能够用数学公式表达的问题而设计的,其数值计算的功能较强。lFORTRAN 77还不是完全结构化的语言,但由于增加了一些结构化的语句,特别是“块if”语句,提供了IF-ELSE-ENDIF形式的判断控制语句,使FORTRAN 77能用于编写结构化程序。此外,还扩充了字符处理功能,使FORTRAN不仅可用于数值计算领域,还可以使用于非数值运算领域。l目前,FORTRAN77已在国内外广泛使用,大多数计算机系统都已配置了FORTRAN 77。lFORTRAN语言的不同版本:FORTRAN I、FORTRAN II、FORTRAN IV、FORTRAN 66、FORTRAN 77、FORTRAN 901.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*,AVERAGE=,AVEREND例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*RRETURNEND从以上例子中可以看出:1、一个程序由一个或若干个程序单位组成。主程序和每一个子程序分别是一个独立的程序单位。在解决一个比较复杂的问题时,可以分别将每个功能编为一个子程序,然后按搭积木一样将各有关程序单位组成一个程序。一个程序单位就是一个模块,结构化程序设计需要采用模块化方法,在FORTRAN中,子程序是实现模块化的有效方法。2、每一个程序单位都是以“END”结束的。在FORTRAN 77中,END既是一个程序单位的结束标志,又是一个独立的语句(结束语句)。主程序中的END语句的作用是使程序“停止运行”,子程序中的END语句是“使流程返回调用程序”。请注意在一个程序单位中只能有一个END语句,如果需要,可以用STOP语句使程序终止或用RETURN语句从子程序返回。3、一个程序单位包括若干行。FORTRAN行分为两类:(1)语句行。由一个FORTRAN语句组成,它对程序运行情况是有影响的。FORTRAN语句分为:执行语句和非执行语句。执行语句使计算机在运行时产生某些操作,如赋值语句、打印语句等。非执行语句(包括说明语句,数据语句等)将有关信息通知编译系统,以便在编译时作出相应的处理,例如类型说明语句、函数子程序语句等。(2)非语句行,即注释行。它不是FORTRAN语句,它不被翻译成机器目标指令,不产生任何机器操作。它仅仅是为了人们阅读程序的方便而加到程序中的。一个程序中注释行的数目不受限制,根据需要而定。但一个程序单位不能只由注释行组成。注释行是程序的一部分,在打印程序清单时,注释行也照样打印出来。注释行的内容完全是根据程序设计人员需要而写的,一般是为程序(或程序中某一部分)的作用作注释。注释可以用英文或汉语拼音文字,还可以用汉字作注释。在一些实用程序中,注释行的篇幅有时占整个程序的三分之一以上。4、FORTRON程序中的语句可以没有标号,也可以有标号,根据需要而定。标号的作用是标志一个语句以便被其它语句引用。在同一个程序单位中不能有两个相同标号的语句。标号不影响语句的执行顺序。程序中语句执行的顺序一般依照它们在程序中的位置而定,即写在前面的语句先执行,写在后面的语句后执行。5、一个程序单位中各类语句的位置是有一定规定的,例如PROGRAM语句应是主程序的第一个语句,FUNCTION语句是函数子程序的第一个语句,END语句只能是程序单位中最后一行。6、FORTRAN源程序必须按一定的格式书写。哪些内容写在一行中的哪一列都有严格的规定。1.3 FORTRAN源程序的书写格式 FORTRAN源程序必须严格地按照一定的格式书写。在编译时对一行中不同位置上的内容分别处理。标准的FORTRAN程序纸格式见下图。1、第l5列为标号区:可以写l至5位整数。也可以没有标号。标号区中的空格不起作用。如 l00与100 或1 0 0作用相同。标号应是无符号整数(不应包括正负号或小数点)。标号大小顺序没有任何要求。假如第二行的标号为1000,第三行的标号可以是10,也可以是10000。标号区内不得出现标号以外的内容,但注释行例外。注释行的内容可以写在标号区内,一行中第一列为“C”或“*”的,该行即被认为注释行。如果在第一列上出现的不是数字、空格或“C”和“*”的字符,编译时按出错处理。2、第6列位续行标志区:如果在一行的第6列上写一个非空格和非零的字符,则该行作为其上一行的续行。3、第772列为语句区:语句可以从第7列以后的任何一列开始写,但一行只能写一个语句。语句区中的空格(除引号内的字符串内的空格)在编译时被忽略,例如SIN(X)与S IN(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,不合法。指数部分不能单独用来代表一个常数,例如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,DR.LI是不合法的。选用变量名时注意:(1)在变量名中大写与小写是等价的,例如TOTAL,Total,total都代表同一个变量。(2)变量名的字符之间可以插入空格,例如:AMOUNT和A M O U N T都代表同一个变量AMOUNT。(3)变量名应尽量做到见名知义,例如:GRADE代表等级,AVER代表平均值,AMOUNT代表金额。(4)FORTRAN 77没有规定保留字,即可以用FORTRAN中的函数名或语句定义符作变量名,例如:SIN=3.5PRINT*,SIN 或READ*,PRINTPRINT*,PRINT3.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,DG342、用类型说明语句确定变量类型 FORTRAN中有六个类型说明语句:INTEGER语句(整型说明语句)REAL语句(实型说明语句)DOUBLE PRECISION语句(双精度说明语句)COMPLEX语句(复型说明语句)LOGICAL语句(逻辑型说明语句)CHARACTER语句(字符型说明语句)例如:INTEGER A,SUM,TOTAL3.隐含说明语句IMPLICIT语句IMPLICIT INTEGER(A,C,T-V)IMPLICIT REAL(I,J)IMPLICIT INTEGER(A,B),REAL(I,K)说明:1、类型说明语句最优先,IMPLICIT语句次之,I-N规则最低。例如:IMPLICIT REAL(I,J)INTEGER IMAX2、IMPLICIT语句和类型说明语句应该出现在程序单位中的所有执行语句的前面,IMPLICIT语句又应该在所有的类型说明语句的前面。在编写程序时不仅需要考虑程序本身的结构,即操作语句间的结构关系,还要考虑数据的结构,要清楚数据的特性及数据间的联系,设计出适当的数据结构,然后考虑用什么样的算法。例如学生记录那样的数据结构可以用数组来实现。对于同一个问题的求解,可以采用不同的数据结构和不同的算法。对不同的数据结构有不同的算法,它们的复杂程度不同。选择合适的数据结构,可以降低算法的复杂程度,因此,在程序设计中应重视数据结构的设计。在计算机高级语言中提供实现各种数据结构的功能,用数据类型表示不同的数据结构。每种高级语言都规定它可以使用的数据类型。三类数据结构:1)基本类型:最基本的数据项,是不可再分的。基本类型包括整型、实型、双精度型、复型、逻辑型等类型2)构造类型:由已知类型,按一定规则构造而成的复合类型数据,包括数组、记录、文件和集合等3)指针类型:用于构造各种形态的动态数据结构,如链表、队、栈、树、图等在FORTRAN 77中基本类型有以下六种:整型 实型 双精度型 复型 逻辑型 字符型6.2 双精度类型数据实型提供7位有效数字,双精度型提供1517位有效数字。双精度常数要用指数形式表示,将实数中表示指数的字母E改成字母D即可。例如:1.23456789表示为1.23456789D+0 0.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.。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 6.4 四种数值型数据之间的转换和运算6.4.1 不同类型数据之间运算的规则 表6.1给出不同类型数据之间进行加减乘除运算的规则(C=A+B或C=A*B)C的类型 整型 实型 双精度型 复型 整型 整 实 双 复 实型 实 实 双 复 双精度型 双 双 双 复 复型 复 复 复 复 其中表示FORTRAN 77标准是不允许的。但有的FORTRAN编译系统作了放宽,允许双精度型数据和复型数据之间运算,结果为复型 6.4.2 不同类型数据的赋值规则表6.2 不同类型数据的赋值规则(v=e)v e整型 实型 双精度型 复型 整型 直接赋值 取整,舍去小数再赋值 取整,舍去小数再赋值 实部取整 实型 化成实型,赋值 直接赋值 舍掉多余的有效数字,变成实型,赋值 实部赋值 双精度型 先化成双精度型,赋值 先化成双精度型,赋值 直接赋值 实部化成双精度型,赋值 复型 化成实数,加上虚部0,变成复数,赋值 实部赋值,虚部赋零 化成实数,虚部赋零 直接赋值 6.4.3 类型转换函数FORTRAN 77提供一些函数,使不同类型的数据能相互转换,见表6.3。整型 实型 双精度型 复型 INT(A)不转换,仍得A将A的小数部分舍掉,取整 将A的小数部分舍掉,取整 将实部的小数部分舍去,取整 REAL(A)A化成实型 仍为A本身 舍去多余的有效数字 取A的实部 DBLE(A)A化成双精度型 A化成双精度型 仍为A本身 取A的实部并将它转为双精度型 CMPLX(A)将A化实型,作为实部,虚部为0 将A作为实部,虚部为零 将A的多余有效数字去掉,作为实部,虚部为零 仍为A本身 CMPLX(A1,A2)A1,A2先化实型,然后分别作为实部和虚部 A1作实部,A2作虚部 将A1,A2先舍去多余有效数字,再分别作实部、虚部 实部是REAL(A1),虚部是REAL(A2)6.4.4 不同类型数据的比较规则表6.4是比较规则。将A与B进行关系运算 A B 整型 实型 双精度型 复型 整型 允许 允许 允许 实型 允许 允许 允许 双精度型 允许 允许 允许不允许 复型 不允许 星号表示只有用.EQ.或.NE.时才可以进行比较 6.5 字符型数据FORTRAN不仅能用于数值计算,而且具有处理文字的能力。计算机的用途已日益扩展到非数值运算领域,必须能有效地对文字信息进行处理。例如,对一个班学生名字按字母顺序排列,从一批书籍中找出指定书名的那一本等等。只有以前介绍过的五种类型(整型、实型、双精度型、复型、逻辑型)是不够的,FORTRAN 77提供了字符类型。6.5.1 字符型常量字符型常量亦称字符串(character string),它是用引号(单引号或双引号)括起来的若干个字符。字符型常量允许使用系统可以使用的字符,只要能从键盘输入给计算机系统的字符都可以出现在字符串中。例如下面的字符串都是合法的:CHINA “U.S.A”LI DAN “FUN-LI”How are you?“X=?”A+B;C+D;E+F;*$?#“您好”FORTRAN规定:字符串如出现引号要用两个连续的引号表示,例如:THATS RIGHT!6.5.2 字符型变量用来存放字符型常量的变量称为字符型变量。在程序中必须先定义字符型变量才能使用它。定义字符型变量用CHARACTER语句或IMPLICIT语句,例如:CHARACTEER*5 STR1,STR2,STR3CHARACTER NAME*20,ADDR*30,CODE*10如果语句统一指定的字符长度与变量个别指定的长度不一致,以个别指定优先于统一指定,例如:CHARACTER*5 A,B*6,C,D*4,E若CHARACTER语句中不指定长度,则隐含指定长度为1:CHARACTER A,B,C可以用IMPLICIT语句定义字符型变量:IMPLICIT CHARACTER*5(A-C),CHARACTER*4(X)CHARACTER语句还可以定义符号常量:CHARACTER*5 NAMEPARAMETER(NAME=CHINA)6.5.3 字符型变量的赋值用赋值语句对字符型变量赋值,例如:CHARACTER*5 NAME1,NAME2,NAME3NAME1=CHINANAME2=BEIJINGNAME3=NEW也可以通过READ语句从键盘读入字符常量给字符变量,注意用表控格式输入字符串时要用撇号将字符串括起来,例如:READ*,NAME1,NAME2,NAME36.5.4 子字符串字符串的一部分称为字符串的子串。例如:字符变量A的值为NEW YEAR,则NEW,YEAR,EW,Y,AR都是A的子串。子串的形式表示:字符变量名(e1:e2)e1和e2是整型表达式,表示子字符串在字符串中的起止位置,例如: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。子字符串 子串的值 STR(12:22)PROGRAMMING STR(27:)FORTRAN STR(:10)STRUCTURE STR(5:5)C STR(:)STRUCTURED PROGRAMMING IN FORTRAN可以将一个子字符赋给一个字符变量或另一个子字符串,例如:NAME=STR(27:33)STR(1:10)=STR(27:33)STR(23:29)=STR(27:33)6.5.5 字符表达式字符型数据也可以进行运算。FORTRAN 77只提供一种字符运算符字符连接符,用“/”符号表示将两个字符型数据连接起来。例如:A/B得到AB。A/B就是一个字符表达式。字符表达式的值是字符型常量。例6.3将读入的名字和地址打印出来CHARACTER NAME*10,ADDR*20,LINE*50READ*,NAME,ADDRLINE=MR./NAME/ADDRESS:/ADDRPRINT*,LINEEND6.5.6 字符关系表达式两个数值型数据可以进行比较,两个字符型数据也可以进行比较,例如:A.GT.B字符比较的规则:按其ASCII代码的值进行比较。从附录可以看到不同字符的先后次序。常用的字符顺序:数字0小9大;数字比字母小;大写字母比小写字母小;字母A小Z大,a小z大;空格字符最小;其它专用字符有的比数字小,有的比数字大。在进行关系运算时遵循以下规律:(1)两个单个字符比较,以其代码比较,代码大者为大。如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,即将一个字母变成其后第五个字母。取字母的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.”CHARACTER*80 LINE1,LINE2CHARACTER L1,L2READ*,LINE1DO 10,K=1,80L1=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*,LINE2END例6.6从10个书名中查找有FORTRAN的书名CHARACTER*7 NAME,BOOK*30NAME=FORTRANDO 10,I=1,10READ*,BOOKIF(INDEX(BOOK,NAME).NE.0)PRINT*,BOOK10CONTINUEEND例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 IF IF(J.LE.76)GOTO 2010CONTINUEPRINT*,THE NUMBER OF CHINA IS,NEND习题1.用双精度数据计算sinx=x-x3/3!+x5/5!-+(-1)n-1*x2n-1/(2n-1)!。直到第n项的绝对值小于10-15为止。2.输入一个单词,将它按逆序打印出来(如输入FORTRAN应打印NARTROF)。3.打印出以下图案,要求用字符型变量。4.*4.输入10个国家名,将其中按字母顺序在最前面的打印出来。第七章 数组 数组是一种数据结构,每个数组代表一组具有同一类型的变量,把数组中所包含的变量称为数组元素。在程序中通过说明语句声明数组。例如:INTEGER A(1:6)每个变量都在内存中占有一个独立的存储单元。例如:INTEGER A1,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数组中的六个变量赋值:DO 10,I=1,6 READ(*,*)A(I)10CONTINUE通过以下语句找出它们之中最小的那个数:IP=1MIN=A(IP)DO 20,I=2,6IF(A(I).LT.MIN)THENIP=IMIN=A(IP)END IF20CONTINUE通过以上例子可以看到,数组的使用将使程序变得简洁、灵活、易读,它是程序设计中一种十分有用的工具。使用数组可以使许多复杂的算法得以实现,这些算法用简单变量是无法实现的。7.1 数组的说明和数组元素的引用 使用数组必须在类型说明语句或在DIMENSION语句中先对数组进行说明。说明数组的一般形式如下:类型说明或DIMENSION 数组说明符,其中数组说明符的形式如下:数组名(维说明符,)维说明符的组成形式如下:下标下界:下标上界7.1.1 用类型语句说明数组数组通常在类型说明语句中说明:REAL IA(1:10),ND(80:99),W(1:3,1:2)INTEGER NUM(-1:0),A(0:2,0:1,0:3)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,NDDIMENSION语句用来说明数组,数组的类型则根据数组名的第一个字母由隐含类型规则来决定,否则应该在类型语句中对数组名进行显示说明。例如,以上IA、ND是实型数组,所以应该在REAL语句中说明,而W则可以不在REAL语句中说明,因为按隐含类型规则,名字W的隐含类型就是实型;A数组(整型)应该在INTEGER语句中说明,而NUM数组则可以不必另行说明。7.1.3 数组元素的引用数组元素的引用形式:数组名(下标,.)7.2 数组的逻辑结构和存储结构 7.3 数据的输入和输出 假定有以下数组说明语句:REAL W(3,2)INTEGER A(10)将以A数组和W数组为例介绍对数组进行输入和输出操作的三种方式。7.3.1 利用DO循环对数组进行输入和输出从终端键盘输入十个数,按顺序逐个放入A(1)到A(10)中DO 10,I=1,10 READ(*,*)A(I)10CONTINUE把A(1)、A(3)、A(5)、A(7)、A(9)输出到终端屏幕上。DO 20 I=1,10,2WRITE(*,*)A(I)20 CONTINUE双重循环将从终端读入数据赋给W数组中各元素DO 10 I=1,3 DO 20 J=1,2 READ(*,*)W(I,J)20 CONTINUE10CONTINUE按列的顺序输出W数组中的元素值:DO 30,I=1,2DO 40,J=1,3WRITE(*,*)W(J,I)40CONTINUE30CONTINUE按A数组元素排列的逆序打印数组元素的值:N=10DO 20,I=N,1,-1 WRITE(*,*)A(I)20CONTINUE打印出A数组中前五个元素的值:N=5DO 20,I=1,N WRITE(*,*)A(I)20CONTINUE每行输出五个元素的值:DO 20,I=1,10,5 WRITE(*,*)A(I),A(I+1),A(I+2),A(I+3),A(I+4)20CONTINUE7.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,107.4 给数组赋初值(使用DATA语句)通过DATA语句给变量或数组赋初值。例如:DATA A,B,C/-1.0,-1.0,-10/或者写成:DATA A/-1.0/,B/-10/,C/-1.0/DATA语句的一般形式如下:DATA 变量表/初值表/,变量表/初值表/,变量表中可以出现变量名、数组名、数组元素名、隐含DO循环;初值表中只允许出现常量,不允许出现任何形式的表达式。变量表中的变量个数与对应初值表中常量的个数必须相同,类型按从左到右的顺序一一对应相同。变量表中变量之间、初值表中初值之间都用逗号隔开。对于以上所举的DATA语句,由于A、B、C三个变量都赋初值-1.0,所以可简写如下:DATA A,B,C/3*-1.0/当在DATA语句中的变量表中出现数组名时,初值表中常量的个数必须与元素的个数相同。例如:CHARACTER*6 CHN(10)DATA CHN/10*abcdef/给数组中部分元素置初值,可以在变量表中利用隐含DO循环。例如:INTEGER NUM(1000)DATA(NUM(I),I=1,500)/500*0/,(NUM(I),I=501,1000)/500*1/DATA语句是非执行语句,可以出现在程序中说明语句之后、END语句之前的任意行上。程序在编译期间给变量赋初值,因为程序中一个变量只能有一个初值,如果程序中有多个DATA语句给同一个变量赋初值,则以最后一条DATA语句所赋初值为准。在程序执行期间DATA语句不起任何作用。以下程序中给I所赋的实际初值为10:DATA I/0/WRITE(*,*)1.I=,II=I+1DATA I/10/WRITE(*,*)2.I=,IEND7.5 程序举例 例7.1输入10名学生的学号和一门课的考试成绩,把高于平均分的学生学号和成绩打印出来 PARAMETER(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 END例7.2输入10名学生一门课的考试成绩,统计各分数段的人数用数组的元素作为各分数段的计数器。凡是0-9分用下标为0的计数器统计,11-19分用下标为1的计数器统计,故成绩与数组下标的关系如下:READ(*,*)SK=S/10C(K)=C(K)+1PARAMETER(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)+1 END IF10CONTINUE WRITE(*,*)COUNTEREND例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(*,*)X,Could not be foundEND IFEND例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)PARAMETER(NA=15)INTEGER A(NA),TOP,BOT,MID,XLOGICAL FINDDATA 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=MID+1 ENDIF10CONTINUEIF(.NOT.FIND)WRITE(*,*)X,Has not be foundEND 例7.5把数组中所有的数都向后移动一个位置,最后一个数移到最前面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)=XWRITE(*,*)(A(I),I=1,NA)END例7.6把一个数插到有序数列中,插入后数列仍然有序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+110CONTINUEDO 20,I=NA,P,-1 A(I+1)=A(I)20CONTINUEA(P)=XNA=NA+1WRITE(*,*)(A(I),I=1,NA)END例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.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 IFEND例7.8选择法排序PARAMET