问:物理学中计算势能的公式:E=mgh若写成FORTRAN77赋值语句,应怎样写才好?
答:所问赋值语句为E=M*9.81*H,可以看出,FORTRAN77的赋值语句与工程中的许多计算公式在书写上十分相似。这正是高级算法语言的特点,因此,容易掌握。
大家知道,原来的公式mgh,m表示物体的质量,并不含取整型数的意思,除非在同一程序单位中用类型语句说明了变量M为实型,否则根据I-N隐含规则,变量M就是整型的了。为了避免表达式的操作数在运算时作不必要的类型转换,则上述表达式写成如下形式更好:
E=AM*9.81*H
问:表达式16.5**4属于混合型表达式对吗?
答:不对。表达式16.5**4不属于混合型表达式。这是乘方运算的特殊性。在乘方运算中,只要指数是整型,则不管基数是整型还是实型,都不属于混合型。它属于哪种类型的表达式,由基数的类型决定。象这个问题的表达式是属于实型算术表达式。实质上,它是进行16.5*16.5*16.5*16.5的自乘运算。反之,如果指数是实型,则基数为整型时是混合型表达式;若基数为实型,则为实型表达式。
问:既然可以把常数值赋给变量,为何又要增加一个常数符号名的概念呢?
答:FORTRAN77规定,变量与常数符号名有一个重要的区别,就是变量的值在程序运行中是可改变的,变量在程序中可以多次赋值;而常数符号名的值是恒定的,常数符号名在同一程序单位中只能定义一次。具有常数基本性质的常数符号名,在程序单位中可以出现在许多只允许常数而不允许变量出现的地方。这里举一个例子,这个例子要在学习了后面章节的内容后才能完全理解。

如果这些语句是在一个主程序单位中,在加有横线的符号位置,FORTRAN77规定都不能是变量,而必须是常数值。因此,在这些位置写上常数14时,如果在不同的执行中要改变这个数值为20,则要对程序作多处修改。但是,如果使用PARAMETER语句。命名了一个常数符号名K,只要改变这个语句定义常数符号名K的常数值就行了:
PARAMETER(K=20)
程序中的其他语句都不用改动,这就给修改程序带来很大方便。
问:从内部函数表中可以看到,标识一个内部函数既可用属名又可用专用名,那么它们在使用上有什么不同呢?
答:标识内部函数是既可用属名又可用专用名。比如,绝对值函数,有一个属名,4个专用名(见附表)。每个专用名对应于一种类型变元的引用,而属名简化了内部函数的引用,几种类型的实元都可使用属名引用内部函数,结果类型与变元的类型相同(执行类型转换和复变元的绝对值除外)。

