发布时间 : 星期一 文章fortran语言教程第3章更新完毕开始阅读d8a859d076eeaeaad1f3305d
除了需要内部函数以外,还常常会遇到程序中反复多次用到同一个表达式的运算,FORTRAN语言允许用户自己定义函数,在程序中需要的地方同样可以调用。
2
例如,为了计算表达式X+X+1,当X=1,2.3,3.6,6.5时的值,可以用下面程序实现:
X=1
PRINT *,X**2+X+1 X=2.3
PRINT *,X**2+X+1 X=3.6
PRINT *,X**2+X+1 X=6.5
PRINT *,X**2+X+1 END
本来计算式子是一样的,由于X的值不同,必须反复地使用输出语句完成计算和输出。如果将表达式定义成一个函数,则程序可以修改如下:
F(X)= X**2+X+1 PRINT *,F(1),F(2.3),F(3.6),F(6.5) END
程序中的第一行就是用户自己定义的函数,称为“语句函数”。 2)语句函数的定义
格式:f(x1,x2,?,xn)= e
功能:定义一个形式为e的语句函数。 说明:
(1)语句函数名f
f代表一个语句函数的名字,它的命名方式与变量名相同。其类型可以预先用语句定义或遵照I—N规则。语句函数名不能与本程序单元中的任何其它名字相同。
(2)虚拟参数x1,x2,?,xn
括号中的x1,x2,?,xn代表语句函数的自变量,也叫虚拟参数。
虚拟参量的类型可以预先定义也可以遵照I-N规则,虚参在形式上与普通变量名相同,多个虚参要用逗号(,)分隔且不能同名,它们是代表自变量的符号,用来在形式上表示右边表达式中自变量的个数、类型以及在表达式中的作用。它们没有具体的值,因此,下面的三个语句函数定义语句意义是相同的。
F(X)= X*X+X+1 F(Y)=Y*Y+Y+1 F(R)=R*R+R+1
上面几个语句函数定义语句都定义了一个F函数,类型为实型,都包含一个自变量,自变量的类型都为实型,自变量在语句函数中都完成“自变量的平方+自变量+1”的运算。所以,虚参变量的名字与程序中的其它名字可以相同,此时,虚参变量的类型则应该为程序中同名变量的类型。
(3)语句函数表达式e
语句函数定义语句中,等号右边的e是语句函数f(x1,x2,?,xn)的具体形式,它应该是一个算术表达式、逻辑表达式或字符串表达式。在这个表达式中除了必须包含所有的虚参外,还可以包含常量、变量、内部函数、外部函数和已经定义的语句函数。
3)语句函数的调用
语句函数一旦被定义后,就可以在本程序单元中被调用。调用的形式和调用内部函数相同,即:
语句函数名(实参)
实参可以是与虚参类型一致的常量、变量或表达式,并且实参必须要有确定的值,函数按照代入的实参的值,根据定义的表达式将计算出函数值,因此,与内部函数一样,语句函数的调用结果是一个确定的
值。
例如,有程序如下: FNA(B)=1+B
PRINT*,FUN(FUN(FUN(1.0)) END
程序执行的结果是B=1.0时,嵌套调用语句函数FUN的值4.0。
如果语句函数定义时就没有虚参,则调用时也不给实参。例如: CONST( )=SQRT(2.0)+SQRT(3.0) PRINT *,CONST( ) END 程序执行时输出2.0?3.0的值。
4)定义语句函数时应该注意的问题
① 当定义的运算是在一个表达式中可以完成时才使用语句函数。
② 语句函数定义语句是非执行语句。它应该放在所有可执行语句之前和所有的说明语句之后。 ③ 语句函数只能在本程序单元中被使用。
④ 语句函数定义语句中的虚参只能是变量名,不能是其它形式的量。
⑤ 语句函数定义语句中的表达式中可以包含已经定义过的语句函数、外部函数和内部函数。 ⑥ 语句函数的调用结果是通过表达式得到的,因此,函数名和函数值之间必须满足赋值规则。 下列语句函数定义是正确的:
SUM(A,B,C)=A+B+C
AVER(A,B,C)=SUM(A,B,C)/3.0 IR(ID)=MOD(ID,3) SS(I,X,Y)=A(I)+X*Y 下列语句函数定义是错误的:
BUL(I,J,K)=3*I*J (虚参K没有出现在表达式中) EST(A,A)SQRT(A*4.0)+A (出现了两个同名的虚参)
SF(B)=1.5—SF(B) (表达式中使用了语句函数自己)
3.4 顺序结构程序设计
通过前面几节内容介绍,可以利用所学过的语句编写简单的FORTRAN程序了。设计顺序结构时只要按照问题求解的过程,按顺序将每一步的操作描述出来。下面介绍几个简单的例子。
【例3.1】 鸡兔同笼,已知鸡兔总头数为H(HEADS),总脚数为F(FEET),求鸡兔各有多少只? 结合此问题讨论程序设计的基本步骤:
(1)建立数学模型,即找出处理此问题的数学方法,为此可以列出有关方程式: 设鸡为X只,兔为Y只,可以得到两个二元一次联立方程
X+Y=H 2X+4Y=F
(2)解此联立方程,找出求解X和Y的具体公式
Y=
F?2H4H?F , X= 22以上这两步是属于数学上的方法问题,在此基础上才能编写程序,将方程求解的过程一步一步地描述
出来。
(3)根据流程图写出程序。
PRINT *,‘Enter number of heads:' READ *,H
PRINT *,‘Enter number of feet:' READ *,F X=(4*H-F)/2 Y=(F-2*H)/2
WRITE(*,100) ‘heads=',H,‘feet=',F WRITE(*,100) ‘cock=',X,‘rabbit=',Y
100 FORMAT(1X,2(A,F6.1,2X)) END
运行情况如下(有下划线处是用户输入的):
① Enter number of heads:
16↙
Enter number of feet: 40↙
heads= 16.0 feet= 40.0 cock= 12.0 rabbit= 4.0 ② Enter number of heads:
6↙
enter number of feet: 16↙
heads= 6.0 feet= 16.0 cock= 4.0 rabbit= 2.0
(6)将运行结果代入原方程检验结果。
第一次运算结果: 12*2+4*4=24+16=40(脚) 12+4=16 (头) 第二次运算结果: 4*2+2*4=8+8=16 (脚) 4+2+6 (头) 两次结果均正确,可以确认程序的正确性。 【例3.2】 我国人口在2000年统计为12.9亿,如果年增长率为0.05%,求公元2008年末的人口数。 分析:如果设人口初值为P0,年增长率为R,P1为n年后人口,则计算公式为:
n
P1=P0(1+R)
根据计算公式和计算过程,画出流程图如图3.3所示。
开始 输入 P0,R 计算N=2008-2000 计算P1=P0*(1+R)**N 输出 P1 结束
图3.3 例3.2的算法流程图
根据算法流程图写出程序如下:
R=0.005
P0=12.3
N=2008-2000 P1=P0*(1+R)**N
PRINT *,‘THE POPULATION OF 2008 IS ’,P1 END
THE POPULATION OF 2008 IS 10.719280
如果将程序输入方式改变一下,就可以用来计算任一年后任一增长率情况下的人口: PRINT *,‘INPUT R,YEAR=’ READ *,R,YEAR
P0=12.3 N=YEAR-2000 P1=P0*(1+R)**N
PRINT *,‘THE POPULATION OF 2008 IS’,P1 END
运行结果如下:
运行程序时输入任一组r和year的值就可以得到相应的p1值。运行情况如下:(下划线处是用户输入的数据) INPUT R,YEAR= 0.05,2010↙
THE POPULATION OF 2008 IS 20.035400 INPUT R,YEAR= 0.15,2010↙
THE POPULATION OF 2008 IS 49.760360