1、fortran95作业答案FORTRAN90程序设计麒麟火小组 作业:一求一元方程的根1.采用语句函数或函数子程序定义一元方程;2.程序采用以下多种方法求方程的根;牛顿迭代法,二分法,迭代法 程序利用控制变量(如nmethod)来选择计算方法。Program Frist !一个可以选择子程序的主程序 integer xuhao print*,请选择方法:1:二分法。2:迭代法。3:牛顿迭代法。 read*,xuhao if(xuhao=1)then !将3种方法放在不同的子程序中,并用选择结构进行选择。 call bisection() endif if(xuhao=2)then call d
2、iedai() endif if(xuhao=3)then call niudun() endif end subroutine bisection() !二分法的子程序 real x1,x2,x real bisect,func1 !对要调用的子程序作说明 do print*,输入x1,x2的值: read*,x1,x2 if(func1(x1)*func1(x2)1e-6) f1=func1(x1) if(f1*fx1e-6.and.i=m) print 10,i,x1 x=x1 i=i+1 x1=func2(x) enddo if(i1e-6) print 10,i,x1 x=x1 i=
3、i+1 x1=x-func3(x)/dfunc3(x) enddo print 20,x=,x110 format(i=,i4,6x,x=,f15.7)20 format(a,f15.7) end real function func3(x) !牛顿迭代法一元方程的函数子程序 real x func3=x*3-2*x*2+7*x+4 end real function dfunc3(x) !牛顿迭代法一元方程的导数的子程序 real x dfunc3=3*x*2-4*x+7 end 二求解线性方程组用高斯消去法解线性方程组Ax=B的解,其中A为N*N系数矩阵,x为解向量,B为方程组右端n维列向
4、量。要求程序能够求解任意多个未知数的方程组,并附算例。program second !一个可以选择未知数数量的求线性方程的小程序 real,allocatable:a(:,:),b(:),c(:) print*,输入未知数个数n: read*,n allocate(a(n,n) !为数组分配空间 allocate(b(n) allocate(c(n) print*,输出系数矩阵a: call input(a,n) !引入输入子程序 print*,输入等值矩阵b: read*,b print*,联立方程组: call output(a,b,n) !引入输出子程序 call gauss_jorda
5、n(a,b,c,n) !引入乔丹法子程序 print*,求解: do i=1,n print 10,i,c(i) end do10 format(x,i1,=,f8.4) deallocate(a) !解除数组单元的分配 deallocate(b) deallocate(c) end subroutine input(a,n) !定义输入子程序 real a(n,n) do i=1,n read*,(a(i,j),j=1,n) enddo end subroutine gauss_jordan(a,b,c,n) !定义乔丹法子程序 dimension a(n,n),b(n),c(n) call
6、 up(a,b,n) !乔丹法中包含的两个子程序 call low(a,b,n) forall(i=1:n) c(i)=b(i)/a(i,i) endforall end subroutine output(a,b,n) !定义输出子程序 real a(n,n),b(n) do i=1,n print 10,a(i,1),i do j=2,n if(a(i,j)0)then print 20,a(i,j),j else print 30,abs(a(i,j),j endif enddo print 40,b(i) enddo10 format(f5.2,x,i1)20 format(+,f5.
7、2,x,i1)30 format(-,f5.2,x,i1)40 format(=,f8.4) end subroutine up(a,b,n) real a(n,n),b(n) do i=1,n-1 do j=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 subroutine low(a,b,n) real a(n,n),b(n) do i=n,2,-1 do j=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
8、(j)=b(j)-b(i)*p enddo enddo end 三编写班级成绩考评程序1.采用数据文件输入某班级30名同学的学号及五门课程的成绩;2.求出每名同学的总分、统计各门成绩的平均分;3.统计各门课程中高于和低于平均分的人数;4.按总分高低排序,利用文件输出名次、学号和分数;5.分数查询输入某一学号,输出该生的名次、各门课程的成绩和总分。parameter(n=30) type student_score !定义派生类型student record integer num real chin,math,eng,phy,che,sum integer rank end type type
9、 (student_score) a(n) !结构体数组aopen(1,file=stu1.dat) do i=1,n read(1,1) a(n) !读入30个人的信息 end do1 format(2x,i6,5(3x,f4.1) close(1) open(2,file=stu2.dat) data ave1,ave2,ave3,ave4,ave5/5*0.0/ do j=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 a
10、ve2=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 !输出每门成绩的平均分do i=1,nif(a(i)%chin=ave1)thenp=p+1elseq=q+1endifenddoprint*,高于语文平均分的人数:,pprint*,低于语文平均分的人数:,qp=0;q=0do i=1,nif(a(i)%math=ave2)thenp=p+1elseq=q+1endifenddoprint*,高于数学平均分的人数:,pprin
11、t*,低于数学平均分的人数:,qp=0;q=0do i=1,nif(a(i)%eng=ave3)thenp=p+1elseq=q+1endifenddoprint*,高于英语平均分的人数:,pprint*,低于英语平均分的人数:,qp=0;q=0do i=1,nif(a(i)%phy=ave4)thenp=p+1elseq=q+1endifenddoprint*,高于物理平均分的人数:,pprint*,低于物理平均分的人数:,qp=0;q=0do i=1,nif(a(i)%che=ave5)thenp=p+1elseq=q+1endifenddoprint*,高于化学平均分的人数:,pprin
12、t*,低于化学平均分的人数:,q do k=1,n-1 do m=1,n-k if(a(m)%suma(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 do i=1,n print*,学号 总分 名次 print 10,a(i)%num,a(i)%sum,a(i)%rank enddo10 format(2x,i6,3x,f4.1,3x,i2) print*,enter a students number: re
13、ad*,s !输出符合条件的人的信息 do k=1,n if(s=a(k)%num) then print*, 学号 语文 数学 英语 物理 化学 总分 名次 print 100,a(k) exit endif end do if(kn)print*,can not find the student!100 format (2x,i6,6(3x,f4.1),3x,i2)close(2)end 编译通过,但运行发生错误,可能是环境自身的错误吧。四求定积分1.采用函数子程序定义f(X);2. 程序可选择以下多种方法定积分 矩形法、梯形法、辛普生法3.对于不同的算法分别编写子程序,选择调用。prog
14、ram forth !一个可以选择的方法的主程序 integer shuzhi print*,请选择您需要的方法:1:矩形法,2:梯形法,3:辛普生法。 read*,shuzhi if(shuzhi=1)then call juxing() elseif(shuzhi=2)then call tixing() elseif(shuzhi=3)then call xinpusheng() endif end subroutine juxing() !矩形法的子程序 real a,b,s integer n real yrectangle print*,欢迎使用矩形法,请输入a,b和n的值 rea
15、d*,a,b,n s=rectangle(a,b,n) !调用矩形法求解的函数 print 10,a,b,n print 20,s !输出计算结果10 format(a=,f5.2,3x,b=,f5.2,3x,n=,i4)20 format(s,f15.8) end real function rectangle(a,b,n) !矩形法求解函数 implicit none real x,a,b,h,s integer i,n real func1 x=a h=(b-a)/n s=0 do i=1,n s=s+func1(x)*h x=x+h end do rectangle=s end rea
16、l function func1(x) !矩形法的积分函数 real x func1=1+exp(x) end subroutine tixing() !梯形法的子程序。 real a,b,s integer n real trapezia !对要调用的子程序作说明 print*,感谢您使用梯形法,请输入a,b和n的值 read*,a,b,n s=trapezia(a,b,n) !调用梯形法求解的函数 print 10,a,b,n print 20,s !输出计算结果 10 format(a=,f5.2,3x,b=,f5.2,3x,n=,i4) 20 format(s,f15.8) end r
17、eal function trapezia(a,b,n) !梯形法求解函数 implicit none real x,a,b,h,s integer i,n real func2 x=a h=(b-a)/n s=0 do i=1,n-1 s=s+2*func2(x+i*n) end do trapezia =(s+func2(a)+func2(b)*h/2.0 end real function func2(x) !梯形法积分函数 real x func2=1+exp(x) end subroutine xinpusheng() real a,b,s integer n real sinpso
18、n !对要调用的函数子程序作说明 print*,辛普生法很不错哦,请输入a,b和n的值 read*,a,b,n s=sinpson(a,b,n) !调用辛普生法求解的函数 print 10,a,b,n print 20,s !输出计算结果 10 format(a=,f5.2,3x,b=,f5.2,3x,n=,i4) 20 format(s,f15.8) end real function sinpson(a,b,n) !辛普生法求解函数 implicit none real a,b,h,f2,f4,x integer i,n real func3 h=(b-a)/(2.0*n) x=a+h f2=0 f4=func3(x) do i=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 real function func3(x) !辛普生法的积分函数 real x func3=1+exp(x)end
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1