fortran程序实例
- 格式:docx
- 大小:719.42 KB
- 文档页数:5
1.Fibonacci数列定义如下:F1=1F2=1Fn=Fn-1+Fn-2(n>2)求Fibonacci数列的前30项。
integer f(30),if(1)=1f(2)=2do i=3,30f(i)=f(i-1)+f(i-2)enddoprint*,fend2.输入10个学生的总分,求每个学生的名次integer s(10),a(10),i,jdo i=1,10read*,s(i)enddodo i=1,10a(i)=1do j=1,10if(s(i)<s(j))a(i)=a(i)+1enddoenddodo i=1,10print*,s(i),a(i)enddoend3.给定一组数,按照从小到大的顺序输出。
integer a(10)integer pdo i=1,10read *,a(i)enddodo j=1,9p=jdo i=j+1,10if (a(i)<a(p))p=ienddoif (p/=j) thent=a(p);a(p)=a(j);a(j)=tendifenddoprint *,(a(i),i=1,10)end4.输入若干名学生的学号和三门课程(语数英)的成绩,要求从键盘输入一个学生的学号,能打印出该学生的三门功课成绩和总分。
character*6,dimension(:),allocatable::xueinteger,dimension(:,:),allocatable::ginteger,dimension(:),allocatable::zonginteger i,j,ncharacter*6,xhprint *,"请输入学生的个数"read *,nallocate(xue(n))allocate(g(n,3))allocate(zong(n))do i=1,nread *,xue(i),(g(i,j),j=1,3)enddodo i=1,nzong(i)=0do j=1,3zong(i)=zong(i)+g(i,j)enddoenddoprint *,"请输入你要打印的学生的学号"read *,xhdo i=1,nif(xue(i)==xh)thenprint *,(g(i,j),j=1,3),zong(i)exitendifenddoend5.编写一个函数子程序计算所输入两个整数m、n的最大公约数。
1) 实例3 —求多个半径下的圆周长 ! z3.f90 --Fortran95 FUNCTIONS:-Entry point of con sole application.I*************************************************************************PROGRAM: z3PURPOSE: En try point for the con sole applicati on.I************************************************************************program z3 !求多个半径下的圆周长 !主程序! PROGRAM Z3PRINT *, 'R=',1.2,'C=',C(1.2) PRINT *, 'R=',3.4,'C=',C(3.4) PRINT *, 'R=',15.6,'C=',C(15.6) PRINT *, 'R=',567.3,'C=',C(567.3) END program z3 !子程序FUNCTION C(R) PI=3.1415926 C=2*PI*R RETURN ! Body of z3 endz3•■Alta• JSwFta.■■ TTjn* FMIIH-.T jd - |叭■(Lld4ilh■ Hi li tii.IW M H MvfriiMfeai Iwi Ji JJII+M4Tml+n««I*界rFHtlE- HfrtpliK * W mita itflLuLfl-PRINT* ,'以上为计算机的计算结果,注意 B 的值'ZXZ I O.f90 FUNCTIONS: ZXZ_I_O- Entry point of con sole applicati on.PROGRAM: ZXZ_I_OPURPOSE: En try point for the con sole applicati on.program ZXZ_I_O implicit none!变量声明的位置INTEGER(2) i; INTEGER(4) j; INTEGER(4) m; REAL n INTEGER A,B PRINT*,'输入整数 A'; READ*, A PRINT*,'输入整数 B'; READ*, B B=A+BWRITE(*,*) 'A*B=',A*B实例4 —键盘与显示器输入/输出2)a) Fortra n 基本操作1 B Li PlLu- i \ JfiL ■ I■' hi -IJBL . n :»'匹:"b )程序指令BIE1A J~. C ■* «I*************** 输入、输出样式种种 **************************!系统默认的输出样式 PRINT* ,'系统默认的输出样式' !人为控制的的输出样式--格式化输出 i=21; j=53; m=5 n=(i+j*m*i**m) WRITE(*,*) 'i,j,m 是常量,程序赋初值PRINT*, i,j,m WRITE(*,*) 'i,j,m 的计算结果:'PRINT*,'i+j*m*i**m=' ,nPRINT* ,''! Body of ZXZ_I_O end program ZXZ_I_O 程序说明: 程序赋值一初始化 i=21; j=53; m=5 键盘无格式输入 READ*, A 键盘有格式输入 READ ( *, 100)A,B,C 100 FORMA T( 2F5.2,F5.3) 显示器无格式输出PRINT* ,'系统默认的输出样式' WRITE(*,*) 'A*B=',A*B 显示器有格式输出 PRINT 100 ,A+B WRITE(*,100) 'A*B=',A*B 100 FORMA T( F5.2)C )调试运行d )程序指令pruqrdiri ZX2_l_0 iflnpllclt iioiiv 陝量声明的立置IHTEGERfZ) i; IMTEGEimi ]; IHTEGER(^)叭 REAL nA.B I Uairidbles■HIKE J 播入整該■打1E.D 屯A PRINT •,-KM«a■ e-fltBFHJHIv T -H-Ai-B-1 ,ti' Axb- 1 T A I UHU NA 「臥存为计負机药计貝韭呆*妊憲L1的低・1-21; j-b3;«R[TEC-,«) l,j,n 是常最.程序Itt 前值・FHIHTa, 1 J ,■WR1TF(-F -J l p j,n 的tt 幣结黑,.FHim* /■r u 讪o#畑」」Ffirl prnni'an ZK? I o! ZXZ丄O.f90! FUNCTIONS:ZXZ_I_O - Entry point of con sole applicati on.PROGRAM: ZXZ_I_OPURPOSE: En try point for the con sole applicati on.1 *************** 输^入 ^输出样式种不中program ZXZ_I_Oimplicit none!变量声明的位置INTEGER(2) i; INTEGER(4) j; INTEGER(4) m; REAL nINTEGER A,BREAL X,Y ,Z ! VariablesPRINT*,'输入整数A'; READ*, APRINT*,'输入整数B'; READ*, B PRINT*,'计算结果为:'B=A+BPRINT*,'B=A+B=',BWRITE(*,*) 'A*B=',A*BPRINT* ,'以上为计算机的计算结果,注意B的值'!系统默认的输出样式PRINT* ,'系统默认的输出样式'PRINT*,'输入实数X'; READ(*,100) XPRINT*,'输入实数Y:READ(*,100) Y100 FORMA T(F5.2)PRINT*,'计算结果为:'Z=X+YPRINT 200,Z200 FORMA T(4X,'Z=X+Y=',F8.3)WRITE(*,*)WRITE(*,300) X*Y300 FORMA T(4X,'Z=X*Y=',F8.3)!人为控制的的输出样式--格式化输出PRINT* ,'程序为常量赋了初值'i=21; j=53; m=5n=(i+j*m*i**m)WRITE(*,*) 'i,j,m 是常量,程序赋初值PRINT*, i,j,mWRITE(*,*) 'i,j,m 的计算结果:'PRINT*,'i+j*m*i**m=' ,nPRINT* ,' '! Body of ZXZ_I_Oend program ZXZ_I_Oe)调试运行rRIHT* JPRTNi*. ■讦薛结果为.・ E^A*BPRTNT*,,R=A+R=,,8 URrfEfw,*) 'ft-D-1t A-DPRINT * J 以上药i1■宴利的iT 畀结果.傢金默认囱馥出择畫PRINT*「系唏默认册葆出样式・ 阳IHH. •揃扎斓 W : WIHZJ 输入宪数V;1B0 F0RHAKF5.2)PRINT -,■廿尊结杲为FREAD(*,1ua ) K R 匚flD(*,100) VPRINT 2Q0左2(JU FUKMfil(4i(t ; = «+/= \FB »J) unrrEf*.*)WRITE(*r 30O) X*V FORMfiT(UX /? = X*V=* ,F8 .3}认为扌前函的输世#戎一逼占化输出PRTHT- ”囉序対常豊瓯了初值・ i^Z» i j=53;I1=5 n=(i +j*m*i**n)WRITEf"^) 'i t j t n 是常量,程序赋初值 PRTHTw, i r j F nMRlTEe 』)・i J,n 的计具结衆:,PRI HI*.'i+j *R*i**m=',n。
对于FORTRA的初学者。
这些例子可作为小练习1.例题:计算工资问题。
每小时工资为RATE如果工作超过40小时,加班呢部分工资是正常时间工资的1.5倍。
C Payroll with overtimeprogram payrollreal rate, hours, payread (*,*) rate, hoursif (hours>40) thenpay=40*rate+(hours-40)*1.5*rateelsepay=hours*rateEND IFprint *, "rate=" , rateprint *, "hours=" , hoursprint *, "pay=" ,payend2•学生成绩问题。
大于80为A级。
大于60小于80为B级。
小于60为C级。
IF的嵌套。
注意空格可以看清楚else if ,e nd if,pri nt 的内容•PROGRAGRADESTUDENTREA0GRADEIF (GRADE .GE. 80) THENPRINT*,GRADE, "GRADE=>A"ELSEIF (GRADELT.60) THENPRINT*,GRADE"GRADE=>C"ELSEPRINT*,GRADE"GRADE=>B"END IFEND IFEND3. 三个数按从小到大排序。
PROGRA M AXMINREALA,B,C,TREA0A,B,CIF (A.GT.B) THENT=AA=BB=TELSEEND IFIF (B.GT.C) THENT=BB=CC=TELSEEND IFIF (A.GT.B) THENT=AA=BB=TEND IFPRINT*,A,B,CEND4. 运用EISE IF语句。
重做例子2PROGRAM2READ*,*) GRADEIF (GRADE .GE. 80.0) THENPRINT*, GRADE, "=>A"ELSE IF(GRADE .GE. 70.0) THENPRINT*, GRADE, "=>B"ELSE IF(GARDE .GE. 60.0) THENPRINT*, GRADE, "=>C"ELSEPRINT*, GARDE, "=>D"END IFEND3x 6,x 05. 计算y 2x 2x 8,x 0PROGRAEQUATIONREAD*,*) XIF (X .GE. 0.0) Y=3*X+6IF (X .LT. 0.0) Y=-X**2+2*X-8PRINT*, "X=" ,X, "Y=" ,YEND6. CONTINUED句。
fortran debug案例
Fortran是一种程序设计语言,其用途广泛,在科学计算和工程领域使用较多。
在编写Fortran程序时,调试是非常重要的,以下是一个Fortran调试的案例。
假设我们有一个Fortran程序,用于计算给定数组的平均值。
然而,当我们运行这个程序时,得到的结果并不正确。
我们需要进行调试来找到问题所在。
首先,我们可以检查程序中的算法。
可以通过在代码中添加打印语句来跟踪程序的执行。
例如,我们可以在计算平均值之前打印出数组的值,以确保数组中的数据正确无误。
其次,我们可以检查数组的大小是否与程序的预期相匹配。
如果数组的大小不正确,程序可能会访问无效的内存位置,导致错误的结果。
在这种情况下,我们需要仔细检查数组的定义和传递给计算平均值函数的参数。
此外,我们还可以使用调试工具来进一步分析程序。
例如,我们可以使用gdb或者Ddt来调试Fortran程序。
这些调试工具可以帮助我们在程序运行时跟踪变量的值,执行代码的流程,并定位错误所在的位置。
最后,一些常见的Fortran调试技巧包括:
1. 使用正确的输出格式打印变量值,以检查其值是否正确。
2. 检查循环和条件语句的逻辑,确保程序按照预期的方式执行。
3. 检查程序中的错误处理机制,例如数组越界或除以零等情况。
总之,Fortran调试是找出程序错误的关键步骤。
通过仔细检查代码逻辑、打印变量值、使用调试工具以及遵循常见的调试技巧,我们可以快速有效地找到问题所在,并修复程序中的错误。
fortran77程序设计pdf
Fortran 77 是一种老旧的编程语言,主要用于科学计算。
以下是一个简单的Fortran 77 程序示例,用于计算斐波那契数列的第n 项:
```fortran
PROGRAM FIBONACCI
IMPLICIT NONE
INTEGER N, F1, F2, FN
INTEGER I
PARAMETER (N = 10)
DATA F1, F2 /0, 1/
DO I = 1, N
PRINT *, F1, F2
FN = F1 + F2
F1 = F2
F2 = FN
END DO
END PROGRAM FIBONACCI
```
该程序首先定义了几个整数变量N、F1、F2 和FN,然后使用PARAMETER 语句将N 设置为10。
接下来,程序使用DATA 语句初始化F1 和F2 为斐波那契数列的前两项0 和1。
然后,程序使用DO 循环迭代N 次,每次迭代中输出F1 和F2 的值,计算下一项FN,然后更新F1 和F2 的值。
最后,程序使用END PROGRAM 语句结束。
需要注意的是,Fortran 77 的语法比较繁琐,不支持现代编程语言的许多特性,如变量名中不能包含空格、不支持注释等。
因此,建议使用更现代的Fortran 版本进行编程。
FORTRAN95程序设计实验FORTRAN95的基本语法包括变量定义、注释、循环和条件判断等。
在FORTRAN95中,变量可以通过关键字"INTEGER"、"REAL"和"CHARACTER"等进行定义。
例如,以下语句定义了一个整型变量A和一个浮点型变量B:INTEGER::AREAL::B注释可以通过用一个感叹号(!)开头进行标识。
例如:!这是一个注释循环可以使用关键字"DO"和"ENDDO"来实现。
例如,以下代码展示了一个简单的循环,计算了1到10的和:INTEGER::I,SUMSUM=0DOI=1,10SUM=SUM+IENDDO条件判断可以使用关键字"IF"、"THEN"、"ELSE"和"ENDIF"来实现。
例如,以下代码展示了一个简单的条件判断,判断一个数是否为正数:INTEGER::NUMREAD(*,*)NUMIF(NUM>0)THENPRINT*,"该数为正数"ELSEPRINT*,"该数为非正数"ENDIF在FORTRAN95中,还有其他的语法和特点,如数组、函数、子程序等。
下面的实例将展示如何使用FORTRAN95编写一个计算圆面积和周长的程序。
PROGRAM CircleREAL :: PI, R, Area, CircumferencePRINT*,"请输入半径:"READ(*,*)RArea = PI * R**2Circumference = 2 * PI * RPRINT *, "圆的面积为:", AreaPRINT *, "圆的周长为:", CircumferenceEND PROGRAM Circle以上程序首先定义了一个实数变量PI、半径R、面积Area和周长Circumference。
有限元编程算例(Fortran)本程序通过Fortran语言编写,程序在Intel Parallel Studio XE 2013 with VS2013中成功运行,程序为《计算力学》(龙述尧等编)一书中的源程序,仅作研究学习使用,省去了敲写的麻烦.源程序为:!Page149COMMON/X1/NJ,NE,NZ,NDD,NPJ,IND,NJ2,EO,UN,GAMA,TE,AECOMMON/X2/JM(100,3),NZC(50),CJZ(100,2),PJ(100,2),B(3,6),D(3,3),S(3,6),TKZ(200,20),EKE(6,6),P(200)OPEN(5,FILE=’DATAIN’)!OPEN(6,FILE=’DATAOUT’,STATUS=’NEW')CALL DATAIF(IND.EQ.0)GOTO 10EO=EO/(1.0—UN*UN)UN=UN/(1。
0—UN)10 CALL TOTSTICALL LOADCALL SUPPORCALL SOLVEQCALL STRESSPAUSE!STOPENDSUBROUTINE DATACOMMON/X1/NJ,NE,NZ,NDD,NPJ,IND,NJ2,EO,UN,GAMA,TE,AECOMMON/X2/JM(100,3),NZC(50),CJZ(100,2),PJ(100,2),B(3,6),D(3,3),S(3,6),TKZ(200,20),EKE(6,6),P(200)READ(5,*)NJ,NE,NZ,NDD,NPJ,INDNJ2=NJ*2NPJ1=NPJ+1READ(5,*)EO,UN,GAMA,TEREAD(5,*)((JM(I,J),J=1,3),I=1,NE)READ(5,*)((CJZ(I,J),J = 1,2),I=1,NJ)!Page150READ(5,*)(NZC(I),I=1,NZ)READ(5,*)((PJ(I,J),J=1,2),I=1,NPJ1)WRITE(6,10)(I,(CJZ(I,J),J=1,2),I=1,NJ)10 FORMA T(4X,2HNO,6X,1HX,6X,1HY/(I6,2X,F7。
fortran语言并行计算程序Fortran是一种编程语言,用于科学和工程计算。
Fortran语言中可以使用并行计算来加速程序的执行。
以下是一个简单的Fortran并行计算程序的示例:```fortranprogram parallel_program! 使用OpenMP库启用并行计算use omp_libimplicit noneinteger :: iinteger, parameter :: N = 1000000real :: x(N), y(N), z(N)! 初始化数组x = 1.0y = 2.0! 使用并行循环计算!$omp parallel dodo i = 1, Nz(i) = x(i) + y(i)end do! 打印部分结果do i = 1, 10print *, z(i)end doend program parallel_program```在上面的示例中,使用OpenMP库来启用并行计算。
通过添加`use omp_lib`语句,可以在程序中使用OpenMP的并行化指令。
在循环计算的部分,使用了`!$omp parallel do`指令,它告诉编译器这个循环可以并行执行。
这样,循环中的每个迭代都可以在不同的处理器上并行执行。
在这个示例中,数组`x`和`y`被初始化为 1.0和2.0。
然后,使用并行循环计算数组`z`的每个元素,将`x`和`y`对应位置的元素相加。
通过循环打印了数组`z`的前10个元素。
请注意,实际的并行计算程序可能需要更复杂的逻辑和更多的并行化指令,具体取决于问题的性质和计算的需求。
上述示例只是一个简单的示例,用于说明Fortran中的并行计算的基本概念。
题目:《FORTRAN语言》算例程序专业:班级:学号:姓名:时间:目录1.平面深梁有限元前处理信息生成1.1深梁有限元模型(3)1.2源程序(3)1.3输出结果和分析(4)2.矩阵求逆子程序调试2.1子程序源程序(9)2.2考题(11)2.2.1主程序(11)2.3考题及验证(11)1.平面深梁有限元前处理信息生成1.1深梁有限元模型16117176 81 每个小方格长和宽都为0.25。
1.2源程序c programdimension xy(85,2),ijk(128,3)open(1,file="xyijk.dat",status="unknown")do i=1,17do j=1,5m=(i-1)*5+jxy(m,1)=0.25*(i-1)xy(m,2)=0.25*(j-1)end doend dodo i=1,85write(1,*) i, (xy(i,j),j=1,2)end dodo i=1,16do j=1,4ns=8*(i-1)+jnx=ns+4ijk(ns,1)=(i-1)*5+jijk(ns,2)=ijk(ns,1)+6ijk(ns,3)=ijk(ns,1)+1ijk(nx,1)=ijk(ns,1)ijk(nx,2)=ijk(ns,1)+5ijk(nx,3)=ijk(ns,1)+6end doend dodo i=1,128write(1,*) i, (ijk(i,j),j=1,3)end doclose(1)end1.3输出结果及分析1 0.000000E+00 0.000000E+002 0.000000E+00 2.500000E-013 0.000000E+00 5.000000E-014 0.000000E+00 7.500000E-015 0.000000E+00 1.0000006 2.500000E-01 0.000000E+007 2.500000E-01 2.500000E-018 2.500000E-01 5.000000E-019 2.500000E-01 7.500000E-0110 2.500000E-01 1.00000011 5.000000E-01 0.000000E+0012 5.000000E-01 2.500000E-0113 5.000000E-01 5.000000E-0114 5.000000E-01 7.500000E-0115 5.000000E-01 1.00000016 7.500000E-01 0.000000E+0017 7.500000E-01 2.500000E-0118 7.500000E-01 5.000000E-0119 7.500000E-01 7.500000E-0121 1.000000 0.000000E+0022 1.000000 2.500000E-0123 1.000000 5.000000E-0124 1.000000 7.500000E-0125 1.000000 1.00000026 1.250000 0.000000E+0027 1.250000 2.500000E-0128 1.250000 5.000000E-0129 1.250000 7.500000E-0130 1.250000 1.00000031 1.500000 0.000000E+0032 1.500000 2.500000E-0133 1.500000 5.000000E-0134 1.500000 7.500000E-0135 1.500000 1.00000036 1.750000 0.000000E+0037 1.750000 2.500000E-0138 1.750000 5.000000E-0139 1.750000 7.500000E-0140 1.750000 1.00000041 2.000000 0.000000E+0042 2.000000 2.500000E-0143 2.000000 5.000000E-0144 2.000000 7.500000E-0145 2.000000 1.00000046 2.250000 0.000000E+0047 2.250000 2.500000E-0148 2.250000 5.000000E-0149 2.250000 7.500000E-0150 2.250000 1.00000051 2.500000 0.000000E+0052 2.500000 2.500000E-0153 2.500000 5.000000E-0154 2.500000 7.500000E-0155 2.500000 1.00000056 2.750000 0.000000E+0057 2.750000 2.500000E-0158 2.750000 5.000000E-0159 2.750000 7.500000E-0160 2.750000 1.00000061 3.000000 0.000000E+0062 3.000000 2.500000E-0163 3.000000 5.000000E-0165 3.000000 1.00000066 3.250000 0.000000E+0067 3.250000 2.500000E-0168 3.250000 5.000000E-0169 3.250000 7.500000E-0170 3.250000 1.00000071 3.500000 0.000000E+0072 3.500000 2.500000E-0173 3.500000 5.000000E-0174 3.500000 7.500000E-0175 3.500000 1.00000076 3.750000 0.000000E+0077 3.750000 2.500000E-0178 3.750000 5.000000E-0179 3.750000 7.500000E-0180 3.750000 1.00000081 4.000000 0.000000E+0082 4.000000 2.500000E-0183 4.000000 5.000000E-0184 4.000000 7.500000E-0185 4.000000 1.0000001 1 7 22 2 8 33 3 9 44 4 10 55 16 76 27 87 3 8 98 4 9 109 6 12 710 7 13 811 8 14 912 9 15 1013 6 11 1214 7 12 1315 8 13 1416 9 14 1517 11 17 1218 12 18 1319 13 19 1420 14 20 1521 11 16 1722 12 17 1824 14 19 2025 16 22 1726 17 23 1827 18 24 1928 19 25 2029 16 21 2230 17 22 2331 18 23 2432 19 24 2533 21 27 2234 22 28 2335 23 29 2436 24 30 2537 21 26 2738 22 27 2839 23 28 2940 24 29 3041 26 32 2742 27 33 2843 28 34 2944 29 35 3045 26 31 3246 27 32 3347 28 33 3448 29 34 3549 31 37 3250 32 38 3351 33 39 3452 34 40 3553 31 36 3754 32 37 3855 33 38 3956 34 39 4057 36 42 3758 37 43 3859 38 44 3960 39 45 4061 36 41 4262 37 42 4363 38 43 4464 39 44 4565 41 47 4266 42 48 4368 44 50 4569 41 46 4770 42 47 4871 43 48 4972 44 49 5073 46 52 4774 47 53 4875 48 54 4976 49 55 5077 46 51 5278 47 52 5379 48 53 5480 49 54 5581 51 57 5282 52 58 5383 53 59 5484 54 60 5585 51 56 5786 52 57 5887 53 58 5988 54 59 6089 56 62 5790 57 63 5891 58 64 5992 59 65 6093 56 61 6294 57 62 6395 58 63 6496 59 64 6597 61 67 6298 62 68 6399 63 69 64 100 64 70 65 101 61 66 67 102 62 67 68 103 63 68 69 104 64 69 70 105 66 72 67 106 67 73 68 107 68 74 69 108 69 75 70 109 66 71 72 110 67 72 73111 68 73 74112 69 74 75113 71 77 72114 72 78 73115 73 79 74116 74 80 75117 71 76 77118 72 77 78119 73 78 79120 74 79 80121 76 82 77122 77 83 78123 78 84 79124 79 85 80125 76 81 82126 77 82 83127 78 83 84128 79 84 852.矩阵求逆子程序调试2.1子程序源程序SUBROUTINE gjcp(A,N)integer Nreal A(N,N) !存放矩阵AINTEGER IP(N) !记录主列号REAL P !工作单元,放主元INTEGER I0,R !工作单元,放主列号EPS=0.001write(*,*)'gjcp ok0000000' DO K=1,NP=0I0=KIP(K)=KDO I=K,NIF(ABS(A(I,K)).GT.ABS(P))THENP=A(I,K)I0=IIP(K)=IENDIFENDDOIF(ABS(P).LE.EPS)THENWRITE(*,*)'DET=0'stop !后来加的GOTO 10ENDIFIF(I0.NE.K)THENDO J=1,NS=A(K,J)A(K,J)=A(I0,J)A(I0,J)=SENDDOENDIFA(K,K)=1./PDO I=1,NIF(I.NE.K)THENA(I,K)=-A(I,K)*A(K,K)DO J=1,NIF(J.NE.K)THENA(I,J)=A(I,J)+A(I,K)*A(K,J)ENDIFENDDOENDIFENDDODO J=1,NIF(J.NE.K)THENA(K,J)=A(K,K)*A(K,J)ENDIFENDDOENDDOwrite(*,*)'gjcp ok01'DO K=N-1,1,-1R=IP(K)IF(R.NE.K)THENDO I=1,NS=A(I,R)A(I,R)=A(I,K)A(I,K)=SENDDOENDIFENDDO10 write(*,*)'the end'END2.2考题1 1 2求矩阵-1 2 0 的逆矩阵。
fortran常用算法程序集Fortran是一种广泛用于科学和工程计算的编程语言。
由于其强大的数值计算能力,Fortran在许多领域,如物理、数学、工程和生物信息学中,仍然被广泛使用。
在Fortran中,有许多常用的算法可以用来解决各种计算问题。
下面是一些常用的Fortran算法程序集的示例。
1.冒泡排序算法```fortranPROGRAMBubbleSortIMPLICITNONEINTEGER,DIMENSION(:),ALLOCATABLE::arrINTEGER::i,j,tempALLOCATE(arr(10))!分配数组空间!填充数组数据arr=[9,8,7,6,5,4,3,2,1,0]DOi=1,SIZE(arr)-1DOj=i+1,SIZE(arr)IF(arr(j)>arr(j-1))THEN!交换相邻元素temp=arr(j)arr(j)=arr(j-1)arr(j-1)=tempENDIFENDDOENDDOPRINT*,"排序后的数组:"PRINT*,arr(:)ENDPROGRAMBubbleSort```这个程序使用冒泡排序算法对一个整数数组进行排序。
冒泡排序是一种简单的排序算法,通过重复地遍历要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。
这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。
2.二分查找算法```fortranPROGRAMBinarySearchIMPLICITNONEINTEGER::arr(10),low,high,found=0INTEGER::mid=0PRINT*,"请输入要查找的元素:"INPUT(INTEGER)::xlow=0high=SIZE(arr)-1DOWHILE(found==0)!直到找到元素或数组遍历完为止mid=(low+high)/2!计算中间位置IF(arr(mid)==x)THEN!如果中间元素等于要查找的元素,则找到found=1!设置found标志为1,表示找到元素ELSEIF(arr(mid)>x)THEN!如果中间元素大于要查找的元素,则在左半部分查找high=mid-1!将high指向中间元素的左边的位置ELSE!如果中间元素小于要查找的元素,则在右半部分查找low=mid+1!将low指向中间元素的右边的位置ENDIFENDDOIF(found==0)PRINT*,"元素未找到。
算例一计算简图及结果输出用平面刚架静力计算程序下图结构的内力。
各杆EA,EI相同。
已知:642EA=4.010KN,EI=1.610KN m⨯⨯•计算简图如下:(1)输入原始数据控制参数3,5,8,7,1,2(NE,NJ,N,NW,NPJ,NPF)结点坐标集结点未知量编号0.0,0.0,0,0,0 0.0,4.0,1,2,3 0.0,4.0,1,2,4 4.0,4.0,5,6,7 4.0,0.0,0,0,8单元杆端结点编号及单元EA、EI 1,2,4.0E+06,1.6E+04 3,4,4.0E+06,1.6E+04 5,4,4.0E+06,1.6E+04结点荷载7.0,-15.0非结点荷载1.0,2.0,2.0,-18.02.0,1.0,4.0,-25.0(2)输出结果NE= 3 NJ= 5 N= 8 NW= 7 NPJ= 1 NPF= 2 NODE X Y XX YY ZZ1 0.0000 0.0000 0 0 02 0.0000 4.0000 1 2 33 0.0000 4.0000 1 2 44 4.0000 4.000056 75 4.0000 0.0000 0 0 8ELEMENT NODE-I NODE-J EA EI1 12 0.400000E+07 0.160000E+052 3 4 0.400000E+07 0.160000E+053 54 0.400000E+07 0.160000E+05CODE PX-PY-PM7. -15.0000ELEMENT IND A Q1. 2. 2.0000 -18.00002. 1. 4.0000 -25.0000NODE U V CETA1 0.000000E+00 0.000000E+00 0.000000E+002 -0.221743E-02 -0.464619E-04 -0.139404E-023 -0.221743E-02 -0.464619E-04 0.357876E-024 -0.222472E-02 -0.535381E-04 -0.298554E-025 0.000000E+00 0.000000E+00 0.658499E-03ELEMENT N Q M1 N1= 46.4619 Q1= 10.7119 M1= -6.8477N2= -46.4619 Q2= 7.2881 M2= 0.00002 N1= 7.2881 Q1= 46.4619 M1= 0.0000N2= -7.2881 Q2= 53.5381 M2= 14.15233 N1= 53.5381 Q1= 7.2881 M1= 0.0000N2= -53.5381 Q2= -7.2881 M2= -29.1523算例二计算简图及结果输出用平面刚架静力计算程序下图结构的内力。
fortran90例子例1、输入M个实数,将其相加,并输出其和。
PROGRAM example_1Implicit noneInteger ::n,mReal ::t=0,a=0Read *,mDoRead *, aT=t+aN=n+1If (n>=m) exitEnd doPrint*,tEnd program example_1例2、求∑I!的阶乘(I=4,8)。
Function factor(n) result(fac_result) Implicit noneInteger ,intent(in)::nInteger,intent(out)::fac_resultInteger::IFac_result=1Do I=1,nFac_result=fac_result*IEnd doEnd function factorProgram example_2Implicit noneInteger ::factor,s=0,IDo I=4,8S=s+factor(i)End doPrint*,sEnd program example_2例3、输入一个数,判断他是否能被3整除,并输出相应的信息。
Program judgeImplicit noneInteger :: n,mRead*,nM=mod(n,3)Select case(m) IF (M= =0) THENCase (0)Print*,’yes’Print*,’YES’Case default ELSEPrint*,’no’Print*,’NO’End select END IFEnd program judge例4、判断一个整数N是否为素数PROGRAM primeImplicit noneInteger ::n,I,mRead*,nM= sqrt(real(n))Do I=2,mIf(mod(n,i)= =0) exitEnd doIf (I>m) thenPrint*,’yes’ElsePrin t*,’no’end ifend program prime例5、求N的阶乘PROGRAM example_5Implicit noneInteger::n,I=0,fac=1Read*,nDo while (I<7)I=I+1Fac=fac*IEnd doEnd program example_5例6、求出全部的水仙花数。
fortran cuda 示例以下是一个简单的Fortran CUDA示例,用于在GPU上执行矩阵乘法。
首先,我们需要定义一个Fortran程序,该程序将调用CUDA内核来执行矩阵乘法。
在这个例子中,我们将使用两个5x5的矩阵A和B,并将结果存储在矩阵C中。
```fortranprogram matrix_multiplyuse cudaforimplicit noneinteger, parameter :: N = 5real, device, dimension(:,:), allocatable :: A, B, Creal, device, dimension(:), allocatable :: tempinteger :: i, j, kallocate(A(N,N), B(N,N), C(N,N), temp(N))! Initialize matrices A and B on the CPUdo i = 1, Ndo j = 1, NA(i,j) =B(i,j) =end doend do! Copy matrices A and B to the GPUcall cudaMemcpy(d_A, host_A, NNsize(real(1)), cudaMemcpyHostToDevice)call cudaMemcpy(d_B, host_B, NNsize(real(1)), cudaMemcpyHostToDevice)! Call the CUDA kernel to perform matrix multiplication on the GPUcall matrixMul(d_C, d_A, d_B, N)! Copy the result back to the CPUcall cudaMemcpy(host_C, d_C, NNsize(real(1)), cudaMemcpyDeviceToHost)! Print the result on the CPUdo i = 1, Ndo j = 1, Nprint , C(i,j)end doend dodeallocate(A, B, C, temp)end program matrix_multiply```接下来,我们需要定义CUDA内核来执行矩阵乘法。
fortran test例子
Fortran是一种编程语言,它最初在20世纪50年代由IBM开发。
它被设计用来解决科学和工程领域的问题,特别是那些需要进行数值计算的任务。
下面是一个简单的Fortran测试例子:
```fortran
PROGRAM Test
IMPLICIT NONE
INTEGER :: num1, num2, sum
WRITE(*,*) '请输入两个整数:'
READ(*,*) num1, num2
sum = num1 + num2
WRITE(*,*) '两个数的和是:', sum
END PROGRAM Test
```
这个例子要求用户输入两个整数,并计算它们的和。
在屏幕上显示结果。
编译并运行这个程序,你将看到以下输出:
```
请输入两个整数:
10 20
两个数的和是: 30
```
这个程序演示了Fortran语言的基本输入和输出功能,以及简单的数值计算。
需要注意的是,这个例子中不包含任何网址、超链接和电话,以确保文本的纯净和安全。
Intel Visual Fortran 窗口程序设计实例作者:汪华/blog/254997247/860686026Fortran是一种高级的计算机编程语言,所有Fortran程序源码必须经过编译器的编译、链接,才能被翻译成计算机所能识别的机器码,从而完成源程序设定的任务。
Fortran语言的编译器较多,PC中Windows平台上常见的有:Fortran PowerStation 4.0 微软公司将Fortran90集成到Developer Studio开发环境中之后推出的Fortran编译器,真正实现了Fortran的可视化编程;Digital Visual Fortran 微软公司和数据设备公司(DEC)联合开发的功能更强大的Fortran编译器;Compaq Visual Fortran 数据设备公司(DEC)和康柏公司(Compaq)合并后推出的Fortran编译器以及康柏公司并入惠普后推出的最新版本;Intel Visual Fortran 11.x 惠普公司将Windows下的编译器转售给Intel公司后,由Intel公司开发的Fortran编译器,目前是最新版。
Salford Fortran 95 由silverfrost公司开发的能用于基于Win32平台和.net平台的应用程序开发,支持完整的Fortran95语法和部分Fortran2003语法。
其实,Fortran编译器还有很多,如Lahey Fortran、Absoft Fortran和OpenWatcom等。
从目前的使用情况来看,前四个编译器在Windows平台上最为常见。
本文所有的程序都基于Intel Visual Fortran 11.x编译器。
跟C++一样,Fortran语言本身没有提供图形界面输出方面的功能,所以为了用Fortran编写Windows图形接口程序,必须借助编译器提供的扩展功能。
Intel Visual Fortran编译器封装了几乎完整的Win32 API和OpenGL函数,提供了良好、稳定的编程接口,所以,借助Intel VisualFortran编译器,Fortran既能完成UI设计,也能胜任图形编程,从这个意义上讲,C能做到的,Fortran也能做到。
Fortran学习过程中写的一些小程序1,多重循环的判断program ex19implicit noneinteger scorecharacter gradewrite(*,*) "score:"read(*,*) scoreif (score>100) thengrade="?"else if (score>=90) thengrade="A"else if (score>=80) thengrade='B'else if (score>=70) thengrade='C'else if (score>=60) thengrade='D'elsegrade="?"end ifwrite(*,*) gradestopendprogram ex19implicit noneinteger scorecharacter gradewrite(*,*) "score:"read(*,*) scoreif (score>=90.and.score<=100) thengrade="A"else if (score>=80.and.score<90) thengrade="B"else if (score>=70.and.score<90) thengrade='C'else if (score>=60.and.score<70) then grade='D'else if (score>=50.and.score<60) then grade='E'elsegrade="F"end ifwrite(*,*) gradestopendprogram ex19implicit nonereal xreal yinteger answrite(*,*) "请输入坐标:(x,y)" read(*,*) x,yif (x>0) thenif (y>0) thenans=1else if (y<0) thenans=4elseans=0end ifelse if (x<0) thenif (y>0) thenans=2else if (y<0) thenans=3elseans=0end ifelseans=0end ifif (ans/=0) thenwrite(*,"('第',I1,'象限')") anselsewrite(*,*) "在坐标轴上"end ifstopendprogram ex11implicit nonecharacter::str1,str2character relationwrite(*,*) "string1="read(*,*) str1write(*,*) "string2="read(*,*) str2if (str1>str2) thenrelation=">"else if (str1==str2) thenrelation="="elserelation="<"end ifwrite(*,"('string1',A1,'string2')") relationstopendprogram ex11implicit noneinteger ywrite(*,*) "y="read(*,*) yif(mod(y,4)==0.and.mod(y,100)/=0.and.mod(y,400)==0) then write(*,*) "闰年"elsewrite(*,*) "不是闰年"end ifstopendprogram mainimplicit noneinteger,parameter::dest=9 integer floordo floor=1,destif (floor==4) cyclewrite(*,*) floorend dostopendprogram mainimplicit nonereal,parameter::weight=45.0 real,parameter::error=0.001real gaussdo while(abs(gauss-weight)>error) write(*,*) "weight="read(*,*) gaussend dowrite(*,*) "weight=",gaussstopendprogram mainimplicit noneinteger i,jloop1:do i=1,3loop2:do j=1,3if(i==3) exit loop1if(j==2) cycle loop2write(*,"('(',i2,',',i2,')')") i,jend do loop2end do loop1stopendprogram mainimplicit noneinteger::fn2=0integer::fn1=1integer::fn=0integer counterwrite(*,*) fn2write(*,*) fn1do counter=2,9fn=fn2+fn1write(*,"(I3)") fnfn2=fn1fn1=fnend dostopendprogram mainimplicit noneinteger iinteger,parameter::key=2integer lenstrcharacter(len=20)::stringwrite(*,*) "string:"read(*,*) stringlenstr=len(trim(string))do i=1,lenstrstring(i:i)=char(ichar(string(i:i))+key) end dowrite(*,*) stringstopendprogram mainimplicit nonereal i,j,ki=1j=1k=0do i=1,3j=j/i !计算每个的阶乘k=k+j !计算阶乘的和end dowrite(*,*) kstopendprogram mainimplicit noneinteger,parameter::classes=5integer,parameter::students=5integer::student(classes,students)integer c,sdo c=1,classesdo s=1,studentswrite(*,"('number',I2'of classes',I2)") c,s read(*,*) student(c,s)end doend dodo while(.true.)write(*,*) "classes:"read(*,*) cif(c<=0.or.c>classes) exitwrite(*,*) "student:"read(*,*) sif(s<=0.or.s>students) exitwrite(*,*) student(c,s)end dostopend数组program mainimplicit noneinteger,parameter::row=2integer,parameter::col=2integer::m(row,col)integer r,cdata((m(r,c),r=1,2),c=1,2)/1,2,3,4/write(*,"(I3,I3/I3,I3)") ((m(r,c),r=1,2),c=1,2)stopendprogram mainimplicit noneinteger::i,jinteger,parameter::size=10 integer::a(size)=(/1,10,5,4,3,6,9,8,7,2/) integer::tdo i=1,size-1do j=i+1,sizeif (a(i)<a(j)) thent=a(i)a(i)=a(j)a(j)=tend ifend doend dowrite(*,*) astopendprogram mainimplicit noneinteger::a(4)integer binteger i,jread(*,*) ado i=1,3do j=i+1,4if (a(i)<a(j)) thenb=a(i)a(i)=a(j)a(j)=bend ifend doend dowrite(*,*) astopendprogram mainimplicit noneinteger::iinteger,parameter::players=5real::angle(players)=(/45,50,55,40,35/) real::speed(players)=(/25,20,21,22,27/) real::distance(players)do i=1,playerscall get_distance(angle(i),speed(i),distance(i)) write(*,"('player',I2,'=',F8.2)") I,distance(i) end dostopendsubroutine angle_to_rad(angle,rad)implicit nonereal,parameter::pi=3.14159real::angle,radrad=angle*pi/180.0endsubroutine get_distance(angle,speed,distance) implicit nonereal speed,angle,distancereal t,Vx,radreal,parameter::G=9.8call angle_to_rad(angle,rad)t=2*speed*sin(rad)/GVx=speed*cos(rad)distance=t*Vxendprogram mainimplicit noneinteger,parameter::players=5real::angle(players)=(/30.0,45.0,35.0,50.0,40.0/) real::speed(players)=(/25.0,20.0,21.0,27.0,22.0/) real::distance(players)real,external::get_distanceinteger::ido i=1,playersdistance(i)=get_distance(angle(i),speed(i))write(*,"('player',I2,'='F8.2)") i, distance(i) end dostopendreal function angle_to_rad(angle)implicit nonereal anglereal,parameter::pi=3.14159angle_to_rad=angle*pi/180.0returnendreal function get_distance(speed,angle) implicit nonereal speedreal anglereal timereal Vxreal radreal,parameter::g=9.81real,external::angle_to_radrad=angle_to_rad(angle)time=2*speed*sin(rad)/gVx=speed*cos(rad)get_distance=Vx*timereturnendprogram mainimplicit noneinteger i,ninteger::left=0integer rightwrite(*,*) "n="read(*,*) ndo i=1,nleft=left+i**2end doright=n*(n+1)*(2*n+1)/6if (left==right) thenwrite(*,*) "正确"elsewrite(*,*) "不正确"end ifstopendprogram mainimplicit noneinteger a,binteger tmp,tmp1,tmp2 integer gcd,lcmwrite(*,*) "请输入a,b的值" read(*,*) a,bif (a<b) thentmp=aa=bb=tmpend iftmp1=atmp2=btmp=mod(a,b)do while (.true.)if (tmp==0) exittmp1=tmp2tmp2=tmptmp=mod(tmp1,tmp2)end dogcd=tmp2lcm=a*b/gcdwrite(*,*) gcd,lcmstopendprogram mainimplicit noneinteger ireal numinteger::num1=0integer::num2=0integer::num3=0real::score,meanscorereal::sumscore=0.0write(*,*) "请输入学生人数:" read(*,*) numdo i=1,numwrite(*,"('第',I2,'个同学的成绩:')") i read(*,*) scoresumscore=sumscore+scoreif (score>60) thennum1=num1+1else if(score==60) thennum2=num2+1elsenum3=num3+1end ifend domeanscore=sumscore/numwrite(*,*) "及格以上人数:",num1write(*,*) "刚好及格人数:",num2write(*,*) "不及格的人数:",num3write(*,*) "平均分为:",meanscorestopendprogram mainimplicit noneinteger ninteger,external::factwrite(*,*) "N="read(*,*) nwrite(*,"(I2,'!=',I8)") n,fact(n)stopendrecursive integer function fact(n) result(ans) implicit noneinteger,intent(in)::nif (n<0) thenans=-1returnelse if (n<=1) thenans=1returnend ifans=n*fact(n-1)returnendprogram mainimplicit noneinterfacefunction random10(lbound,ubound)real::lbound,uboundreal::random10(10)end functionend interfacereal::a(10)call random_seed()a=random10(1.0,10.0)write(*,*) aendfunction random10(lbound,ubound) implicit nonereal::lbound,uboundreal::lenreal::random10(10)real tinteger ilen=ubound-lbounddo i=1,10call random_number(t)random10(i)=lbound+len*t end doreturnendmodule constantimplicit nonereal,parameter::pi=3.14159real,parameter::g=9.81end modulemodule typedefimplicit nonetype playerreal::anglereal::speedreal::distanceend typeend moduleprogram mainuse typedefimplicit noneinteger,parameter::players=5type(player)::people(players)=(/player(30.0,25.0,0.0),&player(45.0,20.0,0.0),&player(35.0,21.0,0.0),&player(50.0,27.0,0.0),&player(40.0,22.0,0.0)&/)real,external::get_distanceinteger ido i=1,playerscall get_distance(people(i))write(*,"('player',I1,'=',F8.2)") i,people(i)%distanceend dostopendreal function angle_to_rad(angle)use constantimplicit nonereal angleangle_to_rad=angle*pi/180returnendsubroutine get_distance(person)use constantuse typedefimplicit nonetype(player)::personreal rad,Vx,timereal,external::angle_to_radrad=angle_to_rad(person%angle)Vx=person%speed*cos(rad)time=2*person%speed*sin(rad)/gperson%distance=Vx*timereturnend。
1)实例3—求多个半径下的圆周长
! z3.f90 --Fortran95
! FUNCTIONS:
! z3 - Entry point of console application.
!************************************************************************* ! PROGRAM: z3
! PURPOSE: Entry point for the console application.
!************************************************************************ program z3
! 求多个半径下的圆周长
! 主程序
! PROGRAM Z3
PRINT *, 'R=',1.2,'C=',C(1.2)
PRINT *, 'R=',3.4,'C=',C(3.4)
PRINT *, 'R=',15.6,'C=',C(15.6)
PRINT *, 'R=',567.3,'C=',C(567.3)
END program z3
!子程序
FUNCTION C(R)
PI=3.1415926
C=2*PI*R
RETURN
! Body of z3
end
2)实例4—键盘与显示器输入/输出
a)Fortran 基本操作
b)程序指令
! ZXZ_I_O.f90
! FUNCTIONS:
! ZXZ_I_O - Entry point of console application.
! PROGRAM: ZXZ_I_O
! PURPOSE: Entry point for the console application.
!***************输入、输出样式种种************************** program ZXZ_I_O
implicit none
!变量声明的位置
INTEGER(2) i; INTEGER(4) j; INTEGER(4) m; REAL n
INTEGER A,B
! Variables
PRINT*,'输入整数A'; READ*, A
PRINT*,'输入整数B'; READ*, B
B=A+B
PRINT*,'B=A+B=',B
WRITE(*,*) 'A*B=',A*B
PRINT* ,'以上为计算机的计算结果,注意B的值'
!系统默认的输出样式
PRINT* ,'系统默认的输出样式'
!人为控制的的输出样式--格式化输出
i=21; j=53; m=5
n=(i+j*m*i**m)
WRITE(*,*) 'i,j,m 是常量,程序赋初值' PRINT*, i,j,m
WRITE(*,*) 'i,j,m 的计算结果:' PRINT*,'i+j*m*i**m=',n
PRINT* ,' '
! Body of ZXZ_I_O
end program ZXZ_I_O
程序说明:
程序赋值—初始化
i=21; j=53; m=5
键盘无格式输入
READ*, A
键盘有格式输入
READ(*, 100)A,B,C
100 FORMA T( 2F5.2,F5.3)
显示器无格式输出
PRINT* ,'系统默认的输出样式' WRITE(*,*) 'A*B=',A*B
显示器有格式输出
PRINT 100 ,A+B
WRITE(*,100) 'A*B=',A*B
100 FORMA T( F5.2)
c)调试运行
d)程序指令
带格式的输入输出
! ZXZ_I_O.f90
! FUNCTIONS:
! ZXZ_I_O - Entry point of console application.
! PROGRAM: ZXZ_I_O
! PURPOSE: Entry point for the console application.
!***************输入、输出样式种种************************** program ZXZ_I_O
implicit none
!变量声明的位置
INTEGER(2) i; INTEGER(4) j; INTEGER(4) m; REAL n
INTEGER A,B
REAL X,Y,Z
! Variables
PRINT*,'输入整数A'; READ*, A
PRINT*,'输入整数B'; READ*, B
PRINT*, '计算结果为:'
B=A+B
PRINT*,'B=A+B=',B
WRITE(*,*) 'A*B=',A*B
PRINT* ,'以上为计算机的计算结果,注意B的值'
!系统默认的输出样式
PRINT* ,'系统默认的输出样式'
PRINT*,'输入实数X'; READ(*,100) X
PRINT*,'输入实数Y'; READ(*,100) Y
100 FORMA T(F5.2)
PRINT*, '计算结果为:'
Z=X+Y
PRINT 200,Z
200 FORMA T(4X,'Z=X+Y=',F8.3)
WRITE(*,*)
WRITE(*,300) X*Y
300 FORMA T(4X,'Z=X*Y=',F8.3)
!人为控制的的输出样式--格式化输出
PRINT* ,'程序为常量赋了初值'
i=21; j=53; m=5
n=(i+j*m*i**m)
WRITE(*,*) 'i,j,m 是常量,程序赋初值'
PRINT*, i,j,m
WRITE(*,*) 'i,j,m 的计算结果:'
PRINT*,'i+j*m*i**m=',n
PRINT* ,' '
! Body of ZXZ_I_O
end program ZXZ_I_O e)调试运行。