Fortran95实验指导 实验八 子程序

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验八 函数与子例行程序
子程序是FORTRAN95提供的重要功能之一,FORTRAN95允许用户自己定义子程序,允许用户通过子程序设计和编写程序。

在设计和编写一个复杂的程序时,通常需要使用科学的程序设计方法,如:结构化程序设计方法、模块化程序设计方法、面向对象程序设计方法等,子程序功能完全支持结构化和模块化程序设计方法,结构化和模块化程序设计方法可通过子程序得到应用。

使用子程序可提高程序的可读性、可理解性、可维护性和可修改性,是编写高质量、高水平、高效率程序的有效手段。

子程序分内部子程序和外部子程序。

内部子程序是包含在程序单元CONTAINS 结构中的子程序,只有定义它们的程序单元才能调用执行它们。

内部子程序包括函数子程序和子例行程序两类,通常将函数子程序简称为函数,子例行程序简称为子程序。

本次实验是学习和掌握子程序的一次系统实验活动。

通过本次实验,能够熟练使用语句函数、内部子程序、外部子程序设计和编写程序,求解比较复杂的实际问题。

一、实验目的
1.
了解函数的有关基本概念,如:函数名称、函数自变量、函数调用、函数表达式等。

2.
掌握语句函数定义、调用、参数的基本内容和使用规则。

3.
掌握使用语句函数设计和编写程序的方法。

4. 了解内部子程序的有关基本概念,如:定义、调用、形式参数、实在参数、参数传递关系等。

5. 掌握内部子程序定义、调用、形式参数、实在参数、参数传递的基本内容和使用规则。

6. 掌握结构化程序设计方法。

7. 掌握使用内部子程序设计和编写程序的方法。

8. 了解递归概念,掌握递归问题的求解方法。

9. 掌握递归子程序定义、调用、参数传递关系的基本内容和使用规则。

10. 了解外部子程序概念,掌握并行、协调、合作编写大型复杂程序的方法。

11. 掌握外部子程序定义、调用、参数传递关系的基本内容和使用规则。

12. 掌握使用递归和外部子程序设计和编写程序的方法
二、实验内容1
1、问题描述
在解决某工程计算问题时,遇到下列函数:
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 MAIN
y(x)=1+2*x+x**2
f(x)= __________________
p(x)=__________________
q(x)= __________________
DO x=0.1,0.3,0.1
yx=y(x)
fx=f(x)
px=____
qx=q(x)
PRINT*,'x=',x
PRINT*,'y(x)=',yx
PRINT*, _________
______,'p(x)=',px
PRINT*, 'q(x)=',qx
_________
END
4、实验要求
●分析问题,理解算法,编写程序,将程序填写正确完整。

●函数计算必须使用语句函数实现。

●在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 MAIN
y(x)=1+2*x+x**2
f(x)= __________________
p(x)=__________________
q(x)= __________________
REAL,DIMENSION(____)::yx,fx,px,qx
FORALL(____)
yx(i)=y(0.1*i)
fx(i)=f(0.1*i)
__________
qx(i)=q(0.1*i)
____________________
DO I=1,3
PRINT*,'x=',0.1*I
PRINT*,'y(x)=',yx(I)
PRINT*, _________
______,'p(x)=',px(I)
PRINT*, 'q(x)=',qx(I)
ENDDO
END
三、实验内容2
1、问题描述
已知二项式公式如下:
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 MAIN
INTEGER n,r,p
PRINT'(A\)','请输入二项式阶数n:'
READ*,n
PRINT'(I2,A\)',n,'二项式系数有:'
DO r=0,n
p=_________
PRINT '(I4,2X\)',p
ENDDO
PRINT*
CONTAINS
!计算阶乘函数
FUNCTION fact(n)
INTEGER fact,n
fact=1
DO i=1,n
fact=_________
ENDDO
_________
!计算任意一个二项式系数函数
_________cnr(n,r)
INTEGER cnr,n,r
cnr=fact(n)/( _________)
END FUNCTION
END
4、实验要求
●分析问题,分解任务,设计算法,理解程序,将程序填写完整。

●阶乘和二项式系数计算要求使用内部函数子程序实现。

●输入输出数据采用有格式输入输出,使输入输出数据规范、醒目、简洁。

●在工作区:shiyan08内创建新项目:xm82。

●在项目xm82内创建源程序文件:xm82.f90,同时在文件中编辑输入程序。

●在项目xm82内编译、构建、运行、调试程序。

●将输出结果以注释形式编辑输入到源程序文件xm82.f90末尾。

●使用递归子程序改写阶乘计算程序。

5、实验步骤
●分析问题,设计算法,编写程序。

●启动软件开发环境Microsoft Developer Studio。

●在工作区shiyan08内创建新项目:xm82。

●在项目xm82内创建源程序文件xm82.f90,编辑输入源程序文本。

●编译、构建、运行、调试程序,得到输出结果。

●输出结果以注释形式编辑输入到源程序文件末尾。

