Fortran子程序

上传人:ll****x 文档编号:243380566 上传时间:2024-09-22 格式:PPT 页数:39 大小:157KB
返回 下载 相关 举报
Fortran子程序_第1页
第1页 / 共39页
Fortran子程序_第2页
第2页 / 共39页
Fortran子程序_第3页
第3页 / 共39页
点击查看更多>>
资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第八章 子程序,语句函数,函数子程序,子例行程序,程序单元之间的数据传递,递归调用,数据共用存储单元与数据块子程序,内部子程序,模块,1,8.1,语句函数,语句函数,用一个语句定义的函数。,PROGRAM EXAM1A,X=1,FX=5*X*3-2*X*2+7*X+6,WRITE(*,*) f(, X, )=, FX,X=10,FX=5*X*3-2*X*2+7*X+6,WRITE(*,*) f(, X, )=, FX,X=12,FX=5*X*3-2*X*2+7*X+6,WRITE(*,*) f(, X, )=, FX,X= -1,FX=5*X*3-2*X*2+7*X+6,WRITE(*,*) f(, X, )= ,FX,END,P125 例 8.1 求函数,在x=1, 10, 12, -5时的值。,2,一、语句函数的定义,定义格式:,f:语句函数名, x:虚参, e:表达式,1. 语句函数名,函数名的组成规则与变量名相同,语句函数不能与同一个程序单元中的变量同名。,可在语句函数定义语句前用类型语句说明该函数名的数据类型,否则该语句函数的函数值的类型按其函数名遵守IN隐含规则。,3,F(X, Y)=X*2+Y*2 ! 定义了一个实型函数 F,NF(X, Y)=X*2+Y*2 ! 定义了一个整型函数 NF,INTEDER F,F(X, Y)=X*2+Y*2 ! 定义了一个整型函数 F,2. 语句函数的虚参,虚参的类型遵守变量的说明规则,实参可以是常量、变量或表达式,不同语句函数中的虚参可以同名,虚参也可以和程序中的变量同名。,4,函数F和G本质上是一个函数,因为对于任意的实参T,F(T)和G(T)总是相同的,但函数F、G和H有点不同,其虚参Z被说明为整型。,INTEGER Z,F(X)=3*X*2+5,G(Y)=3*Y*2+5,H(Z)=3*Z*2+5,3. 语句函数表达式,表达式中必须包括语句函数的虚参,还可以包含常量、变量、内部函数、外部函数、已定义过的语句函数。,5,函数用一条语句可以定义时,才用语句函数的形式定义函数。,注意:,语句函数定义语句是非执行语句,放在本程序单位中的所有执行语句之前,说明语句之后。,语句函数只在本程序单位中有意义。,表达式的类型与函数名的类型应一致。,6,二、语句函数的调用,例 8.2 用函数语句的方法设计例8.1,PROGRAM EXAM1B,INTEGER X,F(X)=5*X*3-2*X*2+7*X+6,WRITE(*,*)F(2),F(10),F(12),F(-2),END,实参可以是常量、变量或表达式,实参的个数、类型与虚参个数、类型对应一致,7,8.2 函数子程序,一、 函数子程序的定义,类型说明 FUNCTION 函数名(虚参表),函数体,END,函数名的作用:函数的标识,代表该函数的函数值,虚参可以是变量名、数组名、子程序名,返回调用程序之前:函数名=表达式,8,当未进行说明时,函数值的类型遵守I-N规则。,函数类型的说明方法:,1在函数定义时说明,如:,INTEGER FUNCTION F1(X1,X2.XN),函数体,END,2. 在函数体中说明,如:,FUNCTION F1(X1,X2.XN),INTEGER F1,函数体,END,虚参的类型在函数体中说明,否则遵守I-N规则。,9,二、函数子程序的调用,P130 例8.4 用函数子程序的方法设计一个程序,求50-100内的所有素数及其和。,分析:设计一个函数子程序 PRIME(N),函数PRIME的值定义如下:,主程序的任务是将50-100之间的每个数依次调用PRIME函数子程序,求出那些使PRIME函数值为1的自然数并求这些数的和。,10,函数子程序如下:,FUNCTION PRIME(N),INTEGER PRIME !定义PRIME是整型函数,PRIME=0,DO I=2, N-1,IF (MOD(N, I)=0) RETURN,ENDDO,PRIME=1 !参数N无任何因子,函数值为1,END,11,运行结果如下:,.,83,89,97,S= 732.000000,主程序如下:,PROGRAM EXAM3,INTEGER PRIME !说明要调用的函数PRIME 为整型,S=0,DO I=50, 100,IF (PRIME(I)=1) THEN,S=S+I,WRITE(*,*) I,END IF,END DO,WRITE(*,*) S=, S,END,12,分析:函数子程序NUM(N,I),当I=100时,函数NUM返回N的百位上的数;当I=10时,NUM返回N的十位上的数,I=1时,NUM返回N的个位上的数。程序如下:,PROGRAM FLOWER,DO I=100, 999,IF (NUM(I,100)*3+NUM(I,10)*3+NUM(I,1)*3=I) THEN,WRITE(*,*) I,ENDIF,ENDDO,END,P131 例 8.5 当一个数各个数位的立方和等于这个数本身时,称这样的数为水仙花数(如153=1*3+5*3+3*3)。编程:求100-999之间的水仙花数。,13,FUNCTION NUM(N, I),SELECT CASE(I),CASE(100),NUM=N/100 !用N百位上的数赋值给函数名,CASE(10),NUM=MOD(N/10, 10) !用N十位上的数赋值给函数名,CASE(1),NUM=MOD(N, 10) !用N个位上的数赋值给函数名,END SELECT,END,程序运行结果如下:,153,370,371,407,14,SUBROUTINE 子程序名(虚参表),子例行程序体,END,8.3 子例行程序,CALL 子例行程序名(实参表),函数子程序的名字代表一个值,因而是有类型的,而子例行程序的名字不代表一个值,因而其名字没有类型问题。,在子例行程序中求出的值通过实参与虚参的联系带回调用程序单位。,一、子例行程序的定义,二、子例行程序的调用,15,PROGRAM EXAM5,PARAMETER (N=20),DIMENSION A(N),INTEGER A,A(1)=17 !该语句及随后的三个语句生成数组A,DO I=2, 20,A(I)=MOD(19*A(I-1), 1024),ENDDO,DO I=1, N-1 !二重循环完成对A的排序,DO J=I+1, N,CALL SWAP(A(I), A(J),ENDDO,ENDDO,WRITE(*, 200)(A(I), I=1, N),200 FORMAT(2(2X, 10(I5, X)/),END,P133 例 8.7 随机生成一个含20个元素的数组,对该数组按升序排序。,16,子例行程序和函数子程序在使用上可以相互替代。如果只需要一个返回值时,以采用函数子程序比较方便;如果子程序没有返回值,或希望通过子程序得到一批数据时,则采用子例行程序较为方便。,子例行程序SWAP(M,N)的功能是,若MN,就交换M、N的值,程序段如下:,SUBROUTINE SWAP(X, Y),INTEGER X, Y, T,IF (XY) THEN,T=X,X=Y,Y=T,ENDIF,END,17,PROGRAM EXAM6,PARAMETER(M=3,N=4),DIMENSION A(M, N), B(N, M),INTEGER A, B,WRITE(*,*) please input a 3x4 Matra,READ(*, 200)(A(I, J), J=1, N), I=1, M),CALL TRAN(A, B, M, N),WRITE(*, 300)(B(I, J), J=1, M), I=1, N),200 FORMAT(4I4),300 FORMAT(3I4),END,P134 例 8.8 设计一个子例行程序,求任意矩阵的转置矩阵。,子例行程序TRAN(A,B,M,N)将矩阵A转置后放矩阵B,M、N分别是矩阵A、B的行数和列数。,运行情况:,please input a 3x4 Matra,1 2 3 4,5 6 7 8,9 10 11 12,显示结果如下:,1 5 9,2 6 10,3 7 11,4 8 12,18,子例行程序如下:,SUBROUTINE TRAN(A, B, M, N),INTEGER A(M, N), B(N, M), M, N,DO I=1, M,DO J=1, N,B(J, I)=A(I, J),ENDDO,ENDDO,END,19,实参与虚参共用同一个存储单元,实参的值就是对应虚参的值,虚参的值改变时,对应实参的值也同时改变。,A B,X Y,8.4 实参和虚参之间的数据传递,一、变量作为虚参,1实参是变量或数组元素,FUNCTION SUB(A,B) PROGRAM TTEM,X=3,. Y=-5,S=S+SUB(X, Y),.,END END,20,当用常量或表达式作为实参时,是将该值赋值给对应的虚参。此种情况下,子程序中对应的虚参变量的值不能改变,否则结果难以预料。,2实参是常量或表达式,二. 数组名作为虚参,实参为同一类型的数组名时,将实参数组的第一个元素的存储地址传送给子程序,作为虚参数组第一个元素的存储地址,从而使两者共用一片存储单元。,实参可以是与虚参类型相同的数组名或数组元素。,1虚参数组为数值型或逻辑型数据,21,当实参是一个数组元素时,将该元素的存储地址传送给子程序,作为虚参数组的第一个元素的存储地址,从而使虚参数组与实参自该元素以后的元素共用一片存储单元。,虚参数组最后一个元素必须落在对应实参数组的范围内。,实参和虚参间的元素按存储顺序对应,不要求两者的行列数相同。,22,例:,Program main,dimension a(2, 4),call sub(a),End,Subroutine sub(b),dimension b(6),end,a(1,1) a(2,1) a(1,2) a(2,2) a(1,3) a(2,3) a(1,4) a(2,4),b(1) b(2) b(3) b(4) b(5) b(6),23,例:,Program main,dimension a(8),call sub(a(3),End,Subroutine sub(b),dimension b(4),end,a(1) a(2) a(3) a(4) a(5) a(6) a(7) a(8),b(1) b(2) b(3) b(4),24,如 P136:,PROGRAM TTST FUNCTION SUB2(X),DIMENSION A(3,4) DIMENSION X(2,6),DO I=1,3 S=0,DO J=1,4 DO I=1,2,A(I,J)=I+J DO J=1,6,ENDDO IF (MOD(I+J,3)=0) THEN,ENDDO S=S+X(I,J),WRITE(*,*)SUB2(A) ENDIF,END ENDDO,ENDDO,SUB2=S,END,a(1,1) a(2,1) a(3,1) a(1,2) a(2,2) a(3,2) a(1,3) a(2,3) a(3,3) a(1,4) a(2,4) a(3,4),x(1,1) x(2,1) x(1,2) x(2,2) x(1,3) x(2,3) x(1,4) x(2,4) x(1,5) x(2,5) x(1,6) x(2,6),25,当虚参为字符型数据时(当然对应的实参也为字符型数据),实参和虚参不是按照数组元素的顺序对应,而是按照字符位置一一对应。,实参、虚参两者的元素对应关系是:,A(1,1)X(1,1),A(2,1)X(2,1),A(3,1)X(1,2),A(1,2)X(2,2),A(2,2)X(1,3),A(3,2)X(2,3),A(1,3)X(1,4),A(2,3)X(2,4),A(3,3)X(1,5),A(1,4)X(2,5),A(2,4)X(1,6),A(3,4)X(2,6),2虚参为字符型数据,3可调数组虚参数组的维界是整型虚参变量,可调数组只能作为虚参使用。,26,Program main,Dimension a(10), b(4, 3),m1=4,m2=3,Call sub(a, 10, b, m1, m2),End,Subroutine sub(x, nx, y, n1, n2),Dimension x(nx), y(n1, n2),end,27,在虚参表中允许出现子程序名。,三. 子程序名作为虚参,SUBROUTINE SUB(A, N, X, F, P),DIMENSION A(N),Y=F(I)+1,X=A(I)+1,CALL P,END,强调:只需对实参的属性进行说明。,实参代表的函数名或子例行程序名要求在程序中实际存在。,在调用程序单位中,实参中的子程序名(函数子程序即外部函数,和子例行程序名)必须用EXTERNAL对实参程序名作出说明;内部函数名必须用 INTRINSIC 语句说明,说明语句必须放在该程序段的所有可执行语句前。,28,P137 例,8.9 设有三个连续函数:,每个小区间的宽度为:,h=(b-a)/n,第i个小矩形的面积:,s,i,=h*f(a+(i-1)* h),29,FUNCTION H(X) !被积函数H(X),H=1/(1+X*2),END,三个被积函数不同,求其函数值的方法也就不同,定义三个被积函数F(X)、G(X)、H(X)的函数子程序:,FUNCTION F(X) !被积函数F(X),F=SIN(3*X)+COS(X),END,FUNCTION G(X) !被积函数G(X),G=5*X*3+2*X-10,END,30,用矩形方法求函数积分的方法都相同,设计一个统一的函数子程序,含有虚参函数名,并用被积函数作为实参来调用该函数子程序。,FUNCTION SIMPSON(F,a,b,n),integer n, i,s=0.0,h=(b-a)/n,do i=1,n,s=s+h*F(a+(i-1)*h),enddo,SIMPSON=s,end,每个小区间的宽度为:,h=(b-a)/n,第i个小矩形的面积:,s,i,=h*f(a+(i-1)* h),31,PROGRAM SIMPSON_PRO,EXTERNAL F, G, H !定义三个被积函数为外部函数,REAL I1, I2, I3,I1=SIMPSON(F, 0, 2*3.1416, 100) ! 计算F(X)的积分,I2=SIMPSON(G, 0, 10.0, 100),I3=SIMPSON(H, 0, 1.0, 100),WRITE(*,*)I1=, I1,WRITE(*,*)I2=, I2,WRITE(*,*)I3=, I3,END,32,作业:,P174 6, 9, 13,补1:用语句函数编程序,用牛顿迭代法求:,X,3,-2x,2,+x-1=0,在x=1.5附近的实根,补2:设计一个函数子程序,求大奖赛评委的评分,要求用可调数组。,补3:用子例行程序将一维数组逆序存放,要求用可调数组。,33,补1:用语句函数编程序,用牛顿迭代法求:,x,3,-2x,2,+x-1=0,在x=1.5附近的实根,f(x)=x*x*x-2*x*x+x-1,f1(x)=3*x*x-4*x+1,x=1.5,d=1.0,do while(abs(d)1.0e-6),d=f(x)/f1(x),x=x-d,enddo,print*, The root is ,x,end,34,P174 6 设计一个计算n!的函数子程序,并调用该函数子程序计算:,real function fun(n),integer n,i,real: p=1,do i=1, n,p=p*i,enddo,fun=p,end,program main,integer: i=1,real: e=1, n,n=1.0,do while(na(j) ) then,temp=a(i); a(i)=a(j); a(j)=temp,endif,enddo,enddo,elseif(k=0)then,do i=1, n-1,do j=i+1, n,if( a(i)max) max=a(i),if(a(i)min) min=a(i),enddo,average=(sum-max-min)*1.0/(n-2),End function average,38,补3:用子例行程序将一维数组逆序存放,要求用可调数组。,program main,parameter(n=10) integer a(n),read*, a,call resve(a,n),print*, a,End program main,subroutine resve(a, n),integer: a(n), i, temp,do i=1, n/2,temp=a(i),a(i)=a(n-i+1),a(n-i+1)=temp,enddo,End subroutine resve,39,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!