fortran程序设计.第9章_第1页
fortran程序设计.第9章_第2页
fortran程序设计.第9章_第3页
fortran程序设计.第9章_第4页
fortran程序设计.第9章_第5页
已阅读5页,还剩52页未读 继续免费阅读

下载本文档

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

文档简介

FORTRAN语言

--FORTRAN77结构化程序设计讲师:徐红波Email:第九章子程序

应用程序由一个主程序和若干个子程序组成。程序中可以只有主程序而没有子程序,但是不能没有主程序而只有子程序。以前程序举例都只是由主程序组成的。程序在运行时总是从主程序开始执行,所以如果没有主程序,程序就无法运行。 子程序有函数子程序、子例行程序和数据块子程序三种。数据块子程序仅用来给公用区中的变量赋初值,故将它放在后面与公用区的使用同时介绍。

子程序可以被主程序调用,也可以被其它子程序调用,但是子程序不能直接或间接地自己调用自己,不允许递归调用。把调用子程序的主程序和子程序统称为调用程序,把被调用的子程序统称为被调用程序。9.1函数子程序函数实例:f(x)=x4+x3+2x-7 +1 (x>0) Y=0 (x=0) -1 (x<0)函数子程序:

FUNCTIONY(X) IF(X.GT.0.0)THEN Y=1.0 ELSEIF(X.EQ.0.0)THEN Y=0.0 ELSE Y=-1.0 ENDIF END

三种函数:内部函数、语句函数、函数子程序(外部函数)。 函数子程序是一个单独的程序单位,它不属于调用程序所在的程序单位,因此它称为外部函数。语句函数则属于其所在的程序单位,只能被本程序单位中表达式引用。内部函数是FORTRAN提供的系统标准函数,可以为任何程序单位引用。[例9.1]编写求实型数绝对值的函数 REALFUNCTIONMYABS(X) REALX IF(X.LT.0)THEN MYABS=-1*X RETURN ELSE MYABS=X ENDIF END PROGRAMMAIN REALMYABS,X,A WRITE(*,*)‘Enteranumber:’ READ(*,*)A X=MYABS(A) WRITE(*,*)‘A=’,A,‘X=’,X END9.1.1函数子程序的定义格式1:类型说明FUNCTION函数名(虚拟参数表)格式2:FUNCTION函数名(虚拟参数,…)

类型说明函数名格式3:类型说明FUNCTION函数名()虚参可以是变量名、数组名、子程序名。9.1.2函数子程序的调用

外部函数的调用形式与内部函数的调用形式完全相同,其形式如下:

函数名(实在参数,…)或者函数名()[9.2]编写求1+2+…+n的函数子程序,调用此函数求以下表达式的值Y=((1+2+3)+(1+2+3+4)+(1+2+3+4+5))/((1+2+3+4+5+6)+

(1+2+3+4+5+6+7)) PROGRAMMAIN2 N=3 Y=(SUM(N)+SUM(N+1)+SUM(N+2))/(SUM(N+3)+SUM(N+4)) WRITE(*,*)‘Y=’,Y END FUNCTIONSUM(X) INTEGERX SUM=0 DO10I=1,X SUM=SUM+I10 CONTINUE END[例9.3]已知sinh(x)=(ex-e-x)/2,由程序输入x的值,求出sinh(x),其中ex=1+x+x2/2!+x3/3!+...+xn/n!

PROGRAMMAIN3 REALMYEXP READ(*,*)X Y=(MYEXP(X)-MYEXP(-X))/2.0 WRITE(*,*)‘SINH(‘,X,‘)=’,Y END FUNCTIONMYEXP(X) REALMYEXP N=0 T=1 S=1 DO10WHILE(ABS(T).GT.1E-5) N=N+1

T=T*X/N S=S+T10 CONTINUE MYEXP=S END9.2子例行程序

子例行程序和函数子程序都是子程序,它们的区别在于:函数子程序的名字代表一个值,在函数子程序中求出的函数值存放在函数名中。因此,函数名是函数值的体现者,对函数名应作类型说明。而子例行程序的名字只供调用,它不代表某个值,当然也不属于某个类型。在子例行程序中求得的值不是由子程序名带回调用单位,而是通过实参与虚参的联系带回调用单位。[例9.4]使用子例行程序求1+2+...+n SUBROUTINESUM(N,S) INTEGERN REALS S=0 DO10I=1,N S=S+I10 CONTINUE END PROGRAMMAIN4 CALLSUM(3,Y1) CALLSUM(4,Y2) CALLSUM(5,Y3) CALLSUM(6,Y4) CALLSUM(7,Y5) Y=(Y1+Y2+Y3)/(Y4+Y5) WRITE(*,*)‘Y=’,Y END11.2.1子例行程序的定义

