1、第6章 常用内部过程,作为一门古老而又年轻的高级计算机语言,Fortran提供了大量的内部过程供程序员在编程过程中使用。并且随着新标准的推出,Fortran语言的内部过程还在继续扩展,能够提供更多的常用功能,大大减轻了程序员的重复性劳动。本节主要介绍常用内部过程的基本知识。,6.1 内部过程概述,在Fortran语言中,有很多常用的数学过程、字符处理过程和系统过程。其中,数学过程和字符处理过程通常是以函数子程序的形式存在,而系统过程则通常是以子例行子程序的形式存在。这些过程为应用程序的编写提供了非常方便的手段和丰富的功能。Fortran语言将这些功能各异、用途各异的过程分别编写成一个个独立的子
2、程序,编译后组成一个大的标准过程库(有时也称为标准函数库),存放在外部存储介质(如计算机的硬盘)上。用户在完成自身源程序的编译之后,使用LINK命令将已翻译成二进制指令的目标程序与这个标准过程库连接起来。通过这个连接,将程序中出现过程名的地方用标准过程库中相应的一组指令代替,最终形成统一的用户可执行程序。,6.2 常用数学函数,作为一种主要面向科学、工程和事务处理中的数值计算问题的高级计算机语言,Fortran提供了丰富的数学函数供用户在编程时使用。本小节主要介绍在日常编程中经常会遇到和使用的数学函数。,6.2.1 绝对值函数,绝对值函数用于求出数据的绝对值,函数的原型如下:C = ABS(X
3、)其中,ABS是Fortran中绝对值函数的通用名。除了这个通用名外,绝对值函数还有4个专用名,它们是:IABS,专用于求默认种别的整型数据的绝对值,返回值也为默认种别的整型数据。ABS,专用于求默认种别的实型数据的绝对值,返回值也为默认种别的实型数据。DABS,专用于求双精度实型数据的绝对值,返回值也为双精度的实型数据。CABS,专用于默认种别的复型数据的绝对值,返回值也为默认种别的复型数据。,6.2.2 指数函数,指数函数用于求出数据的指数值,函数的原型如下:C = EXP(X)其中,EXP是Fortran中指数函数的通用名。除了这个通用名外,指数函数还有3个专用名,它们是:EXP,专用于
4、求默认种别的实型数据的指数值,返回值也为默认种别的整型数据。DEXP,专用于求双精度的实型数据的指数值,返回值也为双精度的实型数据。CEXP,专用于默认种别的复型数据的指数值,返回值也为默认种别的复型数据。,6.2.3 正弦函数,正弦函数用于求出数据的正弦值,函数的原型如下:C = SIN(X)其中,SIN是Fortran中正弦函数的通用名。除了这个通用名外,正弦函数还有3个专用名,它们是:SIN,专用于求默认种别的实型数据的正弦值,返回值也为默认种别的整型数据。DSIN,专用于求双精度的实型数据的正弦值,返回值也为双精度的实型数据。CSIN,专用于默认种别的复型数据的正弦值,返回值也为默认种
5、别的复型数据。函数在数学上等价于。函数中参数的单位是弧度而不是度,在使用时需要注意这一点。,6.2.4 余弦函数,余弦函数用于求出数据的余弦值,函数的原型如下:C = COS(X)其中,COS是Fortran中余弦函数的通用名。除了这个通用名外,余弦函数还有3个专用名,它们是:COS,专用于求默认种别的实型数据的余弦值,返回值也为默认种别的整型数据。DCOS,专用于求双精度的实型数据的余弦值,返回值也为双精度的实型数据。CCOS,专用于默认种别的复型数据的余弦值,返回值也为默认种别的复型数据。,6.2.5 反正弦函数,反正弦函数用于求出数据的反正弦值,函数的原型如下:C = ASIN(X)其中
6、,ASIN是Fortran中反正弦函数的通用名。除了这个通用名外,反正弦函数还有2个专用名,它们是:ASIN,专用于求默认种别的实型数据的反正弦值,返回值也为默认种别的整型数据。DASIN,专用于求双精度的实型数据的反正弦值,返回值也为双精度的实型数据。,6.2.6 反余弦函数,反余弦函数用于求出数据的反余弦值,函数的原型如下:C = ACOS(X)其中,ACOS是Fortran中反余弦函数的通用名。除了这个通用名外,反余弦函数还有2个专用名,它们是:ACOS,专用于求默认种别的实型数据的反余弦值,返回值也为默认种别的整型数据。DACOS,专用于求双精度的实型数据的反余弦值,返回值也为双精度的
7、实型数据。,6.2.7 正切函数,正切函数用于求出数据的正切值,函数的原型如下:C = TAN(X)其中,TAN是Fortran中正切函数的通用名。除了这个通用名外,正切函数还有2个专用名,它们是:TAN,专用于求默认种别的实型数据的正切值,返回值也为默认种别的整型数据。DTAN,专用于求双精度的实型数据的正切值,返回值也为双精度的实型数据。,6.2.8 反正切函数,反正切函数用于求出数据的反正切值,函数的原型如下:C = ATAN(X)其中,ATAN是Fortran中反正切函数的通用名。除了这个通用名外,反正切函数还有2个专用名,它们是:ATAN,专用于求默认种别的实型数据的反正切值,返回值
8、也为默认种别的整型数据。DATAN,专用于求双精度的实型数据的反正切值,返回值也为双精度的实型数据。,6.2.9 自然对数函数,自然对数函数用于求数据的自然对数值,函数的原型如下:C = LOG(X)其中,LOG是Fortran中自然对数函数的通用名。除了这个通用名外,自然对数函数还有3个专用名,它们是:ALOG,专用于求默认种别的实型数据的自然对数值,返回值也为默认种别的整型数据。DLOG,专用于求双精度的实型数据的自然对数值,返回值也为双精度的实型数据。CLOG,专用于求默认种别的复型数据的自然对数值,返回值也为默认种别的复型数据。,6.2.10 常用对数函数,常用对数函数用于求数据的常用
9、对数值,函数的原型如下:C = LOG10(X)其中,LOG10是Fortran中常用对数函数的通用名。除了这个通用名外,常用对数函数还有2个专用名,它们是:ALOG10,专用于求默认种别的实型数据的常用对数值,返回值也为默认种别的整型数据。DLOG10,专用于求双精度的实型数据的常用对数值,返回值也为双精度的实型数据。,6.2.11 取整函数,取整函数用于将数据转换为整型,函数的原型如下:C = INT(X)其中,INT是Fortran中取整函数的通用名。除了这个通用名外,取整函数还有3个专用名,它们是:IFIX,专用于将默认种别的实型数据转换为整数,返回值为默认种别的整型数据。INT,专用
10、于将默认种别的实型数据转换为整数,返回值为默认种别的整型数据。IDINT,专用于将双精度的实型数据转换为整数,返回值为默认种别的整型数据。函数的执行结果同数学上的取整有所不同,Fortran中的取整函数只是将数据的小数部分截去,不使用四舍五入规则。函数的参数可以是实型、整型和复型。,6.2.12 求余函数,求余函数用于求第一个变量被第二个变量所除后的余数,函数的原型如下:C = MOD(X1, X2)其中,MOD是Fortran中求余函数的通用名。除了这个通用名外,求余函数还有2个专用名,它们是:MOD,适用于默认种别的整型数据,返回值为默认种别的整型数据。AMOD,适用于默认种别的实型数据,
11、返回值为默认种别的实型数据。,6.2.13 取符号函数,取符号函数返回第一个参数的绝对值与第二个参数的符号的乘积,函数的原型如下:C = SIGN(X1, X2)其中,SIGN是Fortran中取符号函数的通用名。除了这个通用名外,取符号函数还有3个专用名,它们是:ISIGN,适用于默认种别的整型数据,返回值为默认种别的整型数据。SIGN,适用于默认种别的实型数据,返回值为默认种别的实型数据。DSIGN,适用于双精度的实型数据,返回值为双精度的实型数据。,6.2.14 最大值函数,最大值函数用于找出一系列数据中的最大值,函数的原型为:C = MAX(X1, X2, X3)其中,MAX是Fort
12、ran中最大值函数的通用名。除了这个通用名外,最大值函数还有5个专用名,它们是:MAX0,适用于默认种别的整型数据,返回值为默认种别的整型数据。AMAX0,适用于默认种别的整型数据,返回值为默认种别的实型数据。MAX1,适用于默认种别的实型数据,返回值为默认种别的整型数据。AMAX1,适用于默认种别的实型数据,返回值为默认种别的实型数据。DMAX1,适用于双精度的实型数据,返回值为双精度的实型数据。,6.2.15 最小值函数,最小值函数用于找出一系列数据中的最小值,函数的原型为:C = MIN(X1, X2, X3)其中,MIN是Fortran中最小值函数的通用名。除了这个通用名外,最小值函数
13、还有5个专用名,它们是:MIN0,适用于默认种别的整型数据,返回值为默认种别的整型数据。AMIN0,适用于默认种别的整型数据,返回值为默认种别的实型数据。MIN1,适用于默认种别的实型数据,返回值为默认种别的整型数据。AMIN1,适用于默认种别的实型数据,返回值为默认种别的实型数据。DMIN1,适用于双精度的实型数据,返回值为双精度的实型数据。,6.3 常用字符函数,Fortran 90/95的内部函数中新增了许多和字符型数据操作有关的函数供用户使用,可以很方便地进行各种字符操作。,6.3.1 字符与数值转换函数,这是一系列函数的总称,涉及到4个基本函数:ICHAR,CHAR,IACHR和AC
14、HAR函数。Fortran 90/95中允许把字符型的值转换成数值型的值(已知字符得到字符在某种字符集中的序号数值),也可把数值型的值转换成字符型的值(已知字符在某种字符集中的序号数值进而得到该位置上的字符)。函数ICHAR的作用是根据字符得到字符在计算机字符集中的位置,函数的原型为:C = ICHAR(字符数据),6.3.2 字符串长度函数,字符串长度函数用于求出参数字符实体的字段长度,函数的原型为:C = LEN(string)其中,string必须是字符型,可以是字符标量也可以是字符数组。函数返回一个正整数,为该字符实体的字段长度(包括尾随空格、中间空格在内)。比如LEN(ABC 123
15、 )的值是9(6个字符加3个空格)。如果想要得到不计尾部空格的字符串长度,则可以使用LEN_TRIM函数。函数的原型如下:C = LEN_TRIM(string),6.3.3 子字符串位置索引函数,子字符串位置索引函数的作用是找出指定子字符串在目标字符串内的起始位置,函数的原型如下:C = INDEX(string, substring,back)其中,string表示要在其中进行索引的目标字符串;substring表示子字符串;back为逻辑型变量,当back的值为.TRUE.时表示从目标字符串的后面开始搜索,当back的值为.FALSE.或省略不写时,表示从目标字符串的前面开始搜索。函数值
16、返回一个正整数,指明子字符串在目标字符串中是从第几个字符开始的。目标字符串和子字符串可以是任何形式的字符实体。如果目标字符串中不含有子字符串中的内容,则函数的返回值为0。例如INDEX(VitaminC,i)的值为2;INDEX(VitaminC,i,BACK=.TRUE.)的值为6;INDEX(VitaminC,b)的值为0。,6.3.4 字符串验证函数,字符串验证函数的作用是确认指定的字符集中是否包含了给定字符串中所有的字符,函数的原型为:C = VERIFY(string, set, ,back)其中,string为要在其中进行验证的字符集;set为给定的字符串;back表示是从字符集的
17、前面还是后面开始验证:当back值为.TRUE.时表示从后面开始验证,当back的值为.FALSE.或省略不写时表示从前面开始验证。函数的返回值是一个正整数,指明给定字符串中与字符集相异的第一个字符是从左边第几个字符开始的。如果没有相异的字符,则返回函数值为0。比如VERIFY (banana,nbc)的值为2,VERIFY (banana,nbc,BACK=.TRUE.)的值为6,VERIFY(banana,nbca)的值为0。,6.3.5 尾部空格除去函数,尾部空格除去函数的作用就是除去字符串尾部的尾随空格,函数的原型为:C = TRIM(string)函数的返回值与函数的输入参数类型相同
18、、种别相同。返回值就是输入参数除去尾部空格后剩余的部分。比如TRIM(ABC 123 )/34的值是ABC 12334。这个函数在进行文件名的处理上较为方便:为了保存文件的完整路径名称,通常需要使用一个字段宽度较大的字符变量(在Windows系统下,如果使用系统函数,一般要求256个字符宽度)。如果输入的文件实际路径名较短,则在显示时会留下大段的空格。使用TRIM函数就可以避免这种现象。,6.3.6 字符大小比较函数,字符大小比较函数是一个函数族,共包含了4个基本函数。其作用就是比较字符在ASCII字符集中的先后位置,其原型为:C = LGE(string_a, string_b)C = LG
19、T(string_a, string_b)C = LLE(string_a, string_b)C = LLT(string_a, string_b)四个函数都是用两个字符型实体作为参数,用来判断它们之间是否满足大于等于、大于、小于等于、小于关系。,6.4 常用系统过程,在Fortran 90/95中还增加了许多常用的系统过程,这些系统过程大多采用子例行子程序的形式。这里介绍的主要是用于获得系统时间和随机数的系统过程。,6.4.1 CPU时间函数,该函数用于返回同处理器无关的精确的处理器运行时间,单位为秒。过程的原型如下:CALL CPU_TIME (time)其中,time是一个实型变量,用
20、于保存处理器的运行时间。如果过程不能返回有意义的时间,则会返回一个与处理器无关的负值。CPU_TIME函数可以用于获得某一段可执行代码在CPU中的实际运行时间,比如下面的代码段用于确定代码执行时间并将其打印出来: REAL : time_begin, time_end CALL CPU_TIME ( time_begin ) !可执行代码段 CALL CPU_TIME ( time_end ) PRINT *, Time of operation was , time_end - time_begin, seconds,6.4.2 日期和时间函数,该过程用于返回从实时时钟处获得的日期和时间相关
21、信息,日期和时间的格式符合国际标准ISO 8601:1988。过程的原型如下:CALL DATE_AND_TIME ( date , time , zone , values )其中,date用于保存返回的日期信息,必须是一个至少有8个字符长度的字符串。可以用于保存世纪、年、月、日等信息,形式为CCYYNNDD。下面分别给出这些字符的意义:CC:表示系统中所处的世纪;YY:表示系统中所处的年份;MM:表示系统中所处的月份;DD:表示系统中所处的日期。,6.4.3 系统时间过程,系统时间过程用于保存从系统实时时钟处获得的数据信息。过程的原型如下:CALL SYSTEM_CLOCK (count
22、, count_rate , count_max)其中,count用于保存处理器时钟的当前值,必须是一个默认种别的整型变量。每有一个时钟计数发生,count的值就会增加1,直到数值达到count_max,然后count被清零重新开始计数。count_rate必须是一个整型数据,用于指定每秒钟内触发的时钟计数次数。count_max也是一个整型数据,用来设置时钟计数的最大值,可以为系统能够处理的最大整数。,6.4.4 随机数生成过程,随机数生成过程用于生成伪随机数,结果可以是一个标量也可以是一个数组。过程的原型如下:CALL RANDOM_NUMBER (harvest)其中,harvest必须是实型变量,可以是标量或数组。随机数的大小范围在0到1之间。,