1、西安交通大学fortran习题1 二维数组的输入与输出program mainimplicit noneinteger i,jinteger A(2,2)!若为data(A(j,i),i=1,2),j=1,2)/1,2,3,4/print*,Aend !结果为 1 3 2 4实际为A(1,1)=1 A(1,2)=2 A(2,1)=3 A(2,2)=4!若为data(A(i,j),i=1,2),j=1,2)/1,2,3,4/print*,Aend !结果为 1 2 3 4实际为A(1,1)=1 A(2,1)=2 A(1,2)=3 A(2,2)=4program mainimplicit none
2、integer i,jinteger A(2,2)data(A(i,j),i=1,2),j=1,2)/1,2,3,4/write(*,(I3,I3)Aend !结果为 1 2 3 4翻卡片!用数组编写下面的题目:假定有一叠卡片,卡片号为1到52,并且所有卡片的正面朝上。从卡片号2开始,把凡是偶数的卡片都翻成正面朝下。再从3号卡片开始,把凡是卡片号为3的倍数的卡片都翻一个面(即把正面朝上的翻成正面朝下,正面朝下的翻成正面朝上)。下一步从4号卡片开始,把凡是卡片号为4的倍数的卡片都翻一个面,依次类推,直到从52号卡片开始,把凡是卡号为52的倍数的卡片翻一个面。写出一个程序,来测定全过程完成后,哪些
3、卡片的面朝上,共有几张。答案:正面朝上的卡片是第1、4、9、16、25、36、49张,共7张。program mainimplicit none integer s(52)integer i,js=0do i=2,52j=ido while(j=52)s(j)=s(j)+1j=j+iend doend dodo i=1,52if(mod(s(i),2)=0)thenwrite(*,*)iend ifend doend program main/用C语言写#includeint main() int s52;int i,j;for(i=0;i52;i+)si=0;for(i=1;i=51;i+)
4、 for(j=i;j=51;j+=i+1)/ 也可以写作j=j+i+1,不能写作j=j+i+1 sj=sj+1; 斐波拉契!使用递归时result()不能与函数名相同PROGRAM MAINIMPLICIT NONEINTEGER n,i,sumread*,nif(n1)thendo h=2,i-1if(mod(i,h)=0)thenf=f+1endifend doendifend functionprogram mainimplicit noneinteger(4) i,j,n,finteger sdo n=4,600,2s=0j=0do i=1,n/2-1j=n-iif(f(i)=0.an
5、d.f(j)=0)thens=s+1end ifend doif(s=0)thenprint*,n,不满足猜想elseprint*,n,send ifend doend program 黄金值法解方程!将中值法中取中点的值改为取黄金点的值,理论上可以提高效率module golden_sectionimplicit nonereal a,b,ccontainssubroutine sub1(a,b,c)real a,b,c,ycc=(a*0.618+b)/1.618yc=f(c)do while(abs(yc)0.00001)if(yc*f(a)0)print*,f(a)=,f(a);f(b)
6、=,f(b);请重新输入下界aread*,aprint*,请重新输入解的下界bread*,bend docall sub1(a,b,c)end ifprint*,cend回文输出program mainimplicit noneinteger i,jinteger a(5),b(5)data a /1,2,8,2,10/data b /2,3,4,5,6/do i=1,5 do j=1,5 b(j)=b(j)-1 if(b(j)1)then b(j)=b(j)+5 end if end do print*,a(b(1:5)!实践证明这是正确的输出方法end doend! forall语句中不能
7、使用if语句,但可以用where语句,注意()中的内容变化但本题从逻辑上就应该先做完forall,再做where,故不必嵌套program mainimplicit noneinteger i,jinteger a(6),b(6)DATA a /1,4,9,16,25,36/data b /2,3,4,5,6,7/do i=1,6forall(j=1:6)b(j)=b(j)-1end forallwhere(b=0) !可以写为where(b(:)=0) b(:)=b(:)+6 end whereb=b+6end whereprint*,a(b(1:6)!实践证明这是正确的输出方法end do
8、回文数据若干相邻想和并比较大小!1.圆盘上有如图1(1)所示的20个数。请找出哪四个相邻的数之和为最大。请指出他们的位置和数值。如果是1(2)图,又是哪四个相邻的数?program mainimplicit noneinteger a(20),b(23),c(20)integer i,j,d,edata a /20,21,8,4,13,6,10,15,2,17,3,19,7,16,8,11,14,9,12,5/data b /1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,1,2,3/do i=1,20c(i)=a(b(i)+a(b(i+1
9、)+a(b(i+2)+a(b(i+3)end doe=1do i=1,19 if(c(1)c(i+1)then d=c(1) c(1)=c(i+1) c(i+1)=d e=i+1 end ifend doprint*,c(1)write(*,*)(a(b(i),i=e,e+3)end /用C语言写,注意C的数组从0开始计数,所有的i变量减一;嵌套数组仍然有效#includeint main() int a20=20,21,8,4,13,6,10,15,2,17,3,19,7,16,8,11,14,9,12,5; int b23=0,1,2,3,4,5,6,7,8,9,10,11,12,13,1
10、4,15,16,17,18,19,0,1,2; int c20; int i,j,d,e; for(i=0;i=18;i+) ci=abi+abi+1+abi+2+abi+3; e=0; for(i=0;i=18;i+) if(c0ci+1) d=c0; c0=ci+1; ci+1=d; e=i+1; printf(和最大的是%d,这四个数是:n,c0); for(i=e;i=e+3;i+) printf(%d,abi);return 0;!圆盘上有如图所示的K个数。请找出哪l个相邻的数之和为最大。请指出他们的位置和数值。program mainimplicit noneinteger i,j
11、,d,einteger k,linteger,allocatable: a(:),b(:),c(:)print*,请输入数据的总数read*,kprint*,请输入求和的元素个数read*,lallocate(a(k),b(k+l-1),c(k)print*,请依次输入数据do i=1,kread*,a(i)end dodo i=1,kb(i)=iend dodo i=k+1,k+l-1b(i)=i-kend dodo i=1,kdo j=i,i+l-1c(i)=c(i)+a(b(j) !一维数组嵌套的功能可由二维数组代替end doend doe=1do i=1,k-1 if(c(1)c(i
12、+1)then d=c(1) c(1)=c(i+1) c(i+1)=d e=i+1 end ifend doprint*,和最大为,c(1), 这些数为write(*,*)(a(b(i),i=e,e+l-1)end 计算六边形的面积PROGRAM MAINIMPLICIT NONEREAL AREA, L1,L2,L3,L4,L5,L6,L7,L8,L9,L10,L11,L12PRINT*,请输入将六边形分割成三角形后各个三角形的边长PRINT*,第一个三角形三边为READ*,L1,L2,L3PRINT*,第二个三角形三边为READ*,L4,L5,L6PRINT*,第三个三角形三边为READ*
13、,L7,L8,L9PRINT*,第四个三角形三边为READ*,L10,L11,L12AREA=F(L1,L2,L3)+F(L4,L5,L6)+F(L7,L8,L9)+F(L10,L11,L12)write(*,*)AREACONTAINSFUNCTION F(A,B,C)REAL F,A,B,C,SS=(A+B+C)/2F=SQRT(S*(S-A)*(S-B)*(S-C)END FUNCTIONEND 计算最大公约数和最小公倍数PROGRAM MAIN!计算两个数的最小公倍数与最大公约数IMPLICIT NONEINTEGER X,Y,F,GPRINT*,请输入两个正整数READ*,X,YG=
14、X*Y/F(X,Y)write(*,*)最大公因数为,F(X,Y)write(*,*)最小公倍数为,GEND PROGRAM MAIN !FFUNCTION F(X,Y)IMPLICIT NONEINTEGER X,Y,Z,FIF(XY)THENX=ZELSEX=YY=ZENDIFZ=X-YEND DOF=ZEND FUNCTION牛顿法解方程!牛顿法解方程,效率高,但是方程有多解时,解对初值很敏感;另外还要求函数处处可导module newtonimplicit none real x,y,k,vcontains subroutine sub1(x)real x,k,yreal dxdx=0
15、.00001y=f(x)k=(f(x)-f(x-dx)/dxdo while(abs(y)0.00001)x=x-y/k !注意方程不要解错y=f(x)end doend subroutinefunction f(x)real f,xf=x*x-4.0*x+3end functionend module newtonprogram mainuse newtonimplicit none print*,请输入初值x: read*,xcall sub1(x)print*,xend program main牛追人问题!用派生定义坐标,但没有定义向量运算符本题可以不用派生,直接定义坐标变量,应该可以简
16、化。精度由v的增量,时间间隔t,判定相遇的临界距离三者决定module module1implicit nonetype vectorreal xreal yend type!下面的声明语句可以不要,但私下下认为不应省略type (vector):va,vc,ra,rc,dr !模块中定义了type后,其他例程都不用再定义但要声明变量real v,tcontainsfunction norm(r)real normtype(vector):rnorm=(r.x*r.x+r.y*r.y)*0.5end functionsubroutine sub1(v,ra)type (vector):va,v
17、c,ra,rc,drreal v,tt=0.1ra.x=10ra.y=50rc.x=0rc.y=0vc.x=5.0/(26*0.5)vc.y=5.0/(26*0.5)*5va.x=v*2.0/(5*0.5)va.y=v*(-1.0)/(5*0.5)dr.x=ra.xdr.y=ra.y do while(norm(dr)1) rc.x=rc.x+vc.x*trc.y=rc.y+vc.y*tra.x=ra.x+va.x*tra.y=ra.y+va.y*tdr.x=ra.x-rc.xdr.y=ra.y-rc.yvc.x=5*dr.x/(norm(dr)vc.y=5*dr.y/(norm(dr)end
18、 doend subroutine sub1end module program mainuse module1implicit nonev=0print*,小孩的速度应为ra.x=10ra.y=50do while(ra.xpprint*,aend ifendsubroutine program mainimplicit noneinteger iinteger ,target:pdo p=1900,2008call sub1(p)end doend program mai最大公约数!辗转相除法PROGRAM MAINIMPLICIT NONEINTEGER M,NPRINT*,请输入两个正
19、整数read*,M,Nprint*,他们的最大公约数为print*,F(M,N)containsFUNCTION F(M,N)integer M,N,F,I,PI=1IF(MN)THEN P=MM=NN=PEND IFDO WHILE(I/=0)I=MOD(M,N)M=NN=IEND DOF=MEND FUNCTIONEND PROGRAM!秦九韶算法PROGRAM MAINIMPLICIT NONEINTEGER M,NPRINT*,请输入两个正整数read*,M,Nprint*,他们的最大公约数为print*,F(M,N)containsFUNCTION F(M,N)integer M,N,F,I,PI=1DO WHILE(I/=0)IF(M=0.0000006)I=I+1A=A*(-1)*X*X/(I*2+1)/(2*I)SIN=SIN+AEND DOEND SUBROUTIN
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1