fortran习题参考答案.docx
《fortran习题参考答案.docx》由会员分享,可在线阅读,更多相关《fortran习题参考答案.docx(9页珍藏版)》请在冰豆网上搜索。
![fortran习题参考答案.docx](https://file1.bdocx.com/fileroot1/2023-1/5/f679056d-b780-4218-954d-dde6ac7fb97d/f679056d-b780-4218-954d-dde6ac7fb97d1.gif)
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(ctemp=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