为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

计算机语言

2011-12-21 31页 doc 68KB 25阅读

用户头像

is_848537

暂无简介

举报
计算机语言前言 第二十二讲   计算机程序设计语言(之二) 一、 内容提要: 本讲主要讲述FORTRAN的语句 二、 重点难点: 根据所讲语句对简单的程序能够判断输出结果 三、 内容讲解: 三、赋值语句 三、赋值语句 赋值语句的一般格式为: 变量名=表达式 其中,连接变量名和表达式的符号“=”称为赋值号。在FORTRAN77中,有三种赋值语句:算术赋值语句,逻辑赋值语句和字符赋值语句。 (一)算术赋值语句 1.算术赋值语句中赋值号右边是算术表达式。算术表达式可以是单个变量或数组元素,可以是用算术运算符号连接起来的数值计算过...
计算机语言
前言 第二十二讲   计算机程序设计语言(之二) 一、 内容提要: 本讲主要讲述FORTRAN的语句 二、 重点难点: 根据所讲语句对简单的程序能够判断输出结果 三、 内容讲解: 三、赋值语句 三、赋值语句 赋值语句的一般格式为: 变量名=达式 其中,连接变量名和表达式的符号“=”称为赋值号。在FORTRAN77中,有三种赋值语句:算术赋值语句,逻辑赋值语句和字符赋值语句。 (一)算术赋值语句 1.算术赋值语句中赋值号右边是算术表达式。算术表达式可以是单个变量或数组元素,可以是用算术运算符号连接起来的数值计算过程。 (1)算术表达式中的各个数据量(常量或变量)的类型一般应该一致。如果不一致,FORTRAN程序在运行中先将其进行转换,再进行计算。例如实型变量和整型变量进行计算时,整型变量的数值先被转换为实型。 (2)算术表达式计算中,特别应注意两个整型量之间的除法(称为整除)。例如,算术表达式10.0-2/4×10.0的计算过程是 10.0-0×10.0=10.0-0.0=10.0 如果表达式写为10.0-2/4.0×10.0,则计算过程是 10.0-2.0/4.0×10.0=10.0-0.5×10.0=5.0 因为2/4是整除,其结果为0,而进行2/4.0的计算时,整型量2先被转化为实型。 2.算术赋值左边只能是数值型变量名或数值型数组元素。如果赋值号左边的变量与右边的表达式类型不一样时,系统将自动把右边表达式计算的结果转换为与左边变量的类型一致后再赋给该变量。 (二)逻辑赋值语句 在逻辑赋值语句中,赋值号左边为逻辑变量或逻辑型数组元素,右边为一个逻辑表达式。 (三)字符赋值语句 1.字符赋值语句赋值号的左边为字符变量或字符型数组元素。 2.赋值号的右边为字符表达式,可以是单个字符串或用字符运算符连接起来的字符串。字符运算符只有一个,表示为//,含义为连接该符号两边的字符串。 3.执行字符赋值语句时,应注意字符串的长度与赋值号右边变量或数组元素的长度的关系。 例如: CHARACTER*4 A,B*6,C A=/FILE/ B=A///NAME/, C=B(5:6) 定义字符型变量时,根据类型说明语句的规定,A、C长度为4,而变量B因有专门说明,其长度为6。程序运行后,变量A的长度与赋值号右边字符串长一致,A的值为‘FILE’;而B的长度小于‘FILE’和‘NAME’两个字符串长度之和,因此多余的字符被截去,B的值为‘FILENA’;C的结果为‘NA——”,其中最后两格为空格符,这是因为C的长度为4,大于字符串‘NA’的长度,于是在其右边补上2个空格符后形成4个字符长再赋值给C。在上面的程序例中,出现表达式B(5:6),称为“子串”,表示取出字符串的一部分,本例中,表示将B的字符串‘FILENA’中的第5个字符至第6个字符取出。 四、循环语句 四、循环语句 (一)DO语句 DO语句的一般形式为: DO  n  V=e1,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  I=1,9 DO 8  J=I,9 IJ=1*J 8  CONTINUE 10  CONTINUE 本例中,外层循环控制变量I初值为1,终值为9,内层循环控制变量J初值为外层循环控制变量I的当前值,终值为9。外层的第1次循环,内层经过9-1+1=9次循环,依次计算1×1=1,1×2=2,…,1×9=9,外层的第2次循环,内层经过9-2+1=8次循环,依次计算2×2=4,2×3=6,…,2×9=18;……。 (四)使用循环语句应注意的若干问题 1.正确选定循环变量的初值。 比如,对累加问题和连乘问题,变量初值不正确,便影响最终结果。 例如计算m=1!+2!+……+10!,采用循环语句编写程序,涉及到累加和连乘。 其程序可编写如下: m=0 n=1 D0 20 I=1,10 n=n*I m=m+n 20  CONTINUE PRINT*,m END 例如,n用于存放连乘结果,其初值设定为1,而m用于存放累加结果,其初值设定为0。 2.DO语句可以和转换语句,条件语句等结合起来使用,此时应注意从循环体内可以转向循环体外,但不允许从循环体外转向循环体内;从内层循环中可以转向外层循环,但不允许从外层循环转向内层循环中。 3.当内外层循环体的终端语句相同,且两个终端语句之间没有其他语句时,可以合并使用一个终端语句。 例如,前面计算乘法表的程序段可以写为: DO 10 I=1,9 DO 10 J=I,9. IJ=I*J 10 CONTINUE 或写为 DO 10 I=1,9 DO 10J=I,9 10  IJ=I*J 五、输入输出语句 五、输入输出语句 (一)表控输入输出 表控输入输出语句是一种隐含格式的输入输出语句,又称自由格式输入输出,其格式由程序编译系统提供,在程序语句中不予表示。 1.表控输出语句 FORTRAN 77表控输出语句有两种方式: PRINT *,输出量表 WRITE(*,*)输出量表 这两种表控输出语句的作用是相同的,但一般微机上的FORTRAN 77子集不提供PRINT语句,所以通常使用WRITE语句。 2.表控输入语句 FORTRAN 77表控输入语句有两种形式: READ *,输入量表 READ(*,*)输入量表 表控输入又称为自由格式输入。表控输入语句要求用户在隐含的输入设备(通常是键盘)上输入所需的数据,在输入数据时,各数据之间用逗号或空格分隔。 (二)格式输入输出 1.格式输出数据语句WRITE语句和FORMAT语句 WRITE语句的一般形式为: WRITE(u,f)输出量表 其中,u为部件说明符,用以指出在哪个设备上进行输出,通常也称为通道号,当u为记号*时,表示在显示器(输出设备)上进行输出。f为格式说明,它通常是一个格式语句的标号,用以指出输出数据所采用的格式。 格式语句的一般形式为: 标号FORMAT(格式说明) 例如: WRITE(*,10)A,B,A*B 10  FORMAT(1X,F6.2,F7.3,F10.4) FORMAT语句中,第一个“1X称为纵向控制符,它表示前进一空格后再输出后面的数据,后面的三个项分别说明了三个实型数据输出的,称为格式编辑符。 FORTRAN 77也允许在WRITE语句中直接指定输出格式,从而可以省略格式语句FORMAT。例如,上面的输出语句与格式语句可以合并成一个,即: WRITE(*,/ (1X,P6.2,F7.3,F10.4)/)A,B,A*B 2.格式编辑符 FORTRAN常用的格式符有十几种,详细可参照任何一本FORTRAN教材或专用手册。 (三)隐循环的输入输出 数组元素的输入输出可以采用循环方式实现。 例如: DIMENSION X (20) DO 10 I=1,20 20  READ*,X(I) 程序段执行时进行20次循环,每次输入1个数据。这个输入程序段可以改写如下: DIMENSION X (20) READ *,(X(I),I=1,20) 其中第2句就是隐循环的输入语句。循环控制变量I的初值为1,终值为20,步长为1而予以省略。隐循环语句的作用与DO语句是相同的;但使用隐循环语句时,20个数据允许一次性输入,当然,数据与数据之间要用空格符或逗号区别开来。 隐循环语句也用于输出语句,也可使用多重循环。 例如 DIMENSION Y (10,6) READ(*,*)((Y(I,J),J=1,6),I=1,10) WRITE(*,5)((Y(I,J),J=1,6),I=1,10) 5  FORMAT(1X,6F10.2) 运行程序段时,首先读入60个数据,Y(1,1),Y(1,2),……,Y(1,6),Y(2,1),Y(2,2),……,Y(2,6),……,Y(10,1),Y(10,2),……,Y(10,6),然后输出60个数据,每行输出6个数据,数据的排列顺序与输入时相同。 六、控制语句 六、控制语句 一般情况下,FORTRAN程序是按语句顺序执行的,但需要时,可以改变这种顺序。这种改变可以通过各种控制转移语句、逻辑条件语句等来实现。 (一)转移语句 1.无条件转移语句 无条件转移语句的一般形式为: GOTO n 当程序流程到达GOTO语句时,随后就转向语句标号为n的语句。标号为n的语句必须是可执行语句,但它在程序中的排列位置,可以在引导到它的GOTO语句之后,也可以在该GOTO语句之前。无条件转移语句常和其他控制语句结合起来使用。 2.算术条件转移语句 算术条件转移语句的一般形式为: IF(e)  n1,n2,n3 其中,e必须是算术表达式,当表达式运算结果e<0时,程序转向标号为n1的语句;当e=0时,转向标号为n2的语句;当e>0时,转向标号为n3的语句。 例如,计算边长为B的正方形中挖去半径为R的圆后的面积,若B<2R,则给出相关信息。该问题的FORTRAN程序可用算术条件转移语句编写如下。 c     ComputationOf area。 READ *,B,R IF (B-2*R) 5,15,15 5     WRITE (*,10) 10    FORMAT(/Errormessage:Blessthan 2*R/) GOTO 20 15    AREA=B*B-3.14159 * R* R WRITE *,AREA 20    CONTINUE END 本例中,在算术条件转移语句的第1个分支后,使用了GOTO语句;倘没有此语句,则程序按顺序仍会执行标号为15的语句,从而得出不正确的结果。 3.计算转移语句 计算转移语句的一般形式为: GOTO(n1,n2,….”,mm),e 其中,ni(i=1,2,……,m)是被转向的语句标号,共m个;e是一个整型算术表达式,其值不得小于1且不得大于m。当e的值等于1时,程序转向标号n1的语句,当e的值等于2时转向标号n2的语句,当e的值为m时转向标号为nm的语句。整型算术表达式e前的逗号可以省略。计算转移语句通常也和GOTO语句结合起来使用。 例如,有如下一个程序: READ *,M GOTO(20,30,40,50)M 20    N=M GOTO 60 30    N=M*2 GOTO 60 40    N=M*3   GOTO 60 50    N=M*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 IF(IPOINT.GT.100.OR.IPOINT.LT.0)  WRITE(*,*) /DATAERROR/ IF(IPOINT.GE.90.AND.IPOINT.LE.100)  WRITE(*,*) /Excelent/ IF(IPOINT.GE.80.AND.IPOINT.LT.89)  WRITE(*,*) /Good/ IF(IPOINT.GE.60.AND.IPOINT.LT.79)  WRITE(*,*) /Pass/ IF(IPOINT.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 STRESS=RN/AN WRITE*,RN,AN,STRESS ENDIF 当RN大于等于零且AN大于零时,执行赋值语句和输出语句。 (2)使用ELSE的形式 IF(逻辑表达式)THEN 语句块1 ELSE 语句块2 ENDIF 当逻辑表达式的值为“真”时,执行语句块1,当逻辑表达式的值为“假”时,执行语句块2。由此可见,使用ELSE的形式,可以进行两个分支的选择。 (3)使用ELSEIF的形式 IF(逻辑表达式1)THEN 语句块1 ELSE IF(逻辑表达式2)THEN 语句块2 : ELSE 语句块n+1 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 (0:5) … CALLSB (A) … END SUBROUTINESB (B) INTEGERB(-1:2) … END 则在主程序中使用CALL语句调用子程序SB时,实参数组与形参数组的结合情况如下: 实参数组形参数组 A(0)———B(-1) A(1)———B(0) A(2)———B(1) A(3)———B(2) A(4) A(5) 也即调用SB时,A数组的头4个元素与B数组的元素对应,这些对应元素实际上为同一存储地址。 如果实参是数组元素,则从该元素开始依次与形参数组的第一个元素起按列逐个对应,它们也是按地址结合。例如,有主程序与子程序如下: PROGRAM MAIN DIMENTION  A (8) … CALLSB (A (5)) … END SUBROUTINE SB (B) DIMENTION B (3) … END    则在调用语句执行时,实参数组A与形参数组B的结合情况如下: 实参数组形参数组 A(1) A(2) A(3) A(4) A(5)———B(1) A(6)———B(2) A(7)———B(3) A(8) FORTRAN 77规定,不管实参是数组名还是数组元素,用作实参的数组,其维数、各维下标的上下限及数组中元素个数可以和与之结合的形参数组不同,但要求从与形参数组的第一个元素结合的实参数组元素算起,以后的实参数组元素的个数不能少于形参数组元素的个数。 多维数组或数组元素虚实结合时,要特别注意FORTRAN中数组按列存放的规定,不要搞错存储地址的对应关系。例如: PROGRAM MAIN DIMENSION A (3,2) … CALL SB (A) … END SUBROUTINE SB (B) DIMENSION B (2,3) … END 这种情况下,数组元素地址的对应关系是: 实参数组形参数组 A(1,1)——B(1,1) A(2,1)——B(2,1) A(3,1)——B(1,2) A(1,2)——B(2,2) A(2,2)——B(1,3) A(3,2)——B(2,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中元素的值为; D(1):'AB' D(2):'CD' D(3):'EF' D(4);'GH' (5)过程名的虚实结合 FORTRAN允许子程序中的形参为过程名,此时,调用程序中的实参必须是过程名。 如是实参是外部过程名(如函数子程序名、子程序名),则该外部过程名在调用程序中必须用EXTERNAL语句说明。 如果实参是内部过程名(如内部函数名),则该内部过程名在调用中必须用INTRINSIC语句说明。 (二)公用区语句 1.公用区语句的一般形式 COMMON[/Sk公用区名1/]变量表1,[/公用区名2/变量表2]… 没有公用区名的就称为无名公用区,其他都是有名公用区;一个完整的程序只能设置一个无名公用区,但可以有多个有名公用区;变量表中,可以是变量名、数组名、数组说明符,互相之间用逗号隔开。例如: COMMON a,b(3),c(2) 定义了b是3个元素的一维数组,c是2个元素的一维数组。这条语句与下面两句语句是等价的: DIMENSION b(3),c(2) 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 (0:5) … CALLSB (A) … END SUBROUTINESB (B) INTEGERB(-1:2) … END 则在主程序中使用CALL语句调用子程序SB时,实参数组与形参数组的结合情况如下: 实参数组形参数组 A(0)———B(-1) A(1)———B(0) A(2)———B(1) A(3)———B(2) A(4) A(5) 也即调用SB时,A数组的头4个元素与B数组的元素对应,这些对应元素实际上为同一存储地址。 如果实参是数组元素,则从该元素开始依次与形参数组的第一个元素起按列逐个对应,它们也是按地址结合。例如,有主程序与子程序如下: PROGRAM MAIN DIMENTION  A (8) … CALLSB (A (5)) … END SUBROUTINE SB (B) DIMENTION B (3) … END    则在调用语句执行时,实参数组A与形参数组B的结合情况如下: 实参数组形参数组 A(1) A(2) A(3) A(4) A(5)———B(1) A(6)———B(2) A(7)———B(3) A(8) FORTRAN 77规定,不管实参是数组名还是数组元素,用作实参的数组,其维数、各维下标的上下限及数组中元素个数可以和与之结合的形参数组不同,但要求从与形参数组的第一个元素结合的实参数组元素算起,以后的实参数组元素的个数不能少于形参数组元素的个数。 多维数组或数组元素虚实结合时,要特别注意FORTRAN中数组按列存放的规定,不要搞错存储地址的对应关系。例如: PROGRAM MAIN DIMENSION A (3,2) … CALL SB (A) … END SUBROUTINE SB (B) DIMENSION B (2,3) … END 这种情况下,数组元素地址的对应关系是: 实参数组形参数组 A(1,1)——B(1,1) A(2,1)——B(2,1) A(3,1)——B(1,2) A(1,2)——B(2,2) A(2,2)——B(1,3) A(3,2)——B(2,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中元素的值为; D(1):'AB' D(2):'CD' D(3):'EF' D(4);'GH' (5)过程名的虚实结合 FORTRAN允许子程序中的形参为过程名,此时,调用程序中的实参必须是过程名。 如是实参是外部过程名(如函数子程序名、子程序名),则该外部过程名在调用程序中必须用EXTERNAL语句说明。 如果实参是内部过程名(如内部函数名),则该内部过程名在调用中必须用INTRINSIC语句说明。 (二)公用区语句 1.公用区语句的一般形式 COMMON[/Sk公用区名1/]变量表1,[/公用区名2/变量表2]… 没有公用区名的就称为无名公用区,其他都是有名公用区;一个完整的程序只能设置一个无名公用区,但可以有多个有名公用区;变量表中,可以是变量名、数组名、数组说明符,互相之间用逗号隔开。例如: COMMON a,b(3),c(2) 定义了b是3个元素的一维数组,c是2个元素的一维数组。这条语句与下面两句语句是等价的: DIMENSION b(3),c(2) 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语句中的变量类型必须按位置一一对应一致才能正确传递数据。
/
本文档为【计算机语言】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索