●在工作区shiyan08内创建新项目:xm821,在新项目内创建源程序文件xm821.f90,
在文件中输入已改写程序。

编译、构建、运行、调试程序,获得输出结果。

四、实验内容3
1、问题描述
已知两个正整数数列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 main
PARAMETER(max=50)
INTEGER A(n),B(max),n,m
PRINT '(A\)','请输入A数列数据个数n:'
READ*,n
PRINT '(A,I2,A)','请输入A数列',n,'个数据:'
READ*,A(i),i=1,n
PRINT '(A\)','请输入B数列数据个数m:'
READ*,m
PRINT '(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 数列数据:'
DO
IF(A(i)/=-1) PRINT '(I3,2x\)',A(i)
END DO
PRINT*
CONTAINS
!数列内容删除
SUBROUTINE del(A,B,n,m)
INTEGER A(n),B(m),n,m,i,j
DO i=1,n
DO j=1,m
IF(A(i)>B(j)) A(i)=-1
END IF
END DO
END FUNCTION
END
4、实验要求

分析问题,分解任务,理解算法和程序,查找并改正程序错误,得到正确程序。


在工作区shiyan08内创建新项目:xm83。


在项目xm83内创建源程序文件:xm83.f90,同时在文件中编辑输入程序。

● 在项目xm83内编译、构建、运行、调试程序。

输入自行确定的A 数列和B 数列数据,得到运行结果。

● 将输入数据和输出结果以注释形式编辑输入到源程序文件xm83.f90末尾。

5、实验步骤

分析问题,分解任务,理解算法和程序,查找并改正程序错误,得到正确程序。


在工作区shiyan08内创建新项目:xm83。


在项目xm83内创建源程序文件:xm83.f90,同时在文件中编辑输入程序。

● 在项目xm83内编译、构建、运行、调试程序。

输入自行确定的A 数列和B 数列数据,得到运行结果。

● 将输入数据和输出结果以注释形式编辑输入到源程序文件xm83.f90末尾。

五、实验内容4
1、问题描述
已知:
(,)(1)21x f x n x n x
n n x
x =
+
-+-+
++
计算当x=2.85,n=15时的函数值。

使用递归函数求解该问题。

编写程序实现之。

x 和n 的值从键盘输入。

2、算法设计
函数f 可用以下递推公式描述。

11(,) 1(,1)
x n x f x n x n n f x n ⎧=⎪+⎪=⎨⎪>+-⎪⎩ 根据递推公式可知,该问题是一个递推问题,可采用递归函数实现。

求解算法比较简单,采用选择结构就可实现。

学生自行设计算法,绘制流程图。

3、程序编写
设计和编写程序如下(不完整,请在下划线空白处填充正确内容):
!班级:???
!姓名:???
!日期:???
!主程序
PROGRAM MAIN
INTEGER n
REAL x,y
PRINT*,'请输入实数x 和整数n(n ≥1):'
_________*,x,n
y=_________
PRINT 100,x,n,y
100 FORMA T(1X,'f(',F5.2,',',I2,')=',f10.6)
CONTAINS
_________ FUNCTION f(x,n)
REAL f,x
INTEGER n
IF(n==1) THEN
f=_______
ELSE IF(n>1) THEN
f=x/(n+_________)
ELSE
PRINT*,'n 值不符合n ≥1要求.'
END IF
END FUNCTION
END
4、实验要求

分析问题,理解递推公式、算法、程序和递归函数,将程序填写完整。


函数计算使用递归函数子程序实现。


输入输出数据采用有格式输入输出,使输入输出数据规范、醒目、简洁。


在工作区:shiyan08内创建新项目xm84。


在项目xm84内创建源程序文件:xm84.f90,同时在文件中编辑输入程序。


在项目xm84内编译、构建、运行、调试程序。

● 将输出结果以注释形式编辑输入到源程序文件xm84.f90末尾。

5、实验步骤
●分析问题,理解递推公式、算法、程序和递归函数,将程序填写完整。

●在工作区:shiyan08内创建新项目xm84。

●在项目xm84内创建源程序文件:xm84.f90,同时在文件中编辑输入程序。

●在项目xm84内编译、构建、运行、调试程序,输入x和n的值:2.85,15,得到输
出结果。

●输出结果以注释形式编辑输入到源程序文件末尾。

六、实验内容5
1、问题描述
已知5×5矩阵A:
1240201811 2517503045 2416145415 4820103828 5219283542⎛⎫ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪⎝⎭
按以下要求完成操作:
1)从键盘输入矩阵数据;
2)从屏幕输出矩阵数据;
3)将第2行与第4行交换;
4)从屏幕输出交换后矩阵数据;
5)求矩阵中绝对值最小元素值,及所在行号和列号;
6)用绝对值最小元素值与所在行、列每个元素相加;
7)从屏幕输出相加后矩阵数据;
8)结束
对于矩阵输入、矩阵输出、矩阵元素交换、求矩阵绝对值最小元素值、绝对值最小元素值与所在行列元素相加五类操作,使用外部子例行程序实现。

