当前位置:文档之家› fortran95教程5章

fortran95教程5章

fortran95教程5章
fortran95教程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 里的整数?

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

1

1l

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

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

311

12k 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,而128382 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.

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

fortran95教程5章

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

《程序设计语言(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常用语法知识和基本使用规则。

Fortran95 简介-全文版

Fortran95简介-全文版 By陈鲸太FORTRAN的演进 FORTRAN的起源,要追溯到1954年IBM公司的一项计划。由JOHN BACKUS 领导的一个小组,尝试着在IBM 704计算机上面发展一套程序,它可以把使用接近数学语言的文字,翻译成机械语言。这个计划在刚开始并不被大家看好,但他们在1957年交出了成果,也就是第一套FORTRAN编译器,FORTRAN语言也就因此诞生了。FORTRAN语言的执行效率普遍的令各界满意,它证明了这项计划的可行性,也成为第一个被广泛使用的高级语言。FORTRAN的名字来自于英文的FORMULA TRANSLATOR这两个字,而这两个字恰是数学公式翻译器的意思。 旧版的FORTRAN77是在1978年由美国国家标准局(ANSI)所正式公布的,之后改版有1992年提出的FORTRAN90以及1997年的FORTRAN95,本文是为了FORTRAN 95所撰写。 编译器简介 1、VISUAL FORTRAN VISUAL FORTRAN一开始是起源于MICROSOFT的FORTRAN POWERSTATION 4.0,这套工具后来卖给DIGITAL公司来继续发展,下一个版本称为DIGITAL VISUAL FORTRAN 5.0,DIGITAL后来被COMPAQ合并,所以接下来的6.0及6.5版就称为COMPAQ VISUAL FORTRAN。而COMPAQ目前又跟HP合并,也许下一个版本会称为HP VISUAL FORTRAN。 VISUAL FORTRAN被整合在一个叫作MICROSOFT VISUAL STUDIO的图形接口开发环境中,VISUAL STUDIO提供一个统一的使用接口,这个接口包括文书编辑功能,PROJECT的管理、除错工具等等,所以在使用上其实跟上学期的VISUAL C++满类似的,同学们上课用过VISUAL C++,对 VISUAL FORTRAN应该不会陌生。 VISUAL FORTRAN 6.5除了完全支持FORTRAN 95的语法外,扩充功能方面提供完整的WINDOWS程序开发工具,专业版还内含IMSL数值链接库。 另外它还可以和VISUAL C++直接互相连结使用,也就是把FORTRAN和C 语言的程序代码混合编译成同一执行档案。 2、在工作站使用FORTRAN 学校计中工作站也提供FORTRAN COMPILER,使用方式很简单,只需要在存放FORTRAN档案的目录下面输入下面叙述即可:

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简介-全文版

Fortran95簡介-全文版 By陳鯨太FORTRAN的演進 FORTRAN的起源,要追溯到1954年IBM公司的一項計畫。由JOHN BACKUS 領導的一個小組,嘗試著在IBM 704電腦上面發展一套程式,它可以把使用接近數學語言的文字,翻譯成機械語言。這個計畫在剛開始並不被大家看好,但他們在1957年交出了成果,也就是第一套FORTRAN編譯器,FORTRAN語言也就因此誕生了。FORTRAN語言的執行效率普遍的令各界滿意,它證明了這項計畫的可行性,也成為第一個被廣泛使用的高階語言。FORTRAN的名字來自於英文的FORMULA TRANSLATOR這兩個字,而這兩個字恰是數學公式翻譯器的意思。 舊版的FORTRAN77是在1978年由美國國家標準局(ANSI)所正式公布的,之後改版有1992年提出的FORTRAN90以及1997年的FORTRAN95,本文是為了FORTRAN 95所撰寫。 編譯器簡介 1、VISUAL FORTRAN VISUAL FORTRAN一開始是起源於MICROSOFT的FORTRAN POWERSTATION 4.0,這套工具後來賣給DIGITAL公司來繼續發展,下一個版本稱為DIGITAL VISUAL FORTRAN 5.0,DIGITAL後來被COMPAQ合併,所以接下來的6.0及6.5版就稱為COMPAQ VISUAL FORTRAN。而COMPAQ目前又跟HP合併,也許下一個版本會稱為HP VISUAL FORTRAN。 VISUAL FORTRAN被整合在一個叫作MICROSOFT VISUAL STUDIO的圖形介面開發環境中,VISUAL STUDIO提供一個統一的使用介面,這個介面包括文書編輯功能,PROJECT的管理、除錯工具等等,所以在使用上其實跟上學期的VISUAL C++滿類似的,同學們上課用過VISUAL C++,對VISUAL FORTRAN應該不會陌生。 VISUAL FORTRAN 6.5除了完全支援FORTRAN 95的語法外,擴充功能方面提供完整的WINDOWS程式開發工具,專業版還內含IMSL數值程式庫。另外它還可以和VISUAL C++直接互相連結使用,也就是把FORTRAN和C語言的程式碼混合編譯成同一執行檔案。 2、在工作站使用FORTRAN 學校計中工作站也提供FORTRAN COMPILER,使用方式很簡單,只需要在存放FORTRAN檔案的目錄下面輸入下面敘述即可: ccsun33 [u8623033/fortran]% f77 filename.for

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标准的编译

FORTRAN 95 语法速查

FORTRAN 95 语法速查 ----------白云、李学哲、陈国新、贾波编著《FORTRAN95程序设计》读书笔记 目录:一、应用程序的创建与运行/FORTRAN 95所用的字符/ 变量类型及其声明,常量声明/表达式与运算符 二、输入与输出:表控、有格式 三、选择语句与结构:IF语句、CASE结构 四、DO循环结构 五、数组:数组的声明,数组的引用,数组的算术运算,数组的输入、输出,给数组赋初值, 动态数组,WHERE、FORALL语句 六、子程序:语句函数,内部子程序,调用子程序时的虚实结合:形参为数组、非定界数组、子 程序名、星号,递归子程序,外部子程序,纯子程序,逐元子程序 七、派生数据类型与结构体 八、指针与动态链表 九、文件:存取方式,基本操作语句,各类文件的读写操作 十、接口、模块 十一、公用区、存储关联、数据块子程序 十二、绘图:坐标系、设置图形颜色、创建图形程序/ 常用过程:设置线型、绘一像素点、设置当前位置、绘直线、绘弧线、绘矩形、绘多边形、绘制扇形(圆、椭圆)/ 文字信息的显示 附/录:标准函数与标准子例行程序 一、基础部份 1-1 FORTRAN 95 应用程序的创建与运行 创建或运行FORTRAN 95程序必须在Microsoft Developer Studio平台上进行。尽管程序文本及相关文件的编辑可以在任一文本编辑器上进行,然后再拷到Studio的文档窗口中。但最好还是一开始就进入Studio环境。创建FORTRAN 95 程序的步骤大致如下: 1)启动Microsoft Developer Studio 可以通过不同方式运行dfdev.exe程序以启动Microsoft Developer Studio [开始] \ Compaq Visual Fortran 6 \ Developer Studio \ dfdev.exe:或 ……\CVF66 \https://www.doczj.com/doc/015352214.html,\MSDEV98\dfdev.exe Microsoft Developer Studio的界面如下图所示: 文档窗口 工作空间窗口 输出窗口

