版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第第8 8章章 子程序子程序 西南交通大学信息学院西南交通大学信息学院 计算机基础教学中心计算机基础教学中心 FORTRANFORTRAN程序设计程序设计 前一页 休息 2 子程序的概念子程序的概念 FORTRAN FORTRAN中的子程序分为:函数子程序和子中的子程序分为:函数子程序和子 例程(行)子程序。例程(行)子程序。 一个一个FORTRANFORTRAN应用程序必须有仅能有一个主程序和若干个子应用程序必须有仅能有一个主程序和若干个子 程序组成。程序组成。 子程序可以被主程序调用,也可以被其它子程序调用。但子程序可以被主程序调用,也可以被其它子程序调用。但 子程序不能直接或间接地自己调
2、用自己。子程序不能直接或间接地自己调用自己。 执行程序时,从主函数开始执行。主函数的最后一个操作执行程序时,从主函数开始执行。主函数的最后一个操作 执行结束,也就是程序执行结束。执行结束,也就是程序执行结束。 前一页 休息 3 函数子程序的结构:函数子程序的结构: 类型说明符类型说明符 function function 函数名(虚拟参数表)函数名(虚拟参数表) 函数名函数名= =表达式表达式 end end 其中:虚拟参数表由若干个虚拟参数相互间用逗号其中:虚拟参数表由若干个虚拟参数相互间用逗号 分割组成的内容。分割组成的内容。 虚拟参数可以是变量名、数组名、子程序名。虚拟参数可以是变量名、
3、数组名、子程序名。 根据函数子程序的结构,我们知道,通过函根据函数子程序的结构,我们知道,通过函 数名得到函数值。数名得到函数值。 函数子程序函数子程序 前一页 休息 4 在定义函数子程序时,应该注意的有:在定义函数子程序时,应该注意的有: 1 1:子函数名不满足隐含规则,一定要用类型说明语:子函数名不满足隐含规则,一定要用类型说明语 句进行定义。句进行定义。 2 2:虚拟参数不满足隐含规则,一定要用类型说明语:虚拟参数不满足隐含规则,一定要用类型说明语 句进行定义。句进行定义。 3 3:虚拟参数是可以是数组名,也要定义。:虚拟参数是可以是数组名,也要定义。 4 4:虚拟参数表可以没有虚拟参数
4、,书写时,一对圆:虚拟参数表可以没有虚拟参数,书写时,一对圆 括号必须要写。括号必须要写。 5 5:函数子程序体中,:函数子程序体中,必须要有对子函数名赋值必须要有对子函数名赋值。 函数子程序函数子程序 前一页 休息 5 函数子程序函数子程序 函数子程序的调用:函数子程序的调用: 函数名(实参表)函数名(实参表) 函数子程序的调用与内部函数的调用方法相同。函数子程序的调用与内部函数的调用方法相同。 当在主程序或子程序段中调用当在主程序或子程序段中调用 函数子程序,函数子程序, 函函 数子程序名不满足隐含规则,在该主程序或子程序段数子程序名不满足隐含规则,在该主程序或子程序段 中要用类型说明语句
5、对函数子程序名进行说明。中要用类型说明语句对函数子程序名进行说明。 调用函数子程序时,实参表的实参个数与虚拟参调用函数子程序时,实参表的实参个数与虚拟参 数表的形参个数应该相等,对应位置上参数类型一致数表的形参个数应该相等,对应位置上参数类型一致 。实参表的实参可以是变量名、常量、数组元素、数。实参表的实参可以是变量名、常量、数组元素、数 组名等。调用函数子程序时,将第一个实参传给第一组名等。调用函数子程序时,将第一个实参传给第一 个形参,将第二个实参传给第二个形参,个形参,将第二个实参传给第二个形参,.。 前一页 休息 6 函数子程序函数子程序 例例1 1:求:求 (1+2+3)+(1+2+
6、3+4)+(1+2+3+4+5)/(1+2+3+4+(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)5+6)+(1+2+3+4+5+6+7) 在求以上值的过程中,多次用到求在求以上值的过程中,多次用到求1+2+n1+2+n (n=3n=3、4 4、5 5、6 6、7 7),因此,可以设计一个函数子),因此,可以设计一个函数子 程序求程序求1+2+n1+2+n。 函数子程序名用函数子程序名用sumsum,只需要一个形式参数,只需要一个形式参数n n。 在书写程序时,只要写完一个程序段再写另一个程在书写程序时,只要写完一个程序
7、段再写另一个程 序段就可以。序段就可以。 执行程序时,从主函数开始执行。主函数的最后一执行程序时,从主函数开始执行。主函数的最后一 个操作执行结束,也就是程序执行结束。个操作执行结束,也就是程序执行结束。 前一页 休息 7 n=3 n=3 y=(sum(n)+sum(n+1)+sum(n+2) y=(sum(n)+sum(n+1)+sum(n+2) 1/(sum(n+3)+sum(n+4) 1/(sum(n+3)+sum(n+4) write(5,10)y write(5,10)y 1010 format(1x,2hy=,f10.4) format(1x,2hy=,f10.4) end end
8、 function sum(n) function sum(n) sum=0 sum=0 do 20 i=1,n do 20 i=1,n 20 sum=sum+i20 sum=sum+i end end 函数子程序函数子程序 前一页 休息 8 函数子程序函数子程序 例例2 2:已知:已知 sinh(x)=(e sinh(x)=(ex x-e-e-x -x)/2 )/2 由程序输入由程序输入x x,求,求sinh(x)sinh(x)。 我们知道:我们知道:ex=1+x+xex=1+x+x2 2/2!+x/2!+x3 3/3!+./3!+. 在上面的问题中,两次使用同一种方法解决求值过程。在上面的
9、问题中,两次使用同一种方法解决求值过程。 编写一个名为编写一个名为myexp(x)myexp(x)的函数子程序求的函数子程序求e ex x。函数名为。函数名为 实型,形式参数也为实型。实型,形式参数也为实型。 两次调用两次调用myexpmyexp函数,分别求出函数,分别求出e ex x和和e e-x -x。 。 前一页 休息 9 函数子程序函数子程序 function myexp(x) real myexp n=0 t=1 s=1 do 10 while(abs(t).gt.1.0e-5) n=n+1 t=t*x/n 10 s=s+t myexp=s end 前一页 休息 10 函数子程序函数
10、子程序 real myexp real myexp read(5,10)x read(5,10)x 10 format(f8.2)10 format(f8.2) y=(myexp(x)-myexp(-x)/2.0 y=(myexp(x)-myexp(-x)/2.0 write(6,20)x,y write(6,20)x,y 20 format(1x,sinh(,f8.2,)=,e13.6)20 format(1x,sinh(,f8.2,)=,e13.6) end end 前一页 休息 11 子例程(行)子程序的结构:子例程(行)子程序的结构: subroutine subroutine 子例程
11、子程序名(虚拟参数表)子例程子程序名(虚拟参数表) (不能对子例程子程序名赋值)(不能对子例程子程序名赋值) end end 其中:虚拟参数表由若干个虚拟参数相互间用逗号分其中:虚拟参数表由若干个虚拟参数相互间用逗号分 割组成的内容。割组成的内容。 虚拟参数可以是变量名、数组名、子程序名。虚拟参数可以是变量名、数组名、子程序名。 定义子例程(行)子程序时,没有虚拟参数表,可以定义子例程(行)子程序时,没有虚拟参数表,可以 将子例程子程序名后的(虚拟参数表)不写。将子例程子程序名后的(虚拟参数表)不写。 子例程(行)子程序子例程(行)子程序 前一页 休息 12 在定义子例程(行)子程序,应该注意
12、的有:在定义子例程(行)子程序,应该注意的有: 1 1:子例程(行)子程序是没有类型的。:子例程(行)子程序是没有类型的。 2 2:虚拟参数不满足隐含规则,一定要用类型说明语:虚拟参数不满足隐含规则,一定要用类型说明语 句进行定义。句进行定义。 3 3:虚拟参数是可以是数组名,也要定义。:虚拟参数是可以是数组名,也要定义。 4 4:子例程(行)子程序体中,不能对子例程(行):子例程(行)子程序体中,不能对子例程(行) 子程序名赋值。子程序名赋值。 函数子程序函数子程序 前一页 休息 13 子例程(行)子程序的调用:子例程(行)子程序的调用: xxxxx call xxxxx call 子例程子
13、程序名(实参表)子例程子程序名(实参表) 调用函数子例程(行)子程序时,实参表的实参个数调用函数子例程(行)子程序时,实参表的实参个数 与虚拟参数表的形参个数应该相等,对应位置上与虚拟参数表的形参个数应该相等,对应位置上 参数类型一致。实参表的实参可以是变量名、常参数类型一致。实参表的实参可以是变量名、常 量、数组元素、数组名等。调用子例程(行)子量、数组元素、数组名等。调用子例程(行)子 程序时,将第一个实参传给第一个形参,将第二程序时,将第一个实参传给第一个形参,将第二 个实参传给第二个形参,个实参传给第二个形参,.。调用结束后,当。调用结束后,当 实参是变量名,将形参的值返回给实参。实参
14、是变量名,将形参的值返回给实参。 子例程(行)子程序子例程(行)子程序 前一页 休息 14 例例3 3:求:求 (1+2+3)+(1+2+3+4)+(1+2+3+4+5)/(1+2+3+(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)4+5+6)+(1+2+3+4+5+6+7) 子例程(行)子程序如下:子例程(行)子程序如下: subroutine sum(n,s) subroutine sum(n,s) s=0 s=0 do 10 i=1,n do 10 i=1,n s=s+i s=s+i 10 continue10 c
15、ontinue end end 子例程(行)子程序子例程(行)子程序 前一页 休息 15 call sum(3,y1) call sum(3,y1) call sum(4,y2) call sum(4,y2) call sum(5,y3) call sum(5,y3) call sum(6,Y4) call sum(6,Y4) call sum(7,y5) call sum(7,y5) y=(y1+y2+y3)/(y4+y5) y=(y1+y2+y3)/(y4+y5) write(6,10)y write(6,10)y 10 format(1x,y=,e13.6)10 format(1x,y=
16、,e13.6) stop stop end end 子例程(行)子程序子例程(行)子程序 前一页 休息 16 例例4 4:编写子例程(行)子程序分别求出:编写子例程(行)子程序分别求出5 5* *5 5矩阵两个矩阵两个 对角线上元素之和。对角线上元素之和。 程序如下:程序如下: real w(5,5) real w(5,5) call readin(w) call readin(w) call opp(w,x1,x2) call opp(w,x1,x2) write(6,100)x1,x2 write(6,100)x1,x2 100 format(1x,the two sum of oppus
17、ite100 format(1x,the two sum of oppusite 1elements/1x,x1=,f8.2,x2=,f8.2) 1elements/1x,x1=,f8.2,x2=,f8.2) end end 子例程(行)子程序子例程(行)子程序 前一页 休息 17 subroutine opp(a,s1,s2)subroutine opp(a,s1,s2) real a(5,5) real a(5,5) s1=0 s1=0 do 10 t=1,5 do 10 t=1,5 10 s1=s1+a(i,i)10 s1=s1+a(i,i) s2=0 s2=0 do 20 i=1,5
18、do 20 i=1,5 j=5-i+1 j=5-i+1 20 s2=s2+a(i,j)20 s2=s2+a(i,j) end end 子例程(行)子程序子例程(行)子程序 前一页 休息 18 subroutine readin(a)subroutine readin(a) real a(5,5) real a(5,5) do 10 i=1,5 do 10 i=1,5 read(5,5)(a(i,j),j=1,5) read(5,5)(a(i,j),j=1,5) 5 format(5f8.2)5 format(5f8.2) 10 continue10 continue end end 子例程(行
19、)子程序子例程(行)子程序 前一页 休息 19 例例4 4:编写求:编写求3 3个矩阵的两个对角线上元素之和的程序。个矩阵的两个对角线上元素之和的程序。 思路分析:由于多次求矩阵的两个对角线上元素之和,思路分析:由于多次求矩阵的两个对角线上元素之和, 因此,设计一个子例程(行)子程序求任意一个矩因此,设计一个子例程(行)子程序求任意一个矩 阵的两个对角线上元素之和。多次输入一个矩阵的阵的两个对角线上元素之和。多次输入一个矩阵的 所有矩阵元素,因而可设计一个子例程(行)子程所有矩阵元素,因而可设计一个子例程(行)子程 序输入一个矩阵的所有矩阵元素。序输入一个矩阵的所有矩阵元素。 在每一个子例程(
20、行)子程序的设计中,要有表示矩在每一个子例程(行)子程序的设计中,要有表示矩 阵行、列的虚拟参数阵行、列的虚拟参数mm、n(m=n)n(m=n)。 子例程(行)子程序子例程(行)子程序 前一页 休息 20 subroutine readin(a,m)subroutine readin(a,m) real a(m,m) real a(m,m) do 10 i=1,m do 10 i=1,m read(5,5)(a(i,j),j=1,m) read(5,5)(a(i,j),j=1,m) 5 format(5f8.2)5 format(5f8.2) 10 continue10 continue st
21、op stop end end 子例程(行)子程序子例程(行)子程序 前一页 休息 21 subroutine opp(a,s1,s2,m)subroutine opp(a,s1,s2,m) real a(m,m) real a(m,m) s1=0 s1=0 do 10 t=1,m do 10 t=1,m 10 s1=s1+a(i,i)10 s1=s1+a(i,i) s2=0 s2=0 do 20 i=1,m do 20 i=1,m j=m-i+1 j=m-i+1 20 s2=s2+a(i,j)20 s2=s2+a(i,j) write(6,100)s1,s2 write(6,100)s1,s
22、2 100 format(1x,the two sum of oppusite100 format(1x,the two sum of oppusite 1elements/1x,x1=,f8.2,x2=,f8.2) 1elements/1x,x1=,f8.2,x2=,f8.2) end end 子例程(行)子程序子例程(行)子程序 前一页 休息 22 real w1(20,20),w2(30,30),w3(40,40)real w1(20,20),w2(30,30),w3(40,40) read(5,5)m1,m2,m3 read(5,5)m1,m2,m3 5 format(3i2)5 fo
23、rmat(3i2) call readin(w1,m1) call readin(w1,m1) call readin(w2,m2) call readin(w2,m2) call readin(w3,m3) call readin(w3,m3) call opp(w1,x1,x2,m1) call opp(w1,x1,x2,m1) call opp(w2,y1,y2,m2) call opp(w2,y1,y2,m2) call opp(w3,z1,z2,m3) call opp(w3,z1,z2,m3) end end 子例程(行)子程序子例程(行)子程序 前一页 休息 23 例例4 4:编
24、写求:编写求3 3个矩阵相乘的程序。个矩阵相乘的程序。 思路分析:由于两次求两个矩阵相乘,因此,设计一思路分析:由于两次求两个矩阵相乘,因此,设计一 个子例程(行)子程序求任意两个矩阵相乘。多次个子例程(行)子程序求任意两个矩阵相乘。多次 输入一个矩阵的所有矩阵元素,因而可设计一个子输入一个矩阵的所有矩阵元素,因而可设计一个子 例程(行)子程序输入一个矩阵的所有矩阵元素。例程(行)子程序输入一个矩阵的所有矩阵元素。 在每一个子例程(行)子程序的设计中,要有表示矩在每一个子例程(行)子程序的设计中,要有表示矩 阵行、列的虚拟参数阵行、列的虚拟参数mm、n n。在求两个矩阵相乘的。在求两个矩阵相乘
25、的 子例程(行)子程序中,要有表示两个矩阵相乘的子例程(行)子程序中,要有表示两个矩阵相乘的 虚拟参数数组虚拟参数数组a,b,a,b,还有表示两个矩阵相乘的结果虚还有表示两个矩阵相乘的结果虚 拟参数数组拟参数数组c. c. 子例程(行)子程序子例程(行)子程序 前一页 休息 24 subroutine readin(a,m,n)subroutine readin(a,m,n) real a(m,n) real a(m,n) do 10 i=1,m do 10 i=1,m read(5,5)(a(i,j),j=1,n) read(5,5)(a(i,j),j=1,n) 5 format(5f8.2
26、)5 format(5f8.2) 10 continue10 continue stop stop end end 子例程(行)子程序子例程(行)子程序 前一页 休息 25 subroutine matrix(a,b,c,m,n,l)subroutine matrix(a,b,c,m,n,l) real a(m,n),b(n,l),c(m,l) real a(m,n),b(n,l),c(m,l) do 10 i=1,m do 10 i=1,m do 10 j=1,l do 10 j=1,l c(i,j)=0.0 c(i,j)=0.0 do 10 k=1,n do 10 k=1,n c(i,j)
27、=c(i,j)+a(i,k) c(i,j)=c(i,j)+a(i,k)* *b(k,j)b(k,j) 10 continue10 continue end end 子例程(行)子程序子例程(行)子程序 前一页 休息 26 real real a(20,20),b(30,30),c(40,40),d1(40,40),d2(40)a(20,20),b(30,30),c(40,40),d1(40,40),d2(40) read(5,5)m1,m2,m3,m4 read(5,5)m1,m2,m3,m4 5 format(3i2)5 format(3i2) call readin(a,m1,m2) ca
28、ll readin(a,m1,m2) call readin(d1,m2,m3) call readin(d1,m2,m3) call readin(c,m3,m4) call readin(c,m3,m4) call matrix(a,b,d1,m1,m2,m3) call matrix(a,b,d1,m1,m2,m3) call matrix(d1,c,d2,m2,m3,m4) call matrix(d1,c,d2,m2,m3,m4) wite(6,100)d2 wite(6,100)d2 100 format(1x,6(f8.2,2x) 100 format(1x,6(f8.2,2x)
29、 end end 子例程(行)子程序子例程(行)子程序 前一页 休息 27 变量作为虚拟参数:变量作为虚拟参数: 当虚拟参数是变量时,对应的实际参数可以是同当虚拟参数是变量时,对应的实际参数可以是同 一类型的变量、常量、数组元素和表达式。一类型的变量、常量、数组元素和表达式。 如果实际参数是数组元素或变量,在调用子程序如果实际参数是数组元素或变量,在调用子程序 时,对应的需虚拟参数实际上将与之共用同一个时,对应的需虚拟参数实际上将与之共用同一个 存储单元。因此,虚拟参数的值就是实参的值,存储单元。因此,虚拟参数的值就是实参的值, 虚拟参数的值改变,对应的实际参数的值也就同虚拟参数的值改变,对应
30、的实际参数的值也就同 时改变。时改变。 实际参数与虚拟参数的数据传递实际参数与虚拟参数的数据传递 前一页 休息 28 阅读程序,写结果。阅读程序,写结果。 integer a,c(3) subroutine sub(x,a) integer a,c(3) subroutine sub(x,a) data c/3*0/ a=100 a=100 a=2*x call sub(a,c(2) x=2*a write(6,10)a,c(2) end 10 format(1x,a=,i5,2x,c(2),i5) end 实际参数与虚拟参数的数据传递实际参数与虚拟参数的数据传递 前一页 休息 29 数组作为
31、虚拟参数:数组作为虚拟参数: 当虚拟参数是数组名时,对应的实际参数可以是同当虚拟参数是数组名时,对应的实际参数可以是同 一类型的数组名或数组元素。一类型的数组名或数组元素。 以下将区分各种情况加以说明:以下将区分各种情况加以说明: (1 1)如果虚拟参数是数值型或逻辑型,并且对应)如果虚拟参数是数值型或逻辑型,并且对应 的实际参数也是相同类型的数组。在调用子程序时的实际参数也是相同类型的数组。在调用子程序时 将把实际参数第一个元素的地址传送给子程序作为将把实际参数第一个元素的地址传送给子程序作为 虚拟参数的第一个元素的地址,从而导致它们共用虚拟参数的第一个元素的地址,从而导致它们共用 同一个存
32、储单元。由于每个数组占一串连续的存储同一个存储单元。由于每个数组占一串连续的存储 单元,因此虚拟参数的数组的第二个数组数组元素单元,因此虚拟参数的数组的第二个数组数组元素 必然按存放次序与实际参数的第二个元素共用存储必然按存放次序与实际参数的第二个元素共用存储 单元,其他依次类推。单元,其他依次类推。 实际参数与虚拟参数的数据传递实际参数与虚拟参数的数据传递 前一页 休息 30 例如:例如: dimension a(8) dimension a(8) . . cal sub(a) cal sub(a) . . end end subroutine sub(b) subroutine sub(b
33、) dimension b(-1:5) dimension b(-1:5) . . end end a(1) a(2) a(3) a(4) a(5) a(6) a(7) a(8) a(1) a(2) a(3) a(4) a(5) a(6) a(7) a(8) b(-1) b(0) b(1) b(2) b(3) b(4) b(5) b(-1) b(0) b(1) b(2) b(3) b(4) b(5) 实际参数与虚拟参数的数据传递实际参数与虚拟参数的数据传递 前一页 休息 31 例如:例如: dimension a(2,4) dimension a(2,4) . . cal sub(a) cal
34、 sub(a) . . end end subroutine sub(b) subroutine sub(b) dimension b(6) dimension b(6) . . end 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)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) b(1) b(2) b(3) b(4) b(5) b(6) 实际参数与虚拟参数的数据传递实际参数与虚拟参数的数据传递 前一
35、页 休息 32 例如:例如: dimension a(2,4) dimension a(2,4) . . cal sub(a) cal sub(a) . . end end subroutine sub(b) subroutine sub(b) dimension b(2,2) dimension b(2,2) . . end 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)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,1) b(2,1) b(1,2)
36、 b(2,2)b(1,1) b(2,1) b(1,2) b(2,2) 实际参数与虚拟参数的数据传递实际参数与虚拟参数的数据传递 前一页 休息 33 (2 2)如果虚拟参数是数值型或逻辑型,并且对应的)如果虚拟参数是数值型或逻辑型,并且对应的 实际参数是相同类型的数组元素。在调用子程序时实际参数是相同类型的数组元素。在调用子程序时 将把实际参数该元素的地址传送给子程序作为虚拟将把实际参数该元素的地址传送给子程序作为虚拟 参数的第一个元素的地址,从而导致它们共用同一参数的第一个元素的地址,从而导致它们共用同一 个存储单元。并且虚拟参数数组的其余元素将与该个存储单元。并且虚拟参数数组的其余元素将与该
37、 实际参数数组元素后的元素安排列顺序一一对应结实际参数数组元素后的元素安排列顺序一一对应结 合。合。 实际参数与虚拟参数的数据传递实际参数与虚拟参数的数据传递 前一页 休息 34 例如:例如: dimension a(8) dimension a(8) . . cal sub(a(3) cal sub(a(3) . . end end subroutine sub(b) subroutine sub(b) dimension b(5) dimension b(5) . . end end a(1) a(2) a(3) a(4) a(5) a(6) a(7) a(8) a(1) a(2) a(3
38、) a(4) a(5) a(6) a(7) a(8) b(1) b(2) b(3) b(4) b(5) b(1) b(2) b(3) b(4) b(5) 实际参数与虚拟参数的数据传递实际参数与虚拟参数的数据传递 前一页 休息 35 例如:例如: dimension a(2,4) dimension a(2,4) . . cal sub(a(1,2) cal sub(a(1,2) . . end end subroutine sub(b) subroutine sub(b) dimension b(4) dimension b(4) . . end end a(1,1) a(2,1) a(1,2
39、) a(2,2) a(1,3) a(2,3) a(1,4) a(2,4)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(1) b(2) b(3) b(4) 实际参数与虚拟参数的数据传递实际参数与虚拟参数的数据传递 前一页 休息 36 例如:例如: dimension a(6) dimension a(6) . . cal sub(a(3) cal sub(a(3) 该调用将引起运行时出错该调用将引起运行时出错 . . end end subroutine sub(b) subroutin
40、e sub(b) dimension b(6) dimension b(6) . . end end a(1) a(2) a(3) a(4) a(5) a(6) a(1) a(2) a(3) a(4) a(5) a(6) b(1) b(2) b(3) b(4) b(5) b(6) b(1) b(2) b(3) b(4) b(5) b(6) 实际参数与虚拟参数的数据传递实际参数与虚拟参数的数据传递 前一页 休息 37 在虚拟参数表中可以出现函数名和子例程子程序名在虚拟参数表中可以出现函数名和子例程子程序名 FORTRANFORTRAN编译程序完全根据某个虚拟参数名字在编译程序完全根据某个虚拟参数
41、名字在 子程序中出现的上下文关系来确定它是函数名还是子程序中出现的上下文关系来确定它是函数名还是 子例程子程序名。函数名必要时应该进行类型说明。子例程子程序名。函数名必要时应该进行类型说明。 例如:例如: subroutine sub(a,n,x,f) subroutine sub(a,n,x,f) dimension a(n) dimension a(n) . . y=f(i)+1 f y=f(i)+1 f为函数名,因为为函数名,因为f f没有定义是数没有定义是数 组组 x=a(i)+1 a x=a(i)+1 a是数组,因为是数组,因为a a定义是数组定义是数组 . . end end 子程
42、序名作为虚拟参数子程序名作为虚拟参数 前一页 休息 38 例如:例如: subroutine sub(x,p)subroutine sub(x,p) . . call p call p . . end end 由于由于虚拟参数虚拟参数p p出现在出现在callcall语句中,因此,可以确定语句中,因此,可以确定 p p为子例程子程序名。为子例程子程序名。 子程序名作为虚拟参数子程序名作为虚拟参数 前一页 休息 39 编写一个函数子程序,通过函数名的传送,使之能编写一个函数子程序,通过函数名的传送,使之能 够求够求tan(x)tan(x)又能够求又能够求ctn(x),ctn(x),其中其中x=3
43、6x=360 0。 intrinsic sin,cos intrinsic sin,cos x=3.1415926/5.0 x=3.1415926/5.0 y1=triangle(sin,cos,x) y1=triangle(sin,cos,x) y2=triangle(cos,sin,x) y2=triangle(cos,sin,x) write(6,10)y1,y2 write(6,10)y1,y2 10 format(1x,tan(3610 format(1x,tan(360 0)=,f10.4/1x,)=,f10.4/1x, 1ctn(36 1ctn(360 0)=,f10.4)=,f
44、10.4) end end 子程序名作为虚拟参数子程序名作为虚拟参数 前一页 休息 40 function triangle(f1,f2,x) function triangle(f1,f2,x) triangle=f1(x)/f2(x) triangle=f1(x)/f2(x) end end 由于在主程序调用由于在主程序调用triangletriangle函数的实参中出现了内函数的实参中出现了内 部函数名部函数名sinsin、coscos,因此需要在调用该子程序段,因此需要在调用该子程序段 (主程序)的说明部分用(主程序)的说明部分用intrinsicintrinsic语句说明语句说明si
45、nsin、 coscos名字是名字是“内部函数名内部函数名”,否则,会把它们作为,否则,会把它们作为 变量名处理。变量名处理。 在调用某一子程序的实参中出现了另一个函数子程在调用某一子程序的实参中出现了另一个函数子程 序名序名abcabc,因此需要在调用该子程序段的说明部分,因此需要在调用该子程序段的说明部分 用用externalexternal语句说明语句说明abcabc是是“外部函数名外部函数名”,否则,否则, 会把它们作为变量名处理。会把它们作为变量名处理。 子程序名作为虚拟参数子程序名作为虚拟参数 前一页 休息 41 在子程序中使用的变量、数组,在该子程序被在子程序中使用的变量、数组,在该子程序被 调用前都没有确定的存储单元,每当该子程序被调调用前都没有确定的存储单元,每当该子程序被调 用时才临时分配存储单元,而且在调用完该子程序用时才临时分配存储单元,而且在调用完该子程序 后要将这些变量、数组分配的存储单元释放并重新后要将这些变量、数组分配的存储单元释放并重新 分配另做它用。下次再调用这个子程序时,上次调分配另做它用。下次再调用这个子程序时,上次调 用的变量、数组的值已不存在。可以使用用的变量
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年甘肃省酒泉市博物馆招聘工作人员备考题库附答案详解(培优b卷)
- 中国中煤能源集团有限公司2026届高校毕业生春季招聘备考题库附答案详解(综合卷)
- 2026福建漳州港务集团有限公司应届毕业生春季招聘6人备考题库含答案详解ab卷
- 2026海南海口市北京师范大学海口附属学校招聘42人备考题库及1套完整答案详解
- 2026新疆克州柔性引进紧缺人才招募82人备考题库含答案详解
- 2026吉林四平市事业单位招聘(含专项招聘高校毕业生)25人备考题库(2号)及1套参考答案详解
- 2026湖北咸宁市消防救援支队招录政府专职消防员、消防文员70人备考题库附参考答案详解(黄金题型)
- 2026北京联合大学招聘45人备考题库及答案详解【必刷】
- 2026江苏扬州大学招聘专职辅导员(硕士、博士)27人备考题库及答案详解【典优】
- 2026四川绵阳市河湖保护中心招聘5人备考题库带答案详解(b卷)
- 黑龙江哈尔滨德强学校2025-2026学年度六年级(五四制)下学期阶段学情调研语文试题(含答案)
- 2026年温州市瓯海区专职社区工作者公开招聘6人笔试参考试题及答案解析
- 医养结合模式下的老年护理策略
- 2026年社会工作者初级真题及答案
- 铁道概论(高职)PPT完整全套教学课件
- 08D800-7 民用建筑电气设计与施工-室外布线
- 车辆技术档案范本(一车一档)
- 0电连接安装施工作业指导书
- FZ/T 73072-2022矿工袜
- GB/T 15242.1-1994液压缸活塞和活塞杆动密封装置用同轴密封件尺寸系列和公差
- 友谊是什么(中文)
评论
0/150
提交评论