子例行程序必须以SUBROUTINE语句开头,以END语句结束。 形式如下:

SUBROUTINE子例行程序名(虚拟参数,…)

SUBROUTINE子例行程序名9.2.2子例程程序的调用

必须用一条独立的CALL语句来调用子例行程序,CALL语句的形式如下:

CALL子例行程序名(实在参数,…)

当子例行程序没有虚参时,则调用形式可以以下两种形式之一:

CALL子例行程序名或CALL子例行程序名()子例行程序和函数子程序的主要差别: 1、名字的作用不同。子例行程序名只供调用时使用,不得在子程序体内赋值;函数子程序名除了供调用时使用外,还代表着函数值,因此必须在返回前在函数体内给函数名赋予函数值。

2、调用的方式不同。函数子程序的调用总是出现在表达式中,并将所得的函数值参与表达式的运算;子例行程序必须用一条独立的CALL语句调用。

在程序设计中,如果只需得到一个计算值,一般采用函数子程序的形式。在设计函数子程序时通常不主张在函数体内改变形参的值,从而保证不使对应的实参发生变化。如果希望通过子程序的运算操作得到一批数组(例如矩阵相加的结果),则应该采用子例行程序,将得到的新值通过实参与虚参的结合传送回调用单位,这是由在子例行程序体内给形参赋值实现的。另外,还通过使用子例行程序来完成一些特定的操作。[例9.5]编写子例行程序用来在一行上打印20个星号SUBROUTINEASTERISKCHARACTER*20STARSTAR=‘********************’PRINT*,STARENDPROGRAMMAIN5CALLASTERISKCALLASTERISKEND[例9.6]编写子例行程序分别求出5*5矩阵两个对角线上元素值和 PROGRAMMAIN6 REALW(5,5) CALLREADIN(W) CALLOPP(W,X1,X2) END SUBROUTINEREADIN(A) REALA(5,5) WRITE(*,*)‘Enter5*5matrix:’ DO10I=1,5 READ(*,*)(A(I,J),J=1,5)10CONTINUE END SUBROUTINEOPP(A,S1,S2) REALA(5,5) S1=0 DO10I=1,5 S1=S1+A(I,I)10CONTINUE S2=0 DO20I=1,5 J=5-I+1 S2=S2+A(I,J)20 CONTINUE END9.3实参和虚参之间的数据传送

函数子程序和子例行程序中的虚参可以是变量名、数组名、函数名、子例行程序名,在子例行程序中还可用星号作为虚参。 当函数子程序和子例行程序被调用之前,所有虚参都无定义,所有虚参既没有具体的存储单元也没有具体的值,只是起到形式上的作用,所以人们也经常将虚拟参数称为形式参数(或简称形参)。当执行的流程转向子程序时,实参和虚参按地址结合,这时实参的存储单元就是对应虚参的存储单元。当执行的流程退出子程序时,该子程序的虚参又变成无定义的。9.3.1变量作为虚参

当虚参是变量时对应的实参可以是用一类型的常量、变量、数组元素和表达式。 如果实参是变量或数组元素,在调用子程序时,对应的虚参实际上将与之共用同一个存储单元。因此,虚参的值就是实参的值,虚参的值改变时,对应实参的值也就同时改变。PROGRAMMAINSUBROUTINESUB(X,A)INTEGERA,C(3) INTEGERX,ADATAC/3*0/ A=2*XA=100 X=2*ACALLSUB(A,C(2)) ENDWRITE(*,*)‘A=’,A,‘C(2)=’,C(2)END

