文档库 最新最全的文档下载
当前位置:文档库 › Fortran程序设计第5章 准备数据

Fortran程序设计第5章 准备数据

Fortran程序设计第5章 准备数据
Fortran程序设计第5章 准备数据

第5章准备数据

从本章开始,我们将赋予语言实质性的语义,也就是规定上章所描述的语言的每一个细节所具有的涵义。这种涵义与其说是我们对于一种语言细节的定义,不如说是算法的要求,要求语言具有足够多的细节,用来表达在算法当中有可能出现的精细情节。

对于任何的问题,站在计算机的角度来看,总是可以把它抽象为如下图所示的结构:

因此要准备通过计算来解决一个问题,首先要作到的是把该问题所涉及到的数据整理好,也就是列出所有的数据,然后根据数据的数学属性进行分类,这个分类的过程就是对数据施加足够的标记的过程,将来把这些数据输入到计算机,计算机将能够依据这些标记,辨识出数据所应该具有的数学属性,从而施加相应的合法数学运算。

所以作为向计算机描述计算问题的FORTRAN语言,它首先要作到的是约定如何给数据施加足够详细的标记。

对这个标记过程的第一个要求是保证准确性,也就是说这个语言的标记系统必须正确地反映真实世界的问题里面,数据所具有的数学属性,因此这个标记系统必然是与数据的数学分类结构保持一致的。

从数学的观点来看,世界上的所有数据,总是可以被表示为整数,实数,复数等等基本的数据种类,因此本章的内容就是讨论:

●FORTRAN语言如何把数据归结为一些基本数据类型;

●然后为了足够详尽地描述每一个数据类型的属性,FORTRAN是如何施加相应的标

记的;

●FORTRAN语言对于这些标记(语法形式)所约定的语义是什么。

然后我们就可以知道,要想用FORTRAN来描述一个问题的算法,并进而以问题算法的FORTRAN语言版本为媒介,通过计算机来得到计算结果,第一个步骤,就是准备好数据的FORTRAN描述。

5.1 数据是什么

在上一章里,据称计算机能够使用语言,而且是非常类似于人类的语言,至少从形式上看很象,这难免会令某些人(特别是看过KUBRICK的影片《2001: A Space Odyssey》的观众们)感到恐惧:)

别怕!且先不讨论FORTRAN作为语言是否具有与人类语言等价的表达能力,至少从自然语言的语义学的角度来看,FORTRAN说出来的话其实是绝对空洞的,因为FORTRAN 语言的全部语义基础就只是数据,而数据对机器而言,只是意味着经过编码的符号。

一台计算机其实是由以下6个部分组成:

●数据------也就是基本数据元素以及数据结构;

●基本操作------也就是一个对上述数据进行操作的基本操作集;

●顺序控制------也就是一个控制针对数据的基本操作执行的时间顺序的机制;

●数据存取------也就是一个如何给操作提供数据的机制;

●存储管理------也就是一个数据存储分配机制;

●操作环境------也就是一个支持程序和外部环境进行数据通讯的机制。

因此一台计算机

●在程序的使用者看来,就是给它输入数据,它再给你加工过的结果数据;

●在程序的编制者看来,就是把对数据的处理过程表示为计算机有限的一系列基本操

作(指令)的集合,使得计算机能够处理相应的数据;

因此,计算机的一切可以说都是围绕着数据----如何表达数据,如何处理数据。而计算机语言所要具备的两个部分的功能,首先就是完备的描述数据的性质,然后就是描述数据的处理过程。

那么,什么是数据呢?

●数据就是符号化了的信息!

对于计算机来说,任何信息都只有表示为符号,才能被认可;反过来说,计算机只能输入符号,而不会也不能理解符号的含义,它的能力只是体现在按照既定规则来处理符号。

然后,就是给出数据的表示,即如何用符号来明确而无歧义地表达数据。

要使得符号具备数据的含义,需要经过这么几个步骤:

●处理符号的第一步:给符号分类,并给出描述符号性质的方法。

这个分类是人作为设计者给符号规定语义的第一步,因为对于人来说,数据不能只是符号,而是具有来自真实世界的语义,设计者正是根据符号的这种语义,制定相应的处理符号的规则,而计算机要想能够正确地处理符号,基本的前提,就是每当引入一个数据,都得由人向机器声明这个数据是什么类型,这个数据具备什么性质,而且假设计算机已经被引入处理该种数据类型的规则。

●处理符号的第二步:区分常量与变量。

这一对范畴反映了最基本的人类抽象能力,也正是人类思维的基本模式。要想让机器模拟这种能力,最简单的做法就是:任何时候都必须首先声明,哪些符号表示常量,哪些符号表示变量,而变量相应的取值范围必须规定好,也就是说必须描述其取值为具有何种属性的常量值的集合;或至少已经被机器默认。

●处理符号的第三步:给每一类数据规定相应的合法运算。

对于一种数据可以执行什么样的运算,来自于语言设计者对数据语义的规定,只有当运算被表示为相应的机器指令或指令集合,这时在表面看来,机器才开始真正“理解”了数据的“涵义”。

因此可以说,数据的定义构成了计算机的“灵魂”。

按照上面讨论的步骤,说明一个数据类型包括四个方面:

●命名的语法

●取值的范围与属性说明

●该数据类型的常量的表示方法

●定义合法的运算

因此相应的一个数据类型的四个要素就是:

(1) 名字;

(2) 值的集合;

(3) 表示值(相应的常量)的方法;

(4) 操作值的运算的集合。

对于这四个要素,FORTRAN一方面要约定它们的语法形式,从而可以构成符号描述的唯一性标记,保证相应的描述语句能够被FORTRAN编译系统无歧义的辨识,另一方面就是要给出这些语法形式所对应的含义。

5.2 用FORTRAN来说明数据的性质

真实世界的数据显然是多种多样的,几匹马,轴承的内径,圆周长与直径的比值,电子的波函数,非各向同性电介质的电极化率,10个被试每日的最高血压等等,这些数据都具有非常不同的形式与性质,如果我们每针对一种数据形式,都把它定义为某一种新的数据类型,则肯定是烦不胜举,因此合理的途径是找到一种统一的数据描述方式,而对于科学计算问题来说,自然的数据分类方式是数学对数值数据的分类,再加上非数值型数据,会是非常适合于科学计算的数据表达方式。

当然,如果是以描述其他类型的问题为目的,如事务处理,符号演算等,则选用另外的数据分类方式会更有效。

至少从数学的观点来看,我们常常需要处理的数据,都可以表示为一些基本数据类型的组合,例如我们知道向量实际上就是一个数组,数组的每个元素为标量,因此应用数组这种结构,就可以自然地表示向量,另外复数尽管也可表示为一个二元数组,但是这种二元数组的乘法不同于二维向量,因此为了避免这种歧义,FORTRAN把复数当成一个基本数据类型。而几种基本标量里面,整数和实数都同样必须构成基本的数据类型。由此可以建立FORTRAN的对数据的类似描述。

由于真实世界问题的要求的不同,对数据的描述也有程度不等的情况,最基本的情况就是直接说明数据的类型以及其他属性,又由于数据表示的实现具有一个重要的参数,即存储空间,所以当问题要求的数据,不能满足于默认的存储空间的时候,这时,就需要进一步给出数据的种别参数,这是更加详细的数据描述。如果在真实世界问题当中出现的的数据对象,干脆不符合已有的固有数据类型以及数组的定义,这时就还需要根据用户的要求构造一个依赖于问题的特定的数据结构,这就是数据描述时会遇到的第三种情况。

对于这三种情况,FORTRAN的解决方式如下:

第一种情况:

确定数据的类型以及相应的可能具有的属性。

首先,FORTRAN所能辨识的数据类型首先分为两大类:

●固有数据类型

●派生数据类型

根据语义上的基本差别,数据首先具有一些基本的类型,这些基本类型一般是和构成真实世界里的信息的那些基本元素相对应,比方说数字,字符等。然后其他情况下遇到的数据都可以由这些基本数据类型组合得到。不过一种语言具体的规定哪些基本的数据类型,往往受到该种语言主要应用的场合的影响,由于FORTRAN主要用来进行科学计算,因此它所定义的基本数据类型,正是与我们在科学计算问题当中遇到的数据类型相契合的。

●所谓固有类型,是FORTRAN语言所定义的最基本的数据类型,每一种固有类型是

和该种数据类型相应的各种运算一起隐式定义的,也就是说一旦声明引入某种固有数据类型,则系统总是默认为对它进行相应的运算是合法的,并且总是可访问的。

这样就做到了每种数据类型都和它相应的运算捆绑在一起,使得问题的描述非常自然。

●固有类型包括五种:

整型(INTEGER)、实型(REAL)、复型(COMPLEX)、逻辑型(LOGICAL)和

字符型(CHARACTER)。

这个分类完全是遵循数据的数学分类,即整型指整数,实型指实数,复型指复数,逻辑型指逻辑值,字符型则是语言的基本元素。这样就可以把基本的数学语言一一对应的直接翻译为FORTRAN语言。

●所谓派生类型是由用户定义的,非隐式定义的类型,只要用一个类型定义来声明其

成员是何种固有类型,或者是何种其它已经定义过的派生类型,就能够被FORTRAN 认可为一种数据类型。

