fortran常用算法的程序设计举例
Fortran77教程-4逻辑运算和选择结构

read(*,*) grade if(grade.ge.80.) write(*,*) 'A' if(grade.ge.70.) write(*,*) 'B' if(grade.ge.60.) write(*,*) 'C' write(*,*) 'D' end
24
C
单价850,100以上95折优惠,求货款。 price=850 read(*,*) n if(n.ge.100) price=price*0.95 amount=n*price write(*,*) 'n=',n,' amount=',amount end
read(*,*) grade if(grade.le.60.) then write(*,*) ‘D ' else if(grade.le.70.) then write(*,*) ‘C' else if(grade.le.80.) then write(*,*) ‘B' else write(*,*) ‘A' end if end
read(*,*) grade if(grade.ge.80.) then write(*,*) 'A ' else if(grade.ge.70.) then write(*,*) 'B' else if(grade.ge.60.) then write(*,*) 'C' else write(*,*) 'D' end if end
if(grade.ge.60.) then else print *, ’No.’, num print *, ’grade’, grade end if
FORTRAN编程演示

2-4 输入输出语句 PRINT语句是Fortran中较为常用的一种输 出语句,用它来完成表控输出的语法格式如 下所示。 PRINT *[, 输出项,……] 在PRINT语句中不能指定输出设备,只能向 系统隐含指定的设备输出数据(隐含指定的 输出设备一般是指计算机屏幕);语句中的 星号“*”表示“表控格式输出”,即按照 计算机默认的格式进行数据的输出;输出项 可以有多个,每个输出项之间用逗号“,”分 隔;当语句中没有输出项时,命令将输出一 个空白行。
输入语句 使用READ语句来完成表控输入的语法形式 如下所示。 READ *[, 输入项,……] 在这种形式中,不能指定输入设备,只能由 系统隐含指定的设备上输入(系统隐含指定 的设备一般是指键盘);语句中的星号“*” 表示“表控输入”,即按照数据合法的格式 进行输入;输入项可以有多个,每个输出项 之间用逗号“,”分隔;当语句中没有输入项 时,系统将挂起程序的运行直到用户键入回 车符。
2.编写程序已知园半径分别为1、3、12时,对应的 园周长为多少? 示例4
C MAIN PROGEAM !注释下面为主程序 PROGRAM EX2 PRINT *,“R=”,1.0,“C=”,C(1.0) !显示半径周长 PRINT *,"R=",3.0,"C=",C(3.0) PRINT *,“R=”,12.0,“C=”,C(12.0) !未解释C END C SUBPROGRAM !下面为子程序 FUNCTION C(R) !C(R) 是一个函数名字 PI=3.1415926 C=2*PI*R RETURN END !编写了函数的内容
示范举例1。
2- 2 编程修改程序
FORTRAN 程序设计01

一, Fortran 简介 二,程序流程 三,循环结构 四,数据类型 五,数组 六,过程和模块 七,输入,输出,文件 八,复习,总结
Fortran是目前国际上广泛流行的一种高级语言, 适用于科学计算.Fortran是英文FORmula TRANslation的缩写,意为"公式翻译".它 是为科学,工程问题中的那些能够用数学公式 表达的问题而设计的语言,主要用于数值计算. 这种语言简单易学,因为可以像抄写数学教科 书里的公式一样书写数学公式,它比英文书写 的自然语言更接近数学语言.Fortran语言是 第一个真正推广的高级语言.
Fortran77 (I ~ N)规则; 以(I,j,k,m,l,n)字母开头的 变量为整型. 建议编程时使用声明语句,并在 程序中加入implicit non 语句, 屏蔽(I ~ N)规则;
asb exp sin cos Asin Acos Sqrt ……
asb(x) |x| 指数运算 exp(x) exp(x) 正弦函数 sin(x) sinx 余弦函数 cos(x) cosx 反正弦 Asin(x) arcsinx 反余弦 Acos(x) arccosx 开平方 Sqrt(x) x ………………
系统为每一个常量,变量分配一个存储单元,放它的 值.
6, 数据类型
整型:(数学上的整数集合) integer(n),属性列表,变量列表 例:integer (kind=4) i,t2,pop -2147483638 ~ 2147483637 例:integer (1):: k,m -128 ~127
实型(数学上的实数集合) real(n),属性列表,变量列表 单精度: real(4), real 双精度: real(8), double real(4),:: dx,dy real(8),:: d_p,y2
循环结构的Fortran程序设计