要求外部子例行程序与主程序单元分别保存在不同的源程序文件中。

编写程序实现之。

2、算法设计
主程序算法类似于问题描述中给出的操作要求和操作顺序。

分析问题,学生自行设计主程序算法和绘制主程序流程图。

五类操作分别通过5个外部子程序input(A,m,n)、output(A,m,n)、exchange(A,m,n,i1,i2)、find(A,m,n,minval,min_i,imn_j)和add(A,m,n,minval,min_i,min_j)实现。

学生自行设计五个外部子程序求解算法,绘制流程图。

A表示二维矩阵,m和n表示矩阵的行数和列数,i1和i2表示要交换的两个行号,minval、min_i和min_j分别表示绝对值最小值和所在的行号、列号。

3、程序编写
根据算法设计和编写主程序程序如下:
!班级:???
!姓名:???
!日期:???
!主程序
PROGRAM MAIN
EXTERNAL input,output,exchange,find,add
PARAMETER(m=5,n=5)
INTEGER A(m,n),i,j,minval,min_i,min_j
CALL input(A,m,n)
CALL output(A,m,n)
CALL exchange(A,m,n,2,4)
CALL output(A,m,n)
CALL find(A,m,n,minval,min_i,min_j)
CALL add(A,m,n,minval,min_i,min_j)
END
根据矩阵输入子例行程序input算法,设计和编写外部子程序如下:
!矩阵输入外部子例行程序
SUBROUTINE input(A,m,n)
INTEGER A(m,n),m,n,i,j
PRINT '(A,I1,A,I1,A)','请输入',m,'*',n,'矩阵数据:'
READ*,((A(i,j),j=1,n),i=1,m)
END SUBROUTINE
根据矩阵元素行交换子例行程序exchange算法,设计和编写外部子程序如下:
!矩阵元素行交换外部子例行程序
SUBROUTINE exchange(A,m,n,i1,i2)
INTEGER A(m,n),m,n,i1,i2,j,t
DO j=1,n
t=A(i1,j);A(i1,j)=A(i2,j);A(i2,j)=t
END DO
END SUBROUTINE
根据矩阵绝对值最小元素行、列元素累加子例行程序add算法,设计和编写外部子程序如下:
!矩阵元素累加外部子例行程序
SUBROUTINE add(A,m,n,minval,min_i,min_j)
INTEGER A(m,n),m,n,minval,min_i,min_j,i,j,sum
sum=0
DO i=1,m
sum=sum+A(i,min_j)
END DO
DO j=1,n
sum=sum+A(min_i,j)
END DO
sum=sum-minval
PRINT '('绝对值最小元素值与所在行、列每个元素的和为:',I4)',sum
END SUBROUTINE
对于output和find子例行程序,学生可根据算法自行编写。

4、实验要求
●分析问题,理解主程序算法以及主程序和给定的外部子例行程序,编写其他外部子例
行程序。

●在工作区shiyan08内创建新项目:xm85。

●在项目xm85内创建源程序文件:xm85.f90,同时在文件中编辑输入程序。

●在项目xm85内编译、构建、运行、调试程序。

●将输入数据和输出结果以注释形式编辑输入到源程序文件xm85.f90末尾。

5、实验步骤
●分析问题,理解主程序算法以及主程序和给定的外部子例行程序,编写其他外部子例
行程序。

●在工作区shiyan08内创建新项目:xm85。

●在项目xm85内创建源程序文件:xm85.f90,同时在文件中编辑输入程序。

●在项目xm85内编译、构建、运行、调试程序。

输入问题描述中给出的矩阵数据,得
到输出结果。

●将输出结果以注释形式编辑输入到源程序文件末尾。

七、实验小结
本次实验主要涉及语句函数、内部子程序、递归和外部子程序的应用,实验时要注意语句函数、内部子程序、递归和外部子程序的定义、调用和参数传递。

通过本次实验,学生对语句函数、内部子程序、递归和外部子程序有深入了解,能够熟练使用语句函数、内部子程序、递归和外部子程序设计和编写程序。

八、课外练习
利用课后业余时间,完成以下练习,以巩固所学知识。

求解以下问题:
已知:
(,)
f x n=
计算当x=2.85,3.25,4.12,5.21,6.34,n=11,12,13,14,15时的25个函数值。

使用递归函数求解该问题。

编写程序实现之。

x值从键盘输入,25个函数值以每行5个按有格式输出方式输出(F10.5格式),
解题要求:
●对问题进行详细分析,设计算法,绘制框图,编写程序。

●在工作区lianxi08内创建新项目:lx08。

●在项目lx08内创建源程序文件:lx08.f90,同时在文件中编辑输入源程序文本。

●在项目lx08内编译、构建、运行、调试程序。

●输入数据,得到输出结果,将输入输出数据以注释形式编辑输入到源程序文件末尾。

相关文档
最新文档