由于派生数据类型正是由固有数据类型充当成员而构成的,因此在结构关系上,可以把固有数据类型看成原子,而把派生数据类型看成分子。由于语言的根本目的就是为描述算法服务的,因此从这个角度出发,派生数据类型本质上体现了非常重要的数据抽象与数组合的思想,由于我们需要运用语言来描述的问题是开放性,我们很难划定需要FORTRAN来描述的问题的范围,因此通过构造派生数据类型,使得我们可以很自然而简洁地建立新的数据类型。这是FORTRAN在FORTRAN77标准之后的一个重大进步。派生类型数据最重要的用途就是扩充了数组这种重要的数据结构,由于数组在科学计算领域,是一种极端重要的数据结构类型,FORTRAN除了能够直接描述数组,同时还能描述更为广泛的派生数据类型,也就可以直接对一个数据集合的各个成员同时施加运算,拥有了这种自然的数据类型,就避免了象FORTRAN的早期版本那样,需要通过特别设计的算法来实现这种运算。

所谓固有数据类型的固有,对于FORTRAN来说,就是为每一种固有数据类型规定了它的存储模式。

在FORTRAN77及其之前的标准里,整型,实型,逻辑型数据都是使用了一个数值存储单元,而复型和双精度数据则使用了两个数值存储单元,字符型数据使用一个字符存储单元。由于存储模式是非常底层的语言实现结构,因此FORTRAN后续的标准要想保持兼容,只有继承这个约定。

因此在FORTRAN90与95当中,默认的整型,实型,逻辑型数据都是使用了一个数值存储单元,而默认的复型和双精度数据则使用了两个数值存储单元,默认的字符型数据使用一个字符存储单元。而作为语言的一个发展,在FORTRAN90之后的标准里,开始允许在一个程序单元内,由用户定义特定的不依赖于固有数据存储模式的数据类型,这就是第6章的派生数据类型。

建立一种数据类型,最大的好处就是可以把相关的运算和数据捆绑在一起,对于一个特定问题当中的数据对象,是否应该被明确地看成数据类型,属于语言设计的权宜,因为建立一种数据类型所能带来的好处可以用算法来补偿,而FORTRAN77之后的版本的选择是增加派生数据类型,这样使得我们可以在进行科学计算时,有更为自然的描述方式。

数据类型的全部分类总结如下:

固有数据类型

数值型数据

整型

实型

复型

非数值型数据

逻辑型

字符型

派生数据类型

就数据的属性而言,类型当然是最重要的属性了。在指定类型之后,紧接着的就是根据实际情况,看需要描述的数据是否还具有其他需要说明的属性。

对于数组来说,具有一个基本的属性,就是数组的大小,相应的就是如何指定数组的存储空间的大小的问题。

由于FORTRAN具备可分配数组与指针的功能,因此在程序开头并不一定需要指定数组的大小(维度),在程序执行过程当中,数组的大小会作为输入或计算结果被读入,这个指标可以针对具体的问题的要求,以及运行的状况而定。在FORTRAN还不具备这种动态功能的时候,就需要在数组声明里指定数组的维度,而在事先又很难准确预料程序运行过程当中对数组储存空间的要求,因此如果指定的数组过大,就会大量地浪费当时非常宝贵的内存空间,而如果指定的数据组过小,则肯定会在程序运行过程当中导致错误。

所以为了避免这些问题,现在一般不会在数据声明的时候精确指定数组大小,而是把数组处理成一个动态对象,从而有效地回避了这个问题。

数据的一个重要属性,就是它的可访问性。在FORTRAN语言里,模块提供了对数据的访问控制。任何数据对象只要想把自己局限在模块内使用,模块就能够提供足够的保护,使得外部程序无法访问该数据对象。模块的这个功能使得FORTRAN成为一种安全可靠的语言。

是否打开数据的其他许多具体的属性,取决于具体的数据应用环境,因此要讨论数据的每一种属性,在这里不太现实,我们只有等到下面具体地说明每一种声明语句时再具体说明,因为属性指定总是在出现在声明语句当中。

第二种情况:

指定固有数据类型的种别参数。

对于计算机来说,在确定数据的类型,从而可以引导到相应的运算之后,进一步就需要为数据在内存指定存储位置和存储空间,实际上对于冯纽曼型计算机来说,这个步骤是非常关键的,因为冯纽曼型计算机的要点,就是硬件之外的一切,都必须表示为数据,都必须存储在内存当中,然后在程序的运行当中,随时与CPU进行通讯,因此在程序的开头就明确数据在内存当中的位置与每个数据所占有空间的大小,是保证程序运行非常基本的要求。

●用来指定程序当中需要使用的每一种固有数据类型所要求占据的内存空间大小的属

性由种别参数表示。给这个变量(参数)指定一个数值,就可以说明数据所需要的存储空间的大小,也就是程序允许的数值数据的位数和字符串的字符数目。

●KIND(种类种别参数)分别说明整数类型的十进指数范围,实数类型和复数类型的十

进制精度和指数范围,字符类型和逻辑类型的表示方法。

●LEN(长度种别参数)对字符类型规定了字符的个数。

【例5-1】

REAL(KIND=3)::ABC,X,LONG

CHARACTER(LEN=40,KIND=GREECE)::NAME

具体的种别参数的约定是与语言的具体实现相关的,因此具体的取值还是得参考编译器的文档。

●如果没有声明数据的种别,那么程序就会采用默认的参数,由于FORTRAN的早期

版本没有引入种别参数,因此对于有不同精度要求的实型变量,直接采用了两种不同的数据类型,这就是REAL和DOUBLE PRECISION,从FORTRAN90以来的版本里,通过引入种别参数,对种别参数的不同取值,就足够表达不同的精度,而同时为了保证和早期版本的兼容,单独的数据类型声明DOUBLE PRECISION还是被保存下来了,这样一来,就产生了一个有一定任意性的后果,即新的语言标准对不同精度的实型数据,可以通过使用同一个数据类型的不同的种别参数值来表示,而同时用DOUBLE PRECISION作为数据声明也是有效的,这样就保证了源码向前的兼容性,却不具备向后的兼容性。

●对于在指定种别参数的数值时,一般是以字为单位,这样对于字长不同的机器而言,

相互之间就会出现程序移植的困难,下面分情况予以说明:

●实型----由于DOUBLE PRECISION是属于老式标准的遗留物,因此使用DOUBLE

PRECISION作为数据声明的程序就不具备良好的可移植性,因为所谓双精度是针对具体的机器的字长而言的,对于32位的机器,双精度就是64位,而对于64位机器,双精度就意味着128位,这样在不同字长的机器环境里,双精度就具有不同的位数,使得程序无法在不同字长的平台之间进行直接的移植。因此在这种情况下,最好还是统一使用REAL的种别参数来表达算法所要求的实数精度。可以说种别参数一劳永逸地解决了实数精度的可移植性问题。

●复型----由于所谓复型本质上就是由两个实数表达的,因此按道理复型同样应该能够

具有表达多种精度的能力,而实际上早期的版本在这方面是有欠缺的,不过随着FORTRAN90引入种别参数,就可以在COMPLEX的声明语句里通过运用种别参数来实现多种精度的表达,对于任何FORTRAN的实现,至少能表达两种精度,而一般来说是多于两种的。

●字符型----对于字符,一般的机器都是用单字节8bits来表示一个字符,这样就可以

总共表示28=256个不同的字符,这对于任何以字母写出来的语言都是足够的了,不过对于汉语,日语这样一些语言就不够用了,一般得需要双字节,即16bits,这样就可以表达216个字符。因此字符型数据同样需要附加种别参数,以便除了使用默认的基本字符之外,还可以使用辅助字符集里的字符,从而实现程序的本地化。不过某个具体的编译器是否支持双字节字符,必须参考相应的手册。因为FORTRAN 95标准也没有强制要求FORTRAN的任何实现都必须支持双字节字符。

●逻辑型----由于一切逻辑型数据都只有两个值,因此如何确定逻辑型数据的存储空间

应该是非常好办的,不过不幸的是,FORTRAN的早期版本规定逻辑型数据使用和实型数据一样大小的机器存储单位,这样当机器的字长很大时,就会非常的浪费机器的存储空间。因此到了FORTRAN90和FORTRAN 95,除了作为默认的情形,和旧的语言标准保持兼容之外,还可以通过指定种别参数,使得逻辑型数据的存储空间大小只有一个字,甚至一个bit。当然具体的使用方法需要参考相应编译器的说明。

●整型----显然在程序应用当中会出现几乎任何大小的整型数据,因此无法在语言标准

里面统一的规定整型数据的存储空间大小,这就同样需要依靠种别参数来指定应该

给具体问题当中的整型数据确定多大的存储空间。具体地指定方式属于编译器设计者的选择,需要参考相应编译器的语言说明。

第三种情况:

派生数据类型。

数据的本义就是对真实世界里的事物的描述。这种描述可以是简单的,如一个标量,也可以是复杂的,如一个张量,对于更复杂的对象,在自然语言里有一种自然的描述方法,就是使用一系列的词汇,每个词汇都是对象在某个方面的属性的度量;在计算机语言里,可以采用类似的解决方案,即把对象的每一个需要描述的性质用一个适当的基本数据类型来表示,这样用一组基本数据类型就可以描述该对象。而这一组数据可以看成是一个新的数据类型,表示了一个变量。

这样构造出来的数据类型称为派生数据类型,和固有数据类型一样,在声明派生数据类型时,需要给出名称,描述它的每一个元素的固有数据类型以及相应属性和种别参数(如果非默认的话),当然也需要适当地定义其运算。

既然这种派生数据类型是由一组数组成,就会出现两种情况:

●这组数据都是属于一个数据类型

这样构成的派生数据类型就是数组,显然对于数组的元素的描述就可以统一进行。具体的用法会在后面专门说明。