如果实参是常量或表达式,则子程序中对应的虚参变量的值不应当改变,也就是说在这种情况下虚参变量不应当在子程序中被赋值,否则会引起不可预料的结果。 如果虚参是字符变量,则它的长度定义应当遵循以下两条规则之一:(1)虚参字符变量的长度定义必须小于等于对应实参变量的长度。(2)虚参字符变量的长度可用(*)来定义,表示长度不定。当调用子程序时,具有不定长度的虚参变量自动定义成为与对应实参具有同样长度。例如以下程序中:PROGRAMMAIN SUBROUTINESUB(CH)CHARACTERSTR1*8,STR2*40 CHARACTER*(*)CH…. ….CALLSUB(STR1) ENDCALLSUB(STR2)….END9.3.2数组作为虚参

当虚参是数组名时,对应的实参可以是同一类型的数组名或数组元素。以下将区分各种情况加以说明。 (1)如果虚参数组是数值类型或逻辑类型,并且对应实参也是相同的类型,在调用子程序时将把实参数组第一个元素的地址传送给子程序作为虚参数组的第一个元素的地址,从而导致了它们共用一个存储单元。由于每个数组占一串连续的存储单元,因此虚参数组的第二个元素必须按存放次序与实参数组的第二个元素共用存储单元,其它依次类推。图9.2给出了一维数组情况下虚参和实参数组结合的示意图。

PROGRAMMAIN DIMENSIONA(8) CALLSUB(A) END

SUBROUTINESUB(B) DIMENSIONB(-1,5)

…. END图9.3给出了不同维数情况下,虚参和实参数组结合的示意图PROGRAMMAINDIMENSIONA(2,4)….CALLSUB(A)….ENDSUBROUTINESUB(B)DIMENSIONB(6)….END图9.4给出了3*3的实参数组与2*2的虚参数组结合的情况PROGRAMMAINDIMENSIONA(3,3)……CALLSUB(A)……ENDSUBROUTINESUB(B)DIMENSIONB(2,2)……END

注意,在子程序中说明虚参数组时,它的元素个数必须小于等于对应实参数组中元素的个数。虚参数组总是按照内存排列次序与实参数组结合。 虽然虚实结合的数组允许维数不同,下标的上下界不同,但在这种情况下由于对应元素使用的下标完全不同使程序很难读懂,也很容易造成一些隐藏的错误,因此应该尽量避免出现这种情况。(2)如果虚参数组是数值类型或逻辑类型;并且对应实参是一个相同类型的数组元素,在调用子程序时,将把该元素的地址传送到子程序作为虚参数组第一个元素的地址,从而使它们共用一个存储单元;并且虚参数组的其余元素将与该实参数组元素后的元素按排列顺序一一对应结合。 在这种情况下,子程序中实际用到的虚参数组最后一个元素必须落在对应实参数组的范围内,而且与数组维数无关。图9.5给出了当虚参为数组名,对应实参为数组元素时,两个数组结合的情况。 PROGRAMMAIN DIMENSIONA(8) …… CALLSUB(A(3)) …. END

SUBROUTINESUB(B) DIMENSIONB(4)

…… END图9.6给出了当虚参为数组名,对应实参为不同维数的实参数组元素时两个数组结合的情况。PROGRAMMAINDIMENSIONA(3,3)……CALLSUB(A(1,2))……ENDSUBROUTINESUB(B)DIMENSIONB(4)……END图9.7中虚参数组的元素已超出对应实参数组的范围。这将引起运行时出错。PROGRAMMAINDIMENSIONA(6)……CALLSUB(A(3))……ENDSUBROUTINESUB(B)DIMENSIONB(6)……END(3)当数组是字符类型时,虚参和实参数组不是按数组元素的顺序一一对应结合,而是按字符位置一一对应结合。虚参数组中允许的字符总数必须小于等于实参数组中允许的字符总数。在此条件下,虚、实数组的维数可以不同,下标的上、下界可以不同,数组元素的字符长度可以不同。图9.8给出了字符类型数组结合的示意图。 PROGRAMMAIN CHARACTER*4B(6) …… CALLSUB(B) …… END SUBROUTINESUB(C) CHARACTER*5C(4) …… END

除非特殊需要,虚参字符数组元素的长度应该与对应实参相同,这样的程序不仅可读性好,而且易于调试检查。 与虚参字符数组对应的实参也可以是一个字符数组元素,虚参字符数组的第一个字符与该元素的第一个字符结合,其它按次序依次类推,只是虚参字符数组中最后一个字符必须落在对应实参数组的范围之内。(4)在子程序中,允许虚参数组是可调数组。可调数组的使用大大提高了子程序的通用性和灵活性。读者在了解数组虚实结合情况的基础上应该充分利用可调数组这一强有力的工具来进行程序设计。