3 Fortran循环结构程序设计的其它问题
implicit none integer m,i,j read*,m j=sqrt(real(m)) do i=2,j if(mod(m,i).eq.0) exit end do if(i>>1)then print*,m,'是素数' else print*,m,'不是素数' end if End
三、do while循环举例
例1:输入一个整数,输出其位数。
分析:输入的整数存入变量m中,用变量n来统计m的位数,程序为:
Integer:: m,n=0 read*,m Do while (m>0) n=n+1 m=m/10 end do print*,‘n=’,n End 比如:129 ↙ n=3
(4)对于循环次数确定的循环问题也可以使用do while语句来实现,比如:求5!
integer:: m=1,n=1 do while (m<=5) n=n*m m=m+1 end do print*,n End
二、do while循环的执行过程
Do while循环的执行过程可示意为右图,说明如下:
分析:最大公约数在[1,min(m,n)]范围内,且同时能被m和n整除,因此利用do i=min(m,n),1搜寻,一旦mod(m,i)=0、mod(n,i)=0则此时的i就是最大公约数,并利用exit退出循环。然后利用最大公约数,求出最小公倍数。程序为:
If(条件)exit
表示条件为真执行exit终止循环,为假时exit不执行,将继续执行循环。
(2)循环变量与参数表达式数据类型不一致时,其处理方法与赋值语句相同,即先计算参数表达式、并把结果转换成循环变量类型,然后进行处理。比如,“do i=1.3,5.9,2.6”相当于“do i=1,5,2”
FORTRAN语言程序设计