●这组数据的各个元素属于不同的数据类型

这样构成的派生数据类型称为结构,这时就需要对每个数据元素进行分别的说明,即每一个元素的数据类型,可能有的属性,种别参数等等。

上面对派生数据类型的描述实际上是递归式的,即一个派生数据类型的元素同样可以是另一种派生数据类型,而没有限定必须是固有数据类型。

【例5-2】下面是一个典型的派生数据类型。

TYPE SAMPLE

REAL CURRENT

COMPLEX (KIND = QUAD) PHASE

CHARACTER (LEN = 50) SOURCE

END TYPE SAMPLE

TYPE (SAMPLE) SI401,SI402,SI403,SI404

在上面的例子里,首先定义了一个名称为SAMPLE的数据类型,每一个SAMPLE类型的数据由三个分量组成,它们的名称分别为CURRENT,PHASE,SOURCE,分别属于实型,复型和字符型,其中复型和字符型还分别说明了种别参数和字符长度属性,然后给出了程序当中需要使用的四个属于该种数据类型的变量:SI401,SI402,SI403,SI404。

上面例子当中派生数据类型的定义,以TYPE开始,以END TYPE结束。

5.3数据不同种类的存储模式

对于计算机来说,数据分类的第一个反应就是针对不同类型的数据约定不同的存储模式。

由于存储模式的规定涉及到编译环境的设置,因此存储模式的约定是与系统环境相关的,鉴于Compaq Visual Fortran的广泛应用,本节特别针对Compaq Visual Fortran系统而言的说明了数据的各种存储模式。

下表5-1列出了Compaq Visual Fortran所有的固有数据类型的存储空间要求,和相应的能够在这个空间里表达的数据规模。

表中的INTEGER(4)等价于INTEGER(KIND=4)以及INTEGER*4.

5.4 FORTRAN数据类型描述的四个基本属性

一个数据如何才是被完备描述了,以及FORTRAN所要求的描述一个数据的要素是哪些,是一个问题的两面。这个问题对于程序的作者是很重要的,因为FORTRAN现在允许用户自己定义合乎自己需要的派生数据类型,这就要求我们知道一个派生数据类型的定义是否完备。

FORTRAN的数据类型必须包含如下四个部分:

●数据类型的名称

●数据取值的集合

●可以施加于数据的值的运算

●该数据类型的常量的表示形式

5.4.1 数据类型的名称

要能够说明数据的类型所属,首先每种数据类型本身得有个名称,才能在描述数据对象的时候,说某个数据对象属于某个数据类型。

固有数据类型就只有5种,它们的名称:INTEGER,REAL,COMPLEX,LOGICAL,CHARACTER是语言标准的规定。

但派生数据类型则完全是程序作者自定义的,因此必须由作者使用TYPE来给出其构造的派生数据类型的名称,也就是说只要一个数据或一个变量的取值符合TYPE与END TYPE 之间的定义,就被该程序单元识别为属于该数据类型,就可以应用相应的运算。

如果一个程序单元里出现的数据不能被识别为该程序单元的数据声明里的诸种类型,那么FORTRAN还会尝试运用一种方式来试图确定它的数据类型,就是根据数据名称的第一个字符来进行判别,这种方式属于FORTRAN的古老传统,因为早期FORTRAN所处理的数据类型比较单纯,顾可以如此简化处理,FORTRAN90与FORTRAN 95都继承了这点。

5.4.2 数据取值的集合

对于每种数据类型,存在一个允许的具体取值的集合。而属于该数据类型的变量的取值范围必定是在这个集合内。

表面看起来数据类型的取值集合都是明确的数学意义,但是由于本质上计算机的任何具体取值,都必须是有限的,因此数据类型表面的所谓数学涵义并不是很符合实际的。固然整型必定是取整数值,但只能取有限的整数值,而且这个值还有上限,即一个整型数据能够取多大的整数不仅在机器的硬件方面有制约,在语言的具体实现上也进行了约束。

同样,对于实型来说,更不可能就是和实数集合等价,实型数据的具体取值同样只能取可有限表示的实数,即有限小数。至于某些软件(如MATHEMATICA)声称可以精确的引用无理常数,例如欧拉常数,实际上是使用了一个收敛级数来表达无理常数,只有当用户指定有理表示的精度后,计算机才对级数做相应的截断,给出相应精度的有理表示,而并不是说该常数的无限位表示完全存储在计算机里面。

●逻辑型数据能够取得的值的个数是完全确定的,即仅有真和假两个值(即两个元素)。

由此可见所有逻辑型变量都是某种判断,而对该判断的取值只能或真或假,这里实际上就规定了FORTRAN语言只能用来表述满足排中律的数学。

●对于整型和实型来说,既然只可能取有限值,那么剩下的问题就是如何给某个具体

取值分配存储空间了,由于程序单元是根据数据声明当中对数据取值的规划来确定如何为数值分配存储空间的,因此对于具有极大处理能力的现代计算机而言,最好针对数值占用空间的大小进行分级,以做到在保证数值表达需求的前提下,尽量避免存储空间的浪费。FORTRAN为了给数值占用空间的大小分级,引入了种别参数(K1ND),使得在数据声明的时候,就可以一致地规定该类数据在表达时,允许占用空间的大小。

例如整型除了默认表示之外,还可以标志以种别参数“SHORT”,这个参数意味着在整型的默认取值范围了划出了一个子集,只要是属于这个子集的数据,允许系统给它分配较为小的,但更为合算的存储空间。

对于实型来所,则完全可以根据算法的需要,在开始的数据声明里,就给程序单元里可能出现的数据划出三流九等,使得程序对存储空间的占用更为合理。当然FORTRAN语言标准只是规定了实型必须至少在默认精度种别之外,还需要有一个双精度种别,而在FORTRAN的各种编译实现里,还可以规定更多的精度种别。

●对于字符型数据来说,它的存储空间完全和字符串长度成正比,因此只要直接规定

字符串的字符个数,就可以一致地得到其存储空间分配标准。

●至于复型和派生类型,则完全以其他数据类型作为成员,自身没有什么特别的规定,

因此也就没有独特的针对这两种数据类型的种别参数。

显然,FORTRAN通过运用种别参数来明确地规定数据的表示,使得Fortran的标准化程度得到了进一步提高,从而提高了程序的可移植性。

5.4.3 数据类型的合法运算

允许施加于数据的运算同样可以分为两类,即与固有数据类型相应的固有运算,还有自定义运算。由于在FORTRAN里面,运算的主要语法功能是构成表达式,因此详细的关于运算的讨论,参见有关表达式的章节。

1. 固有运算

固有运算就是固有数据类型在FORTRAN里面指定了表示符从而可以直接引用的那些固有运算,根据运算所能施加的算元据的不同,一共分为四类:

1. 算术运算

2. 串联运算

3. 关系运算

4. 逻辑运算

简述如下:

●算术运算

针对三种数值型数据,可以直接引用7种固有的算术运算:

●2种一元运算:

求反运算,其运算符为-;

求同运算,其运算符为+。

这两种一元运算可以施加于任意数值型数据和种别参数的组合,其运算结果的数据类型与种别参数和算元的数据类型和种别参数保持一致。

●5种二元运算是:

加法运算,其运算符为+;

减法运算,其运算符为-;

乘法运算,其运算符为*;

除法运算,其运算符为/;

乘幂运算,其运算符为**。

这5种运算的两个算元可以是数值型数据的任意数据类型与任意种别参数的任意组合。

如果参与运算的两个算元不是同一个类型或种别参数不同,那么FORTRAN如何决定结果的数据类型或种别参数呢?基本的原则就是向需要存储空间大的操作数看齐,以免损失算元的信息。具体地说,就是:

●若两个算元是相同类型和相同种别参数,则运算结果的类型与种别参数就是算元的

类型与种别参数。

●若两个算元都是整型但种别参数不同,则运算结果的种别参数是取十进制幂范围大

的那个算元的种别参数;若范围一样大,则由系统决定。

●当一个算元是整型、另一算元是实型或复型,则运算结果的种别参数就取那个实型

或复型的算元的种别参数。

●若两个算元属于不同种别参数的实型或复型数据,则运算结果的种别参数取十进制

精度高的那个算元的种别参数;若精度一样,则由系统决定取舍。

规定了运算结果的属性,具体的值就是通常的算术运算的结果,即

●加法为两个算元之和;

●减法为两个算元之差;

●乘法为两个算元之积;

●除法为两个算元之商,如果两个算元都是整型数据,它们相除时称为整除,其结果

商就是首先进行算术上的除法运算,得到的商去掉小数部分,取得的整数值即为整除的结果。这是为了满足上面关于保持类型一致性的规则。

例如:99/100的值为0;(-99)/100的值为0;58/3的值为19;(-58)/3的值为-19。

●乘幂为以第一个算元为底,第二个算元为指数的乘幂值。

●串联运算

针对相同种别参数的字符型数据定义了串联运算,其运算符是//。

串联运算的结果为保持种别参数不变的字符型数据。运算结果的值为第一算元的字符值,在右边紧接第二个算元的字符值。

例如:ABC//RTY的值为ABCRTY

●关系运算

关系运算是分别针对整型、实型、复型和字符型数据来定义的二元运算。

关系运算的结果为逻辑型数据,即只能取.TRUE.和.FALSE.两个值之一。

FORTRAN 95定义了六种固有关系运算,这六种固有关系运算根据其可以施加的操作数的不同,又可以分为两类:

可以施加于除复型之外的数值类型,种别参数以及字符型的第一类:

●大于,其运算符为.GT.,或>;