PROGRAMMAIN DIMENSIONA(10),B(4,3) M1=4 M2=3 CALLSUB(A,10,B,M1,M2) … END

SUBROUTINESUB(X,NX,Y,N1,N2)

DIMENSIONX(NX),Y(N1,N2) ... END 可调数组名必须是虚参。可调数组中每一维的上下界可以是整型虚参变量,其值通过对应的实参传送过来;也可以是公用区中变量。为了使程序清晰易读,建议采用虚参变量来说明可调数组的上、下界而不用公用区变量。另外可调数组也遵循前述1、2、3中的有关规定。对于初学者来说要特别注意,只能在子程序中使用可调数组,而且对于那些只是在子程序中局部使用的(并非通过虚实结合传送的)数组不允许是可调的。(5)虚实数组中最后一维的上界可以用星号(*)表示。例如:

PROGRAMMAIN SUBROUTINESUB(X,Y) DIMENSIONA(10),B(4,3) DIMENSIONX(0,*),Y(2,*) ... ... CALLSUB(A,B) END ... END

用这种方式定义的数组称为不定长数组。以上SUB子程序中的X、Y数组在调用之前其大小不固定,当调用该子程序时,它们的大小由对应的实参数组来确定。因此在上例中当执行了CALLSUB(A,B)调用语句后,SUB子程序中X、Y的实际说明为:

DIMENSIONX(0,9),Y(2,3)9.3.3子程序名作为虚参 在虚参表中允许出现函数名和子例行程序名。FORTRAN编译程序完全根据某个虚参名字在子程序中出现时的上下文关系来确定它是函数名还是子例行程序名。函数名在必要时应该进行类型说明。 例如以下子例行程序中:

SUBROUTINESUB(A,N,X,F) DIMENSIONA(N) ... Y=F(I)+1 X=A(I)+1 ... END

虚参A由说明语句可知是一个数组名,子程序表达式中A(I)的形式是数组元素的引用。N和X分别是整型和实型变量名。虚参中,F是以F(I)的形式出现在表达式中,在FORTRAN中,F(I)的形式可能是数组元素的引用或者可能是函数的调用。由于在SUB子程序中并没有说明F为数组名,因此FORTRAN编译程序根据上下文关系确定F为实型函数名。又如以下子例行程序中:

SUBROUTINESUB(X,P) ... CALLP ... END

由于虚参P出现在CALL语句中,因此确定P为子例行程序名。 在虚参中的函数名、子例行程序名(如以上的F、P)只是一个虚设的名字,它并不代表程序中实际存在的某个函数名或子例行程序名,实际的函数名或子例行程序名要在调用时通过实参传送给它。如果虚参是一个函数名,要求对应的实参代表一个在程序中实际存在的尾部函数名或内部函数名。如果虚参是一个子例行程序名,则要求对应的实参代表一个在程序中实际存在的子例行程序名。 当在调用的程序单位中,实在参数中出现外部函数名或子例行程序名时,必须在调用程序的说明部分用EXTERNAL语句说明这些名字。如果在实在参数表中出现内部函数名时,必须在调用程序的说明部分用INTRINSIC语句说明这些名字。以下我们通过例子来说明函数名和子例行程序名的虚实结合以及EXTERNAL和INTRINSIC语句的使用。[例9.7]编写一个函数子程序,通过函数名的传送,使之既能求正切值TAN(X)又能求余切值CTN(X)PROGRAMMAIN7INTRINSICSIN,COSX=3.14159/5.0Y1=TRIANGLE(SIN,COS,X)Y2=TRIANGLE(COS,SIN,X)WRITE(*,*)‘TAN(‘,X*180/3.14159,’)=‘,Y1WRITE(*,*)‘CTN(‘,X*180/3.14159,’)=’,Y2ENDFUNCTIONTRIANGLE(F1,F2,X)TRIANGLE=F1(X)/F2(X)END[例9.8]以下程序由你选择对输入的两个数(X1,X2)进行加法(Add)运算还是减法(Subtract)。当你打入字母A(或a)时,则对随后输入的两个数进行加法运算并输出结果;当你打入字母S(或s)时,则对随后输入的两个数进行减法运算并打印出结果。 PROGRAMMAIN8 EXTERNALADD,SUB CHARACTERCH WRITE(*,*)‘EnterA(Add)orS(Subtract):’ READ(*,‘(A)’)CH WRITE(*,*)‘EnterX1,X2:’ READ(*,*)X1,X2 IF(CH.EQ.‘A’.OR.CH.EQ.‘a’)THEN CALLTEST(ADD,X1,X2,Y)

