fortran77程序设计简介.ppt_第1页
fortran77程序设计简介.ppt_第2页
fortran77程序设计简介.ppt_第3页
fortran77程序设计简介.ppt_第4页
fortran77程序设计简介.ppt_第5页
已阅读5页,还剩276页未读 继续免费阅读

下载本文档

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

文档简介

FORTRAN 77语言 -结构化程序设计,主讲:王 飞 江苏科技大学,教材: FORTRAN语言FORTRAN77结构化程序设计谭浩强等编著,第一章 FORTRAN语言程序设计初步,1.1 FORTRAN语言发展概况 1.2 简单的FORTRAN 77程序分析 1.3 FORTRAN源程序的书写格式,1.1 FORTRAN语言发展概况,FORTRAN语言是世界上第一个被正式推广使用的高级语言。它是1954年被提出来的,1956年开始正式使用,至今已有五十多年历史,但仍历久不衰,它始终是数值计算领域所使用的主要语言。 FORTRAN是英文FORmula TRANslation的缩写,意为“公式翻译”。它是为科学、工程问题或企事业管理中的那些能够用数学公式表达的问题而设计的,其数值计算的功能较强。 FORTRAN 77还不是完全结构化的语言,但由于增加了一些结构化的语句,特别是“块if”语句,提供了IF-ELSE-ENDIF形式的判断控制语句,使FORTRAN 77能用于编写结构化程序。此外,还扩充了字符处理功能,使FORTRAN不仅可用于数值计算领域,还可以使用于非数值运算领域。 目前,FORTRAN77已在国内外广泛使用,大多数计算机系统都已配置了FORTRAN 77。 FORTRAN语言的不同版本:FORTRAN I、FORTRAN II、FORTRAN IV、FORTRAN 66、FORTRAN 77、FORTRAN 90,1.2 简单的FORTRAN 77程序分析,为了使读者从一开始就了解什么是FORTRAN 77程序,下面先介绍两个很简单的FORTRAN 77源程序。 例1.1求三个数的平均数 程序代码: C CALCULATE THE AVERAGE OF THREE NUMBERS X=90.5 Y=87.0 Z=68.5 AVER=(X+Y+Z)/3.0 PRINT *, THE THREE NUMBERS ARE, X, Y, Z PRINT *, AVERAGE=, AVER END,例1.2分别求R=1,3,12,5时的圆周长,可以用一个子程序来求圆周长。 源程序由两部分组成: (1)主程序 C MAIN PROGRAM PROGRAM EX2 PRINT *, 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 SUBPROGRAM FUNCTION C(R) PI=3.1415926 C=2*PI*R RETURN END,从以上例子中可以看出: 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,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和A M O U N T都代表同一个变量AMOUNT。 (3)变量名应尽量做到见名知义,例如:GRADE代表等级,AVER代表平均值,AMOUNT代表金额。,(4)FORTRAN 77没有规定保留字,即可以用FORTRAN中的函数名或语句定义符作变量名,例如: SIN=3.5 PRINT *, SIN 或 READ *, PRINT PRINT *, 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语句(实型说明语句) DOUBLE PRECISION语句(双精度说明语句) COMPLEX语句(复型说明语句) LOGICAL语句(逻辑型说明语句) CHARACTER语句(字符型说明语句) 例如: INTEGER A, SUM, TOTAL,3. 隐含说明语句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 IMAX 2 、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, S S=0.0D0 A=1.0D0 B=1.0D0 C=A+B DO 10, I=1, 20, 1 S=S+C/B A=B B=C C=A+B 10 CONTINUE PRINT *, S=, S END,6.4 四种数值型数据之间的转换和运算 6.4.1 不同类型数据之间运算的规则,表6.1给出不同类型数据之间进行加减乘除运算的规则(C=A+B或C=A*B),其中表示FORTRAN 77标准是不允许的。但有的FORTRAN编译系统作了放宽,允许双精度型数据和复型数据之间运算,结果为复型,6.4.2 不同类型数据的赋值规则,表6.2 不同类型数据的赋值规则(v=e),6.4.3 类型转换函数,FORTRAN 77提供一些函数,使不同类型的数据能相互转换,见表6.3。,6.4.4 不同类型数据的比较规则,表6.4是比较规则。将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, STR3 CHARACTER 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 NAME PARAMETER (NAME=CHINA),6.5.3 字符型变量的赋值,用赋值语句对字符型变量赋值,例如: CHARACTER*5 NAME1, NAME2, NAME3 NAME1=CHINA NAME2=BEIJING NAME3=NEW 也可以通过READ语句从键盘读入字符常量给字符变量,注意用表控格式输入字符串时要用撇号将字符串括起来,例如: READ *, NAME1, NAME2, NAME3,6.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应满足关系:1e1e2L L为字符变量的长度,如省略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*50 READ *, NAME, ADDR LINE=MR./NAME/ADDRESS:/ADDR PRINT *, LINE END,6.5.6 字符关系表达式,两个数值型数据可以进行比较,两个字符型数据也可以进行比较,例如: A .GT. B 字符比较的规则:按其ASCII代码的值进行比较。从附录可以看到不同字符的先后次序。 常用的字符顺序:数字0小9大;数字比字母小;大写字母比小写字母小;字母A小Z大,a小z大;空格字符最小;其它专用字符有的比数字小,有的比数字大。,在进行关系运算时遵循以下规律: (1)两个单个字符比较,以其代码比较,代码大者为大。如 AB (2)两个字符型变量比较,将两个字符串中的字符自左向右进行比较,如果所有字符都相等就认为两个字符串相等。如果两者中有不相同的字符,以最左面的第一对不同字符的比较结果为准。如: SHANGHAISHANKONG 前四个字符相同,第5个字符GK,故知: SHANGHAISHANKONG (3)如果两个字符串长度不等,则系统会自动将短串的尾部补以空格,使两者等长再比较,例如: thethen,6.5.7 用于字符处理的内部函数,LEN(A):A为字符型变量,函数给出A的长度。 LGT(A, B):若AB,则函数值为真,否则为假。 LGE(A, B):若A=B,则函数值为真,否则为假。 LLT(A, B):若AB,则函数值为真,否则为假。 LLE(A, B):若A=B,则函数值为真,否则为假。,INDEX(A, B):检查字符串A是否包含字符串B,若A包含B,则函数值为B中第一个字符出现在A中的位置。若A不包含B,则函数值为0。例如,INDEX(FOLLOW ME, ME)的值为8,因为ME的第一个字符M出现在FOLLOW ME的第8个字符位置上。 CHAR(I):得到ASCII代码为I的字符,即将ASCII码转换为字符,如CHAR(82)=R。 ICHAR(A):得到字符A的ASCII码。如ICHAR(R)=82。,6.5.8 字符处理程序举例,例6.4读入10个单词,把以字母A开头的打印出来 CHARACTER*10 WORD DO 10, I=1, 10 READ *, WORD IF (WORD(1:1) .EQ. A) PRINT *, WORD 10 CONTINUE END,例6.5加密,为了保密,常不采用明码电文,而用密码电文,按事先约定的规则将一个字符转换为另一个字符。收报人则按相反的规律转换得到原来的字符。例如,将字母A-F,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, LINE2 CHARACTER L1, L2 READ *, LINE1 DO 10, K=1, 80 L1=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)=L2 ELSE LINE2(K:K)=L1 10 CONTINUE PRINT *, LINE2 END,例6.6从10个书名中查找有FORTRAN的书名,CHARACTER*7 NAME, BOOK*30 NAME=FORTRAN DO 10, I=1, 10 READ *, BOOK IF (INDEX(BOOK, NAME) .NE. 0) PRINT *, BOOK 10 CONTINUE END,例6.7从一篇文章中查出包含多少个CHINA。假设文章有K行,每行80个字符。,CHARACTER LINE*80, WORD*5 PARAMETER (WORD=CHINA) N=0 READ *, K DO 10, I=1, K READ *, LINE J=1 20 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 20 10 CONTINUE PRINT *, THE NUMBER OF CHINA IS, N END,习题,用双精度数据计算sinx=x-x3/3!+x5/5!-+(-1)n-1*x2n-1/(2n-1)!。直到第n项的绝对值小于10-15为止。 输入一个单词,将它按逆序打印出来(如输入FORTRAN应打印NARTROF)。 打印出以下图案,要求用字符型变量。 * * * * * * * * * 4. 输入10个国家名,将其中按字母顺序在最前面的打印出来。,第七章 数组,数组是一种数据结构,每个数组代表一组具有同一类型的变量,把数组中所包含的变量称为数组元素。在程序中通过说明语句声明数组。例如: INTEGER A(1:6) 每个变量都在内存中占有一个独立的存储单元。例如: INTEGER A1, A2, A3, A4, A5, A6 这六个变量所代表的六个存储单元在内存中的位置是彼此独立、互不相关的。,从终端读入六个数放到这六个存储单元中,则需要用以下输入语句: READ (*, *) A1, A2, A3, A4, A5, A6 从这六个数中找出最小数,则需要以下一系列语句: MIN=A1 IF (A2 .LT. MIN) MIN=A2 IF (A3 .LT. MIN) MIN=A3 IF (A4 .LT. MIN) MIN=A4 IF (A5 .LT. MIN) MIN=A5 IF (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) 10 CONTINUE,通过以下语句找出它们之中最小的那个数: IP=1 MIN=A(IP) DO 20, I=2, 6 IF (A(I) .LT. MIN) THEN IP=I MIN=A(IP) END IF 20 CONTINUE 通过以上例子可以看到,数组的使用将使程序变得简洁、灵活、易读,它是程序设计中一种十分有用的工具。使用数组可以使许多复杂的算法得以实现,这些算法用简单变量是无法实现的。,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 A REAL IA, ND,DIMENSION语句用来说明数组,数组的类型则根据数组名的第一个字母由隐含类型规则来决定,否则应该在类型语句中对数组名进行显示说明。例如,以上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) 10 CONTINUE,把A(1)、A(3)、A(5)、A(7)、A(9)输出到终端屏幕上。 DO 20 I=1, 10, 2 WRITE (*, *) A(I) 20 CONTINUE,双重循环将从终端读入数据赋给W数组中各元素 DO 10 I=1, 3 DO 20 J=1, 2 READ (*, *) W(I, J) 20 CONTINUE 10 CONTINUE,按列的顺序输出W数组中的元素值: DO 30, I=1, 2 DO 40, J=1, 3 WRITE (*, *) W(J, I) 40 CONTINUE 30 CONTINUE,按A数组元素排列的逆序打印数组元素的值: N=10 DO 20, I=N, 1, -1 WRITE (*, *) A(I) 20 CONTINUE 打印出A数组中前五个元素的值: N=5 DO 20, I=1, N WRITE (*, *) A(I) 20 CONTINUE,每行输出五个元素的值: DO 20, I=1, 10, 5 WRITE (*, *) A(I), A(I+1), A(I+2), A(I+3), A(I+4) 20 CONTINUE,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=5 WRITE (*, *) (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语句给变量或数组赋初值。例如: 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=, I I=I+1 DATA I/10/ WRITE (*, *) 2. I=, I END,7.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 (*, *) S K=S/10 C(K)=C(K)+1,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)+1 END IF 10 CONTINUE WRITE (*, *) COUNTER END,例7.3顺序查找,PARAMETER (NA=10) INTEGER A(NA), X, P DATA A/55, 62, 93, 87, 10, 23, 38, 71, 35, 91/ READ (*, *) X WRITE (*, *) (A(I), I=1, NA) P=1 DO 10 WHILE (X .NE. A(P) .AND. P .LT. NA) P=P+1 10 CONTINUE IF (X .EQ. A(P) THEN WRITE (*, *) X, P ELSE WRITE (*, *) X, Could not be found END IF END,例7.4折半查找,序号 A数组元素值 查找x(x=68) 1 10 -TOP 2 17 3 20 4 22 5 31 6 44 7 51 8 59 -MID 9 68 -TOP -TOP -TOP-BOT-MID 10 73 -MID 11 89 -BOT 12 95 -MID 13 120 14 133 15 137 -BOT -BOT (a) (b) (c) (d),PARAMETER (NA=15) INTEGER A(NA), TOP, BOT, MID, X LOGICAL FIND DATA A/10, 17, 20, 22, 31, 44, 51, 59, 68, 73, 89, 95, 120, 133, 137/ READ (*, *) X FIND=.FALSE. TOP=1 BOT=NA DO 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 ENDIF 10 CONTINUE IF (.NOT. FIND) WRITE (*, *) X, Has not be found END,例7.5把数组中所有的数都向后移动一个位置,最后一个数移到最前面,PARAMETER (NA=10) INTEGER A(NA), X DATA 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, -1 A(I+1)=A(I) 10 CONTINUE A(1)=X WRITE (*, *) (A(I), I=1, NA) END,例7.6把一个数插到有序数列中,插入后数列仍然有序,INTEGER A(20), X DATA (A(I), I=1, 10) /14, 25, 28, 33, 45, 56, 68, 72, 81, 95/ WRITE (*, *) Enter a number to insert: READ (*, *) X NA=10 WRITE (*, *) (A(I), I=1, NA) P=1 DO 10 WHILE (X .GT. A(P) .AND. P .LE. NA) P=P+1 10 CONTINUE DO 20, I=NA, P, -1 A(I+1)=A(I) 20 CONTINUE A(P)=X NA=NA+1 WRITE (*, *) (A(I), I=1, NA) END,例7.7从存有N个字符的字符数组中删去指定的字符,PARAMETER (NC=20) CHARACTER C(NC), CH INTEGER P, N DATA C/NC* / READ (*, *) N READ (*, *) (C(I), I=1, N) READ (*, *) CH N0=N P=1 DO 10 WHILE (P .LE. N) DO 20 WHILE (CH .NE. C(P) .AND. P .LE. N) P=P+1 20 CONTINUE IF (CH .EQ. C(P) THEN DO 30 I=P, N-1 C(I)=C(I+1) 30 CONTINUE N=N-1 END IF 10 CONTINUE IF (N .NE. N0) THEN WRITE (*, *) (C(I), I=1, N) ELSE WRITE (*, *) CH END IF END,例7.8选择法排序,PARAMETER (N=8) INTEGER A(N), P DATA A/15, 8, 4, 13, 6, 10, 17, 1/ WRITE (*, *) (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 ENDIF 20 CONTINUE K=A(J) A(J)=A(P) A(P)=K 10 CONTINUE WRITE (*, *) (A(I), I=1, N) END,例7.9输入若干名学生的学号和四门课的考试成绩,计算出每位学生的平均分,打印出成绩表(学生人数不多于35人),PARAMETER (NR=35, NC=4) REAL S(NR, NC), AVE(NR) CHARACTER*6 NUM(NR) N=1 READ (*, *) 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 CONTINUE N=N-1 DO 10, I=1, N SUM=0 DO 20, J=1, NC SUM=SUM+S(I, J) 20 CONTINUE AVE(I)=SUM/NC 10 CONTINUE WRITE (*, *) DO 30, I=1, N WRITE (*, *) NUM(I), (S(I, J), J=1, NC), AVE(I) 30 CONTINUE END,例7.10打印出以下形式的杨辉三角形,1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 矩阵的第1列上元素和对角线上元素的值都为1。此外,三角形中第i行上第2列到第i-1列上的元素值与上一行上的元素值有如下的关系: A(I, J)=A(I-1, J-1)+A(I-1, J),PARAMETER (NM=6) INTEGER PST(NM, NM) DO 10, I=1, NM PST(I, 1)=1 PST(I, I)=1 10 CONTINUE DO 20, I=3, NM DO 30, J=2, I-1 PST(I, J)=PST(I-1, J-1)+PST(I-1, J) 30 CONTINUE 20 CONTINUE DO 40, I=1, NM WRITE (*, *) (PST(I, J), J=1, I) 40 CONTINUE END,3.3 FORTRAN函数,用FORTRAN解题往往要用到一些专门运算,如求三角函数sinx,cosx,求,绝对值|x|,对数lnx,指数ex,求一组数中最大数和最小数。FORTRAN提供了一些系统函数来完成这些运算。程序设计者不必自己设计进行这些运算的语句组(即程序段或子程序),只需写出一个函数的名字以及给出一个或若干个自变量,就可以得到所需的值。例如: SQRT(4.0) SIN(2.0) EXP(3.5) LOG(3.0),例3-1,PROGRAM FUNCTIONS PRINT *, SIN(1.0) PRINT *, TAN(1.0) PRINT *, ATAN(1.0) PRINT *, LOG(

温馨提示

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

评论

0/150

提交评论