●大于等于,其运算符为.GE.,或>=;

●小于,其运算符为.LT.,或<;

●小于等于,其运算符为.LE.,或<=;

可以施加于所有数值型与字符型的第二类:

●等于,其运算符为.EQ.,或==;

●不等于,其运算符为.NE.,或/=。

对于数值型数据来说,关系运算具有通常的涵义,并且两个算元可以是任意的数值型类型与任意种别参数的组合。当然只有复型不能比较大小,而只能比较是否相等。

对于字符数据来说,关系运算具有独特的涵义。

首先要求两个算元具有相同的种别类型参数,但是可以具有任意的长度。其关系运算的执行可以理解为执行下列几个步骤:

(1)首先使两个作为算元的字符串的字符长度变为一致,如果相对来说有个字符的长度较短,就在右边以空格字符填充,直到两个算元长度相同为止。

(2)然后对两个算元按字符位置从左边第一个字符开始逐个进行比较判别,直到足够判别关系是否成立为止。

(3)而字符的比较是按字符在字符集中排列序列的位置的先后来进行的:

●若字符1在字符2之前,则认为满足小于关系,小于等于关系和不等于关系;

●若字符1在字符2之后,则认为满足大于关系,大于等于关系和不等于关系;

●如果位置相同,即为同一个字符,则认为满足等于关系。

●所有空串都是相等的。

●等于关系和不等于关系的运算结果与字符集序列无关,而其它四种关系的运算结果

是依赖于字符集排列序列的。由于ASCII的排列序列对于任何系统都是一致的,所以一般而言可移植性是能得到保证的。

●如果参与运算的默认字符数据值全是字母或全是数字,则按语言的规定,其顺序是

严格确定的;

●如果参与运算的默认字符数据值参杂了字母与数字,则把其中的数字看成字符,而

排序则依赖于系统的具体规定。所以在使用时要注意这点。

●如果参与运算的字符数据值包含了非默认的字符型数据,则同样依赖于系统的规定。

●逻辑运算

针对任意种别参数的逻辑型数据定义五种逻辑运算。

我们知道数值型数据和字符型数据进行关系运算后的结果是逻辑型数据,此外还可以根据算法的需要自定义逻辑型数据,逻辑运算就是施加于逻辑型数据,而得到逻辑型数据值的运算。

根据算元的数目,逻辑运算包含两种,其中一元运算为:

●非运算,运算符为.NOT.;

非运算的运算结果定义如下表5-2:

二元运算包括:

·与运算,运算符为.AND.;

·或运算,运算符为.OR.;

·逻辑等价运算,运算符为.EQV.;

·逻辑不等价运算,运算符为.NEQV.;

各运算的结果定义如下列各表:

逻辑运算的结果的种别参数的约定:

●当两个算元的种别参数相同时,则结果的种别参数与算元的相同;

●当两个算元的种别参数不同时,则结果的种别参数依赖于系统的约定。

2. 自定义运算

由于上面列出的固有运算,并不能满足我们在构造表达式时对运算的全部需求。显然,要使得语言具有开放性,就不可能期望通过指定有限的对象来概括任意需求,因此必然需要制定一个构造规则,以便允许程序作者自定义运算。所谓自定义运算就是需要程序作者根据算法的需要自己来定义的运算。

从语法的角度来讲,一个运算的定义包括三个部分:

●符号的表示;

所谓符号的表示就是给出运算的名称,命名规则为一个字符串的左右分别加一个小数点(句点)。

【例5-3】

.REMAINDER.

.REVERSE.

.INTEGRAL.

固有运算的表示符号除了通常的数学表示符号之外,同时还有一套等价的字符串加左右句点的表示方法,这就和自定义运算的符号表示统一起来了。这样做的好处就是可以用符号串直接作为文字来表示运算的涵义,(例如上面的三个名称就可以用来表示求余,反号,求积分这三种运算),从而便于程序的写作和阅读。这是一个值得遵循的良好的写作风格。

●运用固有运算的组合给出的自定义运算的定义;自定义运算的定义是通过函数用

OPERATOR来完成的,具体的说明见有关过程的章节。

●自定义运算的算元集合的描述。数学上定义一个函数,必定要指出函数的定义域,

同样一种自定义的运算也需要指定能够施加于其上的算元的范围,这里包括如下几种情况:

·定义在某个固有数据类型的真子集上;

如果对一个固有运算也做这样的限制,那么就把这个固有运算看成自定义运算了。

·定义在不止一个固有数据类型上,例如数值型数据和字符型数据的某种组合上;

可以针对某个固有运算做这样的扩展,同样视之为自定义运算。

·定义在派生数据类型上;

这样得首先定义该派生数据类型。

·定义在上述任意情形的组合而成的集合上。

5.4.4 数据类型的常量的表示形式

数据在程序当中的行为,除了以指定数据类型的变量形式出现之外,还有就是以常量形式出现,也就是给出某个数据类型的具体取值的形式。

因此对于数据类型的说明,还包括给出该数据类型的常量的书写语法。

【例5-4】下面给出每一种数据类型的说明常量的例子:

例子数据类型例子的取值

345 INTEGER 345

713.2或7.132E2 REAL 713.2

(2.77,5.38) COMPLEX 2.77+5.38i

.TRUE. LOGICAL TRUE

“SPACE_A” CHARACTER SPACE_A

SAMPLE(1.582,(3.2,5.5),”CHENG”) 派生类型SAMPLE(1.582,3.2+5.5i,”CHENG”)

可以看出,对于数值型数据,直接给出常量数据,就可以了,而对于字符型数据则需要写在定界符里面,对于派生类型则需要遵循派生数据类型的说明语法。

当然一个数据类型里的常量同样具有种别参数的属性,只要给出的常量不是属于默认的种别,就需要给常量加上种别参数,而种别参数有两种情况:

●一种是采用整数,由于不同的编译器对于这些整数的具体解释有可能是不同的,因

此会妨碍程序的可移植性;

●一种是采用命名常量来作为种别参数,那么只要这些命名常量一直被使用,就能保

证对它的解释的一致性。

【例5-5】

类型例子

INTEGER 2_SHORT

REAL 3.14159267895632_QUAD

COMPLEX (3.14159_HIGH, 56.2)

LOGICAL .TRUE._BYTE

CHARACTER CHINES E_”例子”

例子里SHORT,QUAD,HIGH,BYTE,CHINESE都是命名常量。

对于整型,实型,复型和逻辑型来说,种别参数写在数据的右边,以下划线隔开,而字符型则是写在数据的左边,同样以下划线隔开。

5.5 数据的基本类型:固有数据类型

对于计算机来说,数据的意义无非就是要知道在存储空间为一个特定的数据划出多大的空间来装载它,然后才谈得上给每一个数据编制地址,从而随时可以对数据进行读入读出操作。

确定数据占用空间大小的自然方式就是统一地给一类数据指定固定的存储模式,这就是FORTRAN 早期的做法,即整型,实型,逻辑型统一地用一个数值存储单位来存储,而双精度实型与复型则统一采用两个数值存储单位来存储,字符型数据则统一采用一个字符存储单位来存储。由于数值存储与字符存储具有不一样的情况,因此这两种存储单元的字节数大小不一样。

不过语言的进步,毋宁说是算法的进步,要求语言能够提供更加灵活的存储模式的可选择性,这就是FORTRAN90引进的种别参数,这样就扩充了固有数据类型的存储模式。同时为了使得程序能够与旧的标准兼容,一般采取在默认的情况下采取旧的存储模式,而需要扩充时,则额外加上种别参数。

数据的存储模式是通过对数据进行声明来指定的。详尽的声明语句的使用参见数据的声明,不过下面我们给出描述各个数据类型的四个基本属性的词法与句法,以备寻检。

5.5.1 整型

何谓FORTRAN 里的整数?

数学上的整数用整型数据来表示。而所谓整数,具体表示出来,在数学上一般的表示形式如下:

11l

k k k i s w r

-==??∑。

其中:

i 是一个任意的整数。

s 表示正负符号(可以取+1或-1)。

l 是一个正整数,表示i 的位数,即表示i 需要多少个数字。

r 是一个大于1的正整数,表示i 的进制的基数,即逢r 进一位的意思。 w k 是一个小于r 的非负整数,表示了i 的每一位的值。

例如一个形如-41的整数,也可以表示为二进制形式-0101001,因为我们有:

6543210

(1)(02120212020212)41

-??+?+?+?+?+?+?=- 要完全的描述整数i ,显然s ,l ,r ,w k (k=1,2,…l)这些数值都是必须提供的。

例如给出十进制整数-41,实际上也就是提供了

s=-1;l=2;r=10;w 1=1;w 2=4

这一套完整的信息。 不过如果我们的目的是描述一个取整数值的变量n 的数据类型,显然s 和w k (k=1,2,…l)都无须给出,而整型数据的分类都是围绕l 和r 来进行的。

【例5-6】 下面的带种别参数的整型数据的声明语句:

INTEGER(4) i

实际上表示的是如下形式的整数:

31

112

k k k i s w -==??∑

也就是取l=31和r=2。

下面我们就给出说明整型数据的四个基本属性的方式与相关功能函数

1. 整型的名称

整型的名称就是INTEGER 。也可以说就是声明整型数据类型的语句的关键词。 声明一个数据对象属于整型数据的基本语句句法为:

INTEGER [ ( [ KIND = ] kind-parameter) ] [ [ , attribute-list] :: ] entity-list

【例5-7】 以下这些声明语句主要是要说明数据项:

INTEGER X