WRITE(*,100)X1,‘+’,X2,‘=’,Y

ELSEIF(CH.EQ.‘S’.OR.CH.EQ.‘s’)THEN CALLTEST(SUB,X1,X2,Y)

WRITE(*,100)X1,‘-‘,X2,‘=’,Y ELSE WRITE(*,*)‘Selecterror!’ ENDIFFORMAT(1X,2(F6.1,A),F6.1)ENDSUBROUTINETEST(T,X2,X2,X)CALLT(X1,X2,X)ENDSUBROUTINEADD(A,B,C) C=A+BENDSUBROUTINESUB(A,B,C) C=A-B END 9.3.4星号作为虚参 当形参表中出现一个*号时,对应的实参应该是一个冠有*号的语句标号。例如:

PROGRAMMAIN SUBROUTINEEXAM(A,*,*) ... IF(...)THEN120X=X1+X2 ... ... RETURN1 CALLEXAM(X,*120,*140) ELSEIF(…)THEN … …140… RETURN2 END ENDIF … END

在CALLEXAM(X,*120,*140)语句中,与虚参第一个*号对应的语句标号为120,与虚参第二个*号对应的语句标号为140。在执行EXAM子例行程序时,如果遇到END语句,执行的流程将按正常情况返回到调用语句的后继语句去继续执行。当遇到RETURN1语句时,执行的流程返回主程序并跳到与第1个*号对应的语句标号120去继续执行。当遇到RETURN2语句时,执行的流程返回主程序并跳到与第3个星号对应的语句标号140去继续执行。 用星号作为形参将使子程序有一个入口而有多个出口,这种返回方式不符合结构化程序设计的要求,因此除非特殊需要,一般不主张采用。9.4利用子程序实现程序的模块化设计

函数子程序和子例行程序都是独立的程序单位,可以单独进行编译。除了函数子程序名和子例行程序名外,子程序内所用的语句标号、变量、数组、符号常量等都只局限于本程序单位;子程序中可以通过虚实结合使用可调数组,可以通过虚实结合传送子程序名,这都为结构化程序设计提供了有力的工具。

在开发程序的时候,总是把一个大任务分解成若干个小子任务,并且更进一步把子任务分解成更小的子任务,一直细分到每一个子任务只完成比较简单的操作为止。当把所有的子任务都由子程序来完成时,通常细分的程度以每个子程序不超过50-60语句行为宜。子程序可以多次调用,这使得一些相同的操作都可调用同一个子程序来完成而不必重复编程。用这种方法设计出现的程序不仅可读性好而且容易调试、修改和维护。在调试程序时可以一个个模块逐块进行;当需要修改程序时,对一个模块的修改往往不会影响到其它模块。主程序子程序1子程序n……9.5在子程序中的SAVE语句和DATA语句

函数子程序或子例行程序中用到的所有变量,在被调用前通常都没有确定的存储单元,每当子程序被调用时才临时分配存储单元,而且在退出子程序时这些存储单元又都被释放并重新分配另作它用。所以这些变量的值不被保留。在下次进入子程序时,给这些变量分配的可能是另外的一些存储单元,上次调用时这些变量所具有的值已不复存在。称这些变量在子程序未调用时是无定义的。 在函数或子例行程序中可以使用SAVE说明语句来指定子程序中的某些变量的存储单元不被释放,它们的内容在退出子程序期间保持不变,在下次调用时仍可使用。SAVE语句的形式如下:

SAVE变量表或SAVE

