资源预览内容
第1页 / 共46页
第2页 / 共46页
第3页 / 共46页
第4页 / 共46页
第5页 / 共46页
第6页 / 共46页
第7页 / 共46页
第8页 / 共46页
第9页 / 共46页
第10页 / 共46页
亲,该文档总共46页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第6章 程序单元和过程,1、由若干个程序单元组成: 主程序、子程序、模块 2、主程序结构 program 程序名称一般省略 声明语句部分 执行语句部分 ENDprogram 程序名称 注意:END是停止运行、结束标记,不可省略,FORTRA90源程序基本结构,例如:求如图所示的多边形的面积。 首先将该多边形划分成若干个三角形,每个三角形的边长分别用L1、L2、L3表示。 然后用下面的公式(海伦公式)计算每个三角形的面积。最后将这几个三角形的面积相加: 以上问题要经过三次完全相同的运算,但参加运算的L1、L2、L3量值不同。我们可以编写一段程序实现这一功能,并为该程序段命名。在计算每个三角形面积时调用该程序,并代入不同的参数完成运算,从而简化设计,便于结构化的程序设计。,6.1 概述,主程序的结构:,开始 说明部分 输入 计算或处理 输出 END,引入子程序的目的:模块化设计,所有功能都在主程序单位内完成,6.1 概述,一个Fortran90程序必须有一个主程序单元,而且只能有一个主程序单元。一个主程序中可以根据需要包含任意数量的子程序单元,子程序单元可以被主程序单元调用,也可以被其它子程序单元调用。,求1!+2!+3!+4!,Program main Integer:I,s real:f Do I=1,4 s=s+f(I) enddo Print *,s end,Function f(n) result(fac) Integer:n,I,fac Fac=1 Do I=1,n fac=fac*I enddo endfunction,子程序是具有特定功能的程序段 子程序不能独立执行,只能被主程序单元或被其它子程序单元调用,甚至可以递归调用(调用本身),子程序,Fortran90程序中的过程有两种:函数子程序过程和子例子程序过程。这两者的形式、功能与调用方法都有所不同,但总称为过程或子程序。,子程序分类,6.2函数子程序,Visual Fortran90的函数: 1、内在函数(系统函数、标准函数) 如:sin、cos、sqrt、abs、mod 2、Function语句编写的函数(自定义),6.2.1函数子程序的编写方法,FUNCTION 函数名(虚元表)RESULT(结果名) 说明部分 程序体(可执行语句):具体计算(一般不包含输入输出) END FUNCTION 函数名,函数子程序的结构,Function语句 说明部分 函数体:具体计算,实现功能 END Function语句,函数子程序的结构,FUNCTION F(X,Y)RESULT(F_RESULT) IMPLICIT NONE integer:X,Y, F_RESULT F_RESULT =X+Y END function,例:编写求N!的函数子程序。,FUNCTION FACT(N) RESULT(FAC) IMPLICIT NONE INTEGER:N,I,FAC FAC=1 DO I=1,N FAC=FAC*I ENDDO END FUNCTION FACT,表示函数开始,函数名字,N是虚元,表示函数结果,存放函数结果的变量,至少有一条语句给结果变量赋值,函数结束,虚元与结果变量必须进行类型说明,如要求1!+2!+3!+4!, 则主程序为:,PROGRAM MAIN INTEGER:FACT,SUM=0,I DO I=1,4 SUM=SUM+FACT(I) ENDDO PRINT*,SUM END,说明函数子程序的类型,调用函数求阶乘,FUNCTION 函数名(虚元表)RESULT(结果名) 1、函数子程序的第一行(注释行除外)。 2、关键字FUNCTION 3、函数名和普通变量的命名规则相同。是一个函数的名字,不允许在该函数程序内说明其类型。 4、虚元用逗号分隔,函数体内要说明类型。,6.2.1 函数子程序的编写方法(P111),FUNCTION 函数名(虚元表)RESULT(结果名) 5、RESULT关键字,其后括号内的结果变量用于存放函数的结果,在函数体内要说明其类型,并且至少赋值一次。,P111,FUNCTION函数名(虚元表)RESULT(结果名) 说明部分:虚元表中的所有虚元、函数结果名、其它变量 的类型 程序体: 实现函数功能的语句,结果名至少赋值一次 End function函数名,函数子程序的写法,分为说明部分和执行部分。 1、说明部分应对程序体内虚元、结果变量名、其它变量作出说明。 2、执行部分中必须对函数结果名至少赋值一次。,FUNCTION F(X,Y)RESULT(F_RESULT) IMPLICIT NONE integer:X,Y,F_RESULT F_RESULT=X+Y END function,例:编写求N!的函数子程序。,FUNCTION FACT(N) RESULT(FAC) IMPLICIT NONE INTEGER:N,I,FAC FAC=1 DO I=1,N FAC=FAC*I ENDDO END FUNCTION FACT,表示函数开始,函数名字,N是虚元,表示函数结果,存放函数结果的变量,至少有一条语句给结果变量赋值,函数结束,虚元与结果变量必须进行类型说明,1. 虚元可以是变量名、数组名、过程名、指针等。 2. 虚元的可选属性INTENT: INTENT(IN):作为子程序的输入(从实元获得值) INTENT(OUT):子程序的输出(将虚元值传给实元) INTENT(INOUT):子程序的输入输出 例:INTEGER,INTENT(IN):X,Y,有关虚元(P111),编写求1+2+3+N的值的函数子程序,Function isum(n) result(isum_result) integer:n, isum_result,I isum_result=0 do I=1,n isum_result=isum_result+I end do End function,例6-1,6.2.2 函数子程序的调用,1.过程作为子程序不能独立运行,只供其它程序单元调用。 调用形式与内在函数的引用形式相同: 函数名(实元表) 在主程序中,要对调用的函数名进行类型说明,类型同函数子程序中结果变量的类型,2、常见形式: 变量=函数名(实元表) PRINT*,函数名(实元表) IF(函数名(实元表) 注意:实元与虚元一般必须在个数、次序、类型上保持一致;实元与虚元名字可以相同也可以不同。,6.2.2 函数子程序的调用,3.当一个过程被调用时,调用它的主程序或子程序称作主调程序。 4.主调程序和被调用程序间的数据传递主要是通过虚实结合实现。,FUNCTION f(X,Y)RESULT(F_RESULT) IMPLICIT NONE integer:X,Y,F_RESULT F_RESULT=X+Y END function,PROGRAM main Integer:a,b,d,f READ*,a,b D=f(a,b) PRINT*,D END,虚元,实元,调用子程序的执行流程,6.2.2函数子程序的调用,每当程序执行到调用语句时,系统就去运行子程序,完成之后,返回断点(调用语句的下一条语句)继续程序的运行。,例6-1 编写求1+2+3+N的值的函数子程序。 函数定义,Function isum(n) result(isum_result) integer:n, isum_result,I isum_result=0 do I=1,n isum_result=isum_result+I end do End function,例6-1 编写求1+2+3+N的值的函数子程序。 主程序(函数调用),Program main integer:n integer:isum read*,n print *,isum(n) end,求X的绝对值,Function f(x) result(r) real:x,r if (x0)then r=x else r=-x endif end Program main real:I,f read *,i Print *,f(i) end,总结,函数子程序编写思路 funtion函数开始语句 虚元表 函数参数 结果名 不能和函数名同名 说明语句 虚元表中的所有虚元、函数结果名;其它变量 执行语句 完成函数的功能 至少有一次对结果名赋值 程序单位结束语句 END Function,例1:编写子程序求K=M*N,主程序输入2,3,调用子程序,计算2*3。,Program main Implicit none Integer:M,N,K,F Read*,M,N K=F(M,N) PRINT*,K END,FUNCTION F(M,N)RESULT(F_RESULT) IMPLICIT NONE INTEGER:M,N,F_RESULT F_RESULT=M*N END FUNCTION,注意:虚元名任意,可以与实元一致。 检查调用原则,程序体编写规则。,例2计算 x+1 x0 f(x)= 0 x=0 x-1 x0 要求用外部函数求f(x)的值。,FUNCTION F(X)RESULT(Y) IMPLICIT NONE REAL:X, Y IF(X0)THEN Y=X+1 ELSEIF(X0)THEN Y=X-1 ELSE Y=0 ENDIF END FUNCTION,real:a,f READ*,a print *,f(a) END,例6-3求出20-50间的素数,调用函数实现,例6-3、编写判断素数的函数子程序,调用它实现例5-11的功能:求出2050之间的全部素数。,6.2.3函数子程序应用举例:,FUNCTION PRIME(M) RESULT(PRIME_RESULT) IMPLICIT NONE INTEGER:M,I,PRIME_RESULT DO I=2,M/2 IF(MOD(M,I)=0) EXIT ENDDO IF(IM/2) THEN PRIME_RESULT=1 ELSE PRIME_RESULT=0 ENDIF END FUNCTION PRIME,主调程序:,PROGRAM MAIN IMPLICIT NONE INTEGER:N,PRIME DO N=20,50 IF(PRIME(N)=1) PRINT*,N ENDDO END PROGRAM MAIN,主调程序必须说明函数的类型,调用PRIME函数(表达式),改写PRIME函数(使用逻辑变量):,FUNCTION PRIME(M) RESULT(PR) IMPLICIT NONE INTEGER:M,I LOGICAL:PR PR=.TRUE. DO I=2,sqrt(real(m) IF(MOD(M,I)=0) PR=.FALSE. ENDDO END FUNCTION PRIME,说明结果为逻辑类型,先假定是素数,主调程序:,PROGRAM MAIN IMPLICIT NONE INTEGER:N LOGICAL:PRIME DO N=20,50 IF(PRIME(N)=.true.) PRINT*,N ENDDO END PROGRAM MAIN,主调程序必须说明函数的类型,调用PRIME函数(表达式),练习: 计算函数Sinh(x)的值,当ex的通项值小于等于1E-6时停止。计算公式如下:,!主程序如下: Program main1 Real: MyExp,y,x Write(*,*) Enter x: Read(*,*)x Y=(MyExp(x)-MyExp(-x) /2.0 Write(*,)Y END PROGRAM,两次调用,!函数子程序 Function MyExp(x) result (Exp_
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号