INTEGER DIMENSION(:), POINTER :: days, hours

INTEGER(SHORT)RED_BALL

INTEGER(2) POINTER :: k, limit

INTEGER(1) DIMENSION(10) :: min

【例5-8】 以下这些声明语句主要是要说明数据的属性:

INTEGER days, hours

INTEGER(2) k, limit

INTEGER(1) min

DIMENSION days(:), hours(:), min (10)

POINTER days, hours, k, limit

整型数据也可用于指出某个变量为整型也可以构成一个条件语句。

【例5-9】

INTEGER I, X

READ (*,*) I

IF (I) THEN

X = 1

END IF

2. 整型数据的取值

取值为整数值的数据对象被定义为整型数据对象。

值得注意的是整型数据的取值范围,无论如何都只能是整数集合的一个真子集,因为计算机所能表示出来的整数的大小是受到一个有限数值的限制的。至于某一个具体的编译器能够表示的最大的数值是多少,并不是统一的,需要具体的依据编译器的约定,当然只有在我们需要考虑有可能取非常大的数值时,才会注意到系统的这方面的限制。

更具体地考虑一下,当我们要定义一个整型变量的时候,我们不止是需要考虑它是否可能取非常大的数值,更重要的是要在满足算法的数据精度要求与节约机器的内存空间之间取得某种折中。因为尽管语言标准只要求编译器提供整数的一种存储标准,但是现在一般的编译器都能提供多种存储模式,针对算法的具体情况,程序作者就可以选择不同的数据存储模式,来获得高效的程序。

FORTRAN 语言可以很方便地描述数据对象的具体的存储模式,那就是种别参数,实际上对于FORTRAN 来说,每一个数据总是认为它不仅属于一个数据类型,进一步还属于该数据类型的某个种别,在种别参数没有表达出来的时候,就会赋予默认的种别参数值。

由于FORTRAN 标准只是规范了固有数据类型的定义,对于每一个固有数据类型所定义的各个种别的具体存储模式,则一般由具体的编译系统来约定,因为给具有不同字长的数据规定适当的存储空间,得依据系统不同具体情况来确定。

FORTRAN 提供了三个固有函数,可以用于查询具体的某个系统对整型数据的存储模式的设置:

· KIND

· RANGE

· SELECTED_INT_KIND

● 固有函数KIND

这个函数能够给出任意属于固有数据类型的数据对象的种别参数

句法:

result = KIND (x)

输入x ,可以是任意属于固有数据类型的数据对象,如变量或常量。

输出为一个属于默认整型数据的标量,就是x 的种别参数值。

【例5-10】

KIND (0)为默认整型的种别参数值;

KIND (12)同样为默认整型的种别参数值;

● 固有查询函数RANGE

这个函数能够给出数据用十进制表示时的幂次范围。

一般句法为:

result = RANGE (x)

输入x 是数值型数据。

输出为一个属于默认整型数据的标量,表示数据用十进制表示时的幂次范围。

由于机器的存储模式是以二进制的位数为单位的,因此这个函数的作用就在于把二进 制的幂次范围转换为十进制的幂次范围。

对于一个整型变量,输出值为INT(LOG10( HUGE(x) ))。

对于一个实型或复型变量,输出值为INT(MIN (LOG10( HUGE(x) ),

-LOG10( TINY(x) ))).

【例5-11】

如果变量X 属于REAL(4),那么RANGE (X)的值为37. (因为HUGE(X) = (1 - 2-24) x 2128 TINY(X) = 2-126,而12838

2 3.402823669209384634633746074317710≈?;

12637

≈?)。

28.507059173023461586584365185794210

●固有转换函数SELECTED_INT_KIND

这个函数能够根据数据取值的十进制幂次范围,给出其种别参数值。

一般句法为:

result = SELECTED_INT_KIND (l)

输入十进制最大幂次l。

输出满足-10l < n < 10l的变量n的种别参数值。

如果系统不支持相应的整型种别,就会返回数值-1。

如果该数据同时满足不止一个种别参数值,则取具有最小十进制幂次范围的种别参数值。

由于很多情况下,我们只知道数据取值的十进制幂次范围,因此这个函数就提供了通过十进制幂次范围来指定种别参数的方法。

【例5-12】

INTEGER (SELECTED_INT_KIND (6))X !等价于INTEGER(4)X,而X

!的取值最大可以达到106,而最小

!可以达到10-6。

INTEGER (SELECTED_INT_KIND (5)) N,M !声明了变量N和M的取

!值最大可以达到105,而最小可以达

!到10-5。

i = SELECTED_INT_KIND(8) ! 返回4

i = SELECTED_INT_KIND(3) ! 返回2

i = SELECTED_INT_KIND(10) ! 返回-1, 因为系统不提供如此高

!的精度。

3. 运算

施加于整型数据的运算包括:

●一元固有算术运算:求反运算-;求同运算+。

●二元固有算术运算:加法运算+;减法运算-;乘法运算*;除法运算/;乘幂运算**。

●二元固有关系运算:大于.GT.或>;大于等于.GE.或>=;小于.LT.或<;小于等于.LE.

或<=;等于.EQ.或==;不等于.NE.或/=。

固有算术运算的结果仍然为整型数据,而固有关系运算的结果为默认种别类型的逻辑型数据。

4. 常量的表示形式

所谓常量,可以理解为取了具体的定值的数据对象,因此整型常量从形式上讲,就是一串数字,可能在前面(左端)加上正负号,也可能在后面(右端)加上下划线,然后跟一个种别参数。

整型字面常量的一般形式为(R403):

[s]n[n...][ _k]

其中:

s表示正负号;如果取负号(-),则这个负号是不可缺的,如果取正号(+),则是可选的。因此不带任何符号的数字串被默认为正数。

n表示数字(0到9),从左端开始第一个非0数字开始,它左边的任何0都会被忽略。

在默认情形下,这些数字都被认为是十进制表示形式的数值。

k是一个可选的种别参数,必须用下划线( _ )和表示数据的数字串区分开。

种别参数的一般语法形式为:

digit-string

scalar-integer-constant-name

即数字串,或者是取整型标量值的命名常量。

【例5-13】

1表示INTEGER(1);

2表示INTEGER(2);

4表示INTEGER(4);

8表示INTEGER(8);

LONG

SHORT

其中1,2,4,8同样属于默认种别的整型数字,而LONG和SHORT都是命名常量,它们的具体取值完全依赖于编译系统。

在默认情形下,整型常量总是被解释为十进制表示的数值,除了这种默认的十进制表达形式之外,还可以在DATA语句当中初始化表示为其他系统许可的进制形式。

在FORTRAN语言标准里面,规定了十进制之外的三种进制形式:

●二进制常量形式(R408):

B ? digit [ digit ]…?

B “ digit [ digit ]…”

其中的数字只能是0或1.

即二进制常量表示为以字母B开头,后跟用一对撇号或引号括起来的数字串,而且每个数字不是0就是l。

●八进制常量形式(R409):

O ? digit [ digit ]…?

O “ digit [ digit ]…”

其中的数字只能是0到7.

八进制常量表示为以字母O开头,后跟用一对撇号或引号括起来的数字串,而且每个数字是0到7之间的一个数字。

●十六进制常量形式(R410):

Z ? digit[ digit ]…?

Z “ digit [ digit ]…”

其中的数字只能是0到9,和A到F这五个字母,用来表示10到15.

FORTRAN程序设计复习题及答案

FORTRAN程序设计复习题 一、选择题 B (1)下列各FORTRAN表达式中合法的是 A) S+T*2P >= B) .NOT. (A*B+C) C) A2+B2/(C+D) <= D) (A+B).NOT.A*B.GT.(.NOT.只跟一个表达式) C (2)数学式(3/5)ex+y的FORTRAN表达式是 A) 3*EXP(X+Y)/5 B) 3*E* *(X+Y)/ C) (3/5)*EXP(X+Y)D) EXP(X+Y) D (3)下列FORTRAN77表达式中不合法的是 A) A.GT.B.EQV.C.GT.D B) A.AND.B.AND.C.AND.D C) .NOT.(X.LE.D) A.LT.B.LT.C.LT.D D(4)下列叙述中不正确的是 A) FORTRAN子程序可以单独编译 B) 对一个FORTRAN源程序进行编译和连接无误后可生成可执行文件 C) 即使编译和连接都正确无误,FORTRAN程序运行时仍可能出错 D) FORTRAN连接的主要任务是把函数库中的函数翻译成机器指令(正确描述:主要任务为连接目标文件) B (5)在下列FORTRAN77运算符中,优先级最高的是 A) .AND. B) .NOT. C) .OR. D) .EQ. B (6)FORTRAN表达式"6/5+9/2**3/2"的值为 A) 33 B) 1 C) 5 D) 3 A (7)下列FORTRAN77表达式中,合法的是: A) .AND.. B) 10.0 C) D) 提示:A)相当于 .AND.(.NOT.()) D (8)关于编译一个FORTRAN源程序文件,下列说法中错误的是 A) 允许编译只有一个主程序而没有子程序的源文件 B) 允许编译有多个子程序的源文件 C) 允许编译只有一个子程序而没有主程序的源文件 D) 允许编译有多个主程序的源文件 C (9)在FORTRAN77源程序中,续行标志符必须放在 A) 第1列 B) 第1-6列C) 第6列D) 第5列 D (10)下列关于"SUBROUTIN E MAP(X,Y)"语句行的叙述中,不正确的是 A) 这是子程序的第一个语句 B) 字符串"MAP"是子程序名 C) 变量X是子程序的形参D) 子程序执行后,MAP将返回整型数据 提示:子程序无返回值,自定义函数才有) A (11)FORTRAN表达式"2/4+"的值是 A) B) 1 C) D) 0 提示:2/4默认等于整型,=》 D (12)FORTRAN表达式"MOD,"的值是 A) B)0.0 C) D) A (13下列FORTRAN运算符中,优先级最低的是 A)逻辑运算符.AND. B)算术运算符*