fortran安装

Intel Visual Fortran 2013 sp1 完整版下载及安装教程(windows) 10月16日版:更新支持win8.1、VS2013下载地址 【完整安装包】https://www.doczj.com/doc/015352214.html,/akdlm/irc_nas/3651/w_fcompxe_ novsshell_2013_sp1.1.139.exe 【联网安装包】https://www.doczj.com/doc/015352214.html,/akdlm/irc_nas/3651/w_fcompxe_ novsshell_online_2013_sp1.1.139.exe 【百度云副本】https://www.doczj.com/doc/015352214.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.doczj.com/doc/015352214.html,/en-us/articles/intel-composer-xe-2013-compilers-sp1-fixes-list --https://www.doczj.com/doc/015352214.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.doczj.com/doc/015352214.html,/。 微软旗下的DreamPark计划为在校大学生免费提供VS2013Pro版,地址:https://https://www.doczj.com/doc/015352214.html, 2、安装过程中没有加以说明的步骤,请直接点击下一步。

fortran课后习题答案

第一章 FORTRAN程序设计基础第15页 1、2 1.简述程序设计的步骤。 “程序设计”:反映了利用计算机解决问题的全过程,通常要经过以下四个基本步骤:(1)分析问题,确定数学模型或方法;(2)设计算法,画出流程图;(3)选择编程工具,编写程序;(4)调试程序,分析输出结果。 2. 什么是算法?它有何特征?如何描述算法? 解决问题的方法和步骤称为算法。 算法的五个特征:(1) 有穷性。 (2) 确定性。 (3) 有效性。 (4) 要有数据输入。(5) 要有结果输出。 算法的描述有许多方法,常用的有:自然语言、一般流程图、N-S图等。 第二章顺序结构程序设计 第29页 1、2、3、4、5、6、7、8、9 1.简述符号常量与变量的区别? 符号常量在程序运行过程中其值不能改变。变量在程序运行过程中其值可以改变。 2. 下列符号中为合法的FORTRAN 90标识符的有哪些? (1) A123B (2) M%10 (3) X_C2 (4) 5YZ (5) X+Y (6) F(X) (7) COS(X) (8) A.2 (9) ‘A’ONE (10) U.S.S.R. (11) min*2 (12) PRINT 3. 下列数据中哪一些是合法的FORTRAN常量? (1) 9,87 (2) .0 (3) 25.82(4) -356231 (5) 3.57*E2 (6) 3.57E2.1 (7) 3.57E+2(8) 3,57E-2 4. 已知A=2,B=3,C=5(REAL);且I=2,J=3(INTEGER),求下列表达式的值: (1) A*B+C 表达式的值: 11 (2) A*(B+C) 表达式的值: 16 (3) B/C*A 表达式的值: 1.2 (4) B/(C*A) 表达式的值: 0.3 (5) A/I/J 表达式的值: 0.33 (6) I/J/A 表达式的值: 0 (7) A*B**I/A**J*2 表达式的值: 4.5 (8) C+(B/A)**3/B*2. 表达式的值: 7.25 (9) A**B**I 表达式的值: 512 5. 将下列数学表达式写成相应的FORTRAN表达式: (1) 1E-2 (2)(-B+SQRT(B*B-4*A*C)/(2*A) (3) 1+X+X*X/2+X**3/2/3 (4) COS(ATAN((A**3+B**3)**(1.0/3)/(C*C+1))) (5) EXP(A*X**2+B*X+C) (6) COS(X*Y/SQRT(X*X+Y*Y))**3 6. 用FORTRAN语句完成下列操作: (1) 将变量I的值增加1。I=I+1 (2) I的立方加上J,并将结果保存到I中。 I=I**3+J (3) 将E和F中大者存储到G中。G=Max(E,F) (4) 将两位自然数N的个位与十位互换,得到一个新的数存储到M中(不考虑个位为0的情况) M=MOD(N,10)*10+N/10 第三章选择结构程序设计第43页 1、2、3、5、6、7、9 1.分析下列程序运行结果 (1) LOGICAL P INTEGER I,I1,I2,I3 P=.FALSE. READ*,I I1=MOD(I,10) I2=MOD(I/10,10) I3=I/100

fortran习题参考答案

工程分析程序设计上机作业(五) 模块化编程 上机目的:掌握内部例程、主程序、外部例程、模块等功能的使用方法。 1、有一个六边形,求其面积。为求面积,作了3条辅助线。如图所示:(提示,三角形面 积 2 a b c s ++ =,a、b、c为三个边长)。要求用内部函 数来计算每个三角形的面积。 =21 program main implicit none real :: A(9)=(/10,30,16,13,21,14,20,36,28/) integer i real s s=area(A(3),A(4),A(7))+area(A(2),A(7),A(8))+ & area(A(1),A(8),A(9))+area(A(5),A(6),A(9)) print*,'The area is',s contains function area(x,y,z) implicit none real x,y,z real p,area p=(x+y+z)/2 area=sqrt(p*(p-x)*(p-y)*(p-z))

end function end 2、编写一个子例程子程序,SUM(S,T,N1,N2)。把整型数N1到N2进行求和,并把求 和的结果放置到S,把整型数N1到N2进行求积,并把求积的结果放置到T。并用这个子程序来计算: y=++++++++++- (1234)(345678)(3*4*5*6)(1*2*3) program main implicit none integer A(8) integer i,b,c,d,e,f,g,m,n,y b=0;d=0;g=1;n=1 do i=1,8 A(i)=i end do call sum(b,c,1,4) call sum(d,e,3,8) call sum(f,g,3,6) call sum(m,n,1,3) y=b+d+g-n print*,'y=(1+2+3+4)+(3+4+5+6+7+8)+(3*4*5*6)-(1*2*3)=',y contains subroutine sum(s,t,N1,N2) integer s,t,N1,N2,i do i=N1,N2 s=s+A(i) t=t*A(i) end do end subroutine end 3、编写函数子程序GDC求两个数的最大公约数。求最大公约数的算法如下:把两个数中 大的那个数作为被除数,两数相除得到一个余数。把余数去除除数得到新一轮的余数。 不断重复这一过程直到余数为0,这时的除数就是两个数的最大公约数。

Fortran 95内在过程

附录B Fortran 95内在过程 FORTRAN 95标准提供了115个内在过程,其中包括109个内在函数和6个内在子例行子程序。很多编译系统还提供额外的内在过程。 按照形式,内在过程分为如下两类:通用过程;专用过程。 所谓通用过程是一个集合名称,通用过程与专用过程是一个集合与其元素的关系。一个通用过程由两个或多个专用过程组成。 在所有的115个内在过程当中,除了如下4个内在函数外,其他都是通用过程:LGE、LGT、LLE和LLT。 专用过程针对具体类型与种别的变量。例如,求一个变量的绝对值的通用过程为ABS(X),而求一个整型变量的绝对值的专用过程为IABS(X),求一个复型变量的绝对值的专用过程为CABS(X),如此等等。所以,每个通用过程属下的专用过程都必定具有相应的类型,种别,甚至维的属性。这些专用过程的名称的主要用途是作为实元来传递,这时就必须使用专用过程名称。注意,在表中注明了少数专用过程不能作为实元。 按照功能,FORTRAN 95的内在过程主要分为如下5类:查询与数字操作函数;转换,置空以及传递函数;计算函数;数组函数;内在子例行程序。 如果从功能的角度来对内在过程分类,那么除了上面的比较具体的5类之外,还可以从内在过程对数组的作用方式的角度,把内在过程分为两大类:逐元过程和变换过程。 所谓逐元过程,就是从数学的观点来看,这些专用过程的计算对象并不是数组,但是可以运用一种自然的方式使得这专用过程能够作用于数组对象,并且得到相同形状的数组结果。也就是使得该过程分别作用于数组的每个元素,把所有的过程结果再集合起来作为结果数组。内在过程当中的大部分都属于逐元过程,包括:转换函数;计算函数(除了REPEA T,TRIM,DOT_PRODUCT,MA TMUL之外);子例行程序MVBITS。其他的所有内在过程就都不是逐元过程了。 所谓变换过程,就是内在过程里面逐元过程之外的所有过程都称为变换过程,因为从它们的定义的实质上看,就是作用于一个数组数据对象,得到一个标量或者数组结果,也就是一个变换的过程,而不是单独地作用于每个元素。因此除了函数NULL之外,所有的变换过程或者是具有一个取数组值的哑元,或者是具有一个取数组值的实元,它们对数组的作用都是某种整体变换作用。例如对于向量的乘积,就不能逐个元素地进行。 内在过程的引用正如一般过程的引用一样,可以使用关键词变量。由于某些内在过程的变量是可选项,因此使用关键词能够省略相应的实元。 常见的关键词哑元名称含义如下: ● DIM:DIM主要用于数组简化函数以及其他一些数组函数,表示在函数的作用对象不是整个数组的情况下,数组的哪个维被过程作用。DIM取值为标量整型值,并且常常是可选变量。 ●KIND:KIND一般用于转换函数,说明转换结果的种别参数。KIND实元必须是一个标量整型初始化表达式,一般是可选的。 ●BACK:BACK作为一个可选的逻辑型变量用来表示逆序过程,即它所出现的内在过程的对于数据对象的反方向操作。例如,如果在内在过程INDEX当中出现了BACK=.TRUE.,那么INDEX的搜索操作就必须与正常方向相反,即从字符串的右端开始。 注意内在函数的非指针哑元都具有INTENT(IN)的属性,而指针哑元则不能改变其关联的实元或目标。

Fortran作业2

FORTRAN第二次实习作业 2014301610307 -D-马莉1 、根据最新个人所得税计算方法,如下面的个税税率表。工资、薪金所得,适用七级超额累进税率,税率为百分之三(3% )至百分之四十五(45% )。3500 元为起征点,即只需要缴纳高于3500 元部分的个税。请根据下表编程,通过给定个人收入,计算其所需邀纳的个税。 program jiaoshui implicit none integer m real n character i 100 print*,'应缴纳所得税是否含税,请回答Y或N:' read*,i print*,'请输入工资所得:' read *,m if(i=='Y')then select case(m) case(0:1500) n=m*3/100-0 case(1501:4500) n=m*10/100-105 case(4501:9000) n=m*20/100-555 case(9001:35000) n=m*25/100-1005 case(35001:55000) n=m*30/100-2775 case(55001:80000) n=m*35/100-5505 case default n=m*45/100-13505 end select elseif(i==’N’)then select case(m)

case(0:1455) n=m*3/100-0 case(1456:4155) n=m*10/100-105 case(4156:7755) n=m*20/100-555 case(7756:27255) n=m*25/100-1005 case(27256:41255) n=m*30/100-2775 case(41256:57505) n=m*35/100-5505 case default n=m*45/100-13505 end select else print*,"输入格式不正确,请重新输入:" goto 100 endif print*,n End 2、编写程序求某天在当年中是第多少天,例如2010 年1 月10 号是2010 年的第10 天。要求分别使用IF 、CASE结构来编写。program tianshu2 implicit none integer M1(12),i,y,m,d,sum,n data M1/31,28,31,30,31,30,31,31,30,31,30,31/ sum=0 100 print *,"请输入日期格式例如:2010 10 23" read 10,y,m,d 10 format(i4,1x,i2,1x,i2) if(m>12.or.d>31)then

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 95学习笔记

Fortran 95 变量名称的取名策略:变量的名字中可以使用的字符集包括英文的26个字母、0~9这10个数字以及下划线“_”,不过前缀必须是英文字母。变量名称的长度限制随着各家编译器的不同而不同,Fortran 标准规定最少要支持到6个字符,Fortran90则最少要支持到31个字符 Implicit Fortran 标准中有一项不太好的功能,它的变量不一定要经过程序声明才能使用,编译器会根据变量的第一个字母来自东决定这个变量的类型。第一个字母为I、J、K、L、M、N的变量会被视为整数类型,其他的变量则会被当成浮点数来使用。 Implicit命令的功能是用来设置“默认类型”。所谓的默认类型,是指Fortran不经过声明,由第一个字母来决定变量类型。可以经过Implicit描述来决定哪些字母开头的变量会自动使用某种类型 Implicit integer (A,B,C) !A、B、C开头的都被视为整型数 Implicit integer(A-F,I,K) !A到F及I、K开头的变量都视为整型数 Implicit real(M-P) !M到P开头的变量都视为浮点数 Implicit none !关闭默认类型功能,所有变量都要事先声明 常数的声明方法(Parameter) Program ex Implicit none Real ::pi Parameter(pi = 3.14129) Write(*,”(F4.2)”) sin(pi/6) end 在Fortran90里,Parameter可以作为形容词,和变量的声明同时写在一起 Real, parameter ::pi=3.14159 !这里pi前面的冒号不能省,和上面代码不同(上面的可以省略)设置变量的初值 变量内容并不一定要在程序执行时才设置,可以在声明时同时给予初值。在Fortran90偶那个,在设置变量初值时,直接把数值写在声明的变量后面就行了。使用这个方法来设置初值是,不能省略声明中间的那两个冒号(Fortran90) 在fortran77中则要使用Data命令设置初值 Fortran 90 Fortran 77 program ex90 implicit none integer ::a=1 real ::b=2.0 complex ::c=(1.0,2.0) character (len=20) ::str="Hello Acuzio!" write (*,*) a,b,c,str end program ex77 implicit none integer a real b

相关主题
文本预览
相关文档 最新文档