1
2009-7-29
第 6章 Fortran的数据结构
§ 1 数据结构
§ 2 双精度类型数据
§ 3 复型数据
§ 4 四种数值型数据之间的运算及转换规则
§ 5 字符型数据
2
2009-7-29
程序是为解决问题而编制。解决问题面临的对象是 数据 和 算法 。
程序=算法+数据算法有三种基本结构:顺序、选择、循环。
数据有没有结构问题呢?如果有,又使用什么样的结构?
数据结构的形式化定义,数据结构是一个二元组
Data-Structure=(D,S)
其中,D是数据元素的有限集,S是 D上关系的有限集。
§ 1 数据结构 (p128-129)
§ 1 数据结构
3
2009-7-29
§ 1 数据结构一般来说,高级程序设计语言使用三种数据结构,即 基本数据结构,构造数据结构 和 指针数据结构 。
一、基本数据结构基本数据结构 又称 基本类型 (从数据类型角度讲),是指不可再分的基本数据项 。
Fortran77基本类型有六种,整型,实型,双精度型,复型,逻辑型,字符型 。
例如,125,32.5,0.123e-3,(10.8,5.)属于基本类型的数据,都是最基本的数据项。
本章将介绍双精度型、复型和字符型。
4
2009-7-29
二、构造数据结构(构造类型)
由基本数据结构按一定规则构造而成的 复合型数据 。
包括 数组 (教材第 9章),记录 等。
记录 是数据库系统中的术语。一个基本的数据库文件是一个二维表格,表中的每一行称为一个记录。
如某班同学毕业后的通讯录可以包括以下基本内容:
姓名 性别 城市 单 位 职 务 手机张三 男 北京 * * * 局长 1391234561
李四 女 上海 * * * 局总工 1381234562
王五 男 南京 * * * 院长 1371234563
┇ ┇ ┇ ┇ ┇ ┇
§ 1 数据结构
5
2009-7-29
每个记录(即每行)由若干个基本数据项组成,数据项的类型可以不同。
一个记录相当于一个结构体,多个记录相当于一个结构体数组 。
将全部记录保存在数据库系统中,即为一个数据库文件(相当于 excel中的一个工作表)。
将记录保存在普通文件中,即为数据文件( 第 13章将涉及)。
§ 1 数据结构姓名 性别 城市 单 位 职 务 手机张三 男 北京 * * * 局长 1391234566
李四 女 上海 * * * 局总工 1381234567
王五 男 南京 * * * 院长 1371234568
┇ ┇ ┇ ┇ ┇ ┇
6
2009-7-29
三、指针数据结构(指针类型)
主要用于构造各种形式的动态数据结构,如链表 (linked list)、队列 (queue)、堆栈 (stack)、树
(tree)、图 (graph)。
Fortran没有指针类型 。
§ 1 数据结构
7
2009-7-29
§ 2 双精度类型数据 (p129-130)
双精度型数据的有效位数和范围是实型数据的两倍,
在计算机中,以两倍于实型的字节数来存储一个双精度数。
一、双精度型常数必须 用指数形式表示,将实数的 e或 E换成 d或 D即可。
如 12.3456789在 Fortran中可表示为实型或双精度型:
① 表示为实型,12.3456789或 1.23456789e1。
② 表示为双精度型,1.23456789d1。
注意 ① 和 ② 两种表示的区别:设实型为 7位有效数字,
双精度型为 15位有效数字,则:
① 实际表示的数为 12.34568(共 7位有效数字)
② 实际表示的数为 12.3456789000000( 15位有效)
§ 2 双精度类型数据
8
2009-7-29
§ 2 双精度类型数据二、双精度型变量须用类型说明语句 double precision或 implicit语句加以说明。
如:
如:
double precision a,b,c
implicit double precision (a-c)
设实型为 7位有效数字,双精度型为 15位有效数字,问下面三个变量中实际存放的数是多少?
real rx
double precision dx,dy
rx=12.3456789
dx=12.3456789d0
dy=12.3456789
12.34568
12.3456789000000
12.3456800000000
9
2009-7-29
【 例 6.1】 求:
!20
1
!3
1
!2
1
!1
1S
§ 2 双精度类型数据考虑该问题有较高的精度要求,因此用双精度类型进行计算。
编程思路在上一章已经讨论过。
double precision s,z
s=0.0d0
z=0.0d0
do 5,k=1,20
z=z/k
s=s+z
5 continue
print*,s
end需注意对 z的定义
10
2009-7-29
§ 3 复型数据 (p131-134)
一、复型常量(复型常数)
Fortran中的表示形式,用一对括号中由 逗号分开的 两个实数来表示,第一个数表示复数的实部,
第二个数表示复数的虚部。
二、复型变量用类型说明语句 complex或 implicit加以说明。
如:
1,复型变量的赋值问题
complex c,d
implicit complex (x-z)
§ 3 复型数据
11
2009-7-29
§ 3 复型数据可以直接把复型常数赋给复型变量。
如:
但是,若复型常数中的实部或虚部不是常数,而是表达式,则须用 cmplx函数 将实部和虚部组成复型数后再赋给复型变量。
如:
当 cmplx函数中只有一个自变量时,则它代表实部,虚部为 0。
如:
complex c,d
c=(3.0,6.3)
d=(8.75e+5,-67.8e-3)
c=(3.0*2,6.3+1.7)
c=cmplx(3.0*2,6.3+1.7)?
c=cmplx(3.0)? c=(3.0,0.0)
12
2009-7-29
2,复数可以直接进行加、减、乘、除运算。
如:
3.当 abs函数中的自变量为复数时,得到的是复数的模。
如:
complex a,b,c
a=(1.0,2.0)
b=(3.0,4.0)
c=a+b
c=a-b
c=a*b
c=a/b
(4.0,6.0)
(-2.0,-2.0)
(-5.0,10.0)
(11.0/25,2.0/25)
§ 3 复型数据
complex a
a=(3.0,4.0)
write(*,*)abs(a) 0.50.40.3)a(a b s 22
13
2009-7-29
4,复数的输入输出。
采用表控输入语句 read(*,*)输入时,键入时要以复型常数的形式输入 (即 一对括号中由 逗号分开的 两个实数)。
采用表控输出语句 write(*,*)输出时,输出的是复型常数或一对常数的形式 。
【 例 6.2】
§ 3 复型数据
complex a,b,c
read(*,*)a,b
c=a/b
write(*,*)a*b,c
end
14
2009-7-29
一、不同类型数据之间的运算规则当不同类型的数据混合运算时,先将级别低的类型转换成级别高的类型,然后在同一类型下进行运算 。
类型的级别如下:
§ 4 四种数值型数据之间的运算和转换规则复型( 1级)
双精度型( 2级)
实型( 3级)
整型( 4级)
高低
§ 4 四种数值型数据之间的运算和转换规则
15
2009-7-29
1,加减乘除的运算规则设进行 a+b,a-b,a*b,a/b,则运算规则为:
整 型 实 型 双精度型 复 型整 型 整 实 双 复实 型 实 实 双 复双精度型 双 双 双 复?
复 型 复 复 复? 复
a类型结果类型
b类型其中?表示 Fortran77标准不允许双精度数与复数混合运算,但有的 Fortran系统允许它们混合运算。
§ 4 四种数值型数据之间的运算和转换规则
16
2009-7-29
2,乘方运算规则设进行 a**b( a为底数,b为指数),规则为:
整 型 实 型 双精度型 复 型整 型 整 实 双 复实 型 实 实 双 复双精度型 双 双 双 复?
复 型 复 复 复? 复
a类型结果类型
b类型其中?表示 Fortran77标准不允许双精度数与复数之间进行乘方运算,但有的 Fortran系统允许。
§ 4 四种数值型数据之间的运算和转换规则
17
2009-7-29
二、不同类型数据的赋值规则赋值语句,v=e( v为变量,e为表达式)
基本规则:
① 若变量 v与表达式 e的类型相同,则直接赋值;
② 若变量 v与表达式 e的类型不同,则 将右边表达式结果的类型转换为左边变量的类型 。
具体规则见下页。
§ 4 四种数值型数据之间的运算和转换规则
18
2009-7-29
整 型 实 型 双精度型 复 型整 型 取整 取整 实部取整实 型 转为实型 舍去多余的有效数字,变成实型 取实部双精度型 转为双精度型 转为双精度型 实部转为双精度型复 型转为实型,
虚部为 0,
变成复数虚部为 0,
变成复数舍去多余的有效数字,变成实型;虚部为 0,变成复数变量 v
的类型表达式 e
类型
§ 4 四种数值型数据之间的运算和转换规则
19
2009-7-29
三、类型转换函数在混合运算时,低类型 → 高类型是自动转换;
而 高类型 → 低类型 需要强制转换,使用类型转换函数。
类型转换函数 不仅可以强制类型由 高 → 低 转换,
也可强制类型由 低 → 高 转换。(见下表)
§ 4 四种数值型数据之间的运算和转换规则
20
2009-7-29
整 型 实 型 双精度型 复 型
int(a) 不转换 取整 取整 实部取整
real(a) 转为实型 不转换 舍去多余的有效数字,变成实型 取 a的实部
dble(a) 转为双精度型 转为双精度型 不转换取 a的实部并转为双精度型
cmplx(a)
将 a化实,
作为实部,
虚部为 0
将 a作为实部,虚部为 0
将 a的多余有效数字去掉,作为实部,虚部为 0
不转换
cmplx(a1,a2)
a1,a2先化实,然后分别作为实部和虚部
a1作实部
a2作虚部将 a1,a2先舍去多余有效数字,
变成实型,再分别作实部、虚部实部是
real(a1),
虚部是
real(a2)
函 数
a类型
§ 4 四种数值型数据之间的运算和转换规则
21
2009-7-29
a类型是否允许
b类型四、不同类型数据的比较规则设对 a,b进行关系比较运算,则比较规则为:
整 型 实 型 双精度型 复 型整 型 允许 允许 允许 ☆
实 型 允许 允许 允许 ☆
双精度型 允许 允许 允许 不允许复 型 ☆ ☆ 不允许 ☆
§ 4 四种数值型数据之间的运算和转换规则其中,☆ 表示只能进行,eq.或,ne.比较,例如 a
为实型,则,
a,eq,(2.0,3.0)?,a,gt,(2.0,3.0) × 。
22
2009-7-29
一、字符型常量和字符型变量
1,字符型常量即 字符串 (character string),用 成对单引号 括起来的若干个字符。如 ’a’,’sinx=’,’1+2’,’character ’等。一个字符型常量也是一个数据。
2,字符型变量存放字符型常量的变量称为字符型变量。须用类型说明语句 character或 implicit语句进行说明。
例:
定义了三个字符型变量 str1,str2,str3,并 统一指定 每个字符变量的长度为 5,即每个字符变量可以存放 5
个字符。
§ 5 字符型数据 (p136-144)
character*5 str1,str2,str3
§ 5 字符型数据
23
2009-7-29
定义时,也可以分别指定各个字符变量的长度,即个别指定 。
如:
当既有“统一指定”、又有“个别指定”时,“个别指定”优于“统一指定” 。
如:
若不指定长度,则隐含长度为 1。
如:
也可以用 implicit语句定义字符型变量如:
也可以用 character来定义符号常量 。
如:
character name*20,addr*30,code*10
character*5 a,b*6,c,d*4,e
§ 5 字符型数据
character a,b,c
implicit character*5 (a-c),character*4 (y)
character*5 name
parameter (name=‘China’)
24
2009-7-29
二、字符型变量的赋值
1,用赋值语句对字符型变量赋值。
如,character*8 str1,str2,str3
str1=‘ABCDE’
str2=‘ABCDEFGH’
str3=‘ABCDEFGHIJK’
EDCBAstr1
当 字符串长度 <变量长度,靠左存放,右补空格。
HGFEDCBAstr2
§ 5 字符型数据
HGFEDCBAstr3
当 字符串长度 >变量长度,从左存放,右边多余字符截去。
25
2009-7-29
2,可用输入语句输入。
采用表控输入语句 read(*,*)输入时,键入时字符串要用单引号括起来 。
【 例 6.3】
character*8 str1,str2,str3
read(*,*)str1,str2,str3
write(*,*)str1,'长度 =',len(str1)
write(*,*)str2,'长度 =',len(str2)
write(*,*)str3,'长度 =',len(str3)
end
§ 5 字符型数据
26
2009-7-29
三、子字符串从一个字符串中截取的 任一连续部分 称为该字符串的子串 (substring),或称为 子字符串 。
例如:字符变量 a的值为字符串‘ shiyoudaxue’,则
‘ shiyou’、‘ you’、‘ da’、‘ d’等都是 a的子串,而 ’se’
不是。
1,子串的表示形式字符变量名 (e1:e2)
其中,e1,e2是整型表达式,表示子串在字符变量中的起始、终止的位置。
如:
character*29 str
str=‘China University of Petroleum’
write(*,*) str(1:5),str(21:29)
end § 5 字符型数据
27
2009-7-29
§ 5 字符型数据
2.子字符串需要注意的问题
①子字符串的上下界
“字符变量名 (e1:e2)”中的 e1,e2分别称为子字符串的左、右边界 。设字符变量的长度为 L,则 e1,e2应满足:
1≤e1≤e2≤L。
若省略 e1表示 e1=1;若省略 e2表示 e2=L;若 e1,e2都不写(但不能省去冒号),表示 e1=1,e2=L。
如,str=‘China University of Petroleum’
str(7:16)
str(,5)
str(21,)
str(,)
University
China
Petroleum
China University of Petroleum
28
2009-7-29
② 子串赋值的重叠问题可以把一个子串赋给另一个字符型变量或另一个子串,
但 赋值号两边的子串不能互相重叠 。
如,character str*29,a*10
str=‘China University of Petroleum’
a=str(1:5)
str(1:9)=str(21:29)
str(1:8)=str(3:10)
China
Petroleumversity of Petroleum
a=str(3:10)
str(1:8)=a
§ 5 字符型数据
29
2009-7-29
四、字符型数据的运算包括 连接运算 和 关系运算 。
1,连接运算运算符,//,功能:将两个字符型数据连接起来。
如:
2,关系运算字符型数据可以进行关系比较。
比较规则,按字符 ASCII代码的值进行比较,代码大者则为“大”。
§ 5 字符型数据
character str1*3,str2*3,str3*6
str1='abc'
str2='123'
str3=str1 // str2 str3='abc123'
30
2009-7-29
§ 5 字符型数据常用字符的 ASCII码值顺序:
进行关系运算时,遵循以下规律:
① 两个字符串比较时,将两个字符串中的字符从左到右依次比较,若所有字符均相同则认为两个字符串相等,
否则 以第一个不相同的字符的比较结果为准 。
② 若两个字符串长度不等,则 系统自动在短串的右边补空格,使两者等长再比较 。
! " # $ % & ' ( ) * +,-,/
0 1 2 3 4 5 6 7 8 9
,; < = >? @
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
a b c d e f g h I j k l m n o p q r s t u v w x y z
小大小 大
31
2009-7-29
五、字符函数
① len(a),其中 a为字符型变量功能:得到 a的长度。
② lgt(a,b),其中 a,b为字符型变量功能:比较 a,b,若 a>b则函数值为,true.,否则为,false.。
③ lge(a,b),其中 a,b为字符型变量功能:若 a≥b则函数值为,true.,否则为,false.。
④ llt(a,b),其中 a,b为字符型变量功能:若 a<b则函数值为,true.,否则为,false.。
⑤ lle(a,b),其中 a,b为字符型变量功能:若 a≤b则函数值为,true.,否则为,false.。
§ 5 字符型数据
32
2009-7-29
⑤ index(a,b),其中 a,b为字符型变量功能:若字符串 a中包含字符串 b,则函数值为 b中第一个字符在 a中出现的位置;若 a不包含 b,则函数值为 0。
如:
⑥ char(I),其中 I为一个整数功能:得到 ASCII码值为 I的字符,即将 ASCII码转换为字符。
⑦ ichar(a),其中 a为一个字符串功能:得到字符串 a中第一个字符的 ASCII码值(十进制数)。
character str*29
str='China University of Petroleum'
write(*,*)index(str,'of')
end
§ 5 字符型数据若 a中包含多个 b,
返回的是最左边
b的第一个字符位置。
33
2009-7-29
【 例 6.4】 打印下面图形,要求用字符型变量。(一个字符变量存放一行中所有字符)
***
*** ****
*****
思路:循环 5次输出字符变量 star,每输出一行,并增加一个 *。
character*5 star
star=’ ’
do 10 i=1,5
star(i:i) =’*’
write(*,*) star
10 continue
end § 5 字符型数据问:若只输出对角线,
程序如何修改?若要输出一个上三角,程序如何修改?
34
2009-7-29
character*5 star
star=’ ’
do 10 i=1,5
star(i:i) =’*’
write(*,*) star
star(i:i) =’ ’
10 continue
end
character*5 star
star=’ *****’
do 10 i=1,5
write(*,*) star
star(i:i) =’ ’
10 continue
end
输出对角线 输出上三角
§ 5 字符型数据
35
2009-7-29
【 例 6.5】 打印下面图形,要求用字符型变量。(一个字符变量存放一行中所有字符) *
********
****************
************
****
§ 5 字符型数据设两个字符型变量,character*9 star,output
star='*********'
output=' '
思路:用变量 output进行输出,每输出一行,将 output
中相应位置的空格用变量 star中相应位置的星号替换。
36
2009-7-29
character*9 star,output
star='*********'
output=' '
do 10,i=1,5,1
output(5-(i-1):5+(i-1))=star(5-(i-1):5+(i-1))
write(*,*)output
10 continue
do 20,i=4,1,-1
output(5-(i-1):5+(i-1))=star(5-(i-1):5+(i-1))
write(*,*)output
20 continue
end
,i,,-
output=' '
output(5-(i-1):5+(i-1))=star(5-(i-1):5+(i-1))
rite(*,*)output
§ 5 字符型数据上半输出结束下半输出结束
37
2009-7-29
character*9 star
star=’ ’
do 10 i=1,5
do 5 k=5-i+1,5+i-1
star(k:k) =’*’
5 continue
write(*,*) star
10 continue
do 20 i=1,4
star(i:i) =’ ’
star(9-i+1:9-i+1) =’ ’
write(*,*) star
20 continue
end
上半输出结束下半输出结束
§ 5 字符型数据
38
2009-7-29
§ 5 字符型数据
【 例 6.6】 。将字符串中的字符按相反顺序显示。
character*26 str1,str2
str1=’abcdefghijklmnopqrstuvwxyz’
do 10 i=1,26
k=26-i+1
str2(k:k)=str1(i:i)
10 continue
write(*,*) str2
end
39
2009-7-29