文档库 最新最全的文档下载
当前位置:文档库 › Fortran95第8章 构造表达式

Fortran95第8章 构造表达式

Fortran95第8章 构造表达式
Fortran95第8章 构造表达式

第8章构造表达式

完成了数据描述的任务之后,一个程序就进入了数据处理的阶段。也就是一系列的以数据为对象的操作语句,访问经过声明的数据对象,施加计算处理之后,获得新的数据结果。

FORTRAN语言里面访问数据对象然后返回值的一个基本指令形式是表达式,而通过表达式所得到的计算结果被用来赋值给某个变量,完成这个操作的是赋值语句。本章与下一章我们将讨论表达式与赋值语句这两个相续的改变机器的数据状态的基本操作。

一个科学计算程序的基本任务就是进行计算,而计算的最基本的单位就是表达式。FORTRAN作为一门最早的高级语言,其初衷就是公式翻译(FORMULA TRANSLATION),即希望运用这个语言,能够把数学公式最好是原封不动地搬到FORTRAN语言的环境里,

而计算机能够忠实地理解公式的含义,并进行公式所要求的运算。

当然,要求把能够把数学公式原封不动地搬到FORTRAN语言的环境里,就能够被FORTRAN理解是不可能的,因为首先是公式的输入受到键盘的限制,然后作为一种程序语言,我们在第4章已经讨论过,它所使用的字符集必定是有限的,而数学符号的集合则基本上是开放性的。

而从计算的实质上来考虑,我们知道计算机在物理层面所能够做到的计算其实是非常

简单的加减法而已,因此我们希望运用计算机来完成任意的计算任务,所面临的挑战,正是如何把我们的实际计算任务分解为等价的简单计算过程的组合,FORTRAN作为一种语言,显然只能在很初步的层次上完成这个任务,即直接在语言里使用数学基本运算,例如:加法,减法,乘法,幂运算等,然后在此基础上,再定义一些基本的数学函数作为语言的固有函数,可以供人直接引用,对它的解释则完全交给FORTRAN编译器。FORTRAN所能够做到的

基本上也就到此为止了。更进一步的计算的分解任务,则必须由程序来完成。因此FORTRAN 能够做到的就是尽量以符合数学的书写习惯的方式来规范表达式的格式。

一般说来,我们把表达式理解为语句(甚至是程序)的语法结构的单位。在其他的语言里,表达式同样具有非常关键的语法地位,例如在C语言中,表达式组成了允许每一语句改变机器状态的基本操作。在LISP语言这样的高级应用语言中,表达式构成了驱动程序执行的基本顺序控制。而在FORTRAN这样的以科学计算为主要目的的语言当中,表达式更是

构成了完成计算任务的基本成分。

本章的讨论就是围绕着表达式的构造如何贴切地合乎我们对于计算任务的要求。分为

三个部分:

● 有效合法的表达式的格式。

也就是构造表达式的语法。按照我们在前面经常根据语法规则来构造语言所获得的经验,合乎格式的语句不一定是有实际意义的语句,因此我们接着就需要讨论对表达式的理解问题,即:

● 对表达式的解释。

可以理解为表达式的语义,也就是一种规范,按照这种规范,计算机读入合法的表达式之后,能够无歧义地转化为一系列指令,从而采取相应的动作。

计算机对表达式的含义的理解建立在表达式的构造语法的规范性上,一旦完成这个步骤,接着就是完成表达式的最终任务:

● 表达式的计算过程。

计算机对于表达式的实际计算过程未必与人的计算过程一致,对于计算机来说,最为重要的是根据机器计算的特点,对计算过程进行优化,相应的作为程序作者,我们需要了解机器的优化原则,以便在程序写作与算法设计上配合机器的计算优化能力。

FORTRAN表达式的构造,需要解决两大问题:

● 构造算元与算符的规则;

● 运算优先级的规则。

在构造合法的FORTRAN表达式的过程中,最主要的问题就是如何在FORTRAN有限

的构造表达式的规则下,能够构造具有开放性的数学公式。

由于一个表达式的基本成分就是算元,算符和括号,因此上面的问题可以分为两个部分:

·在固有算元类型的基础上,能够构造派生类型的算元;

·在固有算符的基础上,能够扩展固有算符的适用范围,能够构造派生类型的算符。

因此所谓构造表达式的规则,除了规定固有算元与固有算符之外,还必须给出对固有

算元与固有算符的扩展与派生定义的规则。

接下来需要考虑的问题,就是如何表达运算优先级,也就是括号所具有的功能。

在数学运算的过程当中,运算优先级是一个很自然的问题,在数学公式的写作中,我

们使用了很多隐含的规则,基本能够保证数学公式的读者不会产生歧义,把数学公式转换到FORTRAN语言当中,就不能够再依靠那些隐含的规则,而是需要把那些规则明确的形式化出来,有时候还得制定适应于机器语言的独特规则。

尽管我们可以使用尽可能多的括号来做到明确的优先级描述,但是从方便写作的角度

来看,在不导致歧义的前提下,可以通过形式规则来省略很多括号。

8.1 表达式的构造

本节可以说是书写表达式的语法。从语言的角度来看,我们前面章节所讨论的数据对象,可以说是语言的词汇,而且是语法意义上比较简单词汇,即使很多数据对象可以具有非常复杂的数据结构,但在语法意义上,则仍然可以看成是单词。但表达式就不同了,它所隐含的指令性质使得它可以看成是复合性质的词汇。实际上表达式是访问程序中的数据对象并返回值的函数。这就要求它具有比数据对象更为复杂的语法结构。

表达式包含三个基本成分:

● 算元;

● 算符;

● 括号。

其中算元具有最基本的实质含义,因此最简单的表达式就是一个常量,或一个变量。

【例8-1】下面的例子都可以看成是最简单的表达式:

2.7183 !一个实型常数

A !一个标量变量

X !一个数组变量

.TURE. !一个逻辑型常量

X(I) !作为数组X的元素的变量

X(10:100:5) !作为一个数组片断的变量

A%B !作为结构A的成员的变量

X(I)(K:K+100) !作为数组元素X(I)的子串的变量

8.1.1 算元

遵循变量的数学精神,我们可以把表达式看成是一个递归结构,即表达式里的变量总是可以代表任意的由变量构成的结构,或者说表达式,因此可以如下规定算元的构成。

一个算元可以是如下形式的表达式:

● 一个常量或常量的子对象;

● 一个变量;

● 一个数组构造器;

● 一个结构构造器;

● 一个函数引用;

● 另一个括号里的表达式。

注意另一个表达式!,如果使用同一个表达式,必然导致死循环。

【例8-2】下面是算元的例子:

X !

Y(3)

Z(10:100)

(X+SIN(Y))

(/5.52,4031/)

EULER(5,9)

RT

8.1.2 一元算符与二元算符

根据算符所作用的算元数目,算符分为一元算符与二元算符。

下面的表8-1给出了FORTRAN的固有算符,除此之外,用户可以运用函数子程序来给出自定义算符,然后使用一个名称来标志该自定义算符,在FORTRAN语言里,则还需要在名称的两边分别加上一个句点,以便FORTRAN辨识为自定义算符。

无论是固有算符还是自定义算符,总是分为一元算符与二元算符。

一元算符作用于一个算元,形式为:

operator x

即算符写在算元之前。

【例8-3】

+ A

- G

.NOT. B

上面的一元算符里面,+和-都可以成为二元算符,而.NOT.则是唯一的只能作一元算符的固有算符。

加号+运算实际上并不影响算元的值。

二元算符作用于2个算元,形式为:

x operator y

即算符写在2个算元之间。

【例8-4】

A+B

D**3

X .AND. Y

A .GT. B

C .NE. D

PROGRAMER // CALCULATE

A == B

C-D

8.1.3 固有算符与自定义算符

算符分为两类:

● 固有算符。

所谓固有算符就是直接使用相应符号,能够被FORTRAN编译器所辨识的算符。

下面的表8-1给出了FORTRAN的固有算符以及相应的算元类型。

关系算符==,/=,>,>=,<,<=是为了向数学公式的写法靠近,而在FORTRAN里面最新引入的算符写法,分别等价于.EQ.,.NE.,.GT.,.GE.,.LT.,.LE.。

● 自定义算符。

显然上面那些固有算符不够用,所以为了获得算符表示的开放性,FORTRAN约定了通过函数子程序定义自定义算符的规则。

首先自定义算符必须拥有一个名称,而这个名称的写法必须满足一定的形式规则,以便FORTRAN编译器的辨识。

自定义算符的形式为:

.XXX… .

即在两个句点之间有n个字母,n不大于31。

中间的字母串最好是一个表达该运算含义的英文单词。这个单词不能与固有运算符或者逻辑常量里面已经使用了的单词重复。

自定义算符可以是基于已经定义的算符和固有算符,完全重新定义的算符,因此需要给出一个新的名称,也可以是对固有算符的作用算元的类型的扩展,这时仍然可以使用固有算符的符号,但是扩展定义需要预先给出。

一元自定义算符具有最高的运算优先级,而二元自定义算符具有最低的运算优先级。

8.2.4 构造表达式的规则

所谓构造表达式的规则,就是一系列的语句规则,按照这个规则把算元和算符组合起来得到的就是合法的表达式。当然这里包含了一定的任意性,即只要按照这个规则构造出来的表达式都是被FORTRAN认可的。

