1、FORTRAN 语言自学提纲第一章 1 FORTRAN 基础 1. 一个 FORTRAN 程序由一个主程序或一个主程序与若干个子程序组成。但一个完整的FORTRAN 程序只能有一个主程序,主程序的第一个语句是 PROGRAM 语句,用以说明主程序的名称。这个语句也可以省略,省略时默认为主程序的名称为 MAIN。 2FORTRAN 的子程序主要有三种:函数子程序,其第一个语句为 FUNCTION;子例行子程序,其第一个语句为 SUBROUTINE;数据块子程序,其第一个语句为 BLOCK DATA。主程序与各个子程序可以独立编译,最后再链接成一个可执行程序。在编写并输入一个FORTRAN 程序时
2、,既可以将主程序与各个子程序存放在一个文件中,也可以将它们分别存放在不同的文件中。但必须注意,主程序与各个子程序都是独立的程序单位,每个程序单位的最后一行必须用 END 语句作为结束。在主程序中,虽然 END 语句还具有使程序停止运行的作用,但由于一个程序单位只能在最后一行有 END 语句,因此,在程序的其它位置处需要停止运行时,只能用 STOP 语句,不能用 END 语句。同样的道理,在子程序中,虽然 END 语句还具有使程序流程返回到调用程序的作用,但在子程序的其它位置(不是最后一行)需要返回到调用程序时,只能用 RETURN 语句,不能用 END 语句。3FOPTRAN 源程序的书写格式
3、有严格的规定。一行中第一列为“C”或“ *”时,该行被认为是注释行。注释行可以写在四个区中的一个区,且注释行可以出现在程序单位的任何位置。但注释行不能有续行,需要时可以将连续若干行都定义为注释行。FORTRAN 语句部分不能占用标号区及续行标志区,只能从第七列开始。当语句太长时,可以使用续行。在继续行的标号区内必须为空白(即继续行不允许有标号) ,标号只能出现在起始行上。起始行与继续行或各继续行之间的空格不起作用,因此,对于一般的语句,可以不必到72 列才转为继续行,继续行也不必一定要从第 7 列接着写,但是,包括在引号内的字符串中的空格是有效的,因此,对于字符串要使用继续行时应特别注意,最好
4、写到一行的 72 列时再转为继续行,且要从继续行的第 7 列接着写。标号为无符号整数,不能出现正负号。4变量定义的 I-N 规则与别的程序设计语言不同,FORTRAN 语言中的实型变量和整型变量可以按隐含规则确定。这个隐含规则就是 I-N 规则。I-N 规则在一定程度上为用户提供了方便,对于常用的一些变量(如循环控制变量等)就不需要专门的类型语句进行说明,只要用合适的变量名就可以满足对变量类型的需要。但这也容易使用户疏忽了对变量类型的说明,以 I-N 开头的变量名实际是实型变量,但忘了用 REAL 语句说明,或者以非 I-N 开头的变量名实际是整型变量,也忘了用 INTEGER 语句说明。另外
5、,还要提醒大家注意:由于 FORTRAN 语言中实型与整型变量遵循 I-N 规则,因此,在有关 FORTRAN 的练习或考核中,有时会省略对变量类型的说明,在这种情况下,应根据 I-N 规则来判断变量的类型。总之,FORTRAN 中的所有变量都是需要说明其类型的,而不能理解为整型与实型变量不需要进行说明。在对变量类型的说明中,I-N 规则只用于整型变量与实型变量;隐含类型说明语句IMPLICIT 适用于所有 FORTRAN 变量的类型;各种专门的类型说明语句适用于对一种类型的变量进行说明。5字符型常量和变量字符常量是用单撇号括起来的若干个字符,字符常量中的字符可以是所用计算机系统中允许使用的任
6、何字符。用来存放字符型常量的变量称为字符型变量。在程序中必须先定义字符型变量才能使用它。定义字符变量用 CHARACTER 语句或 IMPLICIT 语句。字符关系表达式用于字符型数据的比较,比较结果是一个逻辑值。参加比较的字符表达式可以是字符常量、字符型变量、字符型数组元素以及包括字符运算在内的字符表达式。一个字符串的一部分称为该字符串的子字符串。表示为:字符变量名(e1:e2 )字符常数、字符变量、字符型数组元素和子字符串可以出现在输入输出语句的输入/输出表列中。6不同类型数据的混合是运算。在 FORTRAN77 中,允许两个不同类型的算术量(实型量与整型量)作算术运算。遇到这种情况,系统
7、自动将它转换同一类型后再进行运算。转换的规律是:将低级类型转换成高级类型,具体来说,当遇到一个整型量与实型量作某种运算时,首先将整型量转换成实型量后再作相应运算。这就是所谓的算术表达式中不同类型数据的混合运算。但必须注意,在作不同类型数据的混合运算时,类型的转换是在运算过程中逐步进行的,只要在作某种具体的运算而又遇到两个运算对象的类型不一致时才进行转换,并不是将整个表达式中的不同类型量全部不转换成同一类型后再作表达式的计算。例如:设 A=1.0, B=3.5, I=-5, K=5,求表达式(K+1) /5+1*A-B的值。在这个例子中,A 与 B 为实型变量,I 与 K 为整型变量。首先计算
8、K+1,这是整型运算,结果得 6;作 6/5 的运算,这也是整型运算,结果得到 1;取相反数,得-1。然后作运算1*A,这是不同类型的两个量作乘法运算,先将 I 的值-5 转换成-0.5 后再与 A 的值 1.0 相乘,结果为-5.0。再将前面得到的结果 -1 与-5.0 相加,先作类型转换,-1 转换成-1.0 ,与-5.0 相加后得-6.0。最后减去 B 的值 3.5 后得-9.5。由这个例子可以看出,在写 FORTRAN 表达式时要注意各运算量的类型,特别是在表达式中有除法运算时,应使作除法运算的两个运算量的类型正确,否则会由于整型相除使结果错误。例如:为了计算并输出级数的值,编制了如下
9、的 FORTRAN 程序:S=0.0N=1,100DO10 10 1S=S+1/N WRITE(*,*)S=,S END 这个程序没有任何语法与逻辑错误,但当这个程序输入到计算机后,进行编译、链接,最后运行的结果为 S=1.0。显然,这个结果是错误的。问题出在标号为 10 的这个语句中,赋值号右边的算术表达式中,根据运算顺序,首先计算 I/N,当 N2 时,这个结果总是为0,因为这是一个整数除法,只有当 N=1 时,其结果才不为 0 而等于 1。因此,最后累加到实型变量 S 中的值只有 1.0。解决这个问题的措施是,只需要在表达式中将“I/N”改成“1.0/N”。类似于上例中的错误是很容易发生
10、的。本章需完成以下习题:P10 一、二、三、四第二章 计算赋值语句、参数说明语句、赋初值语句与标号赋值语句 本章重点为计算赋值语句、参数说明语句和赋初值语句。计算赋值语句 (1)数值型计算赋值语句执行过程为计算赋值号右侧表达的值,转换成左侧变量的类型,最后赋值。(2)逻辑型计算赋值语句逻辑赋值语句赋值号左侧的变量必须是逻辑型变量,右侧可以是一个逻辑表达式,也可以是一个逻辑常数、逻辑型变量或关系表达式。(3)字符型计算赋值语句字符型赋值语句的赋值号左侧的变量必须为字符型,而且需说明其长度,如右侧的字符表达式长度超出了左侧变量的长度则多出的字符被截去。参数说明语句 参数语句用来给常数命名,经说明后
11、的常数为符号常数。其类型可以用隐含说明、显式说明等方法来说明。而且符号常数一经定义,其值在运算过程中不能以任何形式来改变。赋初值语句 此语句为说明语句,但可以出现在程序的任何位置。可用于变量、数组、数组元素、子串等量的赋值。本章完成以下习题:P18 一、二第三章 数据的输入 本章的重点放在:1表控格式的输入中应特别注意不同类型数据的输入方法。2字符型变量要注意使用格式输入和表控输入的区别。3注意 READ 语句与 FORMAT 语句的联用,要多做练习。本章需重点完成以下习题:P26 一、二、四、七第四章 数据的输出 本章的重点放在:1表控格式输出中特别注意不同类型数据的输出形式及所占位数。2格
12、式输出时注意以下编辑描述符的使用:I、F 、E、D、A 、L。3注意 WRITE 语句与 FORMAT 语句的联用,要多做练习。本章需重点完成以下习题:P42 一、二、四、八、九、十二、十三第五章 结束、停、暂停与控制转移语句 本章只作一般性了解。注意 GOTO 语句的使用。 第六章 判定与选择1块 IF 结构块 IF 结构的一般形式如下:IF(逻辑表达式 1, )THEN (块 IF 语句)块 1 THEN 块)ELSEIF(逻辑表达式 2) (ELSE 语句)块 2 (ELSEIF 块) ELSE (ELSE 语句)块 n (ELSE 块)ENDIF (ENDIF 语句)其中 中的内容为可
13、选项。块 IF 结构的执行过程如下:(1)先执行块 IF 语句,计算逻辑表达式的值;(2)如果逻辑表达式 1 的值为“真” ,则执行 THEN 块中的各执行语句;(3)如果逻辑表达式 1 的值为“假” ,如有 ELSEIF 语句,则执行 ELSE 语句,计算逻辑表达式 2 的值,如果值为“真” ,则执行 ELSE 块中的各执行语句;否则执行 ELSE 块中的各执行语句;(4)无论是执行完 THEN 块、ELSEIF 块或 ELSE 块,最后都转到 ENDIF 语句,结束块 IF结构的执行。因此,块 IF 结构的执行总是从块 IF 语句开始,以 ENDIF 结束,其中 THEN 块、ELSEIF
14、块与 ELSE 块不能都执行,只能根据逻辑表达式值的确定执行哪一块。2逻辑 IF 语句逻辑 IF 语句用来实现选择结构。它的一般形式为:IF(逻辑表达式)内嵌语句逻辑 IF 语句执行的过程如下:首先计算逻辑表达式的值,如果逻辑表达式的值为“真” ,则执行内嵌语句后继续往下执行;否则不执行内嵌语句,直接执行该语句后面的语句。复习时,同学们应注意,不要将块 IF 结构中的块 IF 语句与逻辑 IF 语句相混淆,要注意它们的区别:(1)块 IF 语句只是块 IF 结构中的第一个语句,它不能单独使用;而逻辑 IF 语句是单独执行完成一种选择结构的功能。(2)块 IF 语句中的逻辑表达式后面要有“THE
15、N ”,而逻辑 IF 语句中没有“THEN” 。(3)块 IF 语句中的 “THEN”后面不能再有别的语句,所有的语句都包括在 THEN 块中;而逻辑 IF 语句中包括一个内嵌语句,但只能是一个语句。(4)用逻辑 IF 实现的选择功能一定可以用一个块 IF 结构实现,但一般的块 IF 结构不能用一个逻辑 IF 实现。3块 IF 结构的嵌套FORTRAN77 规定,在一个块 IF 结构的 THEN 块或 ELSE 块中,可以完整地包含另一个(或多个)块 IF 结构,称为块 IF 的嵌套。块 IF 的嵌套可以多层。对于块 IF 结构的嵌套要注意以下几点:每一层的块 IF 结构必须从块 IF 语句开
16、始,以 ENDIF 语句结束。每一层中的块 IF 结构必须完全包含在外层块 IF 结构的 THEN 块或 ELSE 块中,不允许交叉。在利用块 IF 结构的嵌套或者利用 ELSE 语句处理多路分支选择的时候,块 IF 语句或 ELSE IF 语句中的条件必须正确,否则会出现逻辑错误,程序运行后会得到错误的结果。4ENDIF 语句的使用ENDIF 语句是一个块 IF 结构的结束语句,它一定要与块 IF 语句配对使用。在使用 ENDIF语句时,有以下几个方面需要注意:每一个块 IF 结构不要漏掉 ENDIF 语句。在没有 ELSE 语句的块 IF 结构中,ENDIF 语句在 THEN 块或最后一个
17、 ELSEIF 块的后面;而在有 ELSE 语句的块 IF 结构中,ENDIF 语句在 ELSE 块的后面。块 IF 结构中的 ELSEIF 语句不需要 ENDIF 语句与之配对。一对配对的块 IF 语句、ENDIF 语句不能与另一对配对的块 IF 语句、ENDIF 语句出现任何形式的交叉。ENDIF 语句只提供 THEN 块、ELSE 块与 ELSEIF 块的共同出口,它本身不产生任何操作。本章需重点完成以下习题: P58 一、三、四第七章 循 环 1DO 循环DO 循环的一般形式为:DO n,V=e1,e2,e3n 循环体注意下列语句不能作为 DO 循环的终端语句:GOTO 语句块 IF 语句ELSE 语句ELSEIF 语句ENDIF 语句DO 语句STOP 语句END 语句逻辑 IF 语句可以作为 DO 循环的终端语句,但其内嵌语句也不能是上述这些控制语句。如需要用上述语句作终端语句时,用一个继续语句 CONTINUE 代替。循环变量在循环体内可以被引用,但不能被改变。例如,下列用法是错误的:DO 10 I=10,100,2IF(X.L.T.0.0 )I=101