1
2009-7-29
第 3章 Fortran语言程序设计初步
§ 1 Fortran语言发展概况
§ 2 简单的 Fortran程序分析
§ 3 Fortran源程序格式
§ 4 常量
§ 5 变量
§ 6 Fortran内部函数
§ 7 Fortran算术表达式
§ 8 Fortran的简单语句 (教材 3.9~ 3.13)
§ 9 程序举例
2
2009-7-29
§ 1 Fortran语言发展概况 (p45-46)
一,Fortran语言发展简史
Fortran语言是世界上第一个被正式推广使用的高级语言,Fortran是 Formula Translation的缩写,意为?公式翻译?,它最初是由数值计算方面的需要而发展起来的 。
1957年,IBM公司开发出第一套 Fortran语言,运行在 IBM704计算机上。
1966年,美国标准化协会 ANSI制定了两个标准版本:
①标准 Fortran(x3.9-1966)(也就是 Fortran66) ; ②
标准基本 Fortran(x3.10-1966)。这时 Fortran语言还不是结构化的程序设计语言。
1976年,ANSI重新对 Fortran66进行了评估和拓展,
公布了新的 Fortran标准,也就是 Fortran77。
3
2009-7-29
Fortran77是具有结构化特性的编程语言,它在短时间内取得了巨大的成功,广泛地应用于科学和工程计算,几乎统治了数值计算领域。
1980年,Fortran77被国际标准化组织 ISO接纳为国际标准。
1991年发布的 Fortran90改进了旧版 Fortran
的型式,加入了对象导向的观念与指针,并同时加强数组的功能。
Fortran 现在已经有了 Fortran95,Fortran
2003。
§ 1 Fortran语言发展概况
4
2009-7-29
二,Fortran语言的特性
Fortran语言的最大特性是接近数学公式的自然描述,
在计算机里具有很高的执行效率。
易学,语法严谨。
可直接对矩阵和复数进行运算,这一点类似 Matlab。
自诞生以来广泛地应用于数值计算领域,积累了大量高效而可靠的源程序。
很多专用大型数值运算计算机针对 Fortran做了优化。
广泛地应用于并行计算和高性能计算领域。
Fortran90,Fortran95,Fortran2003的相继推出使
Fortran语言具备了现代高级编程语言的一些特性。
§ 1 Fortran语言发展概况
5
2009-7-29
三,Fortran集成编程平台 (Windows系统下 )
目前主要有两个,Compaq Visual Fortran,Intel
Visual Fortran。
Compaq Visual Fortran发展历史:
Fortran Power Station 4.0 (FPS 4.0),微软公司开发的编程平台,1997年 3月转让给 DEC公司。
Digital Visual Fortran (DVF),Fortran Power
Station的 DEC公司版本。
Compaq Visual Fortran (CVF),1998年 1月,
DEC公司被康柏公司收购,Digital Visual Fortran更名为 Compaq Visual Fortran。一个著名的版本是
Compaq Visual Fortran 6.5。目前康柏公司已并入惠普公司。 Compaq Visual Fortran的最新版是 6.6。
§ 1 Fortran语言发展概况
6
2009-7-29
四、几个著名的 Fortran程序包
IMSL--国际数学和统计链接库
BLAS--Basic Linear Algebra Subroutines
LAPACK--Linear Algebra PACKage
§ 1 Fortran语言发展概况
7
2009-7-29
C Calculate the average of the numbers
x=90.5
y=87.0
z=68.5
aver=(x+y+z)/3.0
write(*,*) 'The three numbers are',x,y,z
write(*,*) 'average=',aver
end
【 例 3.1】 求 x,y,z三个数的平均值。( p46)
第 2~ 4行:赋值语句,分别给 3个变量
x,y,z 赋值。
第 5行:计算赋值语句,计算 3个数的平均值并赋给变量 aver。
第 6~ 7行:输出语句,
分别输出 3个数和它们的平均值。
§ 2 简单的 Fortran程序分析 (p46-48)
注释行,首字符必须是? C”或? *?,
表示该行是注释行。
表示程序结束
8
2009-7-29
变量,在程序中按规定规则组合的、代表存储单元的符号串。
变量代表的存储单元在计算机内存当中,
每个变量存放一个数(包括字符),由编译系统自动分配。
对变量中存放的数,再次赋值时被覆盖,
否则一直保留。
§ 2 简单的 Fortran程序分析
9
2009-7-29
本题思路:
①计算圆周长 C的公式都一样,即 C= 2πR。
②编程时,分别给半径 R赋不同的值,用同一个公式计算 C;
③据此,把程序写成两部分,子程序 专门用于计算圆周长; 主程序 用不同的半径值分别调用子程序,并输出 C值。
【 例 3.2】 分别计算半径 R= 1,3,12,5时的圆周长 C。( p47)
§ 2 简单的 Fortran程序分析
10
2009-7-29
§ 2 简单的 Fortran程序分析
C 主程序
program ex3_2
write(*,*) 'r=',1.0,' c=',c(1.0)
write(*,*) 'r=',3.0,' c=',c(3.0)
write(*,*) 'r=',12.0,' c=',c(12.0)
write(*,*) 'r=',5.0,' c=',c(5.0)
end
C 子程序
function c(r)
pi=3.1415926
c=2.0*pi*r
end
11
2009-7-29
子程序:
第 1行 是注释行;
第 2行 是子程序的头,function说明该子程序为函数子程序,函数名为 c,形参为 r;
第 3行 是赋值语句;
第 4行 是计算赋值语句,将计算结果赋给函数名 c;
第 5行 end表示子程序结束,返回到调用它的主程序。
§ 2 简单的 Fortran程序分析
C 子程序
function c(r)
pi=3.1415926
c=2.0*pi*r
end
12
2009-7-29
§ 2 简单的 Fortran程序分析
C 主程序
program ex3_2
write(*,*) 'r=',1.0,' c=',c(1.0)
write(*,*) 'r=',3.0,' c=',c(3.0)
write(*,*) 'r=',12.0,' c=',c(12.0)
write(*,*) 'r=',5.0,' c=',c(5.0)
end
主程序:
第 1行 是注释行;
第 2行 称为?程序语句?,其作用是为主程序起个名字,
以便识别,可有可无;
第 3~ 6行 是输出语句,在调用函数子程序时,通过给形参传递不同的实参值而得到相应的圆周长。
13
2009-7-29
Fortran77程序小结:
⑴ 一个程序由一个或若干个程序单元组成 。主程序和每一个子程序分别是一个 程序单元 。
一个程序单元也叫做一个模块或程序段,体现了结构化程序设计的模块化思想。
⑵ 每个程序单元都以? end”结束。 主程序中
end语句表示整个程序结束,子程序中 end语句表示结束子程序,返回到调用它的程序单元 。
每个程序单元只能有一个 end语句 。如果在程序中间需要中止运算或返回,可以用 stop语句或用 return语句 。
§ 2 简单的 Fortran程序分析
14
2009-7-29
⑶ Fortran77规定,一行只能写一个语句,一行中不能写多个语句 。 若一个语句太长,在一行内写不完,可以在下行继续写(但要用 续行标志 ) 。
Fortran语言 不区分大小写 。
⑷ Fortran程序中的 语句可以在前面加标号,标号的作用是标志一个语句以便被其它语句引用。
⑸ 某些语句的位置是固定的,如 program语句只能是主程序的第一个语句,end语句只能写在各程序单元的最后一行 。
⑹ Fortran源程序必须按一定的格式输入 。哪些内容应写在一行中的哪一列或哪几列都有严格的规定。
§ 2 简单的 Fortran程序分析
15
2009-7-29
分为 注释行 和 语句行 两类:
注释行,在该行的 第 1列 写? C”或? *?,注释的内容写在 第 2~ 80列 之间。
语句行
1~ 5列为标号区 。如语句需加标号,则放在该区域。标号是 1~ 5位的无符号整数。
第 6列为续行标志区 。若一行的第 6列有 一个非零非空格的字符,则表示该行是上一行的继续。
7~ 72列为语句区 。语句写在该范围内。
§ 3 Fortran源程序格式 (p49-50)
16
2009-7-29
Fortran77的常量有六种,整型常量,实型常量,
双精度常量,复型常量,逻辑型常量,字符型常量 。
1,整型常量即整数 (integer),是没有小数点的数 (正、负、
零 )。 例如 500,+660,123,-321,0等。
2,实型常量即实数 (real),是带小数点的数。有两种表示形式,小数形式,指数形式 。
§ 4 常量 (p54-57)
17
2009-7-29
小数形式由数字和小数点组成( 必须有小数点 )。 小数点前或后为零时零可省略,但不能前后都省略 。
如,12.5,0.88,.096,-121.
0.0可写为 0.,.0,但不能写为,
指数形式用 e或 E表示 底数 10。
如,1.23× 104表示为 0.123e5,1.23e4,123E-2
§ 4 常量指数部分
(必须是整数 )
数字部分
(必须有 )
× e5 e前无 数字
× 1.2E-3.5 指数非整数标准化 (规格化 )形式
(0.1≤|数字 |< 1)
18
2009-7-29
3,双精度常量 (p129)
双精度常量的有效位数和范围是实型常量的两倍。须用指数形式表示,将 e或 E换成 d或 D即可。
4,复型常量 (p131)
即复数 (complex),表示形式,用括号中由逗号分开的两个实数来表示,第一个数表示复数的实部,第二个数表示复数的虚部。
如:
§ 4 常量复型常量 表示的复数
(1.0,2.5) 1+2.5i
(0.0,-5.4) 0-5.4i
(1.5e2,0.) 150+0i
19
2009-7-29
5,逻辑型常量 (p82)
Fortran中的逻辑常量有两个,.TRUE.表示逻辑真,.FALSE.表示逻辑假。
注,与 C语言不同,Fortran的逻辑常量与整型常量不通用 。
6,字符型常量 (p136)
即字符串,用 单引号 括起来的若干个字符。 与 C
不同,Fortran的字符型常量与整型常量不通用 。
如,‘ ABCD’,‘ a’,‘ ’,‘ This”s my
book.’
字符串长度,单引号中字符的个数。
后四种常量将在后面相关章节中详细介绍。 § 4 常量
20
2009-7-29
§ 5 变量 (p58-60)
包括:变量的命名规则、变量的类型定义。
1,变量的命名规则
①由 1~ 6个字母和数字组成;
②首字符必须是字母;
③首字母后面可以跟 1~ 5个字母或数字;
④变量名中大小写字母等价。
如,a,b1,ba,bcd,d7897,a67fg是合法的变量名;
123a,abcdefg,y++,Dr.Li是非法变量名;
TOTAL,Total,total代表同一个变量。
21
2009-7-29
2,变量的类型定义常量有 6种类型,变量也有与之对应的 6种类型。
变量的类型定义有 3种方法,隐式说明,显式定义,
用 implicit语句定义 。
⑴ 隐式说明即 I-N规则,凡以字母 i,j,k,l,m,n开头的变量为整型变量,其余字母开头的变量为实型变量 。 (又叫蕴涵规则,是由系统默认的类型说明 )
如,i,j,imax,number,line,job,k1是整型变量,而 a,b1,count,young,total、
book是实型变量。
§ 5 变量
22
2009-7-29
⑵ 显式定义用 类型定义语句 指定变量类型 。共有 6个变量类型定义语句,包括:
① integer语句(整型变量定义)?
② real语句(实型变量定义)?
③ double precision(双精度型变量定义)
④ complex语句(复型变量定义)
⑤ logical语句(逻辑型变量定义)
⑥ character(字符型变量定义)
§ 5 变量如,integer a,sum,total
real imax,num,job
23
2009-7-29
注,没有被显式定义的变量,其类型按隐式 I-N
规则确定 。
⑶ 用 implicit语句定义功能,把某一字母开头的全部变量指定为所需的类型 。
例如,implicit integer (a,c,t-v)
作用:将以字母 a,c开头的全部变量和从字母 t
到字母 v(即 t,u,v)开头的全部变量指定为整型变量。
如,integer a
real x
x=a+m
§ 5 变量
24
2009-7-29
三种变量类型定义方法的两点注意事项:
三种方法的优先级不同,显式定义优先级最高,implicit语句次之、隐式 I-N规则优先级最低。
类型定义语句只在本程序单元内有效。
类型定义语句必须放置在每段程序头。
如,implicit real (i,j)
integer imax
§ 5 变量
25
2009-7-29
Fortran系统提供的函数称为内部函数。这些函数已由 Fortran系统编好,用户使用时直接调用函数名即可。
全部内部函数见教材 p332附录 Ⅴ,下表列出部分函数。
§ 6 Fortran内部函数 (p61-63)
26
2009-7-29
§ 6 Fortran内部函数函数名 含 义 函数名 含 义
abs 取绝对值 log 自然对数
exp 指数运算 log10 常用对数
sin 正弦 int 取整
cos 余弦 mod 求余
asin 反正弦 sign 取符号
acos 反余弦 real 转换为实数
tan 正切 max 求最大值
atan 反正切 min 求最小值
27
2009-7-29
§ 6 Fortran内部函数内部函数的几点说明:
大部分内部函数要求一个或两个参数,参数个数是固定的,如 abs,mod;但 max和 min函数参数个数不固定,参数个数 ≥2。
函数名分为?通用名?和?专用名?
如:取绝对值函数,通用名为 abs,专用名包括
labs,abs,dabs,cabs,不同专用名要求的参数类型不同。
建议采用通用名,系统会自动识别参数类型 。
三角函数中角度单位为弧度 。
引用时写上函数名,再在括号中按要求写上参数。
28
2009-7-29
一、算术运算符和运算优先级
算术运算符
+ 加 – 减 * 乘 / 除 **乘幂
运算优先级
**最高,* / 次之,+ – 最低。 优先级相同的运算符,按?自左向右?的方向结合 。
例如,x + y – u * 5 / w **2
§ 7 Fortran算术表达式 (p63-66)
可以通过 小括号 改变运算次序。
29
2009-7-29
二、算术表达式
Fortran表达式,由运算符和括号连结运算对象构成的式子 。其中包括 算术表达式,逻辑表达式,
关系表达式,字符表达式 。
§ 7 Fortran算术表达式数学表达式
a× (-b)
(a·b)3
sin(6t)
a·ex
ed
cb
a
31
Fortran表达式
a*(-b)
(a*b)**3
sin(6*t)
a*exp(x)
(1+3*a)/( b+c/(d+e) )
描述公式计算
30
2009-7-29
三、算术表达式需要注意的问题
单个的变量或常数也是表达式。
Fortran无大、中括号,一律用小括号 。
和其它运算符不同,乘方运算符按? 自右向左?的方向结合。如,4**3**2? 4**(3**2)
同类型的算术对象运算结果仍保持原类型。
整数相除后,结果只取整数部分。如,5* 2→10
1/2→0 5/2→2 6.0/4.0→1.5
不同类型的算术对象混合运算时,由低类型转换为高类型(整型 → 实型 → 双精度型)。
不允许整型与逻辑型、字符型混合运算 。
§ 7 Fortran算术表达式
31
2009-7-29
§ 8 Fortran的简单语句 (p67-63)
一、赋值语句二、简单的输出语句三、简单的输入语句四、参数语句五,end,stop和 pause语句
32
2009-7-29
一、赋值语句一般形式为,v = e
功能:把右边表达式 e的值赋给左边的变量 v。
包括,算术赋值语句,逻辑赋值语句,字符赋值语句 。
在算术赋值语句中,右边是算术表达式,左边是算术型变量。
当右边表达式 e和左边变量 v类型不同时,把右边表达式的结果转换为左边变量的类型 。
§ 8 Fortran的简单语句如,i=3.5+2.1
x=3+2
5?i(取整)
5.0?x
33
2009-7-29
二、简单的输出语句输出语句分两种形式:① 按用户指定的格式输出 ;② 按系统默认的标准格式输出 (也称 表控输出 )。
表控输出 有两个语句(完全等价,建议使用
write语句 ):
§ 8 Fortran的简单语句
print *,输出表
write(*,*)输出表系统默认的输出 设备 (显示器 )
系统默认的输出格式一个或多个用逗号隔开的需输出的变量、常量或表达式
34
2009-7-29
表控输出语句说明:
系统默认的输出格式:系统为不同类型的数据提供固定的输出位数。 输出时,数据靠右对齐,
左边补空格 。
每个输出语句都自动换行,从新的一行开始输出 。
同一个输出语句可以输出不同类型的变量。
输出语句没有输出项时,则输出一个空行。
§ 8 Fortran的简单语句例,i = 45
j = 128
write(*,*) i,j
…? 45 …? 128
35
2009-7-29
三、简单的输入语句输入语句也分两种形式:① 按用户指定的格式输入 ;② 按系统默认的标准格式输入 (也称 表控输入 )。
表控输入 也有两种形式(完全等价,建议使用后一种 ):
输入时,数据之间以逗号或空格分隔 。
输入的数据类型应与输入表中变量的类型一致 。一般,整型变量不能输入实数,实型变量可以输入整数。
read *,输入表
read(*,*)输入表
§ 8 Fortran的简单语句
36
2009-7-29
四、参数语句( parameter语句)
功能,用一个名字代表一个常量,即 符号常量 。
符号常量的命名规则和变量名相同,即遵循 I-
N规则,也可用显式定义形式定义符号常量的类型。
符号常量的值不能再被改变。
符号 常量可以是数值型、逻辑型或字符型。
parameter语句必须放在输入 /输出、赋值、
选择结构、循环结构等可执行语句之前。
例,parameter (pi=3.1415926,k=125,imax=50)
§ 8 Fortran的简单语句
37
2009-7-29
五,end,stop和 pause语句
1,end语句作用,主程序中 end语句表示整个程序结束,子程序中 end语句表示结束本子程序,返回到调用它的程序单元 。
一个程序单元只能有一个 end语句,并且 必须 放在本程序单元的最后一行 。
2,stop语句作用,不论在主程序还是在子程序中,使程序结束 。
可以有多个 stop语句,可以出现在程序的任意位置 。
§ 8 Fortran的简单语句
38
2009-7-29
3,pause语句作用,暂时停止程序运行,按回车键 可从暂停处接着运行 。
主要用途:在调试程序时,可在一个程序中放几个 pause语句,把一个程序分成几段,逐段调试,
便于发现错误。
§ 8 Fortran的简单语句
c 计算一个数的开方
read(*,*) x
if(x,lt,0) stop
y=sqrt(x)
write(*,*) 'y=',y
end
39
2009-7-29
本章要点回顾
1,FORTRAN源程序格式;
2、常量(整型和实型)及写法;
3、变量(整型和实型)命名、类型定义方法;
4、算术运算符及算术表达式;
5,FORTRAN内部函数及在源程序中的引用;
6、几个常用的简单语句(赋值语句,表控输入输出语句等)。
40
2009-7-29
【 例 3.3】 已知三角形的三边为 a,b,c,求三角形的面积 s。( p74)
2/)( cbap,其中 ))()(( cpbpapps
write(*,*)'请输入三角形三边的长度,'
read(*,*)a,b,c
p=(a+b+c)/2
s=sqrt( p*(p-a)*(p-b)*(p-c) )
write(*,*)'三角形面积 =',s
end
§ 9 程序举例
41
2009-7-29
【 例 3.4】 求方程 ax2 + bx + c = 0 的根。 a,b,c
由键盘输入,设 b2 - 4ac>0。
a
acbbx
2
42
a
acb
a
b
2
4
2
2?

a
acbq
a
bp
2
4
2
2
=,令 qpxqpx 21 =,则
§ 9 程序举例
42
2009-7-29
real a,b,c,p,q,x1,x2
write(*,*)'请输入一元二次方程 3个系数 a,b,c的值,'
read(*,*)a,b,c
p= -b / (2*a)
q= sqrt(b**2-4*a*c) / (2*a)
x1=p+q
x2=p-q
write(*,*) '方程的根 x1=',x1,'x2=',x2
end
§ 9 程序举例
43
2009-7-29
书面作业
P76 一 ~八,十一,十二下周三交。
44
2009-7-29