语法规则除了给出算元与算符的顺序之外,还能够表达运算顺序,而这个运算顺序是以运算优先级形式给出的,当然FORTRAN表达式的运算优先级必须和我们的数学公式里的运算优先级一致。

直观来看,表达式就是变量的运算结构,而变量本身具有递归的含义,因此表达式的定义必然是具有递归的结构。

也就是首先我们定义最底层的基元,即最简单的表达式,然后对基元的运算构成更加复杂的表达式,而递归的体现就是在基元里面包括括号里面的表达式。

1. 基元

基元的形式定义(R701)为:

constant

constant-subobject

variable

array-constructor

structure-constructor

function-reference

(expression)

以上任何一种对象都可以成为基元。

所谓常量子对象(constant-subobject),就是一个父结构为常量的子对象。

作为基元的变量,不能是哑尺度数组,或者一个哑尺度数组的片断,除非数组的最后一个下标已经明确给出为一个标量下标,或上界确定的下标三元组,或下标向量。

【例8-5】基元的例子如下:

3.1416 实型常量

PI 命名常量

LENGTH 命名常量

…WHOLE?(I:I)常量子对象

X 变量

X(K) 数组元素

X(:,1:K) 在最后一维具有上界的哑尺度数组

STRING(I:J) 子串

(/I,5,100/) 数组构造器

BESSEL1(A,B) 结构构造器

F(X) 函数引用

括号里的表达式

(…WHOLE?(I:I)//

BUT)

作为一个命名常量,PI明显地表示圆周率,使用这类含义明确的英文单词来表示常量是一个很好的习惯。

当LENGTH具有PARAMETER属性,或出现在PARAMETER语句当中时,同样是一个命名常量。

…WHOLE?(I:I)实际上是一个常量子对象,尽管其中I可能是一个变量,但它的父结构是一个常量。BESSEL1(A,B),F(X)都属于自定义类型对象,它们在程序里出现时,都需要预先加以定义。

2. 自定义一元表达式

一个已经自定义的一元算符后接一个算元构成一个自定义一元表达式,句法形式(R703)为:

[defined-operetor]primary

其中自定义算符(defined-operetor)的句法形式(R704)为:

.letter[letter]… .

注意自定义算符是可选的,即单独的基元也可以构成一元表达式。

构成自定义算符的字符数目不能够超过31。

自定义算符不能与固有算符以及逻辑字面常量雷同。

【例8-6】

.ABEL.G 自定义一元表达式,.ABEL.为自定义算符

G 单独的基元也可以构成一元表达式

3. 幂运算表达式

幂运算表达式的句法形式(R705)为:

defined-unary-expression[**exponentiation-expression]

以上形式表明了幂运算表达式(exponentiation-expression)是右边递归的,即幂运算算符右边的幂运算表达式正是上面所定义的表达式本身,这意味着会出现多个幂运算连在一起的情形,这时的优先级是从右到左,即X**Y**Z被解释为X**(Y**Z)。

注意其中的幂运算表达式与幂运算算符都是可选的,即单独的自定义一元表达式从语法角度而言,也是幂运算表达式。

【例8-7】

X**Y 幂运算表达式

X**Y**Z 表示从右到左优先级的幂运算表达式

.ABEL.G 自定义一元表达式也是幂运算表达式

G 单独的基元也可以构成幂运算表达式

4. 乘法表达式

乘法表达式的算元为*和/,句法形式(R706)为:

[multiplication-expression*]exponentiation-expression

multiplication-expression / exponentiation-expression

以上形式表明了乘法表达式(multiplication-expression)是左边递归的,即乘法算符左边的乘法表达式正是上面所定义的表达式本身,这意味着会出现多个乘法运算连在一起的情形,这时的优先级顺序是从左到右,即X*Y*Z被解释为(X*Y)*Z。

在以后的二元运算里,除了关系运算,同级优先级顺序都是从左到右。

注意使用算符*的乘法运算表达式与乘法运算算符都是可选的,即单独的幂运算表达式从语法角度而言,也是幂运算表达式。

【例8-8】

X*Y 乘法运算表达式

X*Y*Z 表示从左到右优先级顺序的乘法运算表达式

X / Y 乘法运算表达式

X / Y / Z 表示从左到右优先级顺序的乘法运算表达式

X**Y 幂运算表达式也是乘法运算表达式

.ABEL.G 自定义一元表达式也是乘法运算表达式

G 单独的基元也可以构成乘法运算表达式

5. 加法表达式

加法表达式的算元为+和-,句法形式(R707)为:

[summation-expression + ] multiplication -expression

summation-expression - multiplication –expression

+ multiplication -expression

- multiplication –expression

多个加法运算的优先级顺序是从左到右,例如X+Y+Z被解释为(X+Y)+Z。

注意使用算符+的加法运算表达式与加法运算算符都是可选的,即单独的乘法运算表达式从语法角度而言,也是加法运算表达式。

【例8-9】

X+Y 加法表达式

X-Y+Z 表示从左到右优先级顺序的加法表达式

-X-Y-Z 表示从左到右优先级顺序的加法表达式

-X 使用一元算符-的加法表达式

+X 使用一元算符+的加法表达式

X*Y 加法表达式

X / Y / Z 加法表达式

X**Y 幂运算表达式也是加法表达式

.ABEL.G 自定义一元表达式也是加法表达式

G 单独的基元也可以构成加法表达式

6. 串联表达式

串联表达式的算元为//,句法形式(R711)为:

[concatenation-expression // ] summation-expression

【例8-10】

X//Y 串联表达式

X//Y//Z 表示从左到右优先级顺序的串联表达式

X+Y 加法表达式也是串联表达式

-X-Y-Z 串联表达式

-X 串联表达式

X*Y 串联表达式

X / Y / Z 串联表达式

X**Y 幂运算表达式也是串联表达式

.ABEL.G 自定义一元表达式也是串联表达式

G 单独的基元也可以构成串联表达式

7. 比较表达式

比较表达式的算元为关系算符,句法形式(R713)为:

[concatenation-expression relation-operator ] concatenation-expression

关系算符==,/=,>,>=,<,<=在任何情况下总是分别等价于

.EQ.,.NE.,.GT.,.GE.,.LT.,.LE.。

注意关系表达式的定义不具有递归性,即关系表达式本身不出现在上面的形式定义当中,所以不会出现多个关系算符连在一起的情形。

【例8-11】

X .NE. Y 关系表达式

X <=Y 关系表达式

X//Y 关系表达式

X+Y 加法表达式也是关系表达式

-X 关系表达式

X / Y / Z 关系表达式

X**Y 幂运算表达式也是关系表达式

.ABEL.G 自定义一元表达式也是关系表达式

G 单独的基元也可以构成关系表达式

8. 非运算表达式

非运算表达式的算元为.NOT.,是一元算符,句法形式(R715)为:

[.NOT. ] comparision-expression

注意非运算表达式的定义不具有递归性,即非运算表达式本身不出现在上面的形式定义当中,所以不会出现多个算符.NOT.连在一起的情形。

【例8-12】

.NOT. X 非运算表达式

X .NE. Y 关系表达式也是非运算表达式

X <=Y 非运算表达式

X//Y 非运算表达式

X+Y 加法表达式也是非运算表达式

X / Y / Z 非运算表达式

X**Y 幂运算表达式也是非运算表达式

.ABEL.G 自定义一元表达式也是非运算表达式

G 单独的基元也可以构成非运算表达式

9. 与运算表达式

与运算表达式的算元为.AND.,是二元算符,句法形式(R716)为:

[conjunct-expression .NOT. ] not-expression

注意与运算表达式的定义具有左边递归性,即与运算表达式本身出现在上面的形式定义当中,所以会出现多个算符.AND.连在一起的情形,这时的优先顺序是从左到右。即X .AND. Y.AND. Z的优先顺序是(X .AND. Y).AND. Z。

【例8-13】

X .AND. Y与运算表达式

X .AND. Y.AND. Z 优先顺序是从左到右的与运算表达式

.NOT. X 非运算表达式也是与运算表达式

X .NE. Y 关系表达式也是与运算表达式

X <=Y 与运算表达式

X//Y 与运算表达式

X+Y 加法表达式也是与运算表达式

X / Y / Z 与运算表达式

X**Y 幂运算表达式也是与运算表达式

.ABEL.G 自定义一元表达式也是与运算表达式

G 单独的基元也可以构成与运算表达式

10. 或运算表达式

或运算表达式的算元为.OR.,是二元算符,句法形式(R717)为:

[disjunct-expression .OR. ] conjunct -expression

注意或运算表达式的定义具有左边递归性,即或运算表达式本身出现在上面的式定义当中,所以会出现多个算符.OR.连在一起的情形,这时的优先顺序是从左到右。即X.OR. Y.OR. Z的优先顺序是(X.OR. Y).OR. Z。

【例8-14】

X.OR. Y 或运算表达式

X.OR. Y.OR. Z 优先顺序是从左到右的或运算表达式

X .AND. Y与运算表达式也是或运算表达式

.NOT. X 非运算表达式也是或运算表达式

X .NE. Y 关系表达式也是或运算表达式

X <=Y 或运算表达式

X//Y 或运算表达式

X+Y 加法表达式也是或运算表达式

X / Y / Z 或运算表达式

X**Y 幂运算表达式也是或运算表达式

.ABEL.G 自定义一元表达式也是或运算表达式

G 单独的基元也可以构成或运算表达式

11. 等价运算表达式

等价运算表达式的算元为.EQV.或者是.NEQV.,是二元算符,句法形式(R718)为:

[equivalence-expression .EQV. ] disjunct -expression

equivalence-expression .NEQV. disjunct –expression

注意等价运算表达式的定义具有左边递归性,即等价运算表达式本身出现在上面的形式定义当中,所以会出现多个算符.EQV. 或与.NEQV.连在一起的情形,这时的优先顺序是从左到右。即X.NEQV. Y.EQV. Z的优先顺序是(X.NEQV. Y).EQV. Z。

【例8-15】

Y.EQV. Z等价运算表达式

X.NEQV. Y 等价运算表达式

X.NEQV. Y.EQV. Z优先顺序是从左到右的等价运算表达式

X.OR. Y 或运算表达式也是等价运算表达式

X .AND. Y与运算表达式也是等价运算表达式

.NOT. X 非运算表达式也是等价运算表达式

X .NE. Y 关系表达式也是等价运算表达式

X <=Y 等价运算表达式

X//Y 等价运算表达式

X+Y 加法表达式也是等价运算表达式

X / Y / Z 等价运算表达式

X**Y 幂运算表达式也是等价运算表达式

.ABEL.G 自定义一元表达式也是等价运算表达式

G 单独的基元也可以构成等价运算表达式

12. 表达式

最一般的表达式的句法形式(R723)为:

[ expression defined-operator ] equivalence-expression

注意表达式(expression)的定义具有左边递归性,即表达式本身出现在上面的形式定义当中,所以会出现多个相同优先级的算符连在一起的情形,这时的优先顺序是从左到右。

【例8-16】

X .CROSS. Y 表达式

X .CROSS. Y .CROSS. Z优先顺序是从左到右的表达式

Y.EQV. Z等价运算表达式也是表达式

X.NEQV. Y 等价运算表达式也是表达式

X.NEQV. Y.EQV. Z等价运算表达式也是表达式

X.OR. Y 或运算表达式也是表达式

X .AND. Y与运算表达式也是表达式

.NOT. X 非运算表达式也是表达式

X .NE. Y 关系表达式也是表达式

X <=Y 表达式

X//Y 表达式

X+Y 加法表达式也是表达式

X / Y / Z 表达式

X**Y 幂运算表达式也是表达式

.ABEL.G 自定义一元表达式也是表达式

G 单独的基元也可以构成表达式

13. 表达式形式的层次

上面我们已经完备地给出了表达式的语法形式,可以明显地看到从最简单的表达式到更为复杂的表达式,具有一种层次结构,这种依据优先级顺序给出的层次结构是我们构造复杂表达式所必须遵循的规则,也是计算机理解表达式时所依据的规则。下面我们给出总结。

【例8-17】下面是一个表达式里的运算优先级降低的例子:

X !基元

.INVERSE. X !自定义一元运算

X**Y !幂运算表达式

X*Y !乘法运算表达式

-X !加法运算表达式

X//Y !连接运算表达式

X .EQ. Y !比较运算表达式

.NOT. X !非运算表达式

X .AND. Y !并运算表达式

X .OR. Y !或运算表达式

X .EQV. Y !等价运算表达式

X .CROSS. Y !一般表达式

下表8-2给出各种一般形式的表达式的运算优先级:

8.2.5 算符的优先级顺序

下表8-3给出各类算符在同样的优先级的情形下的运算优先级顺序:

表8-3

自定义一元算符在所有算符与所有同优先级算符当中,具有最高的优先级。而自定义二元算符在所有算符与所有同优先级算符当中,具有最低的优先级。

表中的“无”表示该算符不会连续出现,可以看到具有这个特点的是自定义一元算符,关系算符,和逻辑非算符,它们的优先级顺序只能使用括号来说明。

8.2.6 固有运算

固有运算的完整含义是,除了算符是属于固有算符,因此可以直接使用相应符号而不需要预先说明之外,算符所作用的算元也必须属于固有数据类型。不同的算符所能够作用的算元类型是不同的。下表8-4给出了不同的算符所能够作用的算元类型:

表中I表示整型,R表示实型,Z表示复型,C表示字符型,L表示逻辑型。

8.2.7 自定义运算

自定义运算的完整含义是:

● 如果算符形式上是固有算符,那么它的算元必定不属于表8-3里面所规定的类型;

● 所含有的算符为自定义算符。

自定义运算的一般句法形式(R703,R723)为:

intrinsic-unary-operator y

defined-operator y

x intrinsic-binary-operator y

x defined-operator y

其中自定义算符(defined-operator)需要在一个具有通用标识符OPERATOR的界面块里用一个函数子程序来加以单独的解释与计算。

如果自定义运算使用了固有算符的符号,意味着扩展了其中固有算符所作用的算元的类型范围,它的通用性需要在界面块里说明。

如果自定义运算使用了自定义算符,那么该自定义运算被称为扩展运算,所使用的自定义算符称为扩展算符。

8.2.8 表达式的数据类型,种别参数和形状

作为表达式的计算结果,可以说表达式终究是有它的数据类型,种别参数,以及形状这些数据对象所具有的属性,那么表达式的这些属性终究是由它的基元的数据属性决定的。

由基元的数据属性最终得到表达式的数据属性,这中间需要完成全部的运算,每经过一次运算,结果的数据属性都可能随着新的算元的加入而发生改变,唯一可以确认的是运算的顺序,是严格按照算符的优先级顺序进行的,鉴于基元本身的可能的数据属性的多样化,下面分小节讨论表达式的的数据属性。

1. 基元的数据类型以及种别参数

基元的数据属性如果已经直截了当地在声明语句当中给予了说明,那就不是我们在这里讨论的中心。

【例8-18】

INTEGER I(100,20)

REAL (8.5,6,4.4)

它们的数据属性已经显式地给出。

下面我们要讨论的基元类型是:

● 指针;

● 数组构造器;

● 结构构造器;

● 函数。

指针变量的类型,种别参数和秩都会在指针变量的声明语句当中予以说明。但是当指针为待定形数组时,它的形状就是由它的目标来决定。

【例8-19】

INTEGER,POINTER::X(:,:)

INTEGER,TARGET::Y(100,200)

其中X的形状就是由Y决定的,即(100,200)。

如果对指针使用固有函数NULL,那么它会返回一个非关联指针,而非关联指针没有形状,但是有秩。

当NULL()不带变量时,固有函数NULL返回的结果的类型,种别和秩由与结果关联的指针决定,跟NULL出现的场合有关,详见下表8-5:

【例8-20】下面是NULL后接变量的例子:

INTERFACE ADD

SUBROUTING S1(J,PI)

INTEGER J

INTEGER,POINTER::PI

END SUBROUTING S1

SUBROUTING S2(K,PR)

INTEGER K

REAL,POINTER::PR

END SUBROUTING S2

END INTERFACE

REAL,POINTER::REAL_KER

CALL ADD(10, NULL(REAL_KER))

数组构造器的类型,种别和形状由构造器的形式决定。

它的秩为1,而尺度等于其中元素的个数,它的类型和种别与其中任意一个元素的一致,因为它的所有元素的类型和种别都必定是相同的。

【例8-21】给出一个构造器:

(/2.4_2, 5.9_1, 9.4_1, 6.4_1)

为实型,种别参数为2,尺度为4.

结构构造器的类型就是派生类型的类型名称,一个结构构造器总是标量,而结构不具有

种别参数。

【例8-22】给出下面的结构构造器:

SAMPLE(5.0, “ALPHA”)

它的类型就是SAMPLE.

函数的类型,种别和形状的决定有以下几种情形:

● 在引用函数的程序单位里对函数进行了隐式声明;

●在引用函数的程序单位里对函数进行了显式声明;

●函数具有显式界面(如果界面不是显式的,那么函数或者是外部函数,或者是语句函

数)。

如果界面是显式的,属性的决定有如下几种情形:

●引用函数的程序单位里的界面块里,有对函数的类型声明以及其他说明语句;

●对内部过程或模块过程的类型声明以及其他说明语句说明了函数;

●被引用的特定的固有函数的描述。

注意,由于固有函数和带界面块的函数可能是通用的,因此它们的属性由特定函数引用的实元决定。

【例8-23】

REAL FUNCTION FUN(A)

DIMENSION FUN(20,50)

上面的语句是给出了内部函数FUN的程序单位的一部分,那么要引用函数FUN(8.1),它的类型就是默认实型,形状为(20,50)。

【例8-24】

REAL(DOUBLE)A(30,50)

…COS(A)…

函数COS的界面在固有函数COS的定义里给出,这里引用的函数COS(A)为双精度实型,形状为(30,50)。

当函数是外部函数或为语句函数时,界面就是隐式的,这时形状总是标量,而其他属性则由默认隐式类型声明所规定,或者是由语句函数的显式声明决定。

【例8-25】

IMPLICIT REAL (SINGLE)(A)

… FUN(X)…

其中的FUN(X)就是一个单精度实型标量。

如果变量或函数是属于待定形或哑形数组,会有以下几种情形:

●对于待定形数组,它的秩已经被声明,但是它的每个维度的尺度需要在运行

ALLOCATE语句或指针赋值语句之后才能确定。

●对于哑形数组,它的秩已经被声明,但是它的形状需要子程序运行之后给出。

●对于指针来说,则需要由被关联到指针的目标来确定形状。

因此一般说来待定形或哑形数组,只能在运行时间才能确定形状。

2. 运算结果的类型与种别参数

对固有类型算元进行固有算符的运算的结果的类型,已经在表8-3给出,因此现在只需要讨论决定种别参数的规则。

运算分为两类:

●非数值运算。

●数值运算。

对于非数值运算有如下情形:

●固有关系运算:种别参数为默认逻辑型。

●固有逻辑运算:如果算元具有相同的种别参数,则结果与之保持一致;如果算元具

有不同的种别参数,则由编译器决定。

●固有字符运算:算元与结果的种别参数必定保持一致,长度参数则是两个算元的

长度的和。

对于数值运算,有如下情形:

●一元运算:保持算元的种别参数不变。

●二元运算:两个算元如果是不同数据类型,则按照表8-3决定;两个算元如果是相

同数据类型与种别参数,则结果保持不变;如果两个算元都是整型,种别参数不同,那么结果取幂次范围大的,如果幂次范围一样大,则由编译器决定;如果两个算元都是实型或复型,种别参数不同,那么结果取精度大的,如果精度一样大,则由编译器决定。

对于二元数值运算,基本的规则可以理解为:如果把从整数到最高精度的复数按照集合包含关系排列起来,那么只要两个算元的种别参数不同,结果总是取所属集合更大的算元的种别参数。

上面讨论的是针对固有类型数据的固有运算,对于自定义运算,结果的类型以及种别参数由被引用的运算的界面块给出,也即在界面块里说明的作为自定义运算的函数名的类型以及种别参数。

【例8-26】

INTERFACE OPERATOR(.PLUS.)

TYPE(SET)FCN_SET_PLUS(X, Y)

TYPE(SET), INTENT(IN)::X,Y

END FUNCTION FCN_SET_PLUS

TYPE(ADD) FCN_SET_PLUS(X, Y)

TYPE(ADD) , INTENT(IN)::X,Y

END FUNCTION FCN_SET_PLUS

END INTERFACE

在得到上面的算符定义之后,如果取类型SET的对象A和B,那么表达式A.PLUS.B 的类型也为SET,无种别参数;如果取类型ADD的对象A和B,那么表达式A.PLUS.B的类型也为ADD,无种别参数。

3. 表达式的形状

表达式形状的决定同样是从基元开始,按照算符的优先级顺序,逐步从底层到高层而决定的。

但是形状的决定比类型与种别参数的决定要简单,因为二元运算的2个算元的形状要求具有一定的关系:

●二元固有运算的2个算元必须保证形状的一致性,也就是两个算元或者是相同形状

的数组,或者至少有一个算元是标量。

●对于二元自定义运算,则2个算元或者与定义的函数的相应哑元保持一致,或者相

互也保持一致。其结果的形状自然也保持不变。

因此结果的形状的决定也就相应比较简单了。

●一元运算不改变算元的形状。

●如果基元是常量,变量,构造器,或函数,则结果的形状分别就是常量,变量,构

造器,或函数名称。

●如果基元是对固有函数NULL的引用,那么结果的形状就与基元无关。而由被关联

到结果的指针决定。

●结构构造器总是标量。

●数组构造器总是秩为1,尺度等于元素数目的数组。

●二元固有运算的算元只要有一个是数组,结果就是相应的数组,否则就是标量。

●对于自定义运算来说,如果算元的形状与哑元保持一致,结果的形状就是定义运算

的函数名称,或者如果定义的函数是基元性的,则结果的形状就是数组算元的形状。

【例8-27】

INTERFACE OPERATOR(//)

FUNCTION FCN_CONCAT(A,B)

CHARACTER (*,1) A

CHARACTER (*,2) B

CHARACTER (LEN(A)+LEN(B),2) FCN_CONCAT (SIZE(B))

END FUNCTION FCN_CONCAT

END INTERFACE

设X是种别参数为1,长度为30的字符型标量,Y是种别参数为2,长度为50的字符型数组,其形状为(25)。那么考虑X//Y的属性:由于算符//的界面里的FCN_CONCAT的类型声明就决定了表达式X//Y的结果为种别参数2的字符型,结果的长度为2个算元的长度之和,即80,结果的形状是秩为1,而尺度等于相应于哑元B的实元Y的尺度,也就是形状为(25)。

4. 表达式的宽度

在大多数情形下,数组表达式的宽度并不需要特别的考虑,因为一致性的要求只涉及到每个维度的尺度。不过如果数组表达式是固有函数LBOUND和UBOUND的ARRAY变量的,数组表达式的宽度就需要加以考虑了。‘

固有函数LBOUND和UBOUND含有两个关键词变量:

●ARRAY,为数组表达式。

●可选的DIM,为整型表达式。

如果变量DIM给出的话,那么函数LBOUND和UBOUND就分别返回由变量DIM决定的维度的下界与上界。

如果变量DIM不给出的话,那么函数LBOUND和UBOUND就分别返回由变量ARRAY 决定的所有维度的下界与上界组成的秩为1的数组。

8.2.9 特殊表达式

表达式除了用于赋值语句之外,还可能出现在许多特殊的场合,在那些特殊场合里的

表达式是受到了各种限制的,比如:

●出现在PARAMETER语句当中的表达式就被限制为常量表达式,起到初始化的作用。

这类表达式称为常量表达式;

●在许多说明语句当中,充当数组界或者是字符长度值的也可能是一些整型表达式,

它们在程序单位运行的时候,就会执行计算过程,给出数组界的值或字符长度值。

这类表达式称为说明表达式。

本节我们就是分小节讨论这2类特殊的表达式的特殊用途。

1. 常量表达式

常量表达式就是扩展常量或扩展常量通过固有算符构成的表达式。

所谓扩展常量的含义有如下几种情形:

●字面常量,命名常量,常量子对象,其中子对象的每个下标,或片断下标,或子串

范围的始点与终点都是常量表达式。

●一个数组构造器,它的每个子表达式的基元都是常量表达式,或者是数组构造器的

隐式do变量。

●每个成员都是常量表达式的结构构造器。

●在汇编时被计算的固有函数引用。

●括号里的常量表达式。

要求固有函数引用在汇编时被计算,就排除了使用固有函数PRESENT,ASSOCIATED 和ALLOCATED,并且要求函数引用的每个变量都是常量,或者至少在编译时,变量的种别参数与界已知。

例如在所有维度具有显式界的数组A,对于A的查询函数SIZE(A)在编译时是可以计算的,那么SIZE(A)*3就是一个常量表达式,可以作为扩展常量。

这样一个限制就排除了属于待定形数组,哑尺度数组,指针数组和可分配数组这类对象的变量。

有了以上限制之后,常量表达式就可以应用于任何可执行语句,而普通表达式是不能

出现在任何可执行语句当中的。

【例8-28】下面是常量表达式的合法例子:

3.141 实型字面常量

45 整型字面常量

-5.0_QUAD 实型字面常量,其中QUAD为命名整型常量

5_SHORT 整型字面常量,其中SHORT为命名整型常量

(/(K,K=0,100),50) 数组构造器

BESSEL1(3.1, J) 结构构造器,其中BESSEL为派生类型,J为命名整型常量

UBOUND(X,1)-10 固有查询函数的引用,X为显形数组

COS(X) 固有函数,其中X为命名常量

KIND(X) 固有函数,其中X为具有已知种别参数的实型变量

REAL(K-2) 固有函数,其中K为命名整型常量

COUNT(X) 固有函数,其中X为命名逻辑型常量

SIN(3.3) 固有函数

SUM(X) 固有变换函数, 其中X为命名整型数组常量

3*I+J**4/2.5 数值表达式,其中I,J为命名整型常量

2. 初始化表达式

所谓初始化表达式是具有如下限制的常量表达式:

●幂函数的幂次只能是整数。

●下标,片断下标,子串范围的始点与终点,结构构造器的成员,以及固有函数的变

量都必须是初始化表达式。

●数组构造器的元素都必须是初始化表达式,或者是隐式do对象,其中数组构造器值

和隐式do参数是基元为初始化表达式或隐式do变量的表达式。

●初始化表达式里的基本固有函数必须包含整型或字符型变量,并且必须返回整型或

字符型结果。

●初始化表达式里的固有变换函数必须是如下几种固有变换函数之一:

NULL,REPEAT,RESHAPE,

SELECTED_INT_KIND,SELECTED_REAL_KIND,TRANSFER, TRIM。

其中除了NULL之外,它们的变量都必须是初始化表达式。

这样实际上就是排除了以下的变换函数:

ALL,ANY,COUNT,CSHIFT,DOT_PRODUCT,EOSHIFT,MATMUL,MAXLOC,

MAXVAL,MINLOC,MINVAL,PACK,PRODUCT,SPREAD,SUM,TRANSPOSE,

UNPACK。

●初始化表达式不能通过ALLOCATE语句给出,也不能通过指针赋值给出。允许使

用固有查询函数,除非它的变量或者是初始化表达式或者变量的种别与界不能够通过查询获得。

●括号里的任意子表达式都必须是初始化表达式。

在8.2.9.1节里的常量表达式例子里面,除了最后5个例子外,其他都是初始化表达式。最后5个例子之所以不是初始化表达式,是因为初始化表达式不允许包含返回实型结果的函数,不允许引用某些特定的变换函数,也不允许幂运算的幂次是非整数。

【例8-29】下面是初始化表达式的其他形式的例子:

SIZE(2,X)+10 整型表达式,其中X为显形数组

KIND(5.0E+01) 变量为常量的查询函数

SELECTED_REAL_KIND(33,100) 变量为常量的查询函数

SELECTED_INT_KIND(10**K) 变量为初始化表达式的查询函数,其中K为预先声明过

的整型常量

fortran95教程5章

第5章准备数据 从本章开始,我们将赋予语言实质性的语义,也就是规定上章所描述的语言的每一个细节所具有的涵义。这种涵义与其说是我们对于一种语言细节的定义,不如说是算法的要求,要求语言具有足够多的细节,用来表达在算法当中有可能出现的精细情节。 对于任何的问题,站在计算机的角度来看,总是可以把它抽象为如下图所示的结构: 因此要准备通过计算来解决一个问题,首先要作到的是把该问题所涉及到的数据整理好,也就是列出所有的数据,然后根据数据的数学属性进行分类,这个分类的过程就是对数据施加足够的标记的过程,将来把这些数据输入到计算机,计算机将能够依据这些标记,辨识出数据所应该具有的数学属性,从而施加相应的合法数学运算。 所以作为向计算机描述计算问题的FORTRAN语言,它首先要作到的是约定如何给数据施加足够详细的标记。 对这个标记过程的第一个要求是保证准确性,也就是说这个语言的标记系统必须正确地反映真实世界的问题里面,数据所具有的数学属性,因此这个标记系统必然是与数据的数学分类结构保持一致的。 从数学的观点来看,世界上的所有数据,总是可以被表示为整数,实数,复数等等基本的数据种类,因此本章的内容就是讨论: ●FORTRAN语言如何把数据归结为一些基本数据类型; ●然后为了足够详尽地描述每一个数据类型的属性,FORTRAN是如何施加相应的标 记的; ●FORTRAN语言对于这些标记(语法形式)所约定的语义是什么。 然后我们就可以知道,要想用FORTRAN来描述一个问题的算法,并进而以问题算法的FORTRAN语言版本为媒介,通过计算机来得到计算结果,第一个步骤,就是准备好数据的FORTRAN描述。 5.1 数据是什么 在上一章里,据称计算机能够使用语言,而且是非常类似于人类的语言,至少从形式上看很象,这难免会令某些人(特别是看过KUBRICK的影片《2001: A Space Odyssey》的观众们)感到恐惧:) 别怕!且先不讨论FORTRAN作为语言是否具有与人类语言等价的表达能力,至少从自然语言的语义学的角度来看,FORTRAN说出来的话其实是绝对空洞的,因为FORTRAN 语言的全部语义基础就只是数据,而数据对机器而言,只是意味着经过编码的符号。 一台计算机其实是由以下6个部分组成:

数据结构1-10章习题

第1章绪论 1.简述下列概念:数据、数据元素、数据项、数据对象、数据结构、逻辑结构、存储结构、抽象数据类型。2.试举一个数据结构的例子,叙述其逻辑结构和存储结构两方面的含义和相互关系。 3.简述逻辑结构的四种基本关系并画出它们的关系图。 4.存储结构由哪两种基本的存储方法实现? 5.选择题 (1)在数据结构中,从逻辑上可以把数据结构分成()。 A.动态结构和静态结构B.紧凑结构和非紧凑结构 C.线性结构和非线性结构D.内部结构和外部结构 (2)与数据元素本身的形式、内容、相对位置、个数无关的是数据的() A.存储结构B.存储实现C.逻辑结构D.运算实现 (3)通常要求同一逻辑结构中的所有数据元素具有相同的特性,这意味着()。 A.数据具有同一特点 B.不仅数据元素所包含的数据项的个数要相同,而且对应数据项的类型要一致 C.每个数据元素都一样 D.数据元素所包含的数据项的个数要相等 (4)以下说法正确的是()。 A.数据元素是数据的最小单位 B.数据项是数据的基本单位 C.数据结构是带有结构的各数据项的集合 D.一些表面上很不相同的数据可以有相同的逻辑结构 (5)以下与数据的存储结构无关的术语是()。 A.顺序队列 B. 链表 C. 有序表 D. 链栈 (6)以下数据结构中,()是非线性数据结构 A.树B.字符串C.队D.栈 6.试分析下面各程序段的时间复杂度。 (1)x=90; y=100; while(y>0) if(x>100) {x=x-10;y--;} else x++; (2)for (i=0; i

《程序设计语言(FORTRAN)》理论课程教学大纲(可打印修改)

《程序设计语言(FORTRAN)》课程教学大纲 课程编号: 总学时数:64(计划内)+16(计划外) 总学分数:4 课程性质:必修课 适用专业:给水排水工程、环境工程、土木工程、工程力学、无机非金属材料工程、应用化学等工科专业。 一、课程的任务和基本要求: FORTRAN语言广泛应用于数值分析、科学计算和工程设计等领域,FORTRAN90/95是FORTRAN语言的最新版本,它是一个功能十分强大且体现现代程序设计语言特征的新型程 序设计语言,在社会上产生了广泛影响,许多高等学校、科研院所和公司企业开始引入和使用FORTRAN90/95语言。《程序设计语言(FORTRAN)》课是计算机基础教学课程体系中一门重要的计算机技术基础课程,是给水排水工程、环境工程、土木工程、工程力学、无机非金属材料工程、应用化学等工科专业(方向)的一门学科基础课和专业必修课。 1、课程任务 通过《程序设计语言(FORTRAN)》课程的学习,使学生了解和掌握计算机程序设计的基本概念、基本知识和基本方法,了解和掌握计算机求解问题的机制和方法,熟练掌握FORTRAN90/95语言基本内容、编程技能和开发环境,能熟练运用FORTRAN90/95语言设计 和编写比较复杂的FORTRAN90/95程序,有效解决本专业中遇到的一些数值计算和数据处理问题,使学生计算机应用能力得到显著提高,为专业应用和发展奠定基础。 2、基本要求 (1) 了解程序设计的基本概念、基本知识和基本方法。 (2) 掌握FORTRAN90/95基本内容,能设计和编写比较复杂的FORTRAN90/95程序。 (3) 掌握FORTRAN90/95开发环境(Developer Studio),提高开发效率。 (4) 能结合本专业实际,熟练使用FORTRAN90/95解决有关数值计算和数据处理问题。 二、基本内容和要求: 1.程序设计概述 (1)程序设计语言。 (2)程序和程序设计。 (3)算法的基本概念和主要特征。 (4)程序设计方法。 通过学习要求学生了解程序设计的基本知识、基本概念、基本方法。掌握计算机求解问题的机制和方法。 2.FORTRAN90/95软件开发环境 (1)FORTRAN语言发展概述和FORTRAN90/95主要特征。 (2)Digital Visual FORTRAN 5.0/Compag Visual FORTRAN 6.6主要特性和系统配置。 (3)Microsoft Developer Studio开发环境和解题过程。 通过学习要求学生了解FORTRAN语言发展历史和FORTRAN90/95主要特征,掌握Microsoft Developer Studio开发环境和解题过程。 3.FORTRAN90/95基础知识 掌握字符集、名称、关键字、程序单元、语句、书写格式、数据类型等基础知识和基本概念。 通过学习要求学生熟练掌握FORTRAN90/95常用语法知识和基本使用规则。

补充练习第八章构造数据类型

补充练习第八章构造数据类型 第八章构造数据类型 一、单项选择题: 1.设有以下语句: struct st{int n; struct st *next;}; static struct st a[3]={5,&a[1],7,&a[2],9,?\0?},*p; p=&a[0]; 则表达式的值是6。 A. p++ ->n B. p->n++ C. (*p).n++ D. ++p->n 2.若有下面的说明和定义,则sizeof(struct aa)的值是。 struct aa{int r1; double r2; float r3;} mya; A. 8 B. 10 C. 12 D. 14 3. 若程序中有下面的说明和定义: struct abc{int x; char y;} struct abc s1,s2; 则会发生的情况是。 A. 编译出错 B. 程序将顺利编译、连接、执行 C. 能顺利通过编译、连接,但不能执行 D. 能顺利通过编译,但连接出错 4.选择出k的正确值。 enum {a,b=5,c,d=4,e} k; k=e; A.3 B. 4 C. 5 D. 6 5.选择出不正确的函数定义:。 A.struct tree func(s) B. int *func(s) struct tree s[]; char *s[]; { { ... ... } } C. struct tree *func(s) D. int *func(s) char **s; char *s[10][]; { {

... ... } } 6.若有以下的说明,则在scanf函数调用语句中对结构体变量成员的不正确引用方式为。 struct pupil { char name[20]; int age; int sex; } pup[5], *p; p=&pup[0]; A.scanf(“%s”, pup[0].name); B. scanf(“%d”, &pup[0].age); C. scanf(“%d”, &(p->sex)); D. scanf(“%d”, &p->age); 7. 设有100个学生的考试成绩数据表如下形式: 在下面结构体数组的定义中,不正确的是: A.struct student B. struct stud [100] { { int no; int no; char name [10]; char name [10]; float score; float score; }; }; struct student stud[100]; C. struct student D. struct { { int no; int no; char name [10]; char name [10]; float score; float score; } stud[100]; ]stud[100];

fortran95教程4章

第2篇. 计算的叙述 算法的每一个步骤,都必须给予确切的定义。对于算法当中所 考虑的每一种情况,每一个有待执行的动作,都必须严格地和 不含混地加以规定。…对于以描述算法作为目的而设计出来 的,采用了形式的定义的程序设计语言,或者说计算机语言, 它的每一个语句都必须有非常确切的意义。 ---- D.E.Knuth[1]《The Art of Computer Programming》 本质上FORTRAN就是一门语言,一门人与计算机赖以进行有效交流的语言,在这个意义上和我们使用的中文,英文等没有本质差别。现在假设要来描述一种大家都陌生的语言,那么总是要分成两个方面来描述,即一方面要描述这门语言的表象和形态,也就是它使用哪些符号,哪些词汇,一般的句式如何,怎样才能完整叙述一个任务之类;另一方面需要说明这门语言的语义,也就是说这门语言是如何用来表达我们需要它表达的意思的。 第4章基本上就是描述FORTRAN作为一种语言的基本形态,也就是书写这种语言的书写规则。 接下来几章则逐步说明如何用FORTRAN来表达我们的要求,或者反过来说,FORTRAN提供了些什么表达方式,以便我们用来向计算机提出合理的任务: ● 表达基本数据; ● 表达数据的结构; ● 完整地描述数据; ● 构造表达式; ● 驱动计算的赋值; ● 计算过程的结构控制; 在整个第二篇,我们将领略到FORTRAN 95是如何能够做到精致地描述计算的,而把一个问题阐述清楚了,就意味着问题已经解决了一大半。

[1]Donald E. Knuth (高纳德),Stanford University的The Art of Computer Programming荣休教授,而The Art of Computer Programming(计算机程序设计技巧)正是他的伟大著作的名称。洋洋七大卷的《The Art of Computer Programming》是当今全世界每一个计算机科学家所膜拜的圣经。1974年在该书刚完成前面很少一部分时,就给他带来了计算机科学家们梦寐以求的图灵奖。 第4章FORTRAN 95语言的形貌 要说明一门语言的形态,必须回答以下问题: ●它使用哪些符号来表达信息? ●它的词汇如何构成? ●它的语句如何构成? ●如何表达一个完整的任务? 具体的对于一门计算机语言,把这几个问题更加明确地转换过来,就是: ●它使用键盘上的哪些符号,各个符号有哪些用途? ●它的词汇如何由键盘字符构成?含有哪些固定的词汇?以及容许自由构成合法词汇 的规则是什么? ●它具有哪些固定的语句格式?以及容许自由构成合法语句的规则是什么? ●我们交待给计算机的任何任务,都必须明确说明任务的开始,执行步骤和完成,因 此一段完整的源代码应该具备什么样的形式?以及应该具备哪些要素? 本章就是要回答这些问题。 4.1 FORTRAN语言所使用的字符 从最抽象的层面来看,人与计算机的交流只是信息的交流,而信息总是需要依靠某种信号来表示,对于人来说,最方便的就是字符。而对于计算机来说,自然就是键盘所能敲出的那些字符(信号),因此下面就是要说明: ●FORTRAN 95能识别键盘上敲出的哪些字符? ●每个字符对于FORTRAN 95来说又意味着什么? 4.1.1 FORTRAN 95所使用的基本字符 按照FORTRAN 95标准的规定,一切FORTRAN 95的实现平台都必须使用下面表4-1所列出来的这个基本的字符集,或者说,这个字符集是所有遵循FORTRAN 95标准的编译

数据结构第八章习题及答案

习题八查找 一、单项选择题 1.顺序查找法适合于存储结构为()的线性表。 A.散列存储 B. 顺序存储或链式存储 C. 压缩存储 D. 索引存储 2.若查找每个记录的概率均等,则在具有n个记录的连续顺序文件中采用顺序查找法查找一个记录,其平均查找长度ASL为( )。 A. (n-1)/2 B. n/2 C. (n+1)/2 D. n 3.适用于折半查找的表的存储方式及元素排列要求为( ) A.链接方式存储,元素无序 B.链接方式存储,元素有序 C.顺序方式存储,元素无序 D.顺序方式存储,元素有序 4.当在一个有序的顺序存储表上查找一个数据时,即可用折半查找,也可用顺序查找,但前者比后者的查找速度( ) A.必定快 B.不一定 C. 在大部分情况下要快 D. 取决于表递增还是递减5.当采用分块查找时,数据的组织方式为 ( ) A.数据分成若干块,每块内数据有序 B.数据分成若干块,每块内数据不必有序,但块间必须有序,每块内最大(或最小)的数据组成索引块 C. 数据分成若干块,每块内数据有序,每块内最大(或最小)的数据组成索引块 D. 数据分成若干块,每块(除最后一块外)中数据个数需相同 6.二叉树为二叉排序树的充分必要条件是其任一结点的值均大于其左孩子的值、小于其右孩子的值。这种说法()。 A.正确 B. 错误 7. 二叉查找树的查找效率与二叉树的((1) )有关, 在 ((2) )时其查找效率最低。 (1): A. 高度 B. 结点的多少 C. 树型 D. 结点的位置 (2): A. 结点太多 B. 完全二叉树 C. 呈单枝树 D. 结点太复杂。 8.如果要求一个线性表既能较快的查找,又能适应动态变化的要求,则可采用( )查找法。 A. 分快查找 B. 顺序查找 C. 折半查找 D. 基于属性 9.分别以下列序列构造二叉排序树,与用其它三个序列所构造的结果不同的是( )。 A.(100,80, 90, 60, 120,110,130) B.(100,120,110,130,80, 60, 90) C.(100,60, 80, 90, 120,110,130) D. (100,80, 60, 90, 120,130,110) 10.下图所示的4棵二叉树,( )是平衡二叉树。 (A)(B)(C)(D) 11.散列表的平均查找长度()。 A.与处理冲突方法有关而与表的长度无关 B.与处理冲突方法无关而与表的长度有关 C.与处理冲突方法有关且与表的长度有关 D.与处理冲突方法无关且与表的长度无关 12. 设有一组记录的关键字为{19,14,23,1,68,20,84,27,55,11,10,79},用链地址法构造散列表,散列函数为H(key)=key MOD 13,散列地址为1的链中有()个

fortran安装

Intel Visual Fortran 2013 sp1 完整版下载及安装教程(windows) 10月16日版:更新支持win8.1、VS2013下载地址 【完整安装包】https://www.wendangku.net/doc/936212905.html,/akdlm/irc_nas/3651/w_fcompxe_ novsshell_2013_sp1.1.139.exe 【联网安装包】https://www.wendangku.net/doc/936212905.html,/akdlm/irc_nas/3651/w_fcompxe_ novsshell_online_2013_sp1.1.139.exe 【百度云副本】https://www.wendangku.net/doc/936212905.html,/s/18E41z 更新内容(翻译自官网,不妥之处恳请指正): 1.Intel? Fortran Compiler 更新至14.0.1 --增加/assume:std_value 编译选项 --增加/Q[a]xMIC-AVX512 编译选项 --增加/Qopt-gather-scatter-unroll=n 编译选项 2.Intel? Math Kernel Library 更新至11.1 Update 1 3.增加对Microsoft Windows 8.1*的支持 4.增加对日语的支持 5.修正问题 --https://www.wendangku.net/doc/936212905.html,/en-us/articles/intel-composer-xe-2013-compilers-sp1-fixes-list --https://www.wendangku.net/doc/936212905.html,/en-us/articles/intel-mkl-111-bug-fixes/ 安装说明: 1、下载安装包中的任意一个,前两个为官方地址,第三个为百度云副本(完整安装包) 2、运行w_fcompxe_novsshell_2013_sp1.0.103.exe 3、点击extract,解压安装包,解压完毕程序会自动运行安装向导 4、在第三步(Activation)中选择Choose alternative activation,点击下一步 5、选择Use a license file 6、选择你的授权许可文件(lib文件) 7、继续安装过程 备注: 1、安装Intel Visual Fortran Composer前,请确保已经安装了Microsoft Visual Studio 2010/2012/2013。若使用其他编辑器,需要手动配置编译环境。 Visual Studio官网:https://www.wendangku.net/doc/936212905.html,/。 微软旗下的DreamPark计划为在校大学生免费提供VS2013Pro版,地址:https://https://www.wendangku.net/doc/936212905.html, 2、安装过程中没有加以说明的步骤,请直接点击下一步。

第八章 高速公路选线定线

第八章高速公路选线、定线 第一节概述 定义:选线是在路线起终点之间的大地表面上,根据计划任务书规定的使用任务和性质,结合当地自然条件,选定道路中线的位置的过程。 一、自然条件对道路路线的影响 影响道路的主要自然因素: 地形、气候、水文、水文地质、地质、土壤及植物覆盖等。 1.地形: 1)平原、微丘地形 (1)平原,地形平坦,无明显起伏,地面自然坡度一般在3°以内。 (2)微丘地形指起伏下大的丘陵,地面自然坡度在20°以下,相对高差在100m以下,设线一般不受地形限制。 (3)河湾顺适,地形开阔且有连续的宽缓台地的河谷地形。河床坡度大部分在5°以下,地面自然坡度在20°以下。沿河设线一般不受限制,路线纵坡平缓或略有起伏。 2)山岭、重丘地形 (1)重丘地形:指连绵、起伏的山丘,具有深谷和较高的分水岭,地面自然坡度一般在20°以上,路线平、纵面大部分受地形限制。 (2)山岭地形:指山脊、陡峻山坡、悬崖、峭壁、峡谷、深沟等。地形变化复杂,地面自然坡度大部分在20°以上。路线平、纵、横面大部分受地 形限制。 (3)高原地带的深侵蚀沟,以及有明显分水线的绵延较长的高地。地面自然坡度多在20°以上。 2.气候: 气候情况直接或间接地影响着地面水的数量、地下水位高度、大气降水量及其强度和形态、路基水温状况、泥泞期、冬季积雪和冰冻延续期。并在一定程度上限制施工期限和条件。 3.水文及水文地质:水文情况决定排水结构物的数量和大小,水文地质情况决定了含水层的厚度和位置、地基或路基岩层滑坍的可能性。 4.地质条件:地质构造,决定地基及路基附近岩层的稳定性,确定有无滑坍、碎落和崩坍的可能;同时也决定土石方工程施工难易和筑路材料的质量。5.土质:土是路基与路面基层的材料,它影响路基形状和尺寸的决定,也影响着路面型式和结构的确定。 6.植被情况:地面的植物覆盖影响暴雨逞流、水土流失程度,并在一定程度上影响路基土壤的水理和热理状况。 二、道路选线的一般原则 1.多方案选择: 2.工程造价与营运、管理、养护费用综合考虑: 3.处理好选线与农业的关系: 4.路线与周围环境、景观相协调: 5.工程地质和水文地质的影响: 6.选线应重视环境保护:

数据结构作业系统_第十章答案

10.23②试以L.r[k+1]作为监视哨改写教材10.2.1节 中给出的直接插入排序算法。其中,L.r[1..k]为待排 序记录且k0;i--) { L.r[L.length+1]=L.r[i+1]; if(GT(L.r[i],L.r[i+1])) { L.r[L.length+1]=L.r[i]; L.r[i]=L.r[i+1]; } for(j=i+2;LT(L.r[j],L.r[L.length+1]);j++) L.r[j-1]=L.r[j]; L.r[j-1]=L.r[L.length+1]; } } 10.26②如下所述改写教科书1.4.3节中的起泡排序算法:将算法中用以起控制作用的布尔变量change改为一个整型变量,指示每一趟排序中进行交换的最后一个记录的位置,并以它作为下一趟起泡排序循环终止的控制值。 实现下列函数: void BubbleSort(SqList &L); /* 元素比较和交换必须调用以下比较函数和交换函数:*/ /* Status LT(RedType a, RedType b); 比较:"<" */

基础工程重点2

第一章 1.桥梁的三个主要组成部分是:桥跨上部结构(桥跨结构、支座系统),桥跨下部结构(桥墩、桥台、墩台基础)和附属结构(引道、锥波、导流护岸等调治构造物) 桥跨结构:行车走人,跨越障碍的结构物 支座系统:支承上部结构并将上部结构产生的各种作用传递至桥梁墩台。 桥墩:设在河中、岸上或地面上支承两侧桥跨上部结构的建筑物。 桥台:设在桥的两端,支承上部结构并与路基衔接,承受后土方压力的建筑物 墩台基础:保证桥梁墩台安全并将各种作用传至地基的桥梁最下部分 2.地基:天然地基(未经人工处理即满足设计要求的地基)人工地基(经过人工加固或处理后的地基) 3、基础:浅基础(刚性扩大基础、柔性扩大基础)深基础(桩基础、沉箱基础、沉井基础、地下连续墙)深水基础. 浅基础:埋置深度较浅(一般在数米以内),且施工相对简单的基础,在设计计算中,可忽略基础侧面土体的摩阻力和侧向抗力. 深基础:浅层土质不良,需将地基至于较深的良好图层上,且在设计计算中不能忽略基础侧面土体的摩阻力和侧向抗力的基础形式. 深水基础:水深超过5m以上,且不能采用一般的土围堰、木板桩围堰等防水技术施工的桥梁基础。 第二章 1、浅基础常用类型:刚性基础、钢筋混凝土扩展基础。 刚性基础:当基础圬工具有足够的截面使材料的容许应力大于由地基反力产生的弯曲拉应力和剪应力时,a-a断面不会出现裂缝,这时,基础内不需配置受力钢筋,这种基础称为刚性基础。 钢筋混凝土扩展基础:基础在基地反力作用下,在a-a断面产生弯曲拉应力和剪应力若超过了基础圬工的强度极限值,为了防止基础在a-a断面开裂甚至裂开,可将刚性基础尺寸重新设计,并在基础中配置足够数量的钢筋,这种基础称为钢筋混凝土扩展基础。区别:(1)刚性基础的特点是稳定性好、施工简便、能承受较大的载荷,所以只要地基强度能满足要求,它是桥梁和涵洞等结构物优先考虑的基础形式。它的主要缺点是自 重大,并且当持力层为软弱土时,由于扩大基础面积有一定限制,需要对地基进 行处理或加固后才能采用。 (2)钢筋混凝土扩展基础主要用钢筋混凝土浇筑,常见的形式有柱下扩展基础、条形和十字形基础、伐板及箱型基础,其整体性能好,抗弯刚度较大。在土质较差的 地基上修筑建筑物时,采用这种基础是适宜的。 2、基坑围护方法:板桩墙支护、喷射混凝土护壁、混凝土围圈护壁。 3、如何确定地基承载力容许值(三种方法) (1)根据现场荷载试验的p-s曲线确定。 (2)按地基承载力理论公式计算。 (3)按现行规范提供的经验公式计算。 4、按现行规范提供的经验公式计算步骤:

程序设计教程(机械工业出版社)课后习题答案 第5章 构造数据类型

第5章构造数据类型 1、枚举类型有什么好处?C++对枚举类型的操作有何规定? 答:使用枚举类型有利于提高程序的易读性;使用枚举类型也有利于保证程序的正确性。 首先,可以对枚举类型实施赋值操作,但不同枚举类型之间不能相互赋值,而且不能把一个整型数直接赋值给枚举类型的变量。还可以对枚举类型实施比较运算。还可以对枚举类型实施算术运算,对枚举类型的运算前要转换成对应的整型值,且运算结果类型为算术类型,而且不能对枚举类型的值直接进行输入/输出。 2、指针类型主要用于什么场合?引用类型与指针类型相比,其优势在哪里? 答:指针类型主要用于参数传递和对动态变量的访问。在C++中,指针类型还用于访问数组元素,以提高访问效率。 引用类型与指针类型都可以实现通过一个变量访问另一个变量,但访问的语法形式不同:引用是采用直接访问形式,指针则采用间接访问形式。在作为函数参数类型时,引用类型参数的实参是一个变量,而指针类型参数的实参是一个变量的地址。 除了在定义时指定的被引用变量外,引用类型变量不能再引用其他变量;而指针变量定义后可以指向其他同类型的变量。因此,引用类型比指针类型要安全。 引用类型的间接访问对使用者而言是透明的。 3、写出下面程序的运行结果: #include using namespace std; void f(int &x,int y) { y = x + y; x = y % 3; cout << x << ‘\t’ << y << endl; } int main() { int x=10, y=19; f(y,x); cout << x << ‘\t’ << y << endl; f(x,x); cout << x << ‘\t’ << y << endl; return 0; } 答: 2 29 10 2 2 20 2 2 4、从键盘输入某个星期每一天的最高和最低温度,然后计算该星期的平均最低和平均最高 温度并输出之。 解: #include

