




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、2022-3-241实际中的程序由若干个程序单元组成,但是有且只有一个主实际中的程序由若干个程序单元组成,但是有且只有一个主程序(程序(Program mainProgram main),其它的都是子程序),其它的都是子程序。子程序是构造。子程序是构造大型实用程序的有效工具,设计程序要善于利用子程序,因大型实用程序的有效工具,设计程序要善于利用子程序,因此,本讲学习此,本讲学习Fortran中的子程序:中的子程序:函数子程序函数子程序和和子例行程序子例行程序。此外,在此外,在Fortran中还有一种类似与函数子程序的中还有一种类似与函数子程序的语句函数语句函数。2222),(yxyxyxf就是
2、用一条语句定义一个函数,比如:就是用一条语句定义一个函数,比如:就可以用就可以用FortranFortran的的一条语句写出来一条语句写出来:)2*2*(*2*),(yxsqrtyxyxf(1 1)语句函数名)语句函数名:其取名及数据类型与变量相同。:其取名及数据类型与变量相同。2022-3-242exxxxfn),(321其中:其中:f 称为称为函数名函数名,x1、x2、xn称为称为虚参虚参,e是是关于虚参关于虚参的一个有效表达式的一个有效表达式。又比如:又比如:Double precision FFDouble precision FF FF(x,y)=x FF(x,y)=x* * *2+
3、y2+y* * *22定义了一个定义了一个双精度型函数双精度型函数FFFF注意在同一程序单元中,语句函数名不能与某个变量同名。注意在同一程序单元中,语句函数名不能与某个变量同名。比如:比如:F(x,y)=xF(x,y)=x* * *2+y2+y* *yy定义了一个定义了一个实型函数实型函数F FNF(x,y)=xNF(x,y)=x* * *2+y2+y* *yy则定义了一个则定义了一个整型函数整型函数NFNF(3 3)语句函数表达式)语句函数表达式给出函数与参数之间的对应关系,可由虚参(必须包含所有的给出函数与参数之间的对应关系,可由虚参(必须包含所有的虚参)、常量、变量、数组、虚参)、常量、
4、变量、数组、FortranFortran的内部函数及在其前面的内部函数及在其前面说明了的语句函数。说明了的语句函数。2022-3-243(2 2)语句函数的虚参)语句函数的虚参-即语句函数的即语句函数的1 1、称其为、称其为“”是因为其是因为其本身是没有值的本身是没有值的,只有在函数被,只有在函数被调用时才用实际意义(叫调用时才用实际意义(叫实参实参)代替;)代替;2 2、可以、可以按照普通变量对待虚参按照普通变量对待虚参,但是一个语句函数中虚参不,但是一个语句函数中虚参不能同名,但不同语句函数中虚参可以同名,虚参也可以和程能同名,但不同语句函数中虚参可以同名,虚参也可以和程序中的变量同名;序
5、中的变量同名;3 3、虚参的类型说明与变量的类型说明方法与规则相同虚参的类型说明与变量的类型说明方法与规则相同,而且,而且对与虚参同名变量同时有效;对与虚参同名变量同时有效;4 4、当存在、当存在多个虚参时,之间用多个虚参时,之间用“,”,”分隔分隔,如果,如果没有虚参没有虚参则则函数名后的函数名后的括号括号是是的。的。2022-3-2441 1、只有当函数关系简单到,可以用一条语句描述函数与参数只有当函数关系简单到,可以用一条语句描述函数与参数的对应关系时,才能使用语句函数;的对应关系时,才能使用语句函数;2 2、语句函数是语句函数是,要放在一个程序单元的所有其它,要放在一个程序单元的所有其
6、它说明语句之后,并放在所有可执行语句之前;说明语句之后,并放在所有可执行语句之前;3 3、语句函数只有在本程序单元中才有意义语句函数只有在本程序单元中才有意义,即不能使用其它,即不能使用其它程序单元中的语句函数;程序单元中的语句函数;此外,还需此外,还需的是:的是:4 4、语句函数中的虚参语句函数中的虚参,不能是常量、数组元素和,不能是常量、数组元素和内部函数等;内部函数等;5 5、语句函数是有类型的,因此语句函数表达式的类型一定要语句函数是有类型的,因此语句函数表达式的类型一定要与其函数名同类型。与其函数名同类型。语句函数一经定义,就可以语句函数一经定义,就可以在同一程序单元中调用在同一程序
7、单元中调用它,调用它,调用的方法与内部函数相同,即:的方法与内部函数相同,即:函数名(实参表)函数名(实参表)2022-3-245需要需要注意下面注意下面2 2个问题个问题:1 1、调用时可以使用常量、变量、内部函数及其表达式作为实、调用时可以使用常量、变量、内部函数及其表达式作为实参代替对应的虚参位置,但要保证实参和虚参具有完全相同参代替对应的虚参位置,但要保证实参和虚参具有完全相同的类型,并且实参是可以计算值的(即调用前实参中包含的的类型,并且实参是可以计算值的(即调用前实参中包含的变量全部已经赋值);变量全部已经赋值);2 2、。比如:比如:integer x,finteger x,fp
8、rintprint* *,f(-1),f(0),f(1),f(-1),f(0),f(1)EndEnd运行结果为:运行结果为:8 6 168 6 162022-3-246语句函数的不足是必须要在一条语句中完成对函数的定义,语句函数的不足是必须要在一条语句中完成对函数的定义,因此只能用于较简单的函数,对于复杂的函数关系、无法用因此只能用于较简单的函数,对于复杂的函数关系、无法用一条语句完成时,需要用到本节的一条语句完成时,需要用到本节的函数子程序函数子程序。函数子程序是以函数子程序是以FunctionFunction语句开头,并以语句开头,并以EndEnd语句结束的一个语句结束的一个程序段程序段,
9、其可以独立自成一个程序文件,也可以和调用它的,其可以独立自成一个程序文件,也可以和调用它的程序单元合并成一个程序文件。其定义的一般格式为:程序单元合并成一个程序文件。其定义的一般格式为: 类型说明符类型说明符 Function Function 函数名(虚参表)函数名(虚参表)endend2022-3-247其中,类型说明用于说明函数名的类型;函数名的命名方法其中,类型说明用于说明函数名的类型;函数名的命名方法与变量名相同;虚参可以是简单变量和数组变量,但不能是与变量名相同;虚参可以是简单变量和数组变量,但不能是常数、数组元素、表达式。常数、数组元素、表达式。30203140100321001
10、211nnnnSnSnS比如:求比如:求functionfunction sm(m,n,l) sm(m,n,l)sm=0sm=0do i=m,ndo i=m,n if(l0)then if(l0)then sm=sm+i sm=sm+i* * *l l else else sm=sm+(1.0 sm=sm+(1.0* *i)i)* * *l l end if end ifend doend doendendprogram mainprogram mainwrite(write(* *, ,* *)s1=,sm(1,100,2)s1=,sm(1,100,2)write(write(* *, ,*
11、 *)s2=,sm(100,140,3)s2=,sm(100,140,3)write(write(* *, ,* *)s3=,sm(20,50,-1)s3=,sm(20,50,-1)endend程序的运行结果为:程序的运行结果为:S1=338350.000000S1=338350.000000S2=7.291440E+07S2=7.291440E+07S3=9.514656E-01S3=9.514656E-012022-3-248程序说明程序说明:1 1、整个程序由主程序和、整个程序由主程序和1 1个函数子程序组成,二者的位置不个函数子程序组成,二者的位置不分先后,因为程序执行时总是从主程序开
12、始的;分先后,因为程序执行时总是从主程序开始的;2 2、函数子程序、函数子程序Function SM(m,n,l)Function SM(m,n,l)中,缺省类型说明时,则中,缺省类型说明时,则函数函数SMSM及其虚参标量及其虚参标量m m、n n、l l的类型遵守的类型遵守I IN N规则;规则;3 3、主程序中的第、主程序中的第2 24 4语句都要输出语句都要输出SMSM的值,其调用了函数子的值,其调用了函数子程序程序SMSM。函数子程序函数子程序的定义还应注意以下问题:的定义还应注意以下问题:1 1、函数值的类型说明方法可使用:、函数值的类型说明方法可使用:Integer Functio
13、n f(x1,x2,xn)Integer Function f(x1,x2,xn)函数体函数体endendFunction f(x1,x2,xn)Function f(x1,x2,xn)Integer fInteger f函数体函数体endend等等 价价如果没有这样的显式说明,则按照如果没有这样的显式说明,则按照I-NI-N规则。规则。2022-3-2492 2、函数不能有同名虚参。而、函数不能有同名虚参。而虚参的类型可以在函数体中说虚参的类型可以在函数体中说明明,没有说明则服从,没有说明则服从I-NI-N规则;规则;3 3、在函数体中、在函数体中至少要有一个语句给函数名赋值至少要有一个语句
14、给函数名赋值,这种赋值,这种赋值语句的格式为:语句的格式为:函数名表达式函数名表达式,错误地写成:,错误地写成:定义函数子程序的目的是为了调用,在定义函数子程序的目的是为了调用,在FortranFortran中不仅主程中不仅主程序可以调用函数子程序,而且函数子程序也可调用其它的函序可以调用函数子程序,而且函数子程序也可调用其它的函数子程序,甚至调用本身(叫递归调用)。常把调用程序叫数子程序,甚至调用本身(叫递归调用)。常把调用程序叫,而被调用的函数子程序叫,而被调用的函数子程序叫。调用函数子程序的方法与调用内部函数及语句函数基本相同:调用函数子程序的方法与调用内部函数及语句函数基本相同:(1
15、1)调用时应该用实参(可以是常量、变量、表达式等)代)调用时应该用实参(可以是常量、变量、表达式等)代替函数子程序中的虚参,实参和虚参的类型要相同;替函数子程序中的虚参,实参和虚参的类型要相同;2022-3-2410(2 2)调用程序单元中的变量不能与函数子程序同名。函数值)调用程序单元中的变量不能与函数子程序同名。函数值的类型由函数定义程序单元决定,与调用程序单元无关;的类型由函数定义程序单元决定,与调用程序单元无关;(3 3)当函数名的类型不满足)当函数名的类型不满足I-NI-N规则时,在调用程序单元中规则时,在调用程序单元中要对函数名的类型给出说明;要对函数名的类型给出说明;(4 4)不
16、能调用一个没有定义的函数子程序,这一点与内部函)不能调用一个没有定义的函数子程序,这一点与内部函数是不同的。数是不同的。问题问题:用函数子程序的方法设计一个程序,求:用函数子程序的方法设计一个程序,求5050100100间所有间所有的素数及其和。的素数及其和。分析分析:(1 1)函数子程序)函数子程序susu(n)susu(n)负责判断负责判断n n是否为素数,定义为:是否为素数,定义为:不是素数当是素数时当nnnsusu0, 1)(2022-3-2411(2 2)主程序调用)主程序调用susu(n)susu(n),并把素数,并把素数n n输出,以及对素数求和输出,以及对素数求和并输出。并输出
17、。!函数子程序!函数子程序function susu(n)function susu(n)integer susuinteger susususu=0susu=0do i=2,n-1do i=2,n-1 if(mod(n,i)= =0) return if(mod(n,i)= =0) returnend doend dosusu=1susu=1endend!主程序!主程序program mainprogram maininteger susuinteger susus=0s=0do i=50,100do i=50,100 if(susu(i)= =1)then if(susu(i)= =1)t
18、hen s=s+i s=s+i write( write(* *, ,* *) i) i end if end if end doend dowrite(write(* *, ,* *)s=,s)s=,sendend2022-3-2412除 了 函 数 子 程 序 , 还 有 一 种 子 程 序 叫 做除 了 函 数 子 程 序 , 还 有 一 种 子 程 序 叫 做 子 例 行 程 序子 例 行 程 序(subroutinesubroutine),),和函数子程序一样都是子程序和函数子程序一样都是子程序-,但是也存在不同:函数子程序的名字代表一,但是也存在不同:函数子程序的名字代表一个值、有
19、类型,而子例行程序的名字不代表一个值、不存在个值、有类型,而子例行程序的名字不代表一个值、不存在类型的问题。此外,功能和使用上,二者可互相取代。类型的问题。此外,功能和使用上,二者可互相取代。子例行程序是以子例行程序是以SubroutineSubroutine语句开头,并以语句开头,并以EndEnd语句结束的一语句结束的一个个程序段程序段,其定义的一般格式为:,其定义的一般格式为:Subroutine Subroutine 子例行程序名(虚参表)子例行程序名(虚参表)endend2022-3-2413注意:注意:(1 1)子例行程序的命名方法与变量相同。虚参由变量、数组)子例行程序的命名方法与
20、变量相同。虚参由变量、数组名(不能是数组元素,常数、表达式)充当,当有多个虚参名(不能是数组元素,常数、表达式)充当,当有多个虚参时,之间用时,之间用“,”,”分隔,分隔,;(2 2)子例行程序的设计方法与函数子程序相同,但不能有对)子例行程序的设计方法与函数子程序相同,但不能有对子例行程序名的赋值语句(子例行程序名的赋值语句()。)。(1 1)其实参的类型与函数子程序相同,但和函数子程序调用)其实参的类型与函数子程序相同,但和函数子程序调用不同的是,子例行程序的不同的是,子例行程序的调用是一个独立的语句调用是一个独立的语句;(2 2)子例行程序调用的其它事项与函数子程序的调用相同。)子例行程
21、序调用的其它事项与函数子程序的调用相同。子例行程序的调用格式为:子例行程序的调用格式为:CallCall 子例行程序名(实参表)子例行程序名(实参表)2022-3-2414(3 3)子例行程序与调用它的主程序的位置先后顺序也是无关)子例行程序与调用它的主程序的位置先后顺序也是无关紧要的,因为程序总是先执行主程序;紧要的,因为程序总是先执行主程序;(4 4)子例行程序和函数子程序在使用上可以相互代替,但是)子例行程序和函数子程序在使用上可以相互代替,但是要求要求子程序有返回值时,宜使用函数子程序子程序有返回值时,宜使用函数子程序;而;而子程序没有返子程序没有返回值时回值时,最好用子例行程序。,最
22、好用子例行程序。设计一个子例行程序,求任意矩阵的转置矩阵设计一个子例行程序,求任意矩阵的转置矩阵: : SubroutineSubroutine trantran( (A A, ,B B,m,n),m,n) Integer A(m,n),B(n,m),m,n Integer A(m,n),B(n,m),m,n Do i=1,m Do i=1,m do j=1,n do j=1,n B(j,i)=A(i,j) B(j,i)=A(i,j) end do end do End do End do end end本讲详细介绍了本讲详细介绍了Fortran90Fortran90中的两种子程序中的两种子程
23、序-函数子程序和子函数子程序和子例行程序,以及语句函数。作为应用,用子程序的方法编程解例行程序,以及语句函数。作为应用,用子程序的方法编程解决下面决下面3 3个问题并上机运行:个问题并上机运行:问题问题2 2:把素数依次从低位去掉:把素数依次从低位去掉1 1位,位,2 2为,为,所得的各数仍,所得的各数仍都是素数的数叫超级素数,比如都是素数的数叫超级素数,比如239.239.试求试求100,9999100,9999内,超内,超级素数的个数、所有超级素数之和、最大的超级素数。级素数的个数、所有超级素数之和、最大的超级素数。【要要求用求用函数子程序函数子程序】问题问题1 1:用:用NewtowNe
24、wtow迭代法求迭代法求 的的一个根。一个根。【要求用要求用语句函数语句函数】034567)(234xxxxxf问题问题3 3:亲密数对定义为:正整数:亲密数对定义为:正整数ABAB,但,但A A不含本身的所有不含本身的所有因子之和等于因子之和等于B B,而,而B B不含自身的所有因子之和等于不含自身的所有因子之和等于A A,求,求30003000以内所有的亲密数对。以内所有的亲密数对。【要求用要求用子例行程序子例行程序】2022-3-2415program newtonprogram newtonf(x)=7f(x)=7* *x x* * *4+64+6* *x x* * *3-53-5*
25、*x x* * *2+42+4* *x+3x+3df(x)=28df(x)=28* *x x* * *3+183+18* *x x* * *2-102-10* *x+4x+4readread* *,x0,e,x0,e ! !x0=-1.0,e=0.0001x0=-1.0,e=0.0001x1=x0 x1=x0 x2=x1-f(x1)/df(x1)x2=x1-f(x1)/df(x1)do while(abs(x1-x2)e)do while(abs(x1-x2)e) x1=x2 x1=x2 x2=x1-f(x1)/df(x1) x2=x1-f(x1)/df(x1)end doend doprin
26、tprint* *,x1,f(x1),x1,f(x1)endend分析:分析:牛顿迭代公式为:牛顿迭代公式为:首先要给个迭代初值首先要给个迭代初值x x0 0,代入公式的右边计算代入公式的右边计算x x1 1,再把再把x x1 1代入计算出代入计算出x x2 2,当第当第n n次和第次和第(n+1)(n+1)次计算次计算结果差不多时(在规定的结果差不多时(在规定的精度内),则计算结果就精度内),则计算结果就是近似根。是近似根。)()(1nnnnxfxfxx2022-3-2416!函数子程序!函数子程序logical functionlogical function su(n) su(n)su=.false.su=.false.i=2i=
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025甘肃嘉峪关市供销合作社招聘公益性岗位人员2人备考练习试题及答案解析
- 2025国铁投资发展有限公司第一批次招聘4人(天津)备考考试题库附答案解析
- 2025云南保山市龙陵县民政局招聘龙陵县殡仪馆临时人员15人备考考试题库附答案解析
- 2025广东阳江市阳西县补充招聘森林消防应急队员7人备考练习题库及答案解析
- 2025年合肥市巢湖市大学生乡村医生专项计划招聘2名备考考试题库附答案解析
- 工厂安全培训教育总结课件
- 宇宙之谜揭秘
- 价格谈判机制优化-洞察及研究
- 心律失常导管消融研究-洞察及研究
- 区域创新管理制度
- 智能城市垃圾分类处理系统合同
- 乙酰丙酸论文
- 人教版 九年级历史上册 第一、二单元 单元测试卷(2024年秋)
- 偏瘫康复护理个案病例分析
- NBT 10643-2021 风电场用静止无功发生器技术要求与试验方法-PDF解密
- 铁路防雷及接地工程技术规范(TB 10180-2016)
- 饮品运输行业分析
- 胸痛的鉴别诊断和诊断流程课件
- 混料错料预防措施培训课件
- 白鹿原名著导读读书分享
- 医疗设备采购 投标技术方案 (技术方案)
评论
0/150
提交评论