西安交通大学fortran习题doc.docx

上传人:b****5 文档编号:3432642 上传时间:2022-11-23 格式:DOCX 页数:17 大小:22.76KB
下载 相关 举报
西安交通大学fortran习题doc.docx_第1页
第1页 / 共17页
西安交通大学fortran习题doc.docx_第2页
第2页 / 共17页
西安交通大学fortran习题doc.docx_第3页
第3页 / 共17页
西安交通大学fortran习题doc.docx_第4页
第4页 / 共17页
西安交通大学fortran习题doc.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

西安交通大学fortran习题doc.docx

《西安交通大学fortran习题doc.docx》由会员分享,可在线阅读,更多相关《西安交通大学fortran习题doc.docx(17页珍藏版)》请在冰豆网上搜索。

西安交通大学fortran习题doc.docx

西安交通大学fortran习题doc

1二维数组的输入与输出

programmain

implicitnone

integeriJ

integerA(2,2)

喏为

data((A(j,i),i=1,2),j=1,2)/1,2,3,4/print*,A

end

!

结果为1324

A(12)=3A(2,2)=4

实际为A(1J)=1A(l,2)=2

喏为

data((A(i,j),i=l,2)j=l,2)/l,2,3,4/

print*,A

end

!

结果为1234

实际为A(1J)=1A(2J)=2programmain

implicitnone

integerij

integerA(2,2)

data((A(i,j),i=l,2),j=l,2)/l,2,3,4/