数据结构作业系统_第十章答案教学文稿

数据结构作业系统_第 十章答案

10.23②试以L.r[k+1]作为监视哨改写教材10.2.1节 中给出的直接插入排序算法。其中,L.r[1..k]为待排 序记录且k0;i--) { L.r[L.length+1]=L.r[i+1]; if(GT(L.r[i],L.r[i+1])) { L.r[L.length+1]=L.r[i]; L.r[i]=L.r[i+1]; } for(j=i+2;LT(L.r[j],L.r[L.length+1]);j++) L.r[j-1]=L.r[j]; L.r[j-1]=L.r[L.length+1]; } } 10.26②如下所述改写教科书1.4.3节中的起泡排序算法:将算法中用以起控制作用的布尔变量change改为一个整型变

量,指示每一趟排序中进行交换的最后一个记录的位置,并 以它作为下一趟起泡排序循环终止的控制值。 实现下列函数: void BubbleSort(SqList &L); /* 元素比较和交换必须调用以下比较函数和交换函数:*/ /* Status LT(RedType a, RedType b); 比较:"<" */ /* Status GT(RedType a, RedType b); 比较:">" */ /* void Swap(RedType &a, RedType &b); 交换 */ 顺序表的类型SqList定义如下: typedef struct { KeyType key; ... } RedType; typedef struct { RedType r[MAXSIZE+1]; // r[0]闲置或用作哨兵单元 int length; } SqList; 比较函数和交换函数: Status LT(RedType a, RedType b); // 比较函数:"<" Status GT(RedType a, RedType b); // 比较函数:">" void Swap(RedType &a, RedType &b); // 交换函数 void BubbleSort(SqList &L) /* 元素比较和交换必须调用如下定义的比较函数和交换函数:*/ /* Status LT(RedType a, RedType b); 比较:"<" */

fortran初步学习资料

第一章: Fortran语言程序设计初步 Fortran语言的发展概况 本节介绍Fortran的起源与发展历史,讲述Fortran由产生到形成标准FortranIV、Fortran77,并进一步形成新标准Fortran90/95的发展历程。 1.1.1 Fortran的历史 a)a)FortranI FortranIV Fortran是目前国际上广泛流行的一种高级语言,适用于科学计算。Fortran 是英文FORmula TRANslatio n的缩写,意为“公式翻译”。它是为科学、工程问题中的那些能够用数学公式表达的问题而设计的语言,主要用于数值计算。这种语言简单易学,因为可以像抄写数学教科书里的公式一样书写数学公式,它比英文书写的自然语言更接近数学语言。Fortran语言是第一个真正推广的高级语言。至今它已有四十多年历史,但仍历久不衰,始终是数值计算领域所使用的主要语言。Fortran语言问世以来,根据需要几经发展,先后推出形成了很多版本。 第一代Fortran语言是在1954年提出来的,称为FortranI。它于1956年在IBM 704计算机上得以实现。在此之前编写计算机程序是极为繁琐的,程序员需要详细了解为之编写代码的计算机的指令、寄存器和中央处理器(CPU)等方面的知识。源程序本身是用数学符号(八进制码)编写的,后来采用了助记符,即所谓机器码或汇编码,这些编码由汇编程序转换为指令字。在50年代书写和调试一个程序要很长时间,因为用这种方式编写程序显然是很不方便的,尽管它能使CPU高效地工作。正是这些原因,促使由John Backus率领的IBM公司的一个小组研究开发最早的高级程序设计语言Fortran。其目的是开发一种容易理解、简单易学又能几乎像汇编一样高效运行的语言,他们取得了极大的成功。Fortran 语言作为第一种高级语言不仅是一次创新,也是一次革命。它使程序员摆脱了使用汇编语言的冗长乏味的负担,而且它使得不再只是计算机专家才能编写计算机程序,任何一名科学家或工程技术人员,只要稍加努力学习和使用Fortran,就能按自己的意图编写出用于科学计算的程序。 经过不断发展,FortranI形成了很多不同版本,其中最为流行的是1958年出现的FortranII,它对FortranI进行了很多扩充(如引进了子程序),FortranII 在很多机器上得以实现。其后出现的FortranIII未在任何计算机上实现。1962年出现的FortranIV对原来的Fortran作了一些改变,使得FortranII源程序在FortranIV编译程序下不能全部直接使用,导致了语言不兼容的问题。这样就形成了当时同时使用FortranII和FortranIV两种程序设计语言的局面。

