fortran语言教程第3章 联系客服

发布时间 : 星期一 文章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