Fortran95程序设计课后习题答案(word版方便)

第四章 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.p rogram 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(*,*) "请输入年龄" read(*,*) age write(*,*) "请输入月收入" read(*,*) money if ( age<50 ) then if ( money<1000 ) then tax = 0.03 else if ( money<5000 )then tax = 0.10 else tax = 0.15 end if else if ( money<1000 ) then tax = 0.5 else if ( money<5000 )then tax = 0.7 else tax = 0.10 end if end if write(*,"(' 税金为'I8)") nint(money*tax) end program 4.program main implicit none integer year, days logical mod_4, mod_100, mod_400 write(*,*) "请输入年份" read(*,*) year mod_4 = ( MOD(year,4) == 0 ) mod_100 = ( MOD(year,100) == 0 ) mod_400 = ( MOD(year,400) == 0 ) if ( (mod_4 .NEQV. mod_100) .or. mod_400 ) then days = 366 else days = 365 end if write(*,"('这一年有'I3'天')") days stop end program 第六章 1.program main implicit none integer i do i=1,5 write(*,*) "Fortran" end do stop end program 2.program main implicit none integer i,sum sum = 0 do i=1,99,2 sum = sum+i end do write(*,*) sum stop end program 3.program main implicit none integer, parameter :: answer = 45 integer, parameter :: max = 5 integer weight, i do i=1,max write(*,*) "请输入体重" read(*,*) weight if ( weight==answer ) exit end do if ( i<=max ) then write(*,*) "猜对了" else write(*,*) "猜错了" end if stop end program 4.program main implicit none integer, parameter :: max=10 integer i real item real ans ans = 1.0 item = 1.0 do i=2,max item = item/real(i) ans = ans+item

计算机程序设计语言(FORTRAN语言)

计算机程序设计语言(FORTRAN语言) (总分:36.00,做题时间:90分钟) 一、 (总题数:36,分数:36.00) 1.编译程序能将高级语言编写的源程序转换成( )。 A.解释程序 B.汇编程序 C.映象程序 D.目标程序 (分数:1.00) A. B. C. D. √ 解析: 2.一个完整的FORTRAN源程序( )。 A.至少包括一个主程序 B.至少包括一个主程序和一个子程序 C.由一个主程序与一个以上的子程序组成 D.由一个主程序与一个子程序组成 (分数:1.00) A. √ B. C. D. 解析: 3.语句函数定义语句在程序内合法的位置是( )。 A.在程序块开头语句之后,END语句之前 B.在程序块开头语句之后,可执行语句之前 C.在说明语句之后,END语句之前 D.在说明语句之后,可执行语句之前 (分数:1.00) A. B. C. D. √ 解析: 4.下列关于函数子程序虚实参数的错误说法是( )。 A.可以没有形参数 B.虚实结合的数组长度可以不同 C.实参表与虚参表类型可以不同 D.函数名可以作为虚参

(分数:1.00) A. B. C. √ D. 解析: 5.下列叙述中正确的是( )。 A.FORTRAN程序块中,无名公用语句只能有一个B.FORTRAN子程序中,至少应有一个RETURN语句C.FORTRAN程序块中,最后一行必须是END语句D.FORTRAN程序块中,必须有变量说明语句 (分数:1.00) A. B. C. √ D. 解析: 6.运行下面的程序时得不到所需的结果,其主要原因是( )。INTEGER X(11) DATA X/9,8,7,6,5,4,3,2,1,0,-1/ DO 10 1=1,X(1) ,-1 WRITE(*,*)1.0/SQRT(25.0-REAL(X(1) )* * 2) 10 CONTINUE END A.没有给X(11) 赋初值 B.发生除以零的情况 C.发生负数开平方的情况 D.循环参数设置错误 (分数:1.00) A. B. C. D. √ 解析: 7.下列数据中,不符合FORTRAN常量表示法的是( )。 A.-25.6 B.2.758D3 C.'FOOT"=' D.TRUE (分数:1.00) A. B. C. D. √ 解析:

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(*,*) "请输入年龄"

《FORTRAN 95程序设计》学习笔记

《FORTRAN 95程序设计》学习笔记 66RPG gg ★目录★ 《FORTRAN 95程序设计》学习笔记 (1) 基础知识(基础、字符串、FORMAT、隐式、TYPE) (1) 流程与控制(if、select、do) (4) 数组(声明、隐式循环、整体操作、可变数组) (5) 函数与子程序(子程序、函数、全局变量) (6) MODULE与面向对象(重载操作符、虚函数) (9) 文件相关(OPEN、WRITE、READ) (10) 指针(指向变量、数组、函数) (11) Visual Fortran 编译器(DLL,VB调用) (12) 数值算法与IMSL(数值算法插件) (14) 常用库函数(数学、数组、零碎、子程序) (15) 基础知识(基础、字符串、FORMAT、隐式、TYPE) ★【小玩意】二进制观察器:装在M.. Visual Studio\DF98\bin,有一个Bitviewer,可以观察变量储存方式 ★【语法】续行:行结尾或行开头使用& 符号;注释:使用! 符号 ★【语法】数学表达式:+ ;- ;* ;/ ;( ;) ;**乘幂 ★【语法】程序结束:STOP (Ruby的exit) ★【语法】输出:write(*,*),完整写法:write(unit=*,fmt=*) ?建议:少用print,尽量用write ★【语法】声明 ?整型:integer(kind=4) a ;其中kind是使用的bytes数,4 or 2 ◆其他写法:integer*4 a; integer(4) a ?浮点:real(kind=4) a ;有效数位6位(12345678存为1.234567E7),如果是kind8 则为15位有效数字 ◆此外:1E10:单精10^10,1D10:双精10^10 ?复数:complex :: a=(2,3)

大学FORTRAN考试试题精修订

大学F O R T R A N考试试 题 标准化管理部编码-[99968T-6889628-J68568-1689N]

《高级语言程序设计(FORTRAN)》考试样题 一、选择题(每小题2分,共40分) 1. 下列标识符中不能作为FORTRAN的合法变量名的是_____D_____。 A) A_1 B) A1 C) A1A D) A+1 2. 在FORTRAN的变量类型说明语句中没有 B A) REAL语句B)CHAR语句C)INTEGER语句 D)LOGICAL语句 3.FORTRAN90 源程序的扩展名是 C 。 A. TXT B. F C. F90 D. FOR 4.下列关于符号常量的说法正确的是___C____。 A.符号常量的定义应该放在所有语句之前 B.符号常量不可以是字符型常量 C.在一个程序单位中定义一个符号常量后,不能再改变它的值 D.符号常量定义语句与赋值语句一样,是可执行语句 5、在下列写法中,__D______不是FORTRAN常量。 A. .TRUE. C. , ,000,000 6.表达式15/4/的值是 B 。 A.整数2 B.实数1.5 C.实数2.25 D.实数1. 3 7. 下列不是FORTRAN赋值语句的是 _____D______。 A) X=.TRUE. B) X=X*X C) X=X**2**2 D) X=X++ 8. 梯形的上底为A,下底为B,高为H,计算其面积的FORTRAN表达式中错误的是____A____。 A)1/2*(AB)*H B)(A+B)*H/2 C)(A+B)/2*H D)*(A+B)*H 9. 要选拔身高T>米且体重W<公斤的人,FORTRAN的逻辑表达式是__C_____。 A) B) C) D) 90规定,变量类型声明的优先顺序是 C 。 A.隐含约定(I-N规则)、IMPLICIT声明、类型声明 B.类型声明、隐含约定(I-N规则)、IMPLICIT声明 C.类型声明、IMPLICIT声明、隐含约定(I-N规则) 声明、类型声明、隐含约定(I-N规则) 11、假设CH是一个字符型变量,并且具有足够的长度,则对于CH(3:7),下面说法正确的是___D________。 A.它是一个数组片段 B.它是一个数组定义形式 C.它是CH的一个子串,并且长度是4 D.它是CH的一个子串,并且长度是5 12.数组声明语句为: INTEGER,DIMENSION(-5:-1,-3:3,11:15) ::A 数组共有 A 个元素。 A.175 B.150 C.120 D.17 13. 下列DATA语句中正确的是______C____。 A) DATA /A,B/, B) DATA A, B/2*/ C) DATA A, B/2* D) DATA A/, B/ 14. 下列有关FORTRAN数组的说法正确的是______D_____。 A) 数组定义语句只能定义一维或二维数组 B) 数组元素下标不能出现负值 C) 在赋值语句中出现的A(3)肯定是数组元素 D) 程序中使用的数组必须进行说明

工程分析程序设计上机作业一Fortran程序设计基础