n 是一个十进制数字(0~9)序列。
Kind值为:1、2、4、8之一。分别表示1、2、4、8个字节个数。
FORTRAN 90/95标准中整型常量的范围没有明确规定。
例如:122、0、-36、559_2
均为合法的整型常量
100.0、100,000、100 0、1002 均为非法的整型常量
5.6.2.2 实型常量
5.5 程序的书写格式 (1)固定格式:将一个语句行分为若干个区域,如下图所示
:
5.6 数据类型
5.6.1 基本概念 1.内部数据类型 FORTRAN语言将内部数据划分为以下类型: 整型 实型 算术型 数据类型 复型 逻辑型 字符型 2.种别 一个数据在内存中均占有一定字节个数的存储单元。上述每类数据都有 其不同的种别(即Kind)特性,即上述每类数据根据其种别特性(即 Kind值)的不同分别拥有不同字节个数的存储单元。 3.数据对象 1)常量:程序运行时,其值不能改变的量,称为常量。如:5,3等等。 2)变量:程序运行时,其值可以改变的量,如:变量a, a是一个存储单元
第四章 FORTRAN语言开发环境
详见教材:3.3 FORTRAN语言 开发环境
第五章 FORTRAN 语言基础知识
5.1 字符集
FORTRAN语言允许使用的字符集为:
fortran常用算法程序集

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*,"元素未找到。
Fortran计算实例
do 20 i=1,(im+1)/2
d1(i)=u1(i)=0.d0 20
t1(i)=1.d0
do 30 i=(im+1)/2+1,im d1(i)=1.d-1 u1(i)=0.d0 设定初值
30
t1(I)=1.d0
tim=0.d0
dt=0.9d0*dx 999 continue do 40 i=1,im d (i)= d1 (i)
c
a
b
s
5. 编程及调试
a, b,c 系数
program diffusion
parameter(im=1001) implicit double precision(a-h,o-z) dimension x(im),bb(im) dimension b1(im) Dimension a(im),b(im),c(im),s(im) b0=1.67d-5 t0=1.d5 L0=1.d5 …… 设定常数 可将3个变量一起 放在一个2维数组
tim=tim+dt
write(*,*)tim,dt
如0.02, 0.04, 0.06, 0.08,……。即每 0.02时间间隔则将结果输出到数据文件。
主 体 部 分
888
if(tim在某些时刻)call output(tim,d1,u1,t1)
if(输出结果的次数等于tend/0.02)goto 888 goto 999 close(10) End Subroutine output(tim,d1,u1,t1) …..
u u 0 t x x u u T T u 0 t x x x T T u u ( 1)T 0 t x x
2维流体力学方程组,*号已略去
fortran排序函数
fortran排序函数Fortran是一种编程语言,它在科学计算和数值分析领域广泛应用。
在这篇文章中,我们将讨论如何使用Fortran编写排序函数。
排序是一种常见的操作,它可以对一组数据按照特定的顺序进行排列。
在计算机科学中,有许多不同的排序算法可供选择,例如冒泡排序、插入排序、选择排序、快速排序等。
在Fortran中,我们可以使用这些算法来实现排序函数。
让我们来看看冒泡排序算法在Fortran中的实现。
冒泡排序的基本思想是通过相邻元素之间的比较和交换来逐步将最大(或最小)的元素移动到正确的位置。
下面是一个简单的冒泡排序函数的示例:```subroutine bubble_sort(arr, n)integer, dimension(n) :: arrinteger :: i, j, tempdo i = 1, n-1do j = 1, n-iif (arr(j) > arr(j+1)) thentemp = arr(j)arr(j) = arr(j+1)arr(j+1) = tempend ifend doend doend subroutine```在这个函数中,我们使用了两个循环来遍历数组,并通过比较和交换操作来排序元素。
外部循环`i`控制了需要进行比较的轮数,而内部循环`j`用于比较相邻的元素,并进行交换。
接下来,让我们来看看另一种常见的排序算法——快速排序。
快速排序是一种基于分治思想的排序算法,通过选择一个基准元素,将数组划分为两个子数组,并对子数组进行递归排序来实现整个数组的排序。
下面是一个简单的快速排序函数的示例:```subroutine quick_sort(arr, left, right)integer, dimension(:) :: arrinteger :: left, right, i, j, pivot, tempif (left < right) thenpivot = arr((left+right)/2)i = leftj = rightdo while (i <= j)do while (arr(i) < pivot)i = i + 1end dodo while (arr(j) > pivot)j = j - 1end doif (i <= j) thentemp = arr(i)arr(i) = arr(j)arr(j) = tempi = i + 1j = j - 1end ifend docall quick_sort(arr, left, j) call quick_sort(arr, i, right) end ifend subroutine```在这个函数中,我们首先选择一个基准元素`pivot`,然后使用两个指针`i`和`j`分别从左右两侧开始遍历数组。
fortran常用算法程序集
Fortran常用算法程序集简介Fortran是一种面向科学和工程计算的编程语言,通常用于数值计算和数据分析。
它有着强大的数学计算能力和高性能,被广泛应用于科学计算、工程仿真、天气预报等领域。
本文将介绍一些常用的Fortran算法程序集,包括数值积分、矩阵运算、排序算法等。
数值积分数值积分是求解定积分的一种方法,用于计算曲线下面积、求解微分方程等。
Fortran提供了一些常用的数值积分算法,如梯形法则、辛普森法则等。
梯形法则梯形法则是数值积分中最简单的算法之一,基本思想是将曲线下面积近似为一系列梯形的和。
下面是使用Fortran编写的梯形法则算法示例:! 梯形法则real function trapezoidal_rule(f, a, b, n)real, external:: freal:: a, b, n, hreal:: x, suminteger:: ih = (b - a) / nsum= f(a) + f(b)do i =1, n-1x = a + i * hsum=sum+2* f(x)end dotrapezoidal_rule = (h/2) *sumend function trapezoidal_rule辛普森法则辛普森法则是一种更精确的数值积分算法,基于多项式插值的思想。
它将曲线分成若干小段,每段近似为一个二次函数,然后对每个二次函数进行积分。
下面是使用Fortran编写的辛普森法则算法示例:! 辛普森法则real function simpsons_rule(f, a, b, n)real, external:: freal:: a, b, n, hreal:: x, sum1, sum2integer:: ih = (b - a) / nsum1 = f(a) + f(b)sum2 =0do i =1, n-1, 2x = a + i * hsum2 = sum2 +4* f(x)end dodo i =2, n-2, 2x = a + i * hsum2 = sum2 +2* f(x)end dosimpsons_rule = (h/3) * (sum1 + sum2)end function simpsons_rule矩阵运算矩阵运算是科学计算中常用的一个重要环节,Fortran提供了丰富的矩阵运算库,包括矩阵乘法、矩阵转置、矩阵求逆等。
fortran常用算法的程序设计举例
b
a f (x)dx s1 s2
其中h c a 2
h { f (a) f (b) 4[ f (a h) f (a 3h)] 2 f (a 2h)}
3
7
如果将(a,b)分成四个小区间:
b f (x)dx h { f (a) f (b) 4[ f (a h) f (a 3h) f (a 5h)
stop
end if
10 continue
write(*,200) m 因有收敛问题,要 100 format(1x,'i=',i3,5x,'x1=',f15.7)
设最大循环次数。 200 format(1x,'computation has not',
$ 'converged after',i4,'iteration')
$ 200
read(*,*) a,b,n
求:
1
sin xdx
x=a
0
h=(b-a)/n
s=0.0
do 10 i=1,n
si=(sin(x+(i-1)*h)+
sin(x+i*h))*h/2.0
s=s+si
continue
write(*,100) a,b,n
write(*,200) s
format(1x,'a=',f10.3,3x,
6
3. Sinpson法
取a,b中点c—((a+b)/2,0),通过 f(a),f(b),f(c)三点可作:
b a
f1 ( x)dx
h[ 3
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
4
2. 梯形法
$ 10
第i个小梯形面积 :
100 f (a ih ) f (a (i 1)h) $ si h 2 200
1 read(*,*) a,b,n 求 : sin xdx 0 x=a h=(b-a)/n s=0.0 do 10 i=1,n si=(sin(x+(i-1)*h)+ sin(x+i*h))*h/2.0 s=s+si continue write(*,100) a,b,n write(*,200) s format(1x,'a=',f10.3,3x, 'b=',f10.3,3x,'n=',i4) format(1x,'s=',f15.8) end
ca 其中h a 2 h { f (a) f (b) 4[ f (a h) f (a 3h)] 2 f (a 2h)} 3
b
f ( x)dx s1 s2
7
如果将(a,b)分成四个小区间:
h a f ( x)dx 3 { f (a) f (b) 4[ f (a h) f (a 3h) f (a 5h) f (a 7h)] 2[ f (a 2h) f (a 4h) f (a 6h)} ba 其中h 2 4
17
五、计算机模拟
计算机模拟(Computer Simulation),又称 “仿真”:用计算机模仿实物系统进行测试,从 测试的结果获得期望的资料。
根据模拟对象的不同特点,可分为: 确定性模拟(Deterministic Mode); 随机性模拟(Stochastic Mode) 。
18
小球以10m/s沿 45 °斜抛,落地反 弹方向同前,速度 减小 10% ,求前三 次周期轨迹。
其他几种 程序变形
$ 10
. . . x2=a . . . do 10 i=1,n x1=x2 x2=x2+h si=(sin(x1)+ sin(x2))*h/2.0 s=s+si continue . . . 10
. . . f1=sin(a) . . . do 10 i=1,n f2=sin(a+i*h) si=(f1+f2)*h/2.0 s=s+si f1=f2 continue . . .
10
x3 2 x 2 2 x 2 0
x ( x3 2 x 2 2) 2
10
因有收敛问题,要 设最大循环次数。 100 200 $
有的g(x)是收敛的,而有的g(x)是不收敛的。 同一个g(x),对某些x0是收敛的,对有的x0则是不 收敛的。 如果g(x)具有一阶导数连续,且对于所有的x, 若|g’(x)|≤q<1(q为一个定数),那么x=g(x)对于任 意的x0均收敛,且q愈小,收敛速度愈快。如果不 满足对所有的x存在|g’(x)|≤q<1 ,则可能对有的x0 收敛,对有的x0不收敛。 因此要恰当的选择g(x)形式和初值x0。
3
1. 矩形法
10
第i个小矩形面积: si h f (a (i 1)h)
100 $ 200
1 read(*,*) a,b,n x 求 : e dx x=a 0 h=(b-a)/n f0=exp(x) s=0.0 do 10 i=1,n si=f0*h s=s+si x=x+h f0=exp(x) continue write(*,100) a,b,n write(*,200) s format(1x,'a=',f10.3,3x,'b=', f10.3,3x,'n=',i4) format(1x,'s=',f15.8) end
11
2. 牛顿迭代法
求f ( x) x3 2 x 2 4 x 1=0在x 0附近的一个实根 f ( x) 3x 2 4 x 4
10
f ( x1 )
f ( x1 ) x1 x2 f ( xn ) f ( xn )
xn 1 xn
100 $
read(*,*) x n=1 x1=x f=x1**3-2.0*x1**2+4.0*x1+1.0 f1=3.0*x1**2-4.0*x1+4.0 x=x1-f/f1 write(*,100) n,x1,x n=n+1 if(abs(x-x1).gt.1e-6) goto 10 format(1x,'n=',i3,3x,'x1=',f15.7, 3x,'x=',f15.7) end
5
10
. . . f0=sin(a) h=(b-a)/n s=f0 do 10 i=1,n f=sin(a+i*h) s=s+2.0*f continue s=(s-sin(b))*h/2.0 . . .
b
ห้องสมุดไป่ตู้
a
f ( x)dx
h f0 2( f1 f 2 f n ) f n ) 2
15
三、求函数极值
求 : f ( x) x 2 4x 5的极小值
Fibonacci搜索算法,或0.618法,或黄金值搜索法。
16
10
real low,high,x1,x2 read(*,*) low,high write(*,200) x1=low+0.618*(high-low) x2=high-0.618*(high-low) if(high-low.gt.1e-4) then f1=x1*x1-4.0*x1+5.0 f2=x2*x2-4.0*x2+5.0 write(*,202) x1,f1,x2,f2 if(f1.gt.f2) then high=x1 x1=x2 x2=high-0.618*(high-low) else low=x2 x2=x1 x1=low+0.618*(high-low) end if goto 10 end if
12
3. 二分法
5
10
用二分法求 f ( x) x 3 6 x 1 0 在x 2附近的一个实根
$
100
read(*,*) x1,x2 f1=x1**3-6.0*x1-1.0 f2=x2**3-6.0*x2-1.0 if(sign(f1,f2).eq.f1) goto 5 x=(x1+x2)/2.0 f=x**3-6.0*x-1.0 if(sign(f,f1).eq.f) then x1=x f1=f else x2=x f2=f end if if((abs(x1-x2).gt.1e-5).and. abs(f).gt.1e-6) goto 10 if(abs(f).gt.1e-6) x=(x1+x2)/2.0 write(*,100) x format(1x,'x=',f15.7) end
b
如果将(a,b)分成n个小区间:
h f ( x ) dx { f (a) f (b) 4[ f (a h) f (a 3h) f (a (2n 1)h)] a 3 2[ f (a 2h) f (a 4h) f (a (2n 2)h)}
13
4. 弦截法(割线法)
5
20
$
x2 x1 x x2 f ( x2 ) f ( x2 ) f ( x1 )
x3 2 x 2 7 x 4 0
100
read(*,*) x1,x2 f1=x1**3-2.0*x1**2+7.0*x1+4.0 f2=x2**3-2.0*x2**2+7.0*x2+4.0 if(sign(f1,f2).eq.f1) goto 5 f=1.0 if((abs(x1-x2).gt.1e-5).and. abs(f).gt.1e-6) then x=x2-(x2-x1)/(f2-f1)*f2 f=x**3-2.0*x**2+7.0*x+4.0 if(sign(f,f1).eq.f) then x1=x f1=f else x2=x f2=f end if goto 20 end if if(abs(f).gt.1e-6) x=(x1+x2)/2.0 write(*,100) x format(1x,'x=',f15.7) end 14
19
5 $
logical flag parameter (g=9.8) read(*,*) v0,d t=0.0 x0=0.0 v=v0*cos(3.1415926/4.0) do 10 i=1,3 dt=d flag=.true. x=v*t+x0 y=v*t-0.5*g*t**2 if(flag) then if(y.ge.0.0) then if(dt.ge.d) write(*,100) t,x,y t=t+dt x=v*t+x0 y=v*t-0.5*g*t**2 else
以上方法都是近似求根,得到不是准确值而是近 似值。但只要给定的误差足够小,就可以认为它们之 间足够近似。 事实上,只有少数的方程才能用解析的方法求出 准确的根值。 计算机可以解任何有实根的一元方程,它采用的 基本方法就是迭代,经过多次迭代,使近似根逐渐趋 近于真实根。迭代可以用循环实现,正好充分发挥计 算机快速运算的特点。
6
3. Sinpson法 取a,b中点c—((a+b)/2,0),通过 f(a),f(b),f(c)三点可作唯一一条抛物 线f1(x)。
根据抛物线定积分求值公式,有:
h a f1 ( x)dx 3 [ f (a) 4 f (c) f (b)] ba 其中h 2