您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 工程分析程序设计上机作业Fortran部分1
工程分析程序设计上机作业(二)模块化编程(1)上机目的:掌握内部例程、主程序、外部例程、接口块、模块等功能的使用方法。1、有一个六边形,求其面积。为求面积,作了3条辅助线。如图所示:(提示,三角形面积=()()()ssasbsc,其中2abcs,a、b、c为三个边长)。要求用内部函数来实现。l1=10l2=20l3=18l4=15l5=21l6=14l7=30l8=36l9=28PROGRAMMAINIMPLICITNONEREAL::L1=10,L2=20,L3=18,L4=15,L5=21,L6=14,L7=30,L8=36,L9=28REALFF=AREA(L5,L6,L9)+AREA(L1,L8,L9)+AREA(L2,L7,L8)+AREA(L3,L4,L7)PRINT*,FCONTAINSFUNCTIONAREA(A,B,C)REALS,A,B,C,AREAS=(A+B+C)/2AREA=SQRT(S*(S-A)*(S-B)*(S-C))ENDFUNCTIONEND2、使用牛顿法求解以下方程的根:(要求用外部子程序)2410xxPROGRAMMAINIMPLICITNONEREALF,DFEXTERNALGENCALLGEN(F,DF)ENDSUBROUTINEGEN(F,DF)IMPLICITNONEREAL::X=0REALF,DFINTEGER::N=0INTEGER::MaxN=100REAL::Eps=1.0E-6F=X**2+4*X+1DF=2*X+4DOWHILE(ABS(F)Eps.AND.NMaxN)X=X-F/DFN=N+1F=X**2+4*X+1DF=2*X+4ENDDOIF(F=Eps)THENPRINT*,'ANSWERIS',XELSEPRINT*,'NOANSWER'ENDIFENDSUBROUTINE432765430xxxxPROGRAMMAINIMPLICITNONEREALF,DFEXTERNALGENCALLGEN(F,DF)ENDSUBROUTINEGEN(F,DF)IMPLICITNONEREAL::X=0REALF,DFINTEGER::N=0INTEGER::MaxN=100REAL::Eps=1.0E-6F=7*X**4+6*X**3-5*X**2+4*X+3DF=28*X**3+18*X**2-10*X+4DOWHILE(ABS(F)Eps.AND.NMaxN)X=X-F/DFN=N+1F=7*X**4+6*X**3-5*X**2+4*X+3DF=28*X**3+18*X**2-10*X+4ENDDOIF(F=Eps)THENPRINT*,'ANSWERIS',XELSEPRINT*,'NOANSWER'ENDIFENDSUBROUTINE3、编写一个子例程子程序,SUM(S,T,N1,N2)。把整型数N1到N2进行求和,并把求和的结果放置到S,把整型数N1到N2进行求积,并把求积的结果放置到T。并用这个子程序来计算(1234)(345678)(3*4*5*6)(1*2*3)yPROGRAMMAINIMPLICITNONEINTEGERN1,N2,S,T,A1,A2,A3,A4,YPRINT*,'请输入N1,N2:'READ*,N1,N2CALLSUM(S,T,N1,N2)A1=SPRINT*,'请输入N1,N2:'READ*,N1,N2CALLSUM(S,T,N1,N2)A2=SPRINT*,'请输入N1,N2:'READ*,N1,N2CALLSUM(S,T,N1,N2)A3=TPRINT*,'请输入N1,N2:'READ*,N1,N2CALLSUM(S,T,N1,N2)A4=TY=A1+A2+A3-A4PRINT*,'Y=',YENDSUBROUTINESUM(S,T,N1,N2)IMPLICITNONEINTEGERS,T,N1,N2,IS=0T=1DOI=N1,N2S=S+IT=T*IENDDOEND4、编写一个模块程序,提供以下服务:定义出常量、e。定义出子程序,实现求和21nin、求阶乘n!。并在主程序中计算如下结果:从键盘上输入整数n、实型数A、R、R0,求21!ninn(实型)和0202nnRRAnReRR(实型)5、MODULECX6、IMPLICITNONE7、REAL,PARAMETER::PI=3.1415926,E=2.7188、CONTAINS9、FUNCTIONADD(N)10、IMPLICITNONE11、INTEGERI,N,ADD12、ADD=113、DOI=2,N14、ADD=ADD+I15、ENDDO16、ENDFUNCTION17、FUNCTIONCJ(N)18、IMPLICITNONE19、INTEGERI,N,CJ20、CJ=121、DOI=1,N22、CJ=CJ*I**223、ENDDO24、ENDFUNCTION25、ENDMODULE26、PROGRAMMAIN27、USECX28、IMPLICITNONE29、INTEGERN30、REALA,R,R0,D,F31、PRINT*,'请输入n,A,R,R0'32、read*,N,A,R,R033、PRINT*,ADD(N)34、PRINT*,CJ(N)35、D=CJ(N)/ADD(N)36、F=A*N/(2*PI*R**2)*(R/R0)**N*E**(-1*(R/R0)**N)37、PRINT*,D,F38、END工程分析程序设计上机作业(三)模块化编程(2)上机目的:进一步掌握内部例程、外部例程、接口块、模块等功能的使用方法。练习例程重载、例程递归的使用方法。1、利用例程重载编写一个子程序求余数ACR(A,B)。要求,对两个整型数和两个实型数都有效(实型数相除的余数:两个实型数相除后的商仍然取一个整数,但剩余值小于除数)[不能用Fortran的内部函数MOD(x,y)]。MODULEModIMPLICITNONEINTERFACEACRMODULEPROCEDUREACRREALSENDINTERFACECONTAINSSUBROUTINEACRREALS(A,B,C)IMPLICITNONEREALA,BINTEGERCDOWHILE(AB)A=A-BENDDOC=AENDSUBROUTINEENDMODULEPROGRAMMAINUSEModIMPLICITNONEREALA,BINTEGERCPRINT*,'请输入A,B的值:'READ*,A,BCALLACR(A,B,C)PRINT*,'A和B的余数是:',CENDPROGRAM2、编写函数子程序GDC求两个数的最大公约数。求最大公约数的算法如下:把两个数中大的那个数作为被除数,两数相除得到一个余数。把余数去除除数得到新一轮的余数。不断重复这一过程直到余数为0,这时的除数就是两个数的最大公约数。调用此函数,求1260,198,72三个数的最大公约数。programmainimplicitnoneintegera,b,c,i,j,kprint*,'请输入要求的数:a,b,c'read*,a,b,ci=gdc(a,b)j=gdc(b,c)k=gdc(i,j)print*,kcontainsfunctiongdc(a,b)implicitnoneintegera,b,c,d,gdcif(ba)thend=aa=bb=dendifc=mod(a,b)dowhile(c0)a=bb=cc=mod(a,b)enddogdc=bendfunctionend3、编写一个函数子程序求sinh(x),以下分三个步骤完成:(1)用递归算法,求出1!1!nnxxxnnn;(2)自行编程求出234012!3!4!!nxnxxxxexn,要求计算精度是610!nxn[不能用Fortran的内部函数EXP(x)];(3)计算sinh()2xxeex。PROGRAMMAINIMPLICITNONEINTEGERN,XREALMPRINT*,'请输入X值:'READ*,XM=SINH(X)PRINT*,'SINH(X)=',MCONTAINSFUNCTIONSINH(X)IMPLICITNONEINTEGERI,X,NREALA,B,C,SINHI=1A=X/IDOWHILE(A1.0E-6)C=1+AI=I+1A=A*(X/I)ENDDOSINH=(C-(1/C))/2ENDFUNCTIONEND4、编写一程序用Euler法求解微分方程22dyyxdx,当x=0时,y=1.0。试求出x=0.1,0.2,0.3,0.4….,1.0时的y值。算法如下:Euler法求解))(,('xyxfy,定解条件:00,yyxx。取向前差分,令11'()nnyyyh,nnxxh1得)(),(*21hOyxfhyynnnnnyyyxfyyxfyyxx21110000),(,),(PROGRAMMAINIMPLICITNONEREALX,YINTEGERIY=1.0X=0DOI=1,10Y=Y+0.1*(Y*Y-X*X)X=X+0.1PRINT*,'X=',X,'Y=',YENDDOEND工程分析程序设计上机作业(四)结构化编程上机目的:练习使用选择结构和循环结构编制程序。1、求y值,x由键盘输入。2320101102012030xxyxxxxxPROGRAMMAINIMPLICITNONEREALX,YPRINT*,'请输入X值'READ*,XIF(X=0.AND.X10)THENY=XELSEIF(X=10.AND.X20)THENY=X**2+1ELSEIF(X=20.AND.X30)THENY=X**3+X**2+1ELSEPRINT*,'X不在取值范围内'ENDIFPRINT*,'Y值为:',YEND2、输入4个数A,B,C,D,按由大到小的顺序打印出来。PROGRAMMAINIMPLICITNONEREALA,B,C,D,TREAL::E(4)INTEGERI,JPRINT*,'请输入四个数:'READ*,A,B,C,DE(1)=AE(2)=BE(3)=CE(4)=DDOI=1,3DOJ=I+1,4IF(E(I)E(J))THENT=E(I)E(I)=E(J)E(J)=TENDIFENDDOENDDOPRINT*,EEND3、编写一个子程序,判断一个整数是否素数。PROGRAMMAINIMPLICITNONEINTEGERX,SSPRINT*,'请输入一个整数:'READ*,XCALLSUSHU(X,SS)CONTAINSSUBROUTINESUSHU(A,SS)IMPLICITNONEINTEGERI,A,B,SS,KK=0DOI=2,A-1B=MOD(A,I)IF(B==0)THENK=K+1ENDIFENDDOIF(K==0)THENPRINT*,'是素数'ELSEPRINT*,'不是素数'ENDIFENDSUBROUTINEEND4、利用上一编程结果,对1000以内的所有偶数验证哥德巴赫猜想。即:对于大于2的任一偶数,先分解为两个奇数之和,然后验证第一个奇数是否素数,如果是,再验证第二个奇数是否素数,如果两个奇数都是素数,则输出结果。(要求给出所有把偶数分解成两个素数之和的等式)。并统计,每个偶数可以分解的等式个数(两个素数互换位置的不算一个独立的结果),研究随着偶数增大,分解的等式个数的变化规律。PROGRAMMAINIMPLICITNONEINTEGERI,x,y,SS,NDOI=2,1000,2N=0DOX=1,I/2,2Y=I-XCALLSUSHU(X,SS)IF(SS==0)THENCALLSUSHU(Y,SS)IF(SS==0)THENPRINT*
三七文档所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
本文标题:工程分析程序设计上机作业Fortran部分1
链接地址:https://www.777doc.com/doc-4520634 .html