实验八 函数与子例行程序子程序是FORTRAN95提供的重要功能之一,FORTRAN95允许用户自己定义子程序,允许用户通过子程序设计和编写程序。
在设计和编写一个复杂的程序时,通常需要使用科学的程序设计方法,如:结构化程序设计方法、模块化程序设计方法、面向对象程序设计方法等,子程序功能完全支持结构化和模块化程序设计方法,结构化和模块化程序设计方法可通过子程序得到应用。
使用子程序可提高程序的可读性、可理解性、可维护性和可修改性,是编写高质量、高水平、高效率程序的有效手段。
子程序分内部子程序和外部子程序。
内部子程序是包含在程序单元CONTAINS 结构中的子程序,只有定义它们的程序单元才能调用执行它们。
内部子程序包括函数子程序和子例行程序两类,通常将函数子程序简称为函数,子例行程序简称为子程序。
本次实验是学习和掌握子程序的一次系统实验活动。
通过本次实验,能够熟练使用语句函数、内部子程序、外部子程序设计和编写程序,求解比较复杂的实际问题。
一、实验目的1.了解函数的有关基本概念,如:函数名称、函数自变量、函数调用、函数表达式等。
2.掌握语句函数定义、调用、参数的基本内容和使用规则。
3.掌握使用语句函数设计和编写程序的方法。
4. 了解内部子程序的有关基本概念,如:定义、调用、形式参数、实在参数、参数传递关系等。
5. 掌握内部子程序定义、调用、形式参数、实在参数、参数传递的基本内容和使用规则。
6. 掌握结构化程序设计方法。
7. 掌握使用内部子程序设计和编写程序的方法。
8. 了解递归概念,掌握递归问题的求解方法。
9. 掌握递归子程序定义、调用、参数传递关系的基本内容和使用规则。
10. 了解外部子程序概念,掌握并行、协调、合作编写大型复杂程序的方法。
11. 掌握外部子程序定义、调用、参数传递关系的基本内容和使用规则。
12. 掌握使用递归和外部子程序设计和编写程序的方法二、实验内容11、问题描述在解决某工程计算问题时,遇到下列函数:2()12y x x x =++2()f x =()p x =()q x =计算x=0.1,0.2,0.3时,上述函数的值,并输出。
使用语句函数编写程序实现之。
2、算法设计该问题求解算法比较简单,可使用顺序结构或循环结构实现。
根据分析,设计循环结构算法如下:算法:1)定义语句函数y(x),f(x),p(x),q(x)2)x=0.1;3)如果x>0.3,则转(7)执行;4)计算各函数值并输出;5)x=x+1;6)转(3)执行;7)结束3、程序编写设计和编写程序如下(不完整,请在下划线空白处填充正确内容):!班级:???!姓名:???!日期:???!语句函数应用PROGRAM MAINy(x)=1+2*x+x**2f(x)= __________________p(x)=__________________q(x)= __________________DO x=0.1,0.3,0.1yx=y(x)fx=f(x)px=____qx=q(x)PRINT*,'x=',xPRINT*,'y(x)=',yxPRINT*, _______________,'p(x)=',pxPRINT*, 'q(x)=',qx_________END4、实验要求●分析问题,理解算法,编写程序,将程序填写正确完整。
●函数计算必须使用语句函数实现。
●在D盘上创建新工作区:shiyan08和新项目:xm81。
●在项目xm81内创建源程序文件:xm81.f90,同时在文件中编辑输入程序。
●在项目xm81内编译、构建、运行、调试程序。
●将输出结果以注释形式编辑输入到源程序文件xm81.f90末尾。
●使用FORALL语句改写程序,实现程序的并行处理,提高程序运行和处理速度。
5、实验步骤●分析问题,理解算法,编写程序。
●启动软件开发环境Microsoft Developer Studio 。
●在D 盘上创建新工作区:shiyan08。
●在工作区shiyan08内创建新项目:xm81。
●在项目xm81内创建源程序文件xm81.f90,编辑输入源程序文本。
●编译、构建、运行、调试程序,得到输出结果。
●输出结果以注释形式编辑输入到源程序文件末尾。
● 在工作区shiyan08内创建新项目:xm811,在新项目内创建源程序文件xm811.f90,在文件中编辑输入已改写程序。
编译、构建、运行、调试程序,获得输出结果。
使用FORALL 语句改写程序如下:PROGRAM MAINy(x)=1+2*x+x**2f(x)= __________________p(x)=__________________q(x)= __________________REAL,DIMENSION(____)::yx,fx,px,qxFORALL(____)yx(i)=y(0.1*i)fx(i)=f(0.1*i)__________qx(i)=q(0.1*i)____________________DO I=1,3PRINT*,'x=',0.1*IPRINT*,'y(x)=',yx(I)PRINT*, _______________,'p(x)=',px(I)PRINT*, 'q(x)=',qx(I)ENDDOEND三、实验内容21、问题描述已知二项式公式如下:011222()......n n n n r n r r n n n n n n n x y C x C x y C x y C x y C y ---+=++++++其中:r n C 为二项式系数,通过下面公式计算:! (0,1,2,...,)()!!r n n C r n n r r ==- 计算5()x y +的二项展开式系数,并输出。
通过内部函数子程序计算阶乘和二项式系数,编写程序实现之。
2、算法设计分析问题,进行任务分解,得到求解问题的分层结构图,如图8-1所示。
根据任务分解图,自行设计和编写主程序来求解总问题,分别设计和编写子程序来求解子问题。
根据子问题的具体内容,设计和编写子程序为函数。
图8-1 任务分解及分层结构图3、程序编写设计和编写程序如下(不完整,请在下划线空白处填充正确内容):!班级:???!姓名:???!日期:???!计算n阶所有二项式系数PROGRAM MAININTEGER n,r,pPRINT'(A\)','请输入二项式阶数n:'READ*,nPRINT'(I2,A\)',n,'二项式系数有:'DO r=0,np=_________PRINT '(I4,2X\)',pENDDOPRINT*CONTAINS!计算阶乘函数FUNCTION fact(n)INTEGER fact,nfact=1DO i=1,nfact=_________ENDDO_________!计算任意一个二项式系数函数_________cnr(n,r)INTEGER cnr,n,rcnr=fact(n)/( _________)END FUNCTIONEND4、实验要求●分析问题,分解任务,设计算法,理解程序,将程序填写完整。
●阶乘和二项式系数计算要求使用内部函数子程序实现。
●输入输出数据采用有格式输入输出,使输入输出数据规范、醒目、简洁。
●在工作区:shiyan08内创建新项目:xm82。
●在项目xm82内创建源程序文件:xm82.f90,同时在文件中编辑输入程序。
●在项目xm82内编译、构建、运行、调试程序。
●将输出结果以注释形式编辑输入到源程序文件xm82.f90末尾。
●使用递归子程序改写阶乘计算程序。
5、实验步骤●分析问题,设计算法,编写程序。
●启动软件开发环境Microsoft Developer Studio。
●在工作区shiyan08内创建新项目:xm82。
●在项目xm82内创建源程序文件xm82.f90,编辑输入源程序文本。
●编译、构建、运行、调试程序,得到输出结果。
●输出结果以注释形式编辑输入到源程序文件末尾。
●在工作区shiyan08内创建新项目:xm821,在新项目内创建源程序文件xm821.f90,在文件中输入已改写程序。
编译、构建、运行、调试程序,获得输出结果。
四、实验内容31、问题描述已知两个正整数数列A和B,每个数列数据个数不定(最多50个)。
从A数列中删除B数列中出现的数,输出删除前后数列数据。
通过内部子例行程序完成删除操作。
编写程序实现之。
2、算法设计分析问题,进行任务分解,得到求解问题的分层结构图,如图8-2所示。
根据图8-2,设计和编写主程序求解总问题,设计和编写子例行程序求解子问题。
图8-2 任务分解及分层结构图根据分析,设计求解总问题算法如下:(1)输入A数列和B数列数据(数据个数不定,最多50个)。
(2)输出删除前的A数列和B数列数据。
(3)从A数列中删除B数列中出现的数据。
(4)输出删除后A数列数据。
(5)结束。
根据分析,设计求解子问题算法,绘制流程图如图8-3所示。
n、m分别表示A、B数列数据个数。
因为数据均为正整数,规定-1为删除标志,要删除的数据ai赋值为-1即可。
图8-3 流程图3、程序编写使用内部子例行程序设计和编写程序如下(含有若干错误,请查找并改正错误):!班级:???!姓名:???!日期:???!从A数列中删除B数列中出现的数据PROGRAM mainPARAMETER(max=50)INTEGER A(n),B(max),n,mPRINT '(A\)','请输入A数列数据个数n:'READ*,nPRINT '(A,I2,A)','请输入A数列',n,'个数据:'READ*,A(i),i=1,nPRINT '(A\)','请输入B数列数据个数m:'READ*,mPRINT '(A,I2,A)','请输入B数列',m,'个数据:',(B(i),i=1,m)PRINT*,'删除前A数列数据:'PRINT '(1X,<n>(I3,2X))',(A(i),i=1,n)PRINT*,'删除前B数列数据:'PRINT '(1X,<m>(I3,2X))',(B(i),i=1,m)CALL del(A,B)PRINT*,'删除后A 数列数据:'DOIF(A(i)/=-1) PRINT '(I3,2x\)',A(i)END DOPRINT*CONTAINS!数列内容删除SUBROUTINE del(A,B,n,m)INTEGER A(n),B(m),n,m,i,jDO i=1,nDO j=1,mIF(A(i)>B(j)) A(i)=-1END IFEND DOEND FUNCTIONEND4、实验要求●分析问题,分解任务,理解算法和程序,查找并改正程序错误,得到正确程序。