write(叮(13,13门A

end

!

结果为12

34

翻卡片

!

用数组编写下面的题目:

假定有一叠卡片,卡片号为1到52,并且所有卡片的正面朝上。

从卡片号2开始,把凡是偶数的卡片都翻

成正面朝下。

再从3号卡片开始,把凡是卡片号为3的倍数的卡片嘟翻一个面(即把正面朝上的翻成正面

朝下,正面朝下的翻成正面朝上)。

下一步从4号卡片开始,把凡是卡片号为4的倍数的卡片都

翻一个面,

依次类推,直到从52号卡片开始,把凡是卡号为52的倍数的卡片翻一个面。

写出一个程序,

來测定全过

程完成后,哪些卡片的面朝上,共有几张。

答案:

正面朝上的卡片是第1、4、9、16、25、36、49张,共7张。

programmainimplicitnoneintegers(52)integeri,js=0

doi=2,52

••

尸1

dowhile(j<=52)

S(j)=S①+1

•••

J=J+1

enddo

enddo

doi=l,52

if(mod(s⑴,2)==0)then

write(*,*)i

endif

enddo

endprogrammain

〃用c语言写

#include

intmain()

{

ints[52];

inti,j;

for(i=0;i<52;i++)s[i]=0;

for(i=l;i<=51;i++)

{for(j=i;j<=51;j+二i+1)//也可以写作j=j+i+1,不能写作j=j+i+1

{

s[j]二s[j]+l;

}

}

斐波拉契

!

使用递归时result()不能与函数名相同

PROGRAMMAIN

IMPLICITNONE

INTEGERn,i,sum

rcad*,nif(n<0)THENPRINT*,"出错”

ENDIF

write(*,*)'f(n)=,,f(n)doi=l,nsum=sum+f(n)enddowrite(*,*),sum=\sumcontains

recursivefunctionf(n)result(g)integergj

if(n==0)then

g=0

elseif(n==l.or.n==2)then

g=l

else

g=f(n-l)+f(n-2)

endif

endfunction

Endprogram

分解质因数

!

分解质因数

programmain

implicitnone

integera,c,i,b

print*,"请输入一个大于二的整数"

read*,a

print*,呗!

j它的所有质因子为

dowhile(a/=l)

i=l

b=l

dowhile(b/=0)

i=i+l

b=mod(aj)

c=i

enddo

a=a/c

print*,c

enddo

endprogram

哥德巴赫猜想

!

屏幕上不能显示500,所以不能将结果完全显示,需要将结果输入文件

FUNCTIONf(i)

IMPLICITNONE

INTEGERi,f,h

f=0

if(i>l)lhen

doh=2,i-l

if(mod(i,h)==0)then

f=f+l

endifenddoendifendfunction

programmainimplicitnoneinteger(4)i,j,n,fintegers

don=4,600,2

s=0

j=o

doi=hn/2-lj=n-iif(f(i)==O.and

enddo

jf(s==O)then

print*,n;不满足猜想’elseprint*,n,sendifenddo

endprogram

黄金值法解方程

!

将中值法中取中点的值改为取黄金点的值,理论上可以提髙效率modulegolden_section

implicitnone

reala,b,c

contains

subroutinesubl(abc)

reala,b,c,yc

c=(a*0.618+b)/1.618

yc=f(c)

dowhile(abs(yc)>0.00001)

if(yc*f(a)

b=c

else

a=c

endif

c=(a*0.618+b)/1.618yc=f(c)

enddo

endsubroutine

functionf(x)realf,xf=x*x・4.0*x+3

endfunction

endmodulegolden_sectionprogrammain

usegolden_section

implicitnone

reale

print*,"请输入解的下界a"

read*,a

print*,"请输入解的上界b”

read*,b

e=f(a)*f(b)

!

用一个循环来判断输入值是否合适,或者就是解

if(f(a)==O)then

print*,a

elseif(f(b)==O)then

print*,b

else

dowhile(e>0)

print*,Hf(a)=,f(a);f(b)=,f(b)谓重新输入F界a"

read*,a

print*;*请重新输入解的下界b”

read*,b

enddocallsubl(a,b,c)endif

print*,cend

回文输出

programmain

implicitnone

integeriJ

integera(5),b(5)

dataa/l,2,8,2,10/

datab/2,3,4,5,6/

doi=l,5

doj=l,5

b(j)=b(j)-l

if(b(j)

b(j)二b(j)+5

endif

enddo

print*,a(b(1:

5))!

实践证明这是正确的输出方法

enddo

end

!

forall语句中不能使用讦语句,但可以用where语句,注意()中的内容变化但本题从逻辑上就应该先做完forall,再做where,故不必嵌套

programmain

implicitnoneintegerijintegera(6),b(6)DATAa/l,4,9,16,25,36/datab23,4,5,6,7/doi=l,6

forall(j=l:

6)b(j)=b(j)・lendforall

where(b==0)!

可以写为where(b(:

)==0)b(:

)=b(:

)+6endwhereb=b+6endwhereprint\a(b(l:

6))!

实践证明这是正确的输出方法

enddo

回文数据若干相邻想和并比较大小

!

1.圆盘上有如图1

(1)所示的20个数。

请找出哪四个相邻的数之和为最大。

请指出他们的位置和数值。

如果是1

(2)图,又是哪四个相邻的数?

programmainimplicitnone

integera(20),b(23),c(20)

integeri,j,d,edataa/20,21,&4,13,6,10,15,2,17,3,19,7,16,&11,14,9,12,5/

datab/1,2,3,4,5,6,7,&9,10,11,12,13,14,15,16,17,1&19,20,1,2,3/

doi=l,20

c(i)=a(b(i))+a(b(i+1))+a(b(i+2))+a(b(i+3))

enddo

e=l

doi=l,19

if(c(l)

d=c(l)

c(l)=c(i+l)

c(i+l)=d

e=i+l

endif

enddo

print*,c(l)

write(*,*)(a(b(i)),i=e,e+3)

end

〃用C语言写,注意C的数组从0开始计数,所有的i变量减一;嵌套数组仍然有效

#include

intmain()

{

inta[20]={20,21,8413610」5,2,17,3J9,7,16,8,11,14,9,12,5};

intb[23]={0,1,2,3,4,5,6,7,&9,10,11,12,13,14,15,16,17,18,19,0,1,2};

intc[20];

intijd,e;

for(i=0;i<=18;i++)

{

c[i]二a[b[i]]+a[b[i+l]]+a[b[i+2]]+a[b[i+3]];

}

e=0;

for(i=0;i<=l&i++)

{if(c[0]vc[i+l])

d=c[0];c[0]=c[i+l];c[i+l]=d;c=i+1;

printif和最大的是%山这四个数是:

\njc[0]);

for(i=e;i<=e+3;i++)

prinlf(“%d,”,a[b[i]]);

return0;

!

圆盘上有如图所示的K个数。

请找出哪1个相邻的数之和为最大。

请指出他们的位置和数值。

programmain

implicitnone

integeri

integerk」

integenallocatable:

:

a(:

),b(:

).c(:

print*/请输入数据的总数”

read*k

print*;1请输入求和的元素个数”

read*」

allocate(a(k),b(k+l-1),c(k))

print*/请依次输入数据“

doi=l,k

rcad*,a(i)

enddo

doi=l,k

b(i)=i

enddo

doi=k+l,k+l-l

b(i)=i-k

enddo

doi=l,k

doj=i,i+l-l

c(i)=c(i)+a(b①)!

一・维数组嵌套的功能可由二维数组代替enddo

enddo

e=l

doi=1,k-1

if(c(l)

d=c(l)

c(l)=c(i+l)

c(i+l)=d

c二i+1

endif

enddo

prim*,湘最大为,c(l),这些数为’

write(*,*)(a(b(i)),i=e,e+l-l)

end

计算六边形的面积

PROGRAMMAIN

IMPLICITNONE

REALAREA,L1,L2,L3,L4,L5,L6,L7,L&L9,L10,L11,L12

PRINT*,”请输入将六边形分割成三角形后各个三角形的边长“

PRINT*;'第一个三角形三边为”

READ*,L1X2,L3

PRINT*;'第二个三角形三边为”

READ*,L4,L5,L6

PRINT*;'第三个三角形三边为”

READ*,L7,L&L9

PRINT*,”第四个三角形三边为”

READ*,L1O,L11,L12

AREA=F(L1,L2,L3)+F(L4,L5,L6)+F(L7,L&L9)+F(L10,L11,L12)write(*,*)AREA

CONTAINS

FUNCTIONF(A,B,C)

REALF,A,B,C,S

S=(A+B+C)/2

F=SQRT(S*(S-A)*(S-B)*(S-C))

ENDFUNCTION

END

计算最大公约数和最小公倍数

PROGRAMMAIN

!

计算两个数的最小公倍数与最大公约数

IMPLICITNONE

INTEGERX,Y,F,G

PRINT*,”请输入两个正整数“

READ*,X,Y

G=X*Y/F(X,Y)write(*,*)"ft大公因数为“,F(X,Y)write(*,*)H最小公倍数为”,GENDPROGRAMMAIN

!

F

FUNCTIONF(X,Y)

IMPLICITNONE

INTEGERX,Y,Z,F

IF(X

Z=Y

Y=X

X=Z

ENDIF

Z=X-Y

DOWHILE(Z/=Y)

IF(Z>Y)THEN

X=Z

ELSEX=YY=ZENDIFZ=X-YENDDO

F=Z

ENDFUNCTION

牛顿法解方程

另外还要求函数处处可导

!

牛顿法解方程,效率高,但是方程有多解时,解对初值很敏感;

modulenewton

implicitnone

realx,y,k,v

containssubroutinesubl(x)

realx,k,y

realdxdx=0.00001

y=f(x)

k=(f(x)-f(x-dx))/dx

!

注意方程不要解错

dowhile(abs(y)>0.00001)x=x-y/k

y=f(x)

enddoendsubroutinefunctionf(x)

realf,x

f=x*x・4.0*x+3

endfunction

endmodulenewtonprogrammainusenewtonimplicitnone

print*;*请输入初值x:

”read*,xcallsubl(x)print*,x

endprogrammain

牛追人问题

!

用派生定义坐标,但没有定义向量运算符

本题可以不用派生,直接定义坐标变位,应该可以简化。

精度由v的增量,时间间隔t,判定相遇的临界距离三者决定

modulemodule1

implicitnone

typevector

realx

realy

endtype

!

下面的声明语句可以不要,但私下下认为不应省略

type(vector):

:

va,vc,ra,rc,dr!

模块中定义了type后,其他例程都不用再定义但要声明变量realv,t

contains

functionnorm(r)

realnorm

type(vector):

:

r

norm=(EX*r.x+r.y*r.y)**0.5

endfunctionsubroutinesubl(vja)type(vector):

:

va,vc,ra,rc,drreal

t=0.1

ra.x=10

ra.y=50

rc.x=0

rc.y=0

vc.x=5.0/(26**0.5)

vc.y=5.0/(26:

l:

*0.5)*5

va.x=v*2.0/(5**0.5)

va.y=v*(-1.0)/(5**0.5)

d匚x=ra.x

dr.y=ra.y

dowhile(norm(dr)>l)rc.x=rc.x+vc.xrc.y=rc.y+vc.y*t

ra.x=ra.x+va.x*t

ra.y=ra.y+va.y*t

dr.x=ra.x-rc.x

di;y二ra.y・rc・y

vc.x=5*dr.x/(norm(dr))

vc.y=5*d匚y/(norm(dr))

enddo

endsubroutinesubl

endmoduleprogrammain

usemodule1

implicitnone

v=0

print*;小孩的速度应为

ra.x=10

ra.y=50

dowhile(ra.x<60.0)v=v+0.1

ra.x=10

ra.y=50

callsubI(v,ra)

write(*,*)v,ra.x

enddo

write(*,*)v

end

判断闰年

subroutinesubl(p)

implicitnone

integer.target:

:

p

integer,pointer:

:

a

integeri

if(mod(p,400)==0.or.mod(p,100)/=0.and.mod(p,4)==0)then!

事实证明这么写是正确的

a=>p

print*,a

endifendsubroutine

programmainimplicitnoneintegeriintegertarget:

:

pdop=1900,2008callsubl(p)enddo

endprogrammai

最大公约数

!

辗转相除法

PROGRAMMAIN

IMPLICITNONE

INTEGERM,N

PRINT*,”请输入两个正整数“read*,M,N

print*,他们的最大公约数为

print*,F(M,N)

contains

FUNCTIONF(M,N)integerM,N,F,I,P1=1

IF(M

P=M

M=N

N=P

ENDIF

DOWHILE(I/=0)

I=MOD(M,N)

M=N

N=I

ENDDO

F=M

ENDFUNCTION

ENDPROGRAM

!

秦九韶算法

PROGRAMMAIN

IMPLICITNONE

INTEGERM,N

PRINT*,”请输入两个正整数“read*,M,N

print*,他们的最大公约数为

print*,F(M,N)contains

FUNCTIONF(M,N)integerM,N,F,I,P1=1

DOWHILE(I/=0)

IF(M

P=M

M=N

N=P

ENDIF

I=M-N

梯形积分moduleintegralimplicitnoneintegernreala,b

containsfunctions(n,a,b)

integern

reala,b

integeri

reals,h

h=(b-a)/n

s=0

doi=l,n,l

s=s+(f(a+h*(i-l))+f(a+h*i))/2*henddoendfunctionfunctionf(x)

realx,f

f=cxp(x)

endfunction

endmoduleintegralprogrammainuseintegralimplicitnone

write(*,*)”被积函数f=eAx,请输入积分下限a,与积分上限b:

nread*,a,b

write(*,*)"i#输入n,"

rcad*,n

print*,"积分结果为:

”,s(n,a,b)

endprogrammain

用幕级数近似计算

PROGRAMMAIN

IMPLICITNONE

REAL(8)X,SIN,A

READ*,X

CALLISIN(X,S1N,A)

PRINT*,SIN

ENDPROGRAM

SUBROUTINEISIN(X,SIN,A)

IMPLICITNONE

REAL(8)SIN,X,A

INTEGERI

1=0

SIN=X!

明确累加从何开始

A=X

DOWHILE(ABS(A)>=0.0000006)

1=1+1

A=A*(-1)*X*X/(I*2+1)/(2*I)

SIN二SIN+A

ENDDO

ENDSUBROUTIN

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 学科竞赛

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1