但是,当内部函数作实元时,不能用属名,而只能用内部函数专用名。例如:
MAX(100,ABS(K))
如果变元K按I-N规则隐含说明为整型的话,由于ABS(K)为引用MAX函数的实元,对于整型变元K,ABS是绝对值函数的属名而不是专用名,因此以上引用MAX函数的表达式是错误的。正确应写为:
MAX(l00,IABS(K))
问:表控输入与格式输入有什么区别和联系?
答:两者均为格式输入,不同之点在于表控输入是计算机系统规定的格式输入,例如某一计算机表控输入格式实型数为F16.7,即字域宽度包括符号位、小数点在内有16个字符位置,小数部分有7个数字位置;整型数为I10,即字域宽度包括符号位在内有10个字符位置。不同的计算机有不同的规定,所以,用机时就需要注意到这一点。格式输入是指输入的格式由程序设计人员按实际需要选定的,例如F10.5、I5等。一般来说,表控格式的输入输出比较方便,是程序设计人员常用的输入输出格式之一。
问:如何设计输入的表控记录?
答:常常碰到这样的问题,尽管程序设计正确,但是由于输入记录设计不正确,使程序运行出错,甚至中断运行。因此,必须根据原程序准确地设计输入数据记录。在设计原程序和数据记录时,建议注意以下几条:(1)设计输入语句的名表时,应先整型变量名后实型变量名,先简单变量名后数组名,简单变量名表与数组名表应分属于不同的输入语句。设计输入记录时,对于简单变量,应一个数据记录对应一个输入语句;对于数组,应按照数组的规则用一个或多个数据记录对应相应的输入语句。这样,尽管输入名表很多时,也容易查错和修改。(2)由于一般的终端屏幕一行只显示80个字符,因而,一个数据记录的长度不宜超过80个字符,以便于屏幕显示和修改。(3)按照日常的习惯,输入记录中的实数带小数点,用逗号作分隔符。(4)输入数据较多时,宜建立数据文件,这样可以一次建立多次使用,也便于查错和修改,节省时间,避免重复劳动,减少差错。
例一、READ*,M,N,A,B,C
输入记录是:10,20,1.5,2.5,3.5
问:格式说明与输入数据的有效数位有什么关系?怎样选择格式说明?
答:输入数据的有效数位依赖于格式说明和计算机的字长,格式说明中常用的有整编辑和实编辑,实编辑有单精度和双精度之分。每一台计算机对单、双精度的有效数位都有规定。对于整型数,不超过计算机规定的最大整数,都能准确表示,对于实型数,一般只能近似表示,其有效数位不能超过单、双精度的规定。表控格式输入的数据,能满足单精度数据的运算要求。如果要求输入的数据的有效数位超过单精度的数位时,就要对数据和变量作双精度的格式说明。
例如:某一计算机单精度有8个有效数位、双精度有18个有效数位,表控格式相当于F16.7,在输入输出记录中我们以小写字母“b”表示空格,以后各例均相同。对于程序:
READ*,A,B
PRINT*,A,B
END
输入记录是:44444.44444,444444.4444
程序运行后输出:bbb44444.4443359bb444444.4453125
这个例子说明,尽管输入有10位数字,但计算机能近似表示的只有前8位数字,后面的几位数字是在输出时计算机随机赋给的,与原输入的数据完全不同,不能作正确数位引用而应予舍弃。至于想通过扩大字域宽度和小数点后的位数的格式说明如F20.10,来增加有效数位,那也是不成的,其结果也是只有前8位数字有效。唯一的办法,对变量和数据给予双精度的格式说明:
例 DOUBLE PRECISION A,B
READ(05,10,B
100 FORMAT(2D20.10)
WRITE(06.200)A,B
200 FORMAT(1X.2D20.10)
END
输入的记录是:bbbbbbbbb44444.44444bbbbbbbbb444444.4444
程序运行后输出:bbbb0.4444444444D+05bbbb0.4444444444D+06
问:为什么说无条件GOTO语句要使用得当,不能滥用?
答: 因为无条件GOTO语句的功能简单,容易掌握,初学编程序的同志往往未经认真思考就随意使用它来达到程序转移的目的。其结果使编出来的程序逻辑结构不清晰,一不小心还会出错。教材第88页举过例子说明。这里再举一例:
READ*,X,Y,Z
U=X+Y
V=X-Y
W=X*Y
GO TO 3
5 PRINT*,U,V,W,A,B C
GO TO 7
3 A=X/Y
B=Y/Z
C=(X+Y+Z)/2
GO TO 5
7 STOP
END
这段程序在练习作业中遇到过,而这里作了简化。程序编写者当发现程序中间遗漏了某些语句。就急忙用无条件GOTO语句进行补遗。结果使程序“转来转去”,不易阅读。如果一个本来就比较复杂的程序,经这么“转来转去”要看清它的逻辑流程就更吃力了。我们提倡运用FORTRAN77语言进行结构程序设计。因此要求尽量少用无条件GO TO语句。教材第115页指出,用块IF、逻辑IF语句编写未知循环次数的循环程序时就必须用到无条件GO TO语句。其它地方则必须是确实需要时才使用。(黄庙由 李光洁 黄远利 邓自立)