第3章 创建数据类型和表

第3章创建数据类型和表 本章概述 在前面了解了SQL Server数据库的组成以及SQL Server数据库中的对象后,我们在本章中学习数据库中的数据类型和表的创建方法。通过本章的学习,我们已经能够利用SQL Server数据库为简单资料设计和实现最基本的存储方案了。 教学目标 ●了解SQL Server支持的数据类型 ●掌握创建和删除用户定义数据类型的方法 ●掌握创建和删除用户表的方法 ●掌握生成列值的方法 ●掌握生成脚本的方法 教学重点 ●SQL Server支持的类型,何时选用何种类型描述数据。用户定义类型的相关处理。 ●用户表的增删以及相关操作,包括生成脚本和数据列的定义。 教学难点 ●本章同样会设计到数据的底层存储结构,比如B树,为什么要这样设计,需要讲 清楚。 ●企业项目流程同课程内容的结合。比如设计表结构属于项目什么阶段的任务,该 任务的实际进行方式是如何的(结合案例)。又比如生成SQL脚本对项目的作用。

数据库程序设计—SQL Server 2000 数据库程序设计教师参考手册 教学资源 先修知识 在正式开始学习本章内容以前,学生须具备下列知识基础。 2

第3章创建数据类型和表 建议学时 课堂教学(3课时)+实验教学(3课时) 教学过程 3.1创建数据类型 教学提示: 本节主要达到三个目的。 ●掌握SQL Server支持的数据类型。(精讲) ●掌握用户自定义类型的创建。(精讲+演示) ●掌握选择数据类型的原则,这点在企业数据库应用中非常重要,因为正确的选择数据 列的类型将使数据库性能达到最优。(略讲) 3