变量表可以是本子程序中的变量名、数组名,若变量或数组名不止一个,它们之间用逗号隔开。在SAVE语句中不允许出现虚拟参数名。当SAVE语句中带有变量表时,则为变量表中指定的变量和数组保留存储单元,如果SAVE语句中没有变量表,则表示让子程序中所有的变量和数组在程序执行期间都占有确定的存储单元,不因退出子程序而被释放。[例9.9]求阶乘的函数,每次调用此函数时,把最后一项乘数放在变量N0中,把阶乘的值放在变量F中。当下次调用此函数时,如果N大于等于N0,则不必再从头开始进行连乘运算,只需把上次的函数值再乘以N0+1、N0+2、…N即可。 PROGRAMMAIN9 WRITE(*,*) WRITE(*,*)‘ENTERN:’ READ(*,*)N DO10WHILE(N.GE.0) WRITE(*,*)’FUN=’,FUN(N) WRITE(*,*)‘ENTERN:’ READ(*,*)N10 CONTINUE END FUNCTIONFUN(N) SAVEN0,F DATAN0/0/,F/1/ IF(N.LT.0)THEN WRITE(*,*)‘DATAERROR!’ FUN=-1 RETURN ELSEIF(N.LE.N0)THEN F=1 N0=1 ENDIF DO10I=N0+1,N F=F*I10 CONTINUE FUN=F N0=N END

对于只需在第一次调用时赋初值,后续调用不必赋初值的情况,使用DATA语句是合适的。当用DATA语句给子程序中的变量或数组赋初值时,这些变量和数组元素只是在子程序第一次调用时才有初值。如果没有SAVE语句说明,DATA语句中的变量和数组在第一次调用退出后就变成无定义的了。不要误解为调用一次子程序DATA语句就赋一次初值,因为DATA是非执行语句。如果每调用一次就需要赋一次相同的初值,这应该用赋值语句来实现。FUNCTIONFAC(N)FUNCTIONFAC(N)

DATAF/1/ F=1IF(N.LT.0)THEN IF(N.LT.0)THEN WRITE(*,*)‘ERROR’WRITE(*,*)‘DATAERROR!’ FAC=-1 FAC=-1 RETURN RETURNELSE ELSE DO10I=1,N DO10I=1,N

F=F*I F=F*I10 CONTINUE 10CONTINUE ENDIF ENDIF FUN=F FUN=F END END[例9.10]给出一个产生伪随机数的函数RAND(),函数没有自变量,产生的随机数在0到1之间,不包括0和1 PROGRAMMAIN10 DIMENSIONA(10) DO10I=1,10 A(I)=RAND()10 CONTINUE WRITE(*,*)A END

FUNCTIONRAND() SAVESEED INTEGERSEED,C1,C2,C3 PARAMETER(C1=29,C2=217,C3=1024) DATASEED/0/ SEED=MOD(SEED*C1+C2,C3) RAND=REAL(SEED)/C3 END从程序运行的结果可以看到,每次产生相同的随机数序列。这是因为每次运行开始,随机数的种子SEED的初值总是为0。如果每次运行时想从终端输入种子SEED的初值,从而使每次运行时产生不同的随机数序列,可把函数改写如下: FUNCTIONRAND() SAVESEED INTEGERSEED,C1,C2,C3 PARAMETER(C1=29,C2=217,C3=1024) DATASEED/0/ IF(SEED.EQ.0)THEN WRITE(*,*)‘ENTERRANDNUMBERSEED:’ READ(*,*)SEED ENDIF SEED=MOD(SEED*C1+C2,C3) RAND=REAL(SEED)/C3 END9.6程序举例

[例9.11]编写函数求去掉尾部空格后字符串的长度 PROGRAMMAIN11 CHARACTER*80LINE READ(*,*)LINE L=LENGTH(LINE) WRITE(*,*)L END FUNCTIONLENGTH(LINE) CHARACTER*(*)LINE I=LEN(LINE) DO10WHILE(I.GT.0.AND.LINE(I:I).EQ.‘‘) I=I-110CONTINUELENGTH=IEND[例9.12]编写子例行程序把字符串中的小写字母转换成大写字母,其它字符不变

SUBROUTINETOUPCASE(STR) CHARACTER*(*)STR,CH*1 L=LEN(STR) DO10I=1,L,1 IF(STR(I:I).GE.‘a’.AND.STR(I:I).LE.‘z’)THEN CH=CHAR(ICHAR(STR(I:I))+ICHAR(‘A’)-ICHAR(‘a’)) STR(I:I)=CH ENDIF10 CONTINUE ENDPROGRAMMAIN12CHARA

温馨提示

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

评论

0/150

提交评论