fortran习题参考答案.docx
- 文档编号:6337333
- 上传时间:2023-01-05
- 格式:DOCX
- 页数:9
- 大小:81.75KB
fortran习题参考答案.docx
《fortran习题参考答案.docx》由会员分享,可在线阅读,更多相关《fortran习题参考答案.docx(9页珍藏版)》请在冰豆网上搜索。
fortran习题参考答案
工程分析程序设计上机作业(五)
模块化编程
上机目的:
掌握内部例程、主程序、外部例程、模块等功能的使用方法。
1、有一个六边形,求其面积。
为求面积,作了3条辅助线。
如图所示:
(提示,三角形面积=
,其中
,a、b、c为三个边长)。
要求用内部函数来计算每个三角形的面积。
programmain
implicitnone
real:
:
A(9)=(/10,30,16,13,21,14,20,36,28/)
integeri
reals
s=area(A(3),A(4),A(7))+area(A
(2),A(7),A(8))+&
area(A
(1),A(8),A(9))+area(A(5),A(6),A(9))
print*,'Theareais',s
contains
functionarea(x,y,z)
implicitnone
realx,y,z
realp,area
p=(x+y+z)/2
area=sqrt(p*(p-x)*(p-y)*(p-z))
endfunction
end
2、编写一个子例程子程序,SUM(S,T,N1,N2)。
把整型数N1到N2进行求和,并把求和的结果放置到S,把整型数N1到N2进行求积,并把求积的结果放置到T。
并用这个子程序来计算:
programmain
implicitnone
integerA(8)
integeri,b,c,d,e,f,g,m,n,y
b=0;d=0;g=1;n=1
doi=1,8
A(i)=i
enddo
callsum(b,c,1,4)
callsum(d,e,3,8)
callsum(f,g,3,6)
callsum(m,n,1,3)
y=b+d+g-n
print*,'y=(1+2+3+4)+(3+4+5+6+7+8)+(3*4*5*6)-(1*2*3)=',y
contains
subroutinesum(s,t,N1,N2)
integers,t,N1,N2,i
doi=N1,N2
s=s+A(i)
t=t*A(i)
enddo
endsubroutine
end
3、编写函数子程序GDC求两个数的最大公约数。
求最大公约数的算法如下:
把两个数中大的那个数作为被除数,两数相除得到一个余数。
把余数去除除数得到新一轮的余数。
不断重复这一过程直到余数为0,这时的除数就是两个数的最大公约数。
调用此函数,求1260,198,72三个数的最大公约数。
programmain
implicitnone
integera,b,c,m,n,temp
print*,'请输入三个数:
'
print*,'abc'
read*,a,b,c
if(a
temp=a
a=b
b=temp
endif
callGDC(a,b,m)
if(c temp=c c=m m=temp endif callGDC(m,c,n) print*,'最大公约数为',n contains subroutineGDC(x,y,z) integerx,y,z,k dowhile(mod(x,y)/=0) k=mod(x,y) x=y y=k enddo z=y endsubroutine end 4、编写一个模块程序,提供以下服务: 定义出常量、e。 定义出子程序,实现求和 、求阶乘n! 。 并在主程序中计算如下结果: 从键盘上输入整数n、实型数A、R、R0,求 (实型)和 (实型)。 modulemytask implicitnone real,parameter: : PI=3.1415926 real,parameter: : e=2.7182818 contains functionsub(n) integeri,n,sub sub=0 doi=1,n sub=sub+i*i enddo endfunctionsub functionfact(n) integeri,n realfact fact=1 doi=1,n fact=fact*i enddo endfunctionfact endmodulemytask programmain usemytask implicitnone integern realA,R,R0 realx,y print*,'请输入依次n,A,R,R0: ' read*,n,A,R,R0 x=fact(n)/sub(n) y=(A*n/(2*PI*R*R))*(R/R0)**n*e**(-(R/R0)**n) print*,'n! /∑n^2(i=1,n)=',x print*,'(A*n/(2*PI*R*R))*(R/R0)**n*e**(-(R/R0)**n)',y endprogram 5、编写外部函数,计算 的值,直到最后一项的绝对值小于10-6为止。 再编写主程序,从键盘读入x,调用该外部函数并输出sinx的计算结果。 注意不能用Fortran的标准函数SIN(X)。 programmain implicitnone realx,p externalsub print*,'请输入角度x: ' read*,x p=x/180*3.14 callsub(p) endprogram subroutinesub(k) implicitnone realk,y integeri y=0 i=1 dowhile(abs(k**i/(fact(i)))>1.0e-6) y=y+(-1)**((i-1)/2)*k**i/(fact(i)) i=i+2 enddo print*,'sin(x)=',y contains functionfact(m) integerm,j,fact fact=1 doj=1,m fact=fact*j enddo endfunctionfact endsubroutinesub 6、编写程序,用欧拉法数值求解一阶微分方程。 数值解法的基本思想: 用差分方程代替微分方程,然后在若干个离散点上逐点求解差分方程,得到各离散点x0,x1,x2,…等处函数 的近似值y0,y1,y2,…。 其中各离散点x0,x1,x2,…之间的距离称为步长h。 欧拉法的基本思想是,一阶微分 可用向前差分代替,即 。 带入微分方程,可得 因此, ,其中 。 当给定x0,y0和步长h后,即可按下面步骤求得数值解: 请按上述方法编写程序用Euler法求解微分方程 ,当x0=0时,y0=1.0。 取h=0.1,试求出当xi=0.1,0.2,0.3,0.4….,1.0时的yi值。 programmain implicitnone realx(0: 10) realy(0: 10) realp(0: 10) integer (2)i,j y(0)=1.0;x(0)=0.0 p(0)=f(x(0),y(0)) doi=1,10 x(i)=x(i-1)+0.1 enddo doj=1,10 y(j)=y(j-1)+0.1*p(j-1) p(j)=f(x(j),y(j)) print*,'x(',j,')=',x(j),'y(',j,')=',y(j) enddo contains functionf(a,b) reala,b,f f=b*b-a*a endfunction end
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- fortran 习题 参考答案
![提示](https://static.bdocx.com/images/bang_tan.gif)