工程分析程序设计 上机作业(一) Fortran 程序设计基础 上机目的:掌握程序书写、字符集和标识符、数据类型、声明、算术表达式、表控输入输出语句等编程基本概念。 1、 若有实型数A=1.0 B=3.5 T=10.0 X=5.0 整型数I=-5 J=7 K=3,求出下面表达式的值。 -(A+T) (B+(X/T))/(4.0*A) (I*J)/K (I/K)*J+T/X -(K+1)/5+I*A-B SQRT(REAL(ABS(K)+1)) MAX(J,MOD(J,K)) J+INT(T/B)/2 2、 从键盘输入三个角度值a, b, c ,计算如下式子的值: 22 34a b a b +- c b a b a tan |)||cos(|| |sin +++ 26ln()1403b c a ++ 3、 已知一圆柱底面半径R 为6.4,高为5,编程求圆柱底面圆周长、圆面积,圆柱的体积和表面积;以 R=6.4为半径的圆球表面积和体积、(要求在变量声明的同时赋初值) 4、 编写一个程序,要求完成以下要求: (1) 提示用户输入任意的3个小数; (2)显示这三个小数; (3)将这三个小数相加,并显示其结果; (4)将结果按四舍五入方法转换成整数并显示。 5、 有一个六边形,求其面积。为求面积,作了3条辅助线。如图所示:(提示,三角形面积 2 a b c s ++=,a 、b 、c 为三个边长)。 =21 6、 我国现在人口13.0亿人,假定每年增长率为1.5%,求n 年以后的人口数。n 从键盘输入。

7、 请写一个程序,可以让使用者输入初始速度V 0(单位为m/s )与角度θ(单位°),利用下列公式计算 飞行时间与距离: g V t /sin 20θ= t V D ?=θcos 0

Fortran用法小结

目录: 一、说明 二、概述 三、数据类型及基本输入输出 四、流程控制 五、循环 六、数组 七、函数 八、文件 一、说明 本文多数内容是我读彭国伦《Fortran 95 程序设计》的笔记。只读到第九章,主要是3~9 章,都是最基本的用法(原书共16章)。这里主要摘录了我看书过程中总结的一些Fortran和C不 同的地方,主要是语法方面。希望这份笔记能够给学过C但没有接触过Fortran的同学带去一些帮 助。要想得更清楚些,推荐看一下原书,觉得作者真的写得很好,很清楚;如果有C语言的基础, 看完前九应该很快的,花一两天就行了。觉得如果耐心看完本文,基本功能应该也可以顺利用起 来了。外,由于我之前没有用过Fortran,这次为了赶文档看书又看得很粗浅,大多数东西看过

之后都没得及仔细想,只是按着作者的意思去理解。所以这份笔记还处于纸上谈兵的层次。如果 有不妥的方,希望大家指正。谢谢! 文中蓝色的部分是程序代码,!后面的内容为注释。 二、概述 1、名词解释 Fortran=For mula Tran slator/Translation 一看就知道有什么特色了:可以把接近数学语言的文本翻译成机械语言。的确,从一开始 ,IBM设计的时候就是为了方便数值计算和科学数据处理。设计强大的数组操作就是为了实现这一 目标。ortran奠定了高级语言发展的基础。现在Fortran在科研和机械方面应用很广。 2、Fortran的主要版本及差别 按其发展历史,Fortran编译器的版本其实很多。现在在广泛使用的是Fortran 77和Fortr an90。ortran 90在Fortran 77基础上添加了不少使用的功能,并且改良了77编程的版面格式, 所以编程时推荐使用90。鉴于很多现成的程序只有77版本,有必要知道77的一些基本常识,至少保 证能够看77程序。以下是77和90的一些格式上的区别。

Fortran95课程设计

Fortran95 课程设计

目录 一,任务书...............................................................................1 二,员工档案(工资和个人所得税)..................................6 三,求解方程.........................................................................11 1,求解一元方程的根494-)(23++=x x x x f .. (11) 1-1,二分法求解 1-2,弦截法求解 1-3,Newton 迭代法求解 (13) 2,求方程的积分()dx x e x b a 5431+++?.......................................15 2-1,矩形法积分 2-2,梯形法积分 2-3,辛普生法积分 3,Gauss-Jordan 法求联立方程组 (18) ?? ???=++=++=++8z 2y x 7z y 2x 6z y x 四 ,课程总结 (22)

2012级FORTRAN 95程序设计语言课程设计任务书 一、实践目的 通过本课程设计、加深学生对所学程序设计语言的理解,培养其程序设计能力以及综合解决实际问题的能力。通过自己分析问题、分解问题、查找算法、编写、调试程序的过程,掌握FORTRAN 95程序设计与调试方法,提高应用所学知识借助计算机程序解决具体问题的能力。 二、设计任务 1、综合应用所学FORTRAN 95知识点解决具体问题。 某小型公司有员工25人,员工信息包括员工编号,姓名,性别,工龄,工资(为方便,视其为三险一金减除后的金额),现在需要对这25名员工按照其工资进行个人信息的排序,计算每个人的个人所得税并添加到个人信息中。请按以下要求进行设计 ⑴利用记事本创建员工基本信息文件。 ⑵设计包含以上信息内容的派生类和结构体数组。 ⑶以结构体数组为虚参编写排序子程序,可使用简单交换法、选择法和冒泡法中的任何一种。 ⑷以普通变量为虚参,编写函数子程序计算个人所得税子程序。 ⑸编写主程序完成以上工作,并将包含所得税信息的员工信息输出到另一个文本文件。

Fortran复习题

FORTRAN程序设计复习题 选择题 B (1)下列各FORTRAN表达式中合法的是 A) S+T*2P >= 0.0 B) .NOT. (A*B+C) C) A2+B2/(C+D) <= 0.0 D) (A+B).NOT.A*B.GT.0.0(.NOT.只跟一个表达式) C (2)数学式(3/5)ex+y的FORTRAN表达式是 A) 3*EXP(X+Y)/5 B) 3*E* *(X+Y)/5.0 C) (3/5)*EXP(X+Y) D) (3.0/5.0)EXP(X+Y) D (3)下列FORTRAN77表达式中不合法的是 A) A.GT.B.EQV.C.GT.D B) A.AND.B.AND.C.AND.D C) .NOT.(X.LE.0.0) D) A.LT.B.LT.C.LT.D D (4)下列叙述中不正确的是 A) FORTRAN子程序可以单独编译 B) 对一个FORTRAN源程序进行编译和连接无误后可生成可执行文件 C) 即使编译和连接都正确无误,FORTRAN程序运行时仍可能出错 D) FORTRAN连接的主要任务是把函数库中的函数翻译成机器指令(主要任务为连接目标文件) B (5)在下列FORTRAN77运算符中,优先级最高的是 A) .AND. B) .NOT. C) .OR. D) .EQ. B (6)FORTRAN表达式"6/5+9/2**3/2"的值为 A) 33 B) 1 C) 5 D) 3 A (7)下列FORTRAN77 表达式中,合法的是:A)相当于0.0.LE.X .AND.(.NOT.(X.GE.10.0 ))A) 0.0.LE.X .AND..NOT.X.GE.10.0 B) 0.0.GE.X.LT.10.0 C) 0.0.LE.X.GE.10. D) 10.0.LE.X.OR..AND.X.GT.0.0 D (8)关于编译一个FORTRAN源程序文件,下列说法中错误的是 A) 允许编译只有一个主程序而没有子程序的源文件 B) 允许编译有多个子程序的源文件 C) 允许编译只有一个子程序而没有主程序的源文件 D) 允许编译有多个主程序的源文件 C (9)在FORTRAN77源程序中,续行标志符必须放在 A) 第1列 B) 第1-6列 C) 第6列 D) 第5列 D (10)下列关于"SUBROUTIN E MAP(X,Y)"语句行的叙述中,不正确的是 A) 这是子程序的第一个语句 B) 字符串"MAP"是子程序名 C) 变量X是子程序的形参 D) 子程序执行后,MAP将返回整型数据(子程序无返回值,自定义函数才有) A (11)FORTRAN表达式"2/4+0.5"的值是 A) 0.5 B) 1 C) 1.0 D) 0 D (12)FORTRAN表达式"MOD(4.9,1.3)"的值是 A)1.3 B)0.0 C)4.9 D)1.0 A (13下列FORTRAN运算符中,优先级最低的是 A)逻辑运算符.AND. B)算术运算符* C)关系运算符 >= D)算术运算符+ A (14下列语句函数的定义中正确的是 A)F(X,Y)=(X+Y)/(X*Y)+7.0 B)FUNCTION FUN(I,J,K)=3*I+2*J+0.5*K

第二章 Fortran程序设计基础

第二章 Fortran程序设计基础 2.1.1字符集 “字符集”是指编写Fortran程序时,所能使用的所有字符及符号。Fortran所能使用 Fortran标准中规定,编译器只需要认得大写的英文字母,而如果程序代码中使用小写英文字母,则会把它们视为大写字母。简单说,Fortran是不区分大小写的语言。 特殊符号除了用来做数学计算符号外,还有其他用法,后面用到时会介绍它们。 2.1.2书面格式 Fortran程序代码的编写格式有两种,Free Format(自由格式)及 Fixed format(固定格式)。Fixed format(固定格式)属于旧式写法,它在编写版面上有很多限制。Free Format (自由格式)是Fortran90之后的新写法,取消了很多旧的限制。这里,我们要求用Free Format格式来编写程序。以*.F90为扩展名的文件,就是用Free Format来编写的程序。 Free Fortran格式基本上允许非常自由的格式,它没有规定每一行的第几个字符有什么作用。需要注意以下几点: (1)叹号“!”后面的文本都是注释,Fortran90编译程序对源程序进行编译时,对注释区内的内容不予处理。 (2)每行可以编写132个字符。 (3)行号放在每行程序的最前面。 (4)要求以一个“&”作为一个续行标志;一行中可以写多条语句,用“;”隔开。 下面是一个用Free Format格式的编写实例: 1.! Free Format 2. program main 3. write(*.*) “hellow” !这也是注释 4. write(*.*) & 5. “hellow” 6. end 这里,读者可发现第一、三行中都有注释,第一行整行都是注释,第三行只有叹号后面的部分是注释。第四行的最后是连接符号&,所以第五行会连接在它后面。 2.1.3 Fortran的数据类型 1.整数(INTEGER) 整数的类型又分为两种,长整型与短整型。在个人计算机中长整型占32 bit(4 bytes)的空间,常整型可保存的数值范围在-2147483648+2147483647之间,(也就是-231+1231之间),而短整型占16 bit(2 bytes)的空间,短整型可保存的数值范围在-32768+32767之间,(就是-215+1215之间)。 2.浮点数(REAL) 浮点数也有两种类型,单精度及双精度。单精度浮点数在个人计算机中占用32 bit(4 bytes)的空间,有效位数为6—7位。可记录的最大数值为±3.4*1038,最小数值为±1.18*10-38。双精度浮点数会占用64 bit(8 bytes)的空间,有效位数为15—16位。可记录的最大数值为±1.79*10308,最小数值为±2.23*10-308。 3.复数(COMPLEX)

