华科fortran第3章2 Fortran语言程序设计初步.ppt_第1页
华科fortran第3章2 Fortran语言程序设计初步.ppt_第2页
华科fortran第3章2 Fortran语言程序设计初步.ppt_第3页
华科fortran第3章2 Fortran语言程序设计初步.ppt_第4页
华科fortran第3章2 Fortran语言程序设计初步.ppt_第5页
已阅读5页,还剩133页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

3.4 FORTRAN 字符集 3.5 常量 3.6 变量 3.7 内部函数 3.8 算术表达式 3.9 赋值语句 3.10简单的输出语句(表控输出) 3.11简单的输入语句(表控输入) 3.12 PARAMETER语句(参数说明) 3.13 PROGRAM语句,END语句,STOP语句,PAUSE语句,不是任何一种外文字母或数字符号都能被某一计算机语言接受。每一种计算机的高级语言分别规定了它允许使用的字符。 Fortran允许使用的字符如下: 英文字母 :A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 阿拉伯数字 :0 1 2 3 4 5 6 7 8 9 特殊符号 :空格 = + - * / ( ) , . : “ ! % $ ? _ (F90中新增的字符),3.4 FORTRAN 字符集,表3-1基本的FORTRAN 90/95字符集,基本字符分为两大类:文字字符和特殊字符。除了货币符号可以本地化之外,其他任何字符都必须依照表里的形式。,注意: 一. 文字字符的用处 主要是命名的作用,可以用来命名语言中的一切对象,这三种符号可以混合使用; 其中数字还具有它本来的含义,就是表示数目。 二. 特殊字符的用处 特殊字符主要具有功能的意义,如编辑功能,运算功能,语法功能等。 FORTRAN 90/95标准原则上接受小写字母。因此除了以下位置,大小写是等价的。 三.大小写必须区分的位置 作为字符常量的字符串里面; 输入输出的纪录里面; 作为编辑描述符的引号或撇号里面。,四. CVF编译平台接受小写字母。 在OPEN或者INQUIRE语句里面的FILE=或NAME=后面是否区分大小写,也是由编译平台指定的。 五.如果是需要调用其他语言写的子程序, 而恰好该种语言(例如C语言)是区分大小写的,这时就需要特别小心。,【例3_1】 如果用C写了两个子程序EIGEN和eigen,然后有如下的FROTRAN片断: EXTERNAL EIGEN . CALL EIGEN . END,这时它是该引用EIGEN还是eigen呢?如果所使用的FROTRAN系统正好是怪异的那种,没问题。如果是常见的如CVF,这时它就无法区分EIGEN和eigen,这样就必须给它们更换名称了。,六.数字的涵义: 除了以下情形,数字总是表示十进位数字 属于二进制,八进制,十六进制的字面常量; 带有B,O,Z编辑描述符的输入输出纪录。,【例3_2】 以下语句当中的数字不是属于十进位数字: DATA I, J, K / O1001, 23.54, Z5CA2 /,其中第一个为八进制数,第二个为十进制数,第三个为十六进制数。,七.下划线的涵义: 下划线的主要作用就是置于单词之间代替空格,使得我们在命名时使用清楚的英语词汇。 下划线不能置于任意名称的前面,但是可以置于名称的最后。 下划线也用于在字面常量中区隔常量的值和种别参数。 无论给什么对象起名,都尽量使用完整的英语单词,同时使用下划线以区隔不同的单词。所谓好记性不如烂笔头,只有这样才能切实保证你在任何时候,在程序代码的任意位置都知道任意变量等的含义。,与平台有关的FORTRAN辅助字符集 基本字符集是在一切FROTRAN的编译平台都可以使用的,被FORTRAN 95标准规定为必须使用的默认字符集。另外还有些辅助的字符则是不同的平台有不同的用法约定。 辅助字符分两类:可打印字符和不可打印字符。 可打印字符; 各种本地化语言的字符,象汉字,希腊字母等,都可以应用在字符串,注释,和输入输出纪录当中。, 不可打印字符。 主要就是控制字符,例如制表符Tab键。 制表符(Tab键) 对于一个FORTRAN77标准的编译系统来说,在固定源程序形式里的Tab被看成是至少6个空格,而在自由源程序形式里的Tab被看成1个空格。这样如果Tab被放在文本当中用于输出格式控制,那么这种默认的转换方式,有时就会导致输出格式的混乱。 有关FORTRAN 95的辅助字符集的使用规则,请参考具体的编译系统的说明。,所谓FORTRAN的词汇就是一个语句的最小的意义单位,它由一个或多个FORTRAN字符集里的字符组成。包括两类共6种,分类例举如下:,3.5 词汇, 由文字字符组成的词汇,包括4种: 语句关键词 名称 由单个词汇组成的字面常量 标识符, 由特殊字符组成 算符: +,.OR. 定界符:逗号,=,=,:,:,;,%。,1.语句关键词, 标志语句本身 【例3-3】下面的DO语句中的关键词DO本身标志了该语句 DO I=1,500, 标志选项。 【例3-4】下面的INTENT语句当中的IN,OUT,或INOUT。 INTENT(IN),A。B INTENT(INOUT),X,Y,Z, 用在语句当中,起分界的作用。 【例3-5】 如下面DO语句当中的WHILE DO WHILE( .NOT. VECTOR ),并非所有的语句都必须包含关键词,在FORTRAN里面,赋值语句和函数都不需要关键词。,在一个程序当中,任何对象都需要有一个名称,给它们命名所得到的词汇,可以说就是一般语言里的名词,这样的对象包括:变量,命名常量,程序单元,过程,公用块,构造,派生类型,哑元等。,2.名称,名称的拼写规则为: 名称必须由字母开头,可以由文字字符混合组成,而下划线不能作为名称的第一个字符。 一个名称至多允许含有31个字符。,一个常量就是对一个值的合乎语法的字符标记。 常量分为字面常量和命名常量两种: 一个值如果没有在程序里面经过命名,则称为字面常量,这种常量不能取派生数据类型。 【例4-6】 66953 Z5120A 2.3417 .TRUE. (33.2, 5.0),3. 常量, 一个值如果在程序里面经过命名,则称为命名常量,这种常量能取派生数据类型。,【例3-7】 在如下声明语句当中的常量UNSTABLE_POINT为命名常量: PARAMETER (UNSTABLE_POINT= 5.332) 对于常量的语义,将在说明数据时进一步讨论。,在一个程序单元内部,对任何一条语句,都可以在该语句的前面加上语句标签,以便在该程序单元内部的任何其他位置引用该语句。需要引用其他语句的语句包括CALL语句,DO结构,分支语句,输入输出语句等。,4. 语句标签,语句标签的书写规则为: 语句标签由1到5个十进制数字组成,其中必须至少有一个数字不能是0,例如000不能作为标识符; 标识符以0开头是没有任何意义的,例如0034与34没有区别。 标识符不能放置于空语句之前。,算符用在表达式当中,通过运算而获得某种类型的值。 算符分为固有算符和自定义算符两类: 固有算符 在FORTRAN 95语法当中,R310规定了固有算符的构成法则。 【例4-9】 /表示字符串的连接 + 表示对数值的加法 .NOT. 表示逻辑否 .OR. 表示逻辑或,5. 算符,6. 定界符 全部的定界符有如下12种形式: / ( ) (/ /) , = = : : ; % 其中(和),(/和/)都必须成对出现 顾名思义,这些定界符的功能就是在一个连续的源码文本当中,用来把不同性质的源码成分区分开。它们的具体含义将在具体的语句当中说明。,数据表示的实现具有一个重要的参数,即存储空间,所以当问题要求的数据,不能满足于默认的存储空间的时候,这时,就需要进一步给出数据的种别参数,这是更加详细的数据描述。 如果在真实世界问题当中出现的的数据对象,不符合已有的固有数据类型以及数组的定义,这时就需要根据用户的要求构造一个依赖于问题的特定的数据结构,这就是数据描述时会遇到的三种情况。 对于这三种情况,FORTRAN的解决方式如下:, 数据的性质 (数据的类型以及其他属性),3.6 常量与变量,第一种情况: 确定(固有)数据的类型以及相应的可能具有的属性。 FORTRAN所能辨识的数据类型首先分为两大类: 固有数据类型 派生数据类型, 所谓固有类型,是FORTRAN语言所定义的最基本的数据类型,每一种固有类型是和该种数据类型相应的各种运算一起隐式定义的,也就是说一旦声明引入某种固有数据类型,则系统总是默认为对它进行相应的运算是合法的,并且总是可访问的。,固有类型包括五种: 整型(INTEGER)、实型(REAL)、复型(COMPLEX)、逻辑型(LOGICAL)和字符型(CHARACTER)。, 所谓派生类型是由用户定义的,非隐式定义的类型,只要用一个类型定义来声明其成员是何种固有类型,或者是何种其它已经定义过的派生类型,就能够被FORTRAN认可为一种数据类型。 由于派生数据类型正是由固有数据类型充当成员而构成的,因此在结构关系上,可以把固有数据类型看成原子,而把派生数据类型看成分子。 派生类型数据最重要的用途就是扩充了数组这种重要的数据结构。,每一种固有数据类型的存储模式: 在FORTRAN77中: 整型,实型,逻辑型数据都是使用了一个数值存储单元,复型和双精度数据则使用了两个数值存储单元, 字符型数据使用一个字符存储单元。 在FORTRAN90与95中: 默认在FORTRAN77中的规定, 在FORTRAN90之后的标准里,开始允许在一个程序单元内,由用户定义特定的不依赖于固有数据存储模式的数据类型,这就是派生数据类型。,第二种情况: 指定固有数据类型的种别参数。 用来指定程序当中需要使用的每一种固有数据类型所要求占据的内存空间大小的属性由种别参数表示。给这个变量(参数)指定一个数值,就可以说明数据所需要的存储空间的大小,也就是程序允许的数值数据的位数和字符串的字符数目。 KIND(种类种别参数)分别说明整数类型的十进制指数范围,实数类型和复数类型的十进制精度和指数范围,字符类型和逻辑类型的表示方法。 LEN(长度种别参数)对字符类型规定了字符的个数。,【例】 REAL(KIND2):ABC,X,LONG CHARACTER(LEN40,KINDGREECE):NAME, 如果没有声明数据的种别,那么程序就会采用默认的参数,FORTRAN的早期版本没有引入种别参数,直接采用了两种不同的数据类型: REAL和DOUBLE PRECISION FORTRAN90以来的版本里,引入种别参数,对种别参数的不同取值,就足够表达不同的精度,, 对于在指定种别参数的数值时,一般是以字或字节为单位,这样对于字长不同的机器而言,相互之间就会出现程序移植的困难,下面分情况予以说明:, 实型-由于DOUBLE PRECISION是属于老式标准的遗留物,因此使用DOUBLE PRECISION作为数据声明的程序就不具备良好的可移植性,因为所谓双精度是针对具体的机器的字长而言的,对于32位的机器,双精度就是64位,而对于64位机器,双精度就意味着128位,这样在不同字长的机器环境里,双精度就具有不同的位数,使得程序无法在不同字长的平台之间进行直接的移植。 最好统一使用REAL的种别参数来表达算法所要求的实数精度。, 整型-在程序应用当中会出现几乎任何大小的整型数据,因此无法在语言标准里面统一的规定整型数据的存储空间大小,这就同样需要依靠种别参数来指定应该给具体问题当中的整型数据确定多大的存储空间。具体地指定方式属于编译器设计者的选择,需要参考相应编译器的语言说明。, 复型-由于所谓复型本质上就是由两个实数表达的,因此按道理复型同样应该能够具有表达多种精度的能力,而实际上早期的版本在这方面是有欠缺的,不过随着FORTRAN90引入种别参数,就可以在COMPLEX的声明语句里通过运用种别参数来实现多种精度的表达,对于任何FORTRAN的实现,至少能表达两种精度,而一般来说是多于两种的。 字符型-对于字符,一般的机器都是用单字节8bits来表示一个字符,这样就可以总共表示28=256个不同的字符,这对于任何以字母写出来的语言都是足够的了,不过对于汉语,日语这样一些语言就不够用了,一般得需要双字节,即16bits,这样就可以表达216个字符。因此字符型数据同样需要附加种别参数,以便除了使用默认的基本字符之外,还可以使用辅助字符集里的字符,从而实现程序的本地化。不过某个具体的编译器是否支持双字节字符,必须参考相应的手册。, 逻辑型-由于一切逻辑型数据都只有两个值,因此如何确定逻辑型数据的存储空间应该是非常好办的,不过不幸的是,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。,数据不同种类的存储模式 对于计算机来说,数据分类的第一个反应就是针对不同类型的数据约定不同的存储模式。 由于存储模式的规定涉及到编译环境的设置,因此存储模式的约定是与系统环境相关的,鉴于Compaq Visual Fortran的广泛应用,本节特别针对Compaq Visual Fortran系统而言的说明了数据的各种存储模式。 下表5-1列出了Compaq Visual Fortran所有的固有数据类型的存储空间要求,和相应的能够在这个空间里表达的数据规模。, 对于字符型数据来说,它的存储空间完全和字符串长度成正比,因此只要直接规定字符串的字符个数,就可以一致地得到其存储空间分配标准。 至于复型和派生类型,则完全以其他数据类型作为成员,自身没有什么特别的规定,因此也就没有独特的针对这两种数据类型的种别参数。 显然,FORTRAN通过运用种别参数来明确地规定数据的表示,使得Fortran的标准化程度得到了进一步提高,从而提高了程序的可移植性。, 数据的基本(固有)类型,对于计算机来说,数据的意义无非就是要知道在存储空间为一个特定的数据划出多大的空间来装载它。 FORTRAN早期的做法统一地给一类数据指定固定的存储模式。 FORTRAN90引进的种别参数,这样就扩充了固有数据类型的存储模式。,整型(INTEGER) 实型(REAL) 双精度型(DOUBLE PRECISION) 复型(COMPLEX) 逻辑型(LOGICAL) 字符型(CHARACTER),隐含说明IMPLICIT,固有数据类型:Fortran中有七种类型说明语句:,类型说明,1隐式类型描述法 当初FORTRAN使用隐式类型声明方法,是与语言的简朴形态相适应的除非首先声明了IMPLICIT语句。 隐式类型声明方法的约定,就是让名称的第一个字母来标记它的类型,隐含说明(I-N规则) I-N规则:若不加说明,以字母I,J,K,L,M,N六个字母开头的所有变量名,其变量类型为整型,以其他字母开头的为实型变量。 例如: I,J,IMAX,NUMBER,LINE,JOB Kl为整型变量 A,Bl,COUNT,AMOUNT,TOTAL 为实型变量 FORTRAN沿用了数学里的很多习惯,这里使用I,J,K,L,M,N来表述整数,就是一个明显的数学习惯。, 利用IMPLICIT语句来自定义字母分配模式,一般的 IMPLICIT语句的句法形式有2种,分别行使不同的功能: IMPLICIT type-specification(letter-specification-list) IMPLICIT NONE (f90) 其中的字母分配说明列表的句法形式为: letter-letter,例如: IMPLICIT INTEGER (A,C,T-V) IMPLICIT REAL (I,J) IMPLICIT INTEGER (A,B),REAL(I,K),INTEGER (X-Z),隐式类型的一般规则如下: 如果要使用IMPLICIT NONE语句,那么它必须放置在任何PARAMETER语句之前,并且在其作用域内,再也不能出现其他IMPLICIT语句。 IMPLICIT语句当中出现的表述字母范围的letter-letter,左边的字母绝对不能是右边字母的按照字母表顺序的后面的字母。 letter-letter的字母之间为减号,而非下划线,表示按照字母表顺序从左边字母到右边字母的所有字母。 在一个作用域里面的IMPLICIT语句里面,同一个字母不能出现在字母分配说明列表里面的不同项里,例如作为单个字母出现了,又同时处于另一个字母范围之中,或同时处于2个不同的字母范围里面。, IMPLICIT语句同样可以用来为派生数据类型分配首字母作为类型标记。 例如: IMPLICIT COMPLEX(E-G,W-Z), IMPLICIT NONE f90中每个变量名都应该在说明部分中说明其类型,不应该使用隐式说明、为了抑制隐式说明发生作用,应该在程序说明部分开始就写出语句:IMIPLlCIT NONE 既声明不使用隐式说明。,【例7-15】 下面的IMPLICIT语句都是合法语句: IMPLICIT CHARACTER*30(B,T),COMPLEX(W-Z) IMPLICIT LOGICAL(KIND=BIT)(Q) IMPLICIT REAL(QUAD)(X-Z) IMPLICIT TYPE(NUMBER)(A-E) IMPLICIT TYPE(ARTICAL)(A,V),CHARACTER*100(B),【例7-16】 下面的IMPLICIT语句都是非法语句: IMPLICIT CHARACTER*30(B,T),COMPLEX(Z -W) !W应该放置在Z 之前。 IMPLICIT LOGICAL(KIND=BIT)(Q),REAL(QUAD)(P-T) ! Q同时表示2种类型。 IMPLICIT TYPE(ARTICAL)(A-H),CHARACTER*100(B,Q) !B同时表示2种类型。 使用隐式类型声明在一个嵌套作用域里面所导致的变量作用域混乱问题在有关作用域之间通讯时再讨论。,注: (1) “IN规则”的隐含约定级别最低。 如下程序中IMAX变量为整型,而其它以I、J开头的 变量为实型: IMPLICIT REAL(I,J) INTEGER IMAX (2) 类型说明语句和IMPLICIT语句是非执行语句。 (3) 类型说明只在本程序单位内有效。 (4) IMPLICIT语句和类型说明语句应该出现在本程序单位中的所有执行语句之前,其中IMPLICIT语句又应在所有的类型说明语句之前。,a) 一般形式 类型说明(种别说明),属性说明表 : 变量名表=初值,2类型说明语句,F90程序中的数据都有三个特征:类型、种别、属性,由类型说明语句来定义说明,例:REAL(KIND=2), DIMENSION(1:10): X,Y 说明变量X,Y都是实型,种别是2,属性是一维数组。这样X、Y实际上是两个种别参数为2的一维实型数组,各具有10个元素。,在某些场合下,种别说明与属性说明可以省略,此时它的一般形式是最基本形式: 类型说明: 变量名表 (90/95) 类型说明 变量名表 (77),b) 类型说明 内部类型一共有五种,三种数值型: 整数型INTEGER 、实数型、复数型COMPLEX ; 两种非数值型: 逻辑型LOGICAL 、字符型CHARACTER 。,例: INTEGER: X,Y REAL: A,B COMPLEX: C,D,或:INTEGER X,Y REAL A,B COMPLEX C,D,c) 赋初值 F90中置初值不需要专门语句,只需在类型说明语句的变量表中,把要置的初值写在指定的变量名后即可。它的形式为: 类型说明: 变量名1=初值1,变量名2=初值2, 例如 REAL: X=1.1, Y=2.2, Z, W=4.4,注意:在过程中这种赋初值的方法实际上是对变量赋于了SAVE属性,即当过程被调用以后,变量的新值将被保存下来,过程再次被调用时变量的初值不再是类型说明语句中的初值,而是上次被保留下来的值。,例如,如果希望上面的变量X在过程每次被调用时都有相同的初值,则应该写成:,REAL, SAVE : X, Y=2.2, Z, W=4.4 X=1.1,d) DATA语句 在F77中,有一个专门给变量赋初值的说明语句,即DATA语句。它的一般形式为: DATA 变量名表1/初值表1/,变量名表2/初值表2/ 变量名表可以是隐DO循环,初值表中的常数之间须用逗号分开,重复的常数表值可以采用如下表示方法: 重复次数*常数值 在DATA语句中赋值的变量都有SAVE属性,除非变量名又出现在COMMON语句中,可以通过SAVE语句或类型说明中的SAVE属性对其显式说明。,例如,可以对数组作以下的初始化: DIMENSION A(10,10) DATA A/100*1.0/ ! 按数组变量名统一初始化 DATA A(1,1), A(10,1), A(3,3) /2*2.5, 2.0/ ! 按数组元素逐个初始化 DATA (A(I,J),I=1,5,2),J=1,5) /15*1.0/ ! 按隐DO循环初始化,对数值型数据作初始化: INTEGER n, order, list(100) REAL coef(4),eps(2),pi(5),x(5,5) COMPLEX*8 cstuff DATA n/0/, order/3/, list/100*0/ DATA coef/1.0,2*3.0,1.0/, eps(1)/.00001/ DATA pi/5*3.14159/ DATA (x(j,i),i=1,j),j=1,5)/15*1.0/ DATA cstuff/(-1.0,-1.0)/,a) 种别说明方法 种别是F90的新概念。一个数据,不仅有一个类型,并在同一类型下可分为若干种别,种别值确定了数据的大小范围和精度。有了种别说明后,程序更易于移植。 为了提高效率,节约内存,按照该变量表达的值范围与表达的精度范围,把同一类划分成几个种别,不同种别分配不同数目的内存单元。,3种别说明,种别由种别选择符说明,写在类型关键字后括号内,其关键字是KIND,后跟=号及种别值。其形式为: 类型说明(KIND=种别值) 例如:要说明变量X是实型,种别值是2 REAL(KIND=2): X,一个变量必有一个种别,如果变量的类型说明语句中没有种别说明符,如: REAL: X, Y 或 REAL X, Y 则表示变量X,Y的种别缺省,这时采用系统规定的标准值。,b) 种别值 Compaq Fortran 提供了如下几类种别值: 整数:有4种,种别值即为字节数n。,实型数:有3种。F90标准没有规定指数的允许范围和有效位数。,复型数:有3种。每种表示整型数据或实型数据的方法都可以用来表示复型数据的实部和虚部。注意简写与完整写法之间的差别。,逻辑型:有4种,字符型:有1种 CHARACTER(KIND=1) 字节型BYTE:取值为1个字节,等价于INTEGER(KIND=1)。,c) 种别函数 F90中关于种别选择的内部函数有: KIND(X): 函数KIND用于查询变量的种别,它返回X的种别值,当X取值为0时,返回标准种别值即缺省值。 如:KIND(0)返回值是整型的标准种别值 KIND(0.)返回值是实型的标准种别值 KIND(.FALSE.)返回值是逻辑型的标准种别值 KIND(“A”)返回字符型的标准种别值。,SELECTED_REAL_KIND(n,m): 该函数返回实型变量对所取的值范围和精度恰当的种别值。其中n是指明十进制有效位的位数,m指明值范围内以10为底的幂次。 例如: SELECTED_REAL_KIND(6,70)的返回值为8,表示一个能表达6位精度、值范围在10701070之间实型数的种别值为8。 如该机型上不能提供满足要求的种别值时,它的返回值是:-1(当精度位数达不到时),-2(当数值范围达不到时),-3(两者都达不到时)。 对给定的实型和复型量X,它的精度和范围可通过内部函数PRECISION(X)和RANGE(X)查出。,SELECTED_INT_KIND(m): 该函数返回整型变量对所取的值范围恰当的种别值。m指明值的范围是10m10m。,可以用SELECTED_REAL_KIND 或SELECTED_INT_KIND定义一个PARAMETER常数以备后用。,例如:下面的语句定义了有9位数的整型数。 INTEGER, PARAMETER : MY_INT_KIND = SELECTED_INT_KIND(9) INTEGER(MY_INT_KIND) : HILL,d) 常数种别 程序中的常数如要标明种别,方法有二。 若是数值型常数或逻辑型常数则用后辍法,即后加一下划线,再跟种别值。,注意: 当实数型数据的指数字母是D时,禁止说明种别值。 如果复型数据的实部和虚部都是整数,则它的精度和范围与缺省的实型相同。如果两部分都是实型,则它的精度和范围按如下的方法确定:两部分有相同的种别,为该种别,两部分中有不同的种别,则由较大的种别值确定。,例如: 21_2+7.6_4 表示整型种别为2的数21与实型种别为4的数7.6相加。 3.8E-5_4 0.87D-16 双精度数据禁止说明种别值 (4.7_8,5) 复型数据表示用括号,逗号分开前面的实部(种别值为8的实数)和后面的虚部(缺省种别值的整数)。 .FALSE._4 表示逻辑型,其常数值是假,种别值是4。,例: INTEGER,PARAMETER: LONG=SELECTED_REAL_KIND(9,99) REAL : A=2.8_LONG, B=1.23456789E60_LONG 来保证常数有需要的9位有效数字和-10-991099的指数范围。PRECISION(A)和RANGE(A)的返回值应是9和99。,若是字符型常数,则用前辍法,把种别值列在字符常数之前,其间用下划线连接。,例如:对Compaq Fortran 1_ 或: 1_计算数学 或:计算数学 字符串的字符不只限于Fortran字符集内,处理系统支持的图形符号也是允许的。,在FORTRAN语言标准里面,规定了十进制之外的三种进制形式:, 二进制常量形式: B digit digit B “ digit digit ” 其中的数字只能是0或1. 即二进制常量表示为以字母B开头,后跟用一对撇号或引号括起来的数字串,而且每个数字不是0就是l。,e)整数的其他进制, 八进制常量形式: O digit digit O “ digit digit ” 其中的数字只能是0到7. 八进制常量表示为以字母O开头,后跟用一对撇号或引号括起来的数字串,而且每个数字是0到7之间的一个数字。, 十六进制常量形式: Z digit digit Z “ digit digit ” 其中的数字只能是0到9,和A到F这五个字母,用来表示10到15. 十六进制常量表示为以字母z开头,后服用一对撇号或引号括起来的数字或字母的串,而且每个数字是数字0到9或字母A到F之一。,这里定义的二进制、八进制和十六进制的字面常量形式只能用于DATA语句中。,如果要在CVF系统里面使用非十进制来表示数值,除了属于FORTRAN标准的二进制,八进制,十六进制三种额外的进制形式之外,还可以使用如下的语法形式表示更多的进制形式: s base # nnn. 其中: base是从2到36的任意整数。这表明CVF可以使用从2进制一直到36进制来表示整数。 而如果base省略了,但是给出了符号#,那么表示后面的整型数据被看成16进制, 如果base 和#都被省略了,那么后面的整型数据就被看成默认的10进制。 s 数的符号,例: 下面的7个变量所赋予的整型数值都是表示十进制的3,994,575: I = 2#1111001111001111001111 m = 7#45644664 J = +8#17171717 K = #3CF3CF n = +17#2DE110 L = 3994575 index = 36#2DM8F,例: 这些都是正确的整型常量; 0 -112 +43212 62_2 1992110235764803_8 31_SHORT 9999999999999999999_LONG,例: 这些都是错误的整型常量: 9999999999999999999 !对于默认的种别参数来说,这个数太大了。 3.14 !不允许出现小数点。 32,767 !不允许出现逗号。 33_3 !3不是一个有定义的种别参数。,4属性说明 说明语句除说明对象的类型、种别外,还可说明对象的属性。每种属性说明都有专门的关键字,各属性关键字间用逗号分开,全部属性关键字写在说明语句种别说明符之后,双分隔号:之前,各属性关键字之间次序任意。属性不仅用于说明数据,还用于说明过程。 a) 属性 属性说明关键字有很多,将在有关章节中详细说明。一般来说,数据属性描述了一个对象是如何在程序中被应用的,可以使用一个或多个语句来规定某个数据对象的属性。Visual Fortran的数据属性如下表所示。,a) PARAMETER属性 PARAMETER属性也称常数名属性。被说明对象一旦附加了PARAMETER属性,就不再是变量名,而是一个常数的名字,它的形式虽与变量名形式一样,但在程序中不能改变值,只能当常数使用。,在F77中: PARAMETER参数语句 例:PARAMETER (LOCAL=100) 具体使用在后面张杰介绍,例如: INTEGER,PARAMETER : K=20 REAL(8),PARAMETER : PI=3.141592654, K_PAI=K*PI, Light_Speed=2.99654E10,b) DIMENSION属性 说明一个符号名是数组名,只要在说明语句中附加数组属性关键字。数组属性关键字是:DIMENSION(数组形状说明)。,例如: INTEGER(KIND=2),DIMENSION(-2:8) : X 说明了X是种别为2的整型一维数组名,数组下标以-2为下界,8为上界,共有11个元素。,注意:F77中不允许DIMENSION和类型说明语句出现在同一个语句中。,a) 逻辑型变量 类型说明语句一般形式为: LOGICAL(KIND=种别值),属性说明表: 变量名表=初始值 例如:LOGICAL(KIND=2),DIMENSION(1:10) : X 说明X数组内有元素X(1),X(2),X(10)都是种别值为2的逻辑型数据。 变量名表中要说明为逻辑型的对象可以是一般变量名、数组名、函数名、构造名等等,彼此用逗号分开,还可以对变量赋以初值。 例如要说明L1,L2是逻辑型变量,并且置L1初值为真,可写成: LOGICAL : L1=.TRUE.,L2 或 LOGICAL L1,L2,5 逻辑型数据,b) 逻辑赋值 逻辑变量取值的方法和数值型数据类似:赋初值、读入、使用逻辑赋值语句赋值。 逻辑赋值语句的一般形式是: 逻辑变量逻辑表达式 它通常用来将一个较长的表达式的值赋给一个逻辑型变量,而后作为条件写在IF语句或选择构造中,使条件变得简短明确。,例:输入实数x,求下面的函数值。 Program Sample implicit none real : x,y logical : in_side read *, x ; print *,x=,x in_side=x1and.x2. if(in_side) then y=x*x else y=1-x end if print *,y=,y End Program Sample,6字符型数据 a) 字符变量 字符常数的一般形式是由一对单引号 或一对双引号“”(90)限定的一串字符。字符串中的字符,允许是PORTRAN字符集的任意字符,如果系统还支持其它字符,例如汉字、希腊字、化学符号、数学符号,也可引入字符串内,用一对 或“”界定。 字符型数据除了有类型、种别外,比其它类型还多了一个长度特性,即规定它有几个字符数。其一般形式是: CHARACTER(LEN=整型字符长度表达式,KIND=种别值),属性说明 : 变量名表=初始值,或 CHARACTER *字符长度 变量名表 CHARACTER 变量名1*字符长度,变量名2*字符长度,,例如: CHARACTER(LEN=12,KIND=1) : A,B CHARACTER(KIND=1,LEN=12) : A,B CHARACTER(12,1) : A,B CHARACTER *12 : A,B CHARACTER *12 A,B 都是等价的,前者说明X、Y2是字符型变量,种别参数为3每个变量长度为12。后者说明表明长度为12,种别值为1。,例如: CHARACTER(LEN=*),PARAMETER : C_NAME=GIRL CHARACTER(LEN=*),PARAMETER : C_NAME=BOY 都是合法的说明语句,说明字符常量C_NAME,前者长度为4,后者长度为3。 CHARACTER后面说明的长度是其后所有实体名的公共长度,如果某一变量的长度与其它不同,可以在其变量名后标出自己的特有长度,方法是在变量名后写上*及长度。例加:CHARACTER(LEN=12) : A,B*5,C,D*7,E,长度也可以写成一个*号,表示长度暂不确定,待以后与程序中实际需要的长度相一致。,b) 字符子串 字符数据中某一部分相连的字符为字符子串,也可以作为一个实体与字符变量一样参加操作。 字符子串的一般形式是:V(e1:e2)。 V是字符型实体名,包括字符变量名、字符函数名、字符数组元素等等。 e1,e2是整型表达式或正整常数,e1的值指明子串在V中的起始列号,e2的值指明子串在V中的终止列号。如果e1省略,表示子串从第一个字符取起;e2省略,表示子串取到末尾;如e1,e2都省略,表示子串从头取到尾。,例如:设有字符变量A,其取值为ABCDE12345FGH, 则下面的子串取值为: A(3:11) - CDE12345F, A(I+4:9) - E1234(I=1),1234(I=2) A(:5) - ABCDE A(11:) - FGH A(:) - ABCDE12345FGH A(3:3) - C,c) 字符操作与赋值 字符操作符只有一个,称并置符,为两相连的斜杠“/”,其功能是把前后两个字符串拼连在一起。 例如:AB/CDE的值为ABCDE。 C/ABC/A(2:6)/B(1:4)/D是把几个字符串连在一起。,字符赋值语句的一般形式: 字符变量字符表达式 在字符赋值语句中,要求两边种别值一致,此外还有长度问题。当两边长度不等时,赋值时以左边的字符变量说明长度为准,当右边小于左边时,尾部补空格,否则将右边尾部的多余部分截去。,对字符串作初始化: CHARACTER (LEN=10) name CHARACTER BELL, TAB, LF, FF, STARS*6 CHARACTER*8 help DATA name,STARS /Zhang Fei,*/ DATA BELL,TAB,LF,FF /7,9,10,12/ ! 对ACSII控制字符码赋于值 DATA help(1:4),help(5:8) /2*HELP/ ! 对字符子串分段赋值,d) 字符比较 在书写FORTRAN语句时,大小写字母是等价的,但当进行字符操作和字符比较时必须看成是不同的。字符作比较实际上是比较它们的ASCII码代码大小。 字符比较的一般形式: 字符表达式关系操作符字符表达式 例如:A=(XY/C2)/C3 当C1、C2、C3是字符型变量名时是合法的,要先计算两端字符表达式的值,而后比较它们是否满足关系。比较的方法随关系操作符而异:, 、关系操作符 只要两边表达式第一个字符不等就可求得关系表达式的值。如:ABCCDE,因第一个字符AABC,因在ASCII码中1的序号为49,空格的序号为32。故上述关系表达式的值为真。, 、 /=关系操作符 先作第一位比较,如不等,关系表达式值为假,如相等,再比较第二位,一直比较到最后一位都相等(不足添空格),才能得出关系表达式值为真,否则值都为假。 如作不等/=比较,只要有一位不等就可得出表达式的值为真,否则一直比较到末位。 设有字符型变量名为NAME,其值为Einstein,则关系表达式: NAME=Einstein - 真 NAME=Ein/stein - 真 NAME/=Ein/Stein - 真 NAME=EINSTEIN - 假,e) 字符函数 F90的内部函数中有许多与字符型操作有关的函数供用户使用,可以很方便地进行各种文本编辑。 字符与数值相互转换的函数:ICHAR,CHAR,IACHR,ACHAR,函数ICHAR的功能是把字符型转换成数值,引用方式是: ICHAR(字符实体) 这里自变量的字符实体不一定是单个字符,也可以是字符变量、字符子串、字符数组元素、字符函数值等等以及由它们组成的字符表达式。 函数值ICHAR返回字符实体第一个字符的代码值。,例如:print *, ichar(A), ichar(A_dog) print *, ichar(A_dog/in_my_room) 打印的结果是3个数字65(A的序号是65)。,函数CHAR的功能是把一个序号转换成它的字符。 引用方式:CHAR(整型数值表达式)。 先计算整型表达式的值,再以这个值为序号,返回相应的单个字符,如CHAR(65)的值是A。,有了字符与数值的转换函数,就可处理字符循环。 例如设要连续打印 DIMENSION A,DIMENSION B,DIMENSION Z,则程序可写成: DO I=0,25 PRINT *,DIMENSION /CHAR(I+6) END DO,求字符串长度的函数:LEN 函数LEN的功能是求出一个字符实体的长度,引用方式是:LEN(字符实体)。函数值返回一个正整教,为该字符实体的长度(包括尾随空格、中间空格在内)。 如:LEN(ABCD 12 )的值是8。,求子串在父串位置的函数:INDEX 引用方式:INDEX(父串,子串) 函数值返回一个正整数,指明子串在父串中是从第几个字符开始的。父串、子串都可以是各种形式的字符实体。如果第二个字符实体不是第一个字符实体的子串,返回函数值为0。 如:INDEX(Einstein,s)的值4。, 不计尾部空格的字符串长度函数:LEN_TRIM 如:LEN_TRIM(ABCD 12 )的值是7。,除去尾部空格函数:TRIM 如:TRIM(ABCD 12 )/34的值是ABCD 1234。 比较字符大小的函数:LGE、LGT、LLE、LLT 比较字符大小的四个函数都有两个字符型实体作自变量,用来判断它们之间是否满足各种、关系的,其函数值是一个逻辑值,满足该不等关系为真,否则为假。它们的引用方式与功能如下:,用Fortran解题往往要用到一些专门运算。如求三角函数,开根号,绝对值,对数,指数,求一组数中最大数和最小数等。Fortran提供了一些系统内在函数来完成这些运算。程序设计者不必自己设计进行这些运算的语句组(即程序段或子程序),只需写出一个函数的名字以及结出一个或若干个自变量,就可以得到所需的值。例如: SQRT(4.0) SIN(2.0) 2(弧度)的正弦值 注意三角函数中的自变量单位为弧度! EXP(3.5) LOG(3.0) ,3.7 内部函数,取的整数部分,(当 ), (当 ),常用的内部函数,二 内部函数的一般形式及引用 一般引用形式: 函数名(自变量表列) 说明 : 自变量应该括起来. 如SINX应写成SIN(X). 三角函数的单位是弧度而不是度. 自变量可以是表达式.如EXP(3.5*6.2),还可是引用 函数SIN(3.5*COS(2.0),且可多次套用. 如: sin(1.5*sin(2.3*sin(2.0) 隐含说明不能改变内部函数的类型. 例:implicit integer(a-d) 对程序中的alog,dexp,dlog函数无影响.,内在函数的执行方法: Fortran将这些内在函数分别编成单个子程序,组成函数库,存在于外部介质(如磁盘)上。在完成源程序的编译之后,用LINK命令实现连接,即将已翻译成二进制指令的目标程序与函数库连接。也就是将程序中出现函

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论