计算机语言.doc
前言 第二十二讲 计算机程序设计语言之二 一、内容提要 本讲主要讲述FORTRAN的语句 二、重点难点 根据所讲语句对简单的程序能够判断输出结果 三、内容讲解 三、赋值语句 三、赋值语句 赋值语句的一般格式为 变量名表达式 其中,连接变量名和表达式的符号“”称为赋值号。在FORTRAN77中,有三种赋值语句算术赋值语句,逻辑赋值语句和字符赋值语句。 一算术赋值语句 1.算术赋值语句中赋值号右边是算术表达式。算术表达式可以是单个变量或数组元素,可以是用算术运算符号连接起来的数值计算过程。 1算术表达式中的各个数据量常量或变量的类型一般应该一致。如果不一致,FORTRAN程序在运行中先将其进行转换,再进行计算。例如实型变量和整型变量进行计算时,整型变量的数值先被转换为实型。 2算术表达式计算中,特别应注意两个整型量之间的除法称为整除。例如,算术表达式10.0-2/410.0的计算过程是 10.0-010.010.0-0.010.0 如果表达式写为10.0-2/4.010.0,则计算过程是 10.0-2.0/4.010.010.0-0.510.05.0 因为2/4是整除,其结果为0,而进行2/4.0的计算时,整型量2先被转化为实型。 2.算术赋值左边只能是数值型变量名或数值型数组元素。如果赋值号左边的变量与右边的表达式类型不一样时,系统将自动把右边表达式计算的结果转换为与左边变量的类型一致后再赋给该变量。 二逻辑赋值语句 在逻辑赋值语句中,赋值号左边为逻辑变量或逻辑型数组元素,右边为一个逻辑表达式。 三字符赋值语句 1.字符赋值语句赋值号的左边为字符变量或字符型数组元素。 2.赋值号的右边为字符表达式,可以是单个字符串或用字符运算符连接起来的字符串。字符运算符只有一个,表示为//,含义为连接该符号两边的字符串。 3.执行字符赋值语句时,应注意字符串的长度与赋值号右边变量或数组元素的长度的关系。 例如 CHARACTER*4 A,B*6,C A/FILE/ BA///NAME/, CB56 定义字符型变量时,根据类型说明语句的规定,A、C长度为4,而变量B因有专门说明,其长度为6。程序运行后,变量A的长度与赋值号右边字符串长一致,A的值为‘FILE’;而B的长度小于‘FILE’和‘NAME’两个字符串长度之和,因此多余的字符被截去,B的值为‘FILENA’;C的结果为‘NA”,其中最后两格为空格符,这是因为C的长度为4,大于字符串‘NA’的长度,于是在其右边补上2个空格符后形成4个字符长再赋值给C。在上面的程序例中,出现表达式B56,称为“子串”,表示取出字符串的一部分,本例中,表示将B的字符串‘FILENA’中的第5个字符至第6个字符取出。 四、循环语句 四、循环语句 一DO语句 DO语句的一般形式为 DO n Ve1,e2,e3 n 循环体 其中,n为语句标号;V为循环控制变量,它只能是简单变量整型或实型,不能是表达式e1,e2,e3分别为循环控制变量的初值、终值与增量步长,它们都可以是表达式,当e3为1时可以省略不写。循环体是若干语句的集合,其中最后一个语句称为循环终端语句;若循环体只有一个语句,则该语句也就是终端语句。终端语句必须有标号n。 在DO循环执行时,首先计算表达式e1,e2,e3的值,并将它们化为与循环控制变量V的类型一致;然后将初值赋给循环控制变量V,并计算需要循环的次数;最后根据循环次数重复执行循环体中的语句,并每次执行完循环体后,将循环控制变量增值一次,循环次数减少一次。当循环次数为零时,则结束循环,转向程序规定的下一个语句。 二继续语句CONTINUE CONTINUE是一个可执行语句,其功能是使程序的流程继续到逻辑上的下一个语句。 FORTRAN77规定,循环终端语句必须是一个可执行语句,但不能是GOTO语句、块IF语句、ELSE语句、ELSE IF语句、ENDIF语句、DO语句、STOP语句、END语句。由于这些限制,通常用CONTINUE语句作为循环的终端语句。当然,CONTINUE语句也可用在其他场合。 三循环嵌套 使用循环嵌套可以实现多重循环。这时应注意各重循环的层次和循环变量的关系。例如,编写一个计算乘法表的程序段,可以写为 DO 10 I1,9 DO 8 JI,9 IJ1*J 8 CONTINUE 10 CONTINUE 本例中,外层循环控制变量I初值为1,终值为9,内层循环控制变量J初值为外层循环控制变量I的当前值,终值为9。外层的第1次循环,内层经过9-119次循环,依次计算111,122,,199,外层的第2次循环,内层经过9-218次循环,依次计算224,236,,2918;。 四使用循环语句应注意的若干问题 1.正确选定循环变量的初值。 比如,对累加问题和连乘问题,变量初值不正确,便影响最终结果。 例如计算m1210,采用循环语句编写程序,涉及到累加和连乘。 其程序可编写如下 m0 n1 D0 20 I1,10 nn*I mmn 20 CONTINUE PRINT*,m END 例如,n用于存放连乘结果,其初值设定为1,而m用于存放累加结果,其初值设定为0。 2.DO语句可以和转换语句,条件语句等结合起来使用,此时应注意从循环体内可以转向循环体外,但不允许从循环体外转向循环体内;从内层循环中可以转向外层循环,但不允许从外层循环转向内层循环中。 3.当内外层循环体的终端语句相同,且两个终端语句之间没有其他语句时,可以合并使用一个终端语句。 例如,前面计算乘法表的程序段可以写为 DO 10 I1,9 DO 10 JI,9. IJI*J 10CONTINUE 或写为 DO 10 I1,9 DO 10JI,9 10 IJI*J 五、输入输出语句 五、输入输出语句 一表控输入输出 表控输入输出语句是一种隐含格式的输入输出语句,又称自由格式输入输出,其格式由程序编译系统提供,在程序语句中不予表示。 1.表控输出语句 FORTRAN 77表控输出语句有两种方式 PRINT *,输出量表 WRITE*,*输出量表 这两种表控输出语句的作用是相同的,但一般微机上的FORTRAN 77子集不提供PRINT语句,所以通常使用WRITE语句。 2.表控输入语句 FORTRAN 77表控输入语句有两种形式 READ *,输入量表 READ*,*输入量表 表控输入又称为自由格式输入。表控输入语句要求用户在隐含的输入设备通常是键盘上输入所需的数据,在输入数据时,各数据之间用逗号或空格分隔。 二格式输入输出 1.格式输出数据语句WRITE语句和AT语句 WRITE语句的一般形式为 WRITEu,f输出量表 其中,u为部件说明符,用以指出在哪个设备上进行输出,通常也称为通道号,当u为记号*时,表示在显示器标准输出设备上进行输出。f为格式说明,它通常是一个格式语句的标号,用以指出输出数据所采用的格式。 格式语句的一般形式为 标号AT格式说明 例如 WRITE*,10A,B,A*B 10 AT1X,F6.2,F7.3,F10.4 AT语句中,第一个“1X称为纵向控制符,它表示前进一空格后再输出后面的数据,后面的三个项分别说明了三个实型数据输出的,称为格式编辑符。 FORTRAN 77也允许在WRITE语句中直接指定输出格式,从而可以省略格式语句AT。例如,上面的输出语句与格式语句可以合并成一个,即 WRITE*,/ 1X,P6.2,F7.3,F10.4/A,B,A*B 2.格式编辑符 FORTRAN常用的格式符有十几种,详细可参照任何一本FORTRAN教材或专用手册。 三隐循环的输入输出 数组元素的输入输出可以采用循环方式实现。 例如 DIMENSION X 20 DO 10 I1,20 20 READ*,XI 程序段执行时进行20次循环,每次输入1个数据。这个输入程序段可以改写如下 DIMENSION X 20 READ *,XI,I1,20 其中第2句就是隐循环的输入语句。循环控制变量I的初值为1,终值为20,步长为1而予以省略。隐循环语句的作用与DO语句是相同的;但使用隐循环语句时,20个数据允许一次性输入,当然,数据与数据之间要用空格符或逗号区别开来。 隐循环语句也用于输出语句,也可使用多重循环。 例如 DIMENSION Y 10,6 READ*,*YI,J,J1,6,I1,10 WRITE*,5YI,J,J1,6,I1,10 5 AT1X,6F10.2 运行程序段时,首先读入60个数据,Y1,1,Y1,2,,Y1,6,Y2,1,Y2,2,,Y2,6,,Y10,1,Y10,2,,Y10,6,然后输出60个数据,每行输出6个数据,数据的排列顺序与输入时相同。 六、控制语句 六、控制语句 一般情况下,FORTRAN程序是按语句顺序执行的,但需要时,可以改变这种顺序。这种改变可以通过各种控制转移语句、逻辑条件语句等来实现。 一转移语句 1.无条件转移语句 无条件转移语句的一般形式为 GOTO n 当程序流程到达GOTO语句时,随后就转向语句标号为n的语句。标号为n的语句必须是可执行语句,但它在程序中的排列位置,可以在引导到它的GOTO语句之后,也可以在该GOTO语句之前。无条件转移语句常和其他控制语句结合起来使用。 2.算术条件转移语句 算术条件转移语句的一般形式为 IFe n1,n2,n3 其中,e必须是算术表达式,当表达式运算结果e0时,转向标号为n3的语句。 例如,计算边长为B的正方形中挖去半径为R的圆后的面积,若B2R,则给出相关信息。该问题的FORTRAN程序可用算术条件转移语句编写如下。 c ComputationOf area。 READ *,B,R IF B-2*R 5,15,15 5 WRITE *,10 10 AT/ErrormessageBlessthan 2*R/ GOTO 20 15 AREAB*B-3.14159 * R* R WRITE *,AREA 20 CONTINUE END 本例中,在算术条件转移语句的第1个分支后,使用了GOTO语句;倘没有此语句,则程序按顺序仍会执行标号为15的语句,从而得出不正确的结果。 3.计算转移语句 计算转移语句的一般形式为 GOTOn1,n2,.”,mm,e 其中,nii1,2,,m是被转向的语句标号,共m个;e是一个整型算术表达式,其值不得小于1且不得大于m。当e的值等于1时,程序转向标号n1的语句,当e的值等于2时转向标号n2的语句,当e的值为m时转向标号为nm的语句。整型算术表达式e前的逗号可以省略。计算转移语句通常也和GOTO语句结合起来使用。 例如,有如下一个程序 READ *,M GOTO20,30,40,50M 20 NM GOTO 60 30 NM*2 GOTO 60 40 NM*3 GOTO 60 50 NM*4 60 WRITE *,N END 程序运行时,若输入1,则转向标号为20的语句,N的值为1;若输入2,则转向标号为30的语句,N的值为4;输入3,转向标号为40的语句,N的值为9,输入4,转向标号为50的语句,N的值为16。 二逻辑条件语句 1.逻辑IF语句 逻辑IF语句用来实现选择结构。它的一般形式为 IF逻辑表达式内嵌语句 其中内嵌语句是单独的一个可执行语句。逻辑IF语句执行时,首先计算逻辑表达式的值,如果逻辑表达式的值为“真”,则执行内嵌语句,若内嵌语句非转移语句,则执行该语句后继续按顺序往下执行,若内嵌语句是转移语句,则转向指定的语句;如果逻辑表达式的值为“假”,则不执行内嵌语句,而直接执行该语句后面的语句。 例如,从键盘读入一个代表百分制成绩的数据,如果数据在90~100之间就输出‘Excelent’,在80~89之间输出‘Good’,在60~79之间输出‘Pass’,在60以下则输出‘Notpass’。其程序可以如下编写 READ*,* IPOINT IFIPOINT.GT.100.OR.IPOINT.LT.0 WRITE*,* /DATAERROR/ IFIPOINT.GE.90.AND.IPOINT.LE.100 WRITE*,* /Excelent/ IFIPOINT.GE.80.AND.IPOINT.LT.89 WRITE*,* /Good/ IFIPOINT.GE.60.AND.IPOINT.LT.79 WRITE*,* /Pass/ IFIPOINT.GE.0.AND.IPOINT.LT.59 WRITE*,* /Not Pass/ END 2.块IF结构的各种形式 1块IF和ENDIF形式 IF逻辑表达式 THEN 语句块 ENDIF 当逻辑表达式的值为“真”时,执行语句块,否则按顺序执行ENDIF后的语句。例如,如下程序段 READ*,RN,AN IF RN.GE.0.0.AND.AN.GT.0.0 THEN STRESSRN/AN WRITE*,RN,AN,STRESS ENDIF 当RN大于等于零且AN大于零时,执行赋值语句和输出语句。 2使用ELSE的形式 IF逻辑表达式THEN 语句块1 ELSE 语句块2 ENDIF 当逻辑表达式的值为“真”时,执行语句块1,当逻辑表达式的值为“假”时,执行语句块2。由此可见,使用ELSE的形式,可以进行两个分支的选择。 3使用ELSEIF的形式 IF逻辑表达式1THEN 语句块1 ELSE IF逻辑表达式2THEN 语句块2 ELSE 语句块n1 ENDIF 这种形式,允许在多个分支中作出选择。FORTRAN测试条件的顺序为逻辑表达式1、逻辑表达式2,一旦遇到逻辑表达式值为TRUE,则执行该条件下的语句块,然后执行ENDIF的下一语句。 3. 块IF结构的嵌套 在一个块IF结构的语句块中,可以完整地包含另一个或多个块IF结构,称为块IF的嵌套。块的嵌套可以多层。 七、函数与子程序过程 七、函数与子程序过程 一内部函数 内部函数是预先编制的一些常用函数或算法的过程,由FORTRAN语言提供,可以直接调用。内部函数调用时的一般形式是 内部函数名实元表 实元表中元素的数据类型、个数是预先规定的。 常用内部函数及其功能可查阅FORTRAN教材或用户手册。 二语句函数 1.语句函数的定义 定义语句函数的语句称为语句函数语句。其一般形式为 函数名形参表,表达式 其中,函数名的命名规则与一般变量名相同,所以它也可以用类型说明语句等来说明。形参又称哑元,是一些变量名,一般应出现在表达式中。 语句函数在程序单位中的位置,应在所有可执行语句之前。 2.语句函数的调用 调用语句函数的结果是得到一个函数值,因此,语句函数的调用形式同内部函数。 三函数子程序 一个函数子程序是一个独立的FORTRAN程序单位。它的第一个语句必须是FUNCTION语句,最后一个语句必须是END语句。即函数子程序的一般结构为 [类型说明]FUNCTION函数名形参表 语句块 函数名表达式 [RETURN] END 也可以写为 FUNCTION函数名形参表 [类型说明函数名] 语句块 函数名表达式 [RETURN] END 其中函数名的命名规则与变量相同,而函数名的类型决定了函数值的类型。 在函数子程序中,形参可以是变量名、数组名、外部过程名,而形参的命名与类型说明也与变量相同,形参数组也必须在函数子程序中予以定义。 函数子程序的函数值由函数名带回到调用该函数子程序的程序,因此,在函数子程序中必须对函数名赋值。在函数子程序中,函数名应该像普通变量那样来使用。 在函数子程序中,所有的名字、语句标号都可以和其他程序单位中的相同而彼此没有任何关系。 在函数子程序中,END语句的功能有两个一是表示该程序单位的结束,二是具有返回语句RETURN的功能。函数子程序中必须有并且只有一个END语句,而且只能是子程序的最后一个语句。当在子程序的其他位置须要返回时,可以使用RETURN语句。 四子例方程子程序 1.子例方程子程序的结构 一个子例方程子程序是一个独立的FORTRAN程序单位。 子例方程子程序的第一个语句必须是SUBROUTINE语句,最后一个语句必须是END语句。即子例方程子程序的一般结构为 SUBROUTINE 子例方程子程序名形参表 语句块 [RETURN] END 子例方程子程序名的命名规则与普通变量相同。但是子例方程子程序名不能用于返回数值,这与函数子程序是不同的。因此,子例方程子程序名没有类型,它不能在本程序单位中使用。 SUBROUTINE语句中的形参表可以省略。这时子例方程子程序名后的括弧不要保留。 对子例方程子程序的其他有关规定与函数子程序相同。 2.子例方程子程序的调用 子例方程子程序调用通过CALL语句实现。其形式为 CALL 子程序名实参 其他有关对子例方程子程序的调用规定与函数子程序相同。 八、程序单位间的数据传递 八、程序单位间的数据传递 一虚实结合 虚实结合又称哑实结合,是各程序单位主程序和各种过程如函数子程序之间传递数据的一种重要途径。 1.变量的虚实结合 当子程序等过程的形参为变量时,则在调用时所对应的实参可以是类型相同的常数、变量、数组元素或表达式;子程序调用后,其运行的结果通过这些实参返回到调用者。在FORTRAN77中,当形参变量所对应的实参是变量或数组元素时,则它们之间的结合方式是地址结合;而当形参变量所对应的实参是常数或表达式时,其结合方法对于不同的FORTRAN系统有可能是不同的。 2.数组的虚实结合 当子程序中的形参为数组名时,则在调用时所对应的实参必须是数组名或数组元素。 如果实参是数组名,则实参数组与形参数组按地址结合,实参数组与形参数组都从第一个元素开始按列逐个对应。例如,有主程序与子程序如下 PROGRAM MAIN INTEGER A 05 CALLSB A END SUBROUTINESB B INTEGERB-12 END 则在主程序中使用CALL语句调用子程序SB时,实参数组与形参数组的结合情况如下 实参数组形参数组 A0B-1 A1B0 A2B1 A3B2 A4 A5 也即调用SB时,A数组的头4个元素与B数组的元素对应,这些对应元素实际上为同一存储地址。 如果实参是数组元素,则从该元素开始依次与形参数组的第一个元素起按列逐个对应,它们也是按地址结合。例如,有主程序与子程序如下 PROGRAM MAIN DIMENTION A 8 CALLSB A 5 END SUBROUTINE SB B DIMENTION B 3 END 则在调用语句执行时,实参数组A与形参数组B的结合情况如下 实参数组形参数组 A1 A2 A3 A4 A5B1 A6B2 A7B3 A8 FORTRAN 77规定,不管实参是数组名还是数组元素,用作实参的数组,其维数、各维下标的上下限及数组中元素个数可以和与之结合的形参数组不同,但要求从与形参数组的第一个元素结合的实参数组元素算起,以后的实参数组元素的个数不能少于形参数组元素的个数。 多维数组或数组元素虚实结合时,要特别注意FORTRAN中数组按列存放的规定,不要搞错存储地址的对应关系。例如 PROGRAM MAIN DIMENSION A 3,2 CALL SB A END SUBROUTINE SB B DIMENSION B 2,3 END 这种情况下,数组元素地址的对应关系是 实参数组形参数组 A1,1B1,1 A2,1B2,1 A3,1B1,2 A1,2B2,2 A2,2B1,3 A3,2B2,3 3.可调数组 在主程序中定义数组元素时,定义说明符中各维下标的上下限必须为整常数,不能是变量或算术表达式。但在子程序中定义数组时,允许用变量来定义各维下标的上下限。子程序中用变量来定义各维下标上下限的数组称为可调数组。但使用可调数组必须遵循以下几个原则。 1可调数组名必须是形参数组名。 2说明可调数组各维下标上下限的表达式中只能出现整型变量,且这种变量必须是形参或出现在COMMON语句中。但在某些FORTRAN 77子集中,定义可调数组各维下标上下限时只能是整型变量,而不能是任何算术表达式。 3可调数组的大小不得超过对应实参数组的大小。 4.字符型变量的虚实结合 1当子程序中的形参为字符型变量时,对应的实参必须是字符型变量、字符常数、字符型数组元素或字符表达式。字符型实参必须用CHARACTER语句加以说明。 2如果字符型形参的长度小于对应的实参长度,则从实参中最左边的字符开始与形参结合,而实参中右边多余的字符被截去。 例如 CHARACTER A* 5 A/ABCDE/ CALL SB A END SUBROUTINE SB X CHARACTER X*3 WRITE*,* X END 程序执行后的输出结果为ABC。 3在FORTRAN 77中,对字符型形参的长度还可以用“*”号来说明,此时,形参字符变量自动与对应的实参取相同的长度。 例如在上面的子程序SB中,如果将CHARACTER X*3改为CHARACTER * x,则执行后,输出的结果为ABCDE。 4当子程序中形参为字符型数组时,如果形参字符型数组元素的长度与对应实参字符型数组元素长度一致,则其虚实结合的情况与一般的数组虚实结合的情况相同。如果形参与实参的字符型数组元素长度不同,则按字符依次对应。 例如,有主程序与子程序如下 CHARACTER A 5*3 DATA A/ABC,DEF,GHI,JKL,MNO/ CALL SB A END SUBROUTINE SB D CHARACTERD 4*2 END 则形参数组D中元素的值为; D1AB D2CD D3EF D4;GH 5过程名的虚实结合 FORTRAN允许子程序中的形参为过程名,此时,调用程序中的实参必须是过程名。 如是实参是外部过程名如函数子程序名、子程序名,则该外部过程名在调用程序中必须用EXTERNAL语句说明。 如果实参是内部过程名如内部函数名,则该内部过程名在调用中必须用INTRINSIC语句说明。 二公用区语句 1.公用区语句的一般形式 COMMON[/Sk公用区名1/]变量表1,[/公用区名2/变量表2] 没有公用区名的就称为无名公用区,其他都是有名公用区;一个完整的程序只能设置一个无名公用区,但可以有多个有名公用区;变量表中,可以是变量名、数组名、数组说明符,互相之间用逗号隔开。例如 COMMON a,b3,c2 定义了b是3个元素的一维数组,c是2个元素的一维数组。这条语句与下面两句语句是等价的 DIMENSION b3,c2 COMMON a,b,c 2.利用公用区进行数据传递时,在无名公用区或同名的有名公用区中,位置排列相同的变量、数组,实际上使用同一存储地址,亦即共享同一数据。 例如 PROGRAM MAIN COMMON a,I 2/COMl/d,c CALL SB END SUBROUTINE SB COMMON aa,JK 2/COMl/f,g END 其中,主程序中的变量a的数据与子程序的变量aa共享,数组1的数据与JK共享,而d,c的数据分别与f,g共享。由此可以知道,各个程序单位中COMMON语句中的变量类型必须按位置一一对应一致才能正确传递数据。 八、程序单位间的数据传递 八、程序单位间的数据传递 一虚实结合 虚实结合又称哑实结合,是各程序单位主程序和各种过程如函数子程序之间传递数据的一种重要途径。 1.变量的虚实结合 当子程序等过程的形参为变量时,则在调用时所对应的实参可以是类型相同的常数、变量、数组元素或表达式;子程序调用后,其运行的结果通过这些实参返回到调用者。在FORTRAN77中,当形参变量所对应的实参是变量或数组元素时,则它们之间的结合方式是地址结合;而当形参变量所对应的实参是常数或表达式时,其结合方法对于不同的FORTRAN系统有可能是不同的。 2.数组的虚实结合 当子程序中的形参为数组名时,则在调用时所对应的实参必须是数组名或数组元素。 如果实参是数组名,则实参数组与形参数组按地址结合,实参数组与形参数组都从第一个元素开始按列逐个对应。例如,有主程序与子程序如下 PROGRAM MAIN INTEGER A 05 CALLSB A END SUBROUTINESB B INTEGERB-12 END 则在主程序中使用CALL语句调用子程序SB时,实参数组与形参数组的结合情况如下 实参数组形参数组 A0B-1 A1B0 A2B1 A3B2 A4 A5 也即调用SB时,A数组的头4个元素与B数组的元素对应,这些对应元素实际上为同一存储地址。 如果实参是数组元素,则从该元素开始依次与形参数组的第一个元素起按列逐个对应,它们也是按地址结合。例如,有主程序与子程序如下 PROGRAM MAIN DIMENTION A 8 CALLSB A 5 END SUBROUTINE SB B DIMENTION B 3 END 则在调用语句执行时,实参数组A与形参数组B的结合情况如下 实参数组形参数组 A1 A2 A3 A4 A5B1 A6B2 A7B3 A8 FORTRAN 77规定,不管实参是数组名还是数组元素,用作实参的数组,其维数、各维下标的上下限及数组中元素个数可以和与之结合的形参数组不同,但要求从与形参数组的第一个元素结合的实参数组元素算起,以后的实参数组元素的个数不能少于形参数组元素的个数。 多维数组或数组元素虚实结合时,要特别注意FORTRAN中数组按列存放的规定,不要搞错存储地址的对应关系。例如 PROGRAM MAIN DIMENSION A 3,2 CALL SB A END SUBROUTINE SB B DIMENSION B 2,3 END 这种情况下,数组元素地址的对应关系是 实参数组形参数组 A1,1B1,1 A2,1B2,1 A3,1B1,2 A1,2B2,2 A2,2B1,3 A3,2B2,3 3.可调数组 在主程序中定义数组元素时,定义说明符中各维下标的上下限必须为整常数,不能是变量或算术表达式。但在子程序中定义数组时,允许用变量来定义各维下标的上下限。子程序中用变量来定义各维下标上下限的数组称为可调数组。但使用可调数组必须遵循以下几个原则。 1可调数组名必须是形参数组名。 2说明可调数组各维下标上下限的表达式中只能出现整型变量,且这种变量必须是形参或出现在COMMON语句中。但在某些FORTRAN 77子集中,定义可调数组各维下标上下限时只能是整型变量,而不能是任何算术表达式。 3可调数组的大小不得超过对应实参数组的大小。 4.字符型变量的虚实结合 1当子程序中的形参为字符型变量时,对应的实参必须是字符型变量、字符常数、字符型数组元素或字符表达式。字符型实参必须用CHARACTER语句加以说明。 2如果字符型形参的长度小于对应的实参长度,则从实参中最左边的字符开始与形参结合,而实参中右边多余的字符被截去。 例如 CHARACTER A* 5 A/ABCDE/ CALL SB A END SUBROUTINE SB X CHARACTER X*3 WRITE*,* X END 程序执行后的输出结果为ABC。 3在FORTRAN 77中,对字符型形参的长度还可以用“*”号来说明,此时,形参字符变量自动与对应的实参取相同的长度。 例如在上面的子程序SB中,如果将CHARACTER X*3改为CHARACTER * x,则执行后,输出的结果为ABCDE。 4当子程序中形参为字符型数组时,如果形参字符型数组元素的长度与对应实参字符型数组元素长度一致,则其虚实结合的情况与一般的数组虚实结合的情况相同。如果形参与实参的字符型数组元素长度不同,则按字符依次对应。 例如,有主程序与子程序如下 CHARACTER A 5*3 DATA A/ABC,DEF,GHI,JKL,MNO/ CALL SB A END SUBROUTINE SB D CHARACTERD 4*2 END 则形参数组D中元素的值为; D1AB D2CD D3EF D4;GH 5过程名的虚实结合 FORTRAN允许子程序中的形参为过程名,此时,调用程序中的实参必须是过程名。 如是实参是外部过程名如函数子程序名、子程序名,则该外部过程名在调用程序中必须用EXTERNAL语句说明。 如果实参是内部过程名如内部函数名,则该内部过程名在调用中必须用INTRINSIC语句说明。 二公用区语句 1.公用区语句的一般形式 COMMON[/Sk公用区名1/]变量表1,[/公用区名2/变量表2] 没有公用区名的就称为无名公用区,其他都是有名公用区;一个完整的程序只能设置一个无名公用区,但可以有多个有名公用区;变量表中,可以是变量名、数组名、数组说明符,互相之间用逗号隔开。例如 COMMON a,b3,c2 定义了b是3个元素的一维数组,c是2个元素的一维数组。这条语句与下面两句语句是等价的 DIMENSION b3,c2 COMMON a,b,c 2.利用公用区进行数据传递时,在无名公用区或同名的有名公用区中,位置排列相同的变量、数组,实际上使用同一存储地址,亦即共享同一数据。 例如 PROGRAM MAIN COMMON a,I 2/COMl/d,c CALL SB END SUBROUTINE SB COMMON aa,JK 2/COMl/f,g END 其中,主程序中的变量a的数据与子程序的变量aa共享,数组1的数据与JK共享,而d,c的数据分别与f,g共享。由此可以知道,各个程序单位中COMMON语句中的变量类型必须按位置一一对应一致才能正确传递数据。