计算机程序设计基础—FORTRAN

中南大学 本科生课程设计(实践)任务书、设计报告(计算机程序设计基础—FORTRAN) 题目线性病态方程组问题 学生姓名刘鑫 指导教师陈语林 学院土木工程学院 专业班级土建类1007班 学生学号1208100724 计算机基础教学实验中心 2011年7 月1日

一、任务内容 利用文件读写、数组、子程序、循环等内容解决线性病态方程组求解、求条件数问题,并绘制方程解的数据分布图。 二、系统开发设计思路 1、系统结构图 三、系统功能及系统详细设计 1、系统功能 通过调用子程序,能求出任意线性病态方程组的解以及系数矩阵的范数并绘出解的数据分布图 求解:全选主元高斯消去法,利用全选主元、归一化、消去、回代过程求出任意方程组的解。再结合矩阵求积子程序,利用循环提高解的精确度从而求出线性病态方程组的解。 求逆矩阵:利用高斯-约当法求逆矩阵。 绘图:利用QuickWin绘图,并设置背景颜色、绘图颜色、标注相应数据等。2、模块

求解 求逆矩阵高斯消去法 绘图:利用QinckWin 绘图 四、 遇到的问题与解决的方法 1、读写过程中无法将文件插入到主程序当中。 解决方法:在主程序当中进行文件操作,先产生文件后调用。 2、用高斯消去法求解得到的解误差很大 解决方法:设定一个EPS 作为精确度,再用三中的求解子程序求解。 3、在求解范数中输出的为7.48E+28 解决方法:请教老师后发现子程序中缺少定义导致相除是分母为0,后添加定义。 五、 总结 通过两周的计算机实践,我的计算机基础以及程序编写能力均有很大的提高,特别是对Fortran 这门语言有了更深的了解,使我在今后的学习生活中能更加熟练地使用这门实用的技术。 六、 参考文献 [1] 刘卫国,蔡旭辉.FORTRAN90程序设计教程.北京:京邮电大学出版社,2007 [2] 徐士良.FORTRAN 常用算法程序集.北京:清华大学出版社,1995

程序设计基础

程序设计基础 1 .简述常用计算机语言及其程序的执行方式? 答: (1 )机器语言,是由若干个0 和 1 ,按照一定的规则组成的代码串。用机器语言编写的程序叫做目标程序。计算机可直接识别目标程序。 (2 )汇编语言,它不能直接使硬件工作,必须用一套相应的语言处理程序去翻译为机器语言后,才能使硬件接受并执行。这种语言处理程序叫做汇编程序。 (3 )高级语言,它必须翻译成机器语言程序后,才能在计算机上运行。根据翻译方式的不同,高级语言源程序的翻译过程可分为解释方式和编译方式。 2 .算法和程序有什么相同之处,有什么不同之处? 答:算法是对解决问题步骤的描述。程序是用计算机语言编制的能完成特定的功能代码。相同:对问题的描述。不同:一个不可执行,一个可执行。 3 .什么叫时间复杂度? 答:时间复杂度:依据算法编制成程序后,在计算机上运行时所消耗的时间。 4 .什么叫空间复杂度? 答:空间复杂度:依据算法编制为程序后,在计算机中所占存贮空间的大小。 5 .什么是结构化程序设计的基本思想? 答:结构化程序设计的基本思想是采用“自顶向下,逐步求精”的程序设计方法和“单入口单出口”的控制结构。 6 .“编译程序”和“解释程序”,有什么区别? 答:编译是指将用高级语言编写好的程序( 又称源程序、源代码) ,经编译程序翻译,形成可由计算机执行的机器指令程序( 称为目标程序) 的过程。解释是将高级语言编写好的程序逐条解释,翻译成机器指令并执行的过程。 7 .程序设计的基本过程是什么? 答:基本过程是:问题描述、算法设计、代码编制以及调试运行。 8 .为什么需要程序的注释? 答:注释就是一种很好的文档,并不要求计算机理解它们,但可被读程序的人理解。注释记录程序设计的说明,保证程序的可读性。

空间桁架结构程序设计(Fortran)

空间桁架静力分析程序及算例1、变量及数组说明

2、空间桁架结构有限元分析程序源代码 !主程序(读入文件,调用总计算程序,输出结果) CHARACTER IDFUT*20,OUTFUT*20 WRITE(*,*) 'Input Data File name:' READ (*,*)IDFUT OPEN (11,FILE=IDFUT,STATUS='OLD') WRITE(*,*) 'Output File name:' READ (*,*)OUTFUT OPEN(12,FILE=OUTFUT,STATUS='UNKNOWN') WRITE(12,*)'*****************************************' WRITE(12,*)'* Program for Analysis of Space Trusses *' WRITE(12,*)'* School of Civil Engineering CSU *' WRITE(12,*)'* 2012.6.25 Designed By MuZhaoxiang *' WRITE(12,*)'*****************************************' WRITE(12,*)' ' WRITE(12,*)'*****************************************' WRITE(12,*)'*************The Input Data****************' WRITE(12,*)'*****************************************' WRITE(12,100) READ(11,*)NF,NP,NE,NM,NR,NCF,ND WRITE(12,110)NF,NP,NE,NM,NR,NCF,ND 100 FORMAT(6X,'The General Information'/2X,'NF',5X,'NP',5X,'NE',5X,'NM',5X,'NR',& 5X,'NCF',5X,'ND') 110 FORMAT(2X,I2,6I7) NPF=NF*NP NDF=ND*NF CALL ANALYSE(NF,NP,NE,NM,NR,NCF,ND,NPF,NDF) END !******************************************************************** !总计算程序

《程序设计语言(FORTRAN)》实验课程教学大纲

《程序设计语言(FORTRAN)》实验教学大纲 所属课程名称:程序设计语言(FORTRAN) 所属课程编号:20411807 课程总学时数:64(计划内)+16(计划外) 实验时数:32(计划内上机16、计划外上机16) 开设实验项目数:16 适用专业:给水排水工程、环境工程、土木工程、工程力学、无机非金属材料工程、应用化学等工科专业。 实验成绩占课程成绩比例:占平时成绩30%。 实验成绩评定方式: 根据专设的操作考核评定 根据专设的实验笔试评定 根据平时实验操作综合评定 其它评定方式:上机操作 √ 课程大纲对实验的要求、实验总目的: 实验要求:理解和掌握程序设计的基本原理、基本知识、基本概念和基本方法,掌握FORTRAN 90语言的词法、语法和语义规定,以及FORTRAN 90/95程序设计方法和技术,熟悉FORTRAN 90/95程序开发环境Developer Studio,能熟练设计和编写FORTRAN 90/95程序求解具体的实际问题。 实验目的:《程序设计语言(FORTRAN)》课是一门实践性很强的计算机技术基础课程,上机实验是本课程教学活动的重要组成部分和必要环节。通过上机实验,使学生进一步理解、消化、掌握FORTRAN 90/95程序设计的基本原理、基本知识、基本概念和基本方法,使学生深入了解和掌握计算机求解问题的一般过程,熟练掌握程序设计方法和技能,提高学生使用计算机分析问题和解决问题的能力,提高学生的计算机综合素质和创新能力。通过上机实验,使学生能熟练使用FORTRAN 90/95语言设计和编写计算机程序,为进一步使用计算机求解专业问题奠定坚实基础。 本课程实验项目

Fortran程序设计课后习题答案方便

第四章 main implicit none write(*,*) "Have a good time." write(*,*) "That's not bad." write(*,*) '"Mary" isn''t my name.' end program main real, parameter :: PI=3 implicit real radius write(*,*) " 请输入半径长" read(*,*) radius write(*,"(' 面积='f8. 3)") radius*radius*PI end program main implicit none real grades write(*,*) "请输入成绩" read(*,*) grades write(*,"(' 调整后成绩为 '") SQRT(grades)* end program a,b real ra,rb a=2 b=3 ra= rb= write(*,*) b/a ! 输出1, 因为使用整 数计算, 小数部分会无条件舍去 write(*,*) rb/ra ! 输出 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/ write(*,"'米 =''厘米 =''英寸')") d%meter, d%cm, d%inch end program 第五章 main implicit none integer money real tax write(*,*) "请输入 月收入" read(*,*) money if ( money<1000 ) then tax = else if ( money<5000) then tax = else tax = end if write(*,"(' 税 金为 'I8)") nint(money*tax) end program main implicit none integer day character(len=20) :: tv write(*,*)

相关文档
相关文档 最新文档