数据库程序设计—SQL Server 2000 数据库程序设计教师参考手册 4

Fortran95程序设计习题答案

Fortran95程序设计习题答案 第四章 1.program main implicit none write(*,*) "Have a good time." write(*,*) "That's not bad." write(*,*) '"Mary" isn''t my name.' end program 2.program main real, parameter :: PI=3 implicit none.14159 real radius write(*,*) "请输入半径长" read(*,*) radius write(*,"(' 面积='f8. 3)") radius*radius*PI end program 3.program main implicit none real grades write(*,*) "请输入成绩" read(*,*) grades write(*,"(' 调整后成绩为 'f8.3)") SQRT(grades)*10.0 end program 4.integer a,b real ra,rb a=2 b=3 ra=2.0 rb=3.0 write(*,*) b/a ! 输出1, 因为使用整数计算, 小数部分会无条件舍去 write(*,*) rb/ra ! 输出 1.5 5.program main implicit none type distance real meter, inch, cm end type type(distance) :: d write(*,*) "请输入长度:" read(*,*) d%meter d%cm = d%meter*100 d%inch = d%cm/ 2.54 write(*,"(f8.3'米 ='f8.3'厘米 ='f8.3'英寸')") d%meter, d%cm, d%inch end program 第五 章 1.program main implicit none integer money real tax write(*,*) "请输入月收入" read(*,*) money if ( money<1000 ) then tax = 0.03 else if ( money<5000) then tax = 0.1 else tax = 0.15 end if write(*,"(' 税金为 'I8)") nint(money*tax) end program 2.program main implicit none integer day character(len=20) :: tv write(*,*) "请输入星期几" read(*,*) day select case(day) case(1,4) tv = "新闻" case(2,5) tv = "电视剧" case(3,6) tv = "卡通" case(7) tv = "电影" case default write(*,*) "错误的输入" stop end select write(*,*) tv end program 3.program main implicit none integer age, money real tax write(*,*) "请输入年龄"

调治构造物

河道上建桥后,为了防止和减轻桥下河床的变形,加强桥梁抵抗水流冲刷的能力,保证桥梁的正常使用而修筑的建筑物,主要有桥头锥体护坡、导流建筑物、护岸和既有桥的浅基防护建筑物等。 桥头锥体护坡路堤和桥梁相联接的建筑物。路堤临桥孔方向的边坡较陡,并迎受水流冲刷,常用干砌片石和浆砌片石修筑各种类型的桥头锥体护坡。 导流建筑物引导水流顺畅地通过桥孔,保护桥梁墩台以及桥头路基和河岸不受冲刷所修筑的桥梁防护建筑物。一般按水流量和流速等修筑不同类型的导流建筑物。常见的有: ①曲线形导流堤和直线形导流堤。桥址所在河段河流通过河滩压缩部分的流量较大,如单侧河滩流量大于总流量15%或双侧河滩大于20%的情况下,修筑这类导流建筑物,能引导河滩水流平顺地进入桥孔。其设置如图1所示。 ②梨形堤。当桥址河段比较稳定,流速不太大,而且桥头路堤伸入河滩,阻挡了部分流量(单侧河滩流量小于总流量15%或双侧河滩小于20%),为了调整水流方向,防止水流对锥体护坡和桥头路堤边坡的淘刷,并改善边孔条件,加大边孔过水能力,一般修筑梨形堤。其设置如图2所示。 ③封闭式导流堤。为引导水流平稳地进入桥孔,保护堤后路基、农田和村镇道路不受水流漫溢的危害而修筑的桥梁防护建筑物。其设置如图3所示。 ④桃形堤。桥址所在河段,是变迁性河流的摆动河段或山前宽河的中游扩散河段,往往须采用一河多桥。在这种情况下,为了避免水流直冲两桥之间的路堤要修筑桃形堤,以便将水流导向两桥的桥孔。其设置如图4所示。

⑤丁坝。修筑于桥头路堤的一侧或两侧的河岸边上,或修筑在长大导流堤的迎水面的桥粱防护建筑物,其作用是将水流挑离桥头路堤河岸和导流堤,并使泥砂在丁坝后部淤积,形成新的水边线,以达到改变水流流向,保护桥头路堤、河岸和导流堤的目的。丁坝的设置如图5所示。 ⑥顺坝和格坝。为控制河势,束窄河道,约束水流而设置的桥梁防护建筑物。顺坝一般同水流的流向平行,当顺坝较长且与河岸距离较大时,常在顺坝与河岸之间修筑几道格坝,以防止水流冲走沉积的泥砂。顺坝和格坝设置如图6所示。 ⑦截水坝和分水堤。截水坝是为堵塞河道而修筑的,常用于堵塞旧河道、河叉、串沟等,以保持桥址所在河段的稳定。分水堤是为了防止两座或几座桥梁和涵洞上游洪水互相窜流时而修建的,以便将通过桥梁和涵洞的洪水流量分开。 设置导流建筑物应根据需要作好水文调查,精心设计,并防止产生有害的影响。导流建筑物常用铺草

C++习题第05章 构造数据类型

第05章构造数据类型 1. 选择题 (1)已知P是一个指向结构体类型A的指针,a是结构体类型A的一个变量,如果要给a 变量的成员赋值为5,()是正确的。 (A)a.m=5 (B)p->m=5 (C) (*p).m=5 (D) A.m=5 (2)下列关于数组的描述错误的是() (A)数组的下标是从0开始的 (B)数组名是一个常量指针 (C)数组的每一个元素都是同一类型的 (D)数组元素只能赋初值,而不能在定义后赋值 (3)若有程序段如下: (A)int a[4]={4,10},*p (B)P=a; 则输出*(++P)的值为 (A)10 (B) 4 (C)0 (D)不定 (4).下列程序的输出结果是(B) #include Struct A {int a,b,c;}; Void main() { struct A s[2]={{1,2,3},{4,5,6}}; Int t; T=s[0].a+s[1].b; Cout<

相关文档