fortran95作业答案.docx
《fortran95作业答案.docx》由会员分享,可在线阅读,更多相关《fortran95作业答案.docx(20页珍藏版)》请在冰点文库上搜索。
![fortran95作业答案.docx](https://file1.bingdoc.com/fileroot1/2023-5/10/8a77a051-0af5-4445-bfb3-59e08c9cbabe/8a77a051-0af5-4445-bfb3-59e08c9cbabe1.gif)
fortran95作业答案
FORTRAN90程序设计
[麒麟火小组]
作业:
一.求一元方程的根
1.采用语句函数或函数子程序定义一元方程;
2.程序采用以下多种方法求方程的根;
牛顿迭代法,二分法,迭代法
程序利用控制变量(如nmethod)来选择计算方法。
ProgramFrist!
一个可以选择子程序的主程序
integerxuhao
print*,"请选择方法:
1:
二分法。
2:
迭代法。
3:
牛顿迭代法。
"
read*,xuhao
if(xuhao==1)then!
将3种方法放在不同的子程序中,并用选择结构进行选择。
callbisection()
endif
if(xuhao==2)then
calldiedai()
endif
if(xuhao==3)then
callniudun()
endif
end
subroutinebisection()!
二分法的子程序
realx1,x2,x
realbisect,func1!
对要调用的子程序作说明
do
print*,"输入x1,x2的值:
"
read*,x1,x2
if(func1(x1)*func1(x2)<0.0)exit
print*,"不正确的输入!
"
enddo
x=bisect(x1,x2)
print10,'x=',x
10format(a,f15.7)
end
realfunctionbisect(x1,x2)!
二分法结构的函数子程序
realx1,x2,x,f1,f2,fx
x=(x1+x2)/2.0
fx=func1(x)
dowhile(abs(fx)>1e-6)
f1=func1(x1)
if(f1*fx<0)then
x2=x
else
x1=x
endif
x=(x1+x2)/2.0
fx=func1(x)
enddo
bisect=x
end
realfunctionfunc1(x)!
二分法的一元方程子程序
realx
func1=x**3-2*x**2+7*x+4
end
subroutinediedai()!
迭代法的子程序
realx
integerm
print*,'请输入x0和最高循环次数的值:
'
read*,x,m
calliteration(x,m)
end
subroutineiteration(x,m)!
迭代法结构的函数子程序
implicitnone
realx,x1
realfunc2
integeri,m
i=1
x1=func2(x)
dowhile(abs(x-x1)>1e-6.and.i<=m)
print10,i,x1
x=x1
i=i+1
x1=func2(x)
enddo
if(i<=m)then
print20,'x=',x1
else
print30,'经过',m,'次迭代后仍未收敛'
endif
10format('i='i4,6x,'x='f15.7)
20format(a,f15.7)
30format(a,i4,a)
end
realfunctionfunc2(x)!
迭代法一元方程的子程序
realx
func2=(-x**3+2*x**2-4)/7
end
subroutineniudun()!
牛顿迭代法的子程序
realx
integerm
print*,'输入初值'
read*,x
callnewton(x)
end
subroutinenewton(x)!
牛顿迭代法结构的函数子程序
implicitnone
realx,x1
realfunc3,dfunc3
integeri,m
i=1
x1=x-func3(x)/dfunc3(x)
dowhile(abs(x-x1)>1e-6)
print10,i,x1
x=x1
i=i+1
x1=x-func3(x)/dfunc3(x)
enddo
print20,'x=',x1
10format('i=',i4,6x,'x=',f15.7)
20format(a,f15.7)
end
realfunctionfunc3(x)!
牛顿迭代法一元方程的函数子程序
realx
func3=x**3-2*x**2+7*x+4
end
realfunctiondfunc3(x)!
牛顿迭代法一元方程的导数的子程序
realx
dfunc3=3*x**2-4*x+7
end
二.求解线性方程组
用高斯消去法解线性方程组
Ax=B
的解,其中A为N*N系数矩阵,x为解向量,B为方程组右端n维列向量。
要求程序能够求解任意多个未知数的方程组,并附算例。
programsecond!
一个可以选择未知数数量的求线性方程的小程序
real,allocatable:
:
a(:
:
),b(:
),c(:
)
print*,'输入未知数个数n:
'
read*,n
allocate(a(n,n))!
为数组分配空间
allocate(b(n))
allocate(c(n))
print*,'输出系数矩阵a:
'
callinput(a,n)!
引入输入子程序
print*,'输入等值矩阵b:
'
read*,b
print*,'联立方程组:
'
calloutput(a,b,n)!
引入输出子程序
callgauss_jordan(a,b,c,n)!
引入乔丹法子程序
print*,'求解:
'
doi=1,n
print10,i,c(i)
enddo
10format('x',i1,'=',f8.4)
deallocate(a)!
解除数组单元的分配
deallocate(b)
deallocate(c)
end
subroutineinput(a,n)!
定义输入子程序
reala(n,n)
doi=1,n
read*,(a(i,j),j=1,n)
enddo
end
subroutinegauss_jordan(a,b,c,n)!
定义乔丹法子程序
dimensiona(n,n),b(n),c(n)
callup(a,b,n)!
乔丹法中包含的两个子程序
calllow(a,b,n)
forall(i=1:
n)
c(i)=b(i)/a(i,i)
endforall
end
subroutineoutput(a,b,n)!
定义输出子程序
reala(n,n),b(n)
doi=1,n
print10,a(i,1),i
doj=2,n
if(a(i,j)>0)then
print20,a(i,j),j
else
print30,abs(a(i,j)),j
endif
enddo
print40,b(i)
enddo
10format(f5.2,'x',i1\)
20format('+',f5.2,'x',i1\)
30format('-',f5.2,'x',i1\)
40format('=',f8.4)
end
subroutineup(a,b,n)
reala(n,n),b(n)
doi=1,n-1
doj=i+1,n
p=a(j,i)/a(i,i)
a(j,i:
n)=a(j,i:
n)-a(i,i:
n)*p
b(j)=b(j)-b(i)*p
enddo
enddo
end
subroutinelow(a,b,n)
reala(n,n),b(n)
doi=n,2,-1
doj=i-1,1,-1
p=a(j,i)/a(i,i)
a(j,1:
i)=a(j,1:
i)-a(i,1:
i)*p
b(j)=b(j)-b(i)*p
enddo
enddo
end
三.编写班级成绩考评程序
1.采用数据文件输入某班级30名同学的学号及五门课程的成绩;
2.求出每名同学的总分、统计各门成绩的平均分;
3.统计各门课程中高于和低于平均分的人数;
4.按总分高低排序,利用文件输出名次、学号和分数;
5.分数查询输入某一学号,输出该生的名次、各门课程的成绩和总分。
parameter(n=30)
typestudent_score!
!
定义派生类型studentrecord
integernum
realchin,math,eng,phy,che,sum
integerrank
endtype
type(student_score)a(n)!
结构体数组a
open(1,file='stu1.dat')
doi=1,n
read(1,1)a(n)!
读入30个人的信息
enddo
1format(2x,i6,5(3x,f4.1))
close
(1)
open(2,file='stu2.dat')
dataave1,ave2,ave3,ave4,ave5/5*0.0/
doj=1,0!
每名同学成绩的求和以及各门成绩的平均分
a(j)%sum=(a(j)%chin+a(j)%math+a(j)%eng+a(j)%phy+a(j)%che)
ave1=ave1+a(j)%chin/30.0
ave2=ave2+a(j)%math/30.0
ave3=ave3+a(j)%eng/30.0
ave4=ave4+a(j)%phy/30.0
ave5=ave5+a(j)%che/30.0
enddo
p=0;q=0!
输出每门成绩的平均分
doi=1,n
if(a(i)%chin>=ave1)then
p=p+1
else
q=q+1
endif
enddo
print*,'高于语文平均分的人数:
',p
print*,'低于语文平均分的人数:
',q
p=0;q=0
doi=1,n
if(a(i)%math>=ave2)then
p=p+1
else
q=q+1
endif
enddo
print*,'高于数学平均分的人数:
',p
print*,'低于数学平均分的人数:
',q
p=0;q=0
doi=1,n
if(a(i)%eng>=ave3)then
p=p+1
else
q=q+1
endif
enddo
print*,'高于英语平均分的人数:
',p
print*,'低于英语平均分的人数:
',q
p=0;q=0
doi=1,n
if(a(i)%phy>=ave4)then
p=p+1
else
q=q+1
endif
enddo
print*,'高于物理平均分的人数:
',p
print*,'低于物理平均分的人数:
',q
p=0;q=0
doi=1,n
if(a(i)%che>=ave5)then
p=p+1
else
q=q+1
endif
enddo
print*,'高于化学平均分的人数:
',p
print*,'低于化学平均分的人数:
',q
dok=1,n-1
dom=1,n-k
if(a(m)%sum>a(m+1)%sum)then
t=a(m)%sum
a(m)%sum=a(m+1)%sum
a(m+1)%sum=t
endif
enddo
a(m+1)%rank=0
a(m+1)%rank=a(m+1)%rank+1
enddo
doi=1,n
print*,'学号总分名次'
print10,a(i)%num,a(i)%sum,a(i)%rank
enddo
10format(2x,i6,3x,f4.1,3x,i2)
print*,'enterastudent’snumber:
'
read*,s!
输出符合条件的人的信息
dok=1,n
if(s==a(k)%num)then
print*,'学号语文数学英语物理化学总分名次'
print100,a(k)
exit
endif
enddo
if(k>n)print*,'cannotfindthestudent!
'
100format(2x,i6,6(3x,f4.1),3x,i2)
close
(2)
end
编译通过,但运行发生错误,可能是环境自身的错误吧。
四.求定积分
1.采用函数子程序定义f(X);
2.程序可选择以下多种方法定积分
矩形法、梯形法、辛普生法
3.对于不同的算法分别编写子程序,选择调用。
programforth!
一个可以选择的方法的主程序
integershuzhi
print*,'请选择您需要的方法:
1:
矩形法,2:
梯形法,3:
辛普生法。
'
read*,shuzhi
if(shuzhi==1)then
calljuxing()
elseif(shuzhi==2)then
calltixing()
elseif(shuzhi==3)then
callxinpusheng()
endif
end
subroutinejuxing()!
矩形法的子程序
reala,b,s
integern
realyrectangle
print*,'欢迎使用矩形法,请输入a,b和n的值'
read*,a,b,n
s=rectangle(a,b,n)!
调用矩形法求解的函数
print10,a,b,n
print20,s!
输出计算结果
10format('a=',f5.2,3x,'b=',f5.2,3x,'n=',i4)
20format('s',f15.8)
end
realfunctionrectangle(a,b,n)!
矩形法求解函数
implicitnone
realx,a,b,h,s
integeri,n
realfunc1
x=a
h=(b-a)/n
s=0
doi=1,n
s=s+func1(x)*h
x=x+h
enddo
rectangle=s
end
realfunctionfunc1(x)!
矩形法的积分函数
realx
func1=1+exp(x)
end
subroutinetixing()!
梯形法的子程序。
reala,b,s
integern
realtrapezia!
对要调用的子程序作说明
print*,'感谢您使用梯形法,请输入a,b和n的值'
read*,a,b,n
s=trapezia(a,b,n)!
调用梯形法求解的函数
print10,a,b,n
print20,s!
输出计算结果
10format('a=',f5.2,3x,'b=',f5.2,3x,'n=',i4)
20format('s',f15.8)
end
realfunctiontrapezia(a,b,n)!
梯形法求解函数
implicitnone
realx,a,b,h,s
integeri,n
realfunc2
x=a
h=(b-a)/n
s=0
doi=1,n-1
s=s+2*func2(x+i*n)
enddo
trapezia=(s+func2(a)+func2(b))*h/2.0
end
realfunctionfunc2(x)!
梯形法积分函数
realx
func2=1+exp(x)
end
subroutinexinpusheng()
reala,b,s
integern
realsinpson!
对要调用的函数子程序作说明
print*,'辛普生法很不错哦,请输入a,b和n的值'
read*,a,b,n
s=sinpson(a,b,n)!
调用辛普生法求解的函数
print10,a,b,n
print20,s!
输出计算结果
10format('a=',f5.2,3x,'b=',f5.2,3x,'n=',i4)
20format('s',f15.8)
end
realfunctionsinpson(a,b,n)!
辛普生法求解函数
implicitnone
reala,b,h,f2,f4,x
integeri,n
realfunc3
h=(b-a)/(2.0*n)
x=a+h
f2=0
f4=func3(x)
doi=1,n-1
x=x+h
f2=f2+func3(x)
x=x+h
f4=f4+func3(x)
enddo
sinpson=(func3(a)+func3(b)+4.0*f4+2.0*f2)*h/3.0
end
realfunctionfunc3(x)!
辛普生法的积分函数
realx
func3=1+exp(x)
end