(4) .eqv.与.neqv.这两个运算符按"先左后右"的原则进行计算。
三、赋值语旬
赋值语句的一般格式为:
变量名=表达式
其中,连接变量名和表达式的符号" ="称为赋值号。在fortran 77中,有三种赋值 语句:算术赋值语句,逻辑赋值语句和字符赋值语句。
(一)算术赋值语句
1.算术赋值语句中赋值号右边是算术表达式。算术表达式可以是单个变量或数组元 素,可以是用算术运算符号连接起来的数值计算过程。
(1)算术表达式中的各个数据量(常量或变量)的类型一般应该一致。如果不一致, fortran程序在运行中先将其进行转换,再进行计算。例如实型变量和整型变量进行 计算时,整型变量的数值先被转换为实型。
(2)算术表达式计算中,特别应注意两个整型量之间的除法(称为整除)。例如,算术表达式10.0-2/4*10.0的计算过程是
10.0 – 0*10.0= 10.0 -0.0= 10.0
如果表达式写为10.0-2/4.0*10.0,则计算过程是
10.0-2.0/4.0*10.0=10.0-0.5*10.0=5.0
因为2/4是整除,其结果为0,而进行2/4.0的计算时,整型量2先被转化为实型。
2.算术赋值左边只能是数值型变量名或数值型数组元素。如果赋值号左边的变量与 右边的表达式类型不一样时,系统将自动把右边表达式计算的结果转换为与左边变量的类 型一致后再赋给该变量。
(二)逻辑赋值语句
在逻辑赋值语句中,赋值号左边为逻辑变量或逻辑型数组元素,右边为一个逻辑表 达式。
(三)字符赋值语句
1.字符赋值语句赋值号的左边为字符变量或字符型数组元素。
2.赋值号的右边为字符表达式,可以是单个字符串或用字符运算符连接起来的字符串。字符运算符只有一个,表示为矿,含义为连接该符号两边的字符串.
3.执行字符赋值语句时,应注意字符串的长度与赋值号右边变量或数组元素的长度的关系。例如:
character*4 a, b*6, c
a= 'file
b=a//’'name'
c=b (5:6)
定义字符型变量时,根据类型说明语句的规定,a长度为4,而变量b因有专门说明,其长度为6。程序运行后,变量a的长度与赋值号右边字符串长一致,a的值为 ‘file' ;而b的长度小于‘file'和‘name'两个字符串长度之和,因此多余的字 符被截去,b的值为‘filena'; c的结果为‘na__' ,其中最后两格为空格符,这是 因为c的长度为4,大于字符串‘na'的长度,于是在其右边补上2个空格符后形成4 个字符长再赋值给c.在上面的程序例中,出现表达式b (5:6),称为"子串",表示取出字符串的一部分,本例中,表示将b的字符串‘filena'中的第5个字符至第6 个字符取出。
四、循环语句
(一)do语句
do语句的一般形式为:
do n v = el, e2, e3
n循环体
其中,n为语句标号;v为循环控制变量,它只能是简单变量(整型或实型) ,不能是表 达式; el, e2, e3分别为循环控制变量的初值、终值与增量(步长) ,它们都可以是表达 式,当e3为1时可以省略不写。循环体是若干语句的集合,其中最后一个语句称为循环 终端语句;若循环体只有一个语句,则该语句也就是终端语句。终端语句必须有标号n。
在do循环执行时,首先计算表达式el, e2, e3的值,并将它们化为与循环控制变量v的类型一致;然后将初值赋给循环控制变量v,并计算需要循环的次数;最后根据 循环次数重复执行循环体中的语句,并每次执行完循环体后,将循环控制变量增值一次, 循环次数减少一次。当循环次数为零时,则结束循环,转向程序规定的下一个语句。
(二)继续语句continue
continue是一个可执行语句,其功能是使程序的流程继续到逻辑上的下一个语句。
fortran 77规定,循环终端语句必须是一个可执行语句,但不能是goto语句、 块if语句、else语句、else if 语句、endif语句、00语句、stop语句、end语句。由于这些限制,通常用continue 语句作为循环的终端语句。当然, continue 语句也可用在其他场合。
(三)循环嵌套
使用循环嵌套可以实现多重循环。这时应注意各重循环的层次和循环变量的关系。例如,编写一个计算乘法表的程序段,可以写为:
do 10 1=1, 9
do 8 j=l, 9
ij = i*j
8 continue
10 continue
本例中,外层循环控制变量i初值为1,终值为9,内层循环控制变量j初值为外层循环 控制变量i的当前值,终值为9。外层的第1次循环,内层经过9-1+1=9次循环,依次 计算1×1=1,1×2=2,…,1×9=9,外层的第2次循环,内层经过9-2+1=8次循 环,依次计算2×2=4, 2×3=6,…, 2×9 = 18……
(四)使用循环语句应注意的若干问题
1.正确选定循环变量的初值。比如,对累加问题和连乘问题,变量初值不正确,使 影响最终结果。
例如计算m=1!十2! +……十10! ,采用循环语句编写程序,涉及到累加和连乘。 其程序可编写如下:
m=0
n=1
do 20 i= 1, 10
n=n×i
m=m十n
20 continue
print*,m
end
例中, n用于存放连乘结果,其初值设定为1,而m用于存放累加结果,其初值设定为0。
2. do语句可以和转换语句,条件语句等结合起来使用,此时应注意从循环体内可以 转向循环体外,但不允许从循环体外转向循环体内;从内层循环中可以转向外层循环,但不允许从外层循环转向内层循环中。
3.当内外层循环体的终端语句相同,且两个终端语句之间没有其他语句时,可以合 并使用一个终端语句。例如,前面计算乘法表的程序段可以写为:
do 10 i=1. 9
do 10j=i,9
ij = i*j
10 continue
或写为
do 10 i=1,9
00 10 j=i, 9
10 ij=i*j
五、输入输出语旬
(一)表控输入输出
表控输入输出语句是一种隐含格式的输入输出语句,其格式由程序编译系统提供,在 程序语句中不予表示。
1.表控输出语句
fortran 77表控输出语句有两种方式:
print*,输出量表
write (*,*)输出量表
这两种表控输出语句的作用是相同的,但一般微机上的fortran 77子集不提供print 语句,所以通常使用write 语句。
2.表控输入
fortran 77表控输入语句有两种型式:
read*,输入量表
read (*,*)输入量表
表控输入又称为自由格式输入。表控输入语句要求用户在隐含的输入设备(通常是键盘)上输入所需的数据,在输入数据时,各数据之间用逗号或空格分隔。
(二)格式输入输出
1.格式输出数据语句write语句和format语句
write语句的一般形式为:
write (u, f)输出量表
其中, u为部件说明符,用以指出在哪个设备上进行输出,通常也称为通道号,当u为记号*时,表示在显示器(标准输出设备)上进行输出。f为格式说明,它通常是一个格式语句的标号,用以指出输出数据所采用的格式。
格式语句的一般形式为:
标号format (格式说明)
例如:
write (*, 10) a, b, a*b
10 format (lx, f6.2, f7.3, f10.4)
format语句中,第一个"1x"称为纵向控制符,它表示前进一空格后再输出后面的数据,后面的三个项分别说明了三个实型数据输出的,称为格式编辑符。
fortran 77也允许在write语句中直接指定输出格式,从而可以省略格式语句 format。例如,上面的输出语句与格式语句可以合并成一个,即:
write (*, i (1x , f6. 2, f7. 3, f10.4) ') a, b, a*b
2.格式编辑符 fortran常用的格式符有十几种,详细可参照任何一本fortran教材或专用于册。
(三)隐循环的输入输出
数组元素的输入输出可以采用循环方式实现。 例如:
dimension x (20)
do 10 1= 1, 20
10 read*, x (i)
程序段执行时进行20次循环,每次输入1个数据。这个输入程序段可以改写如下: dimension x (20)
read*, (x (i), i = 1, 20)
其中第2句就是隐循环的输入语句。循环控制变量i的初值为1,终值为20,步长为1而 予以省略。隐循环语句的作用与do语句是相同的;但使用隐循环语句时, 20个数据允 许一次性输入,当然,数据与数据之间要用空格符或逗号区别开来。
隐循环语句也用于输出语句,也可使用多重循环。例如
dimension y (l0, 6)
read (*,*) ((y (i, j), j=1, 6), i=1, 10)
write (*, 5) ((y (i, j), j=1, 6), i=1, 10)
5 format (lx, 6f10.2)
运行程序段时,首先读入60个数据, y (1, 1), y (1,2),……, y (1, 6), y (2, 1), y (2, 2),……, y (2, 6),……, y (10, 1), y (10, 2),……, y (10, 6), 然后输出60个数据,每行输出6个数据,数据的排列顺序与输入时相同。
例:
1.fortran 语句: i=25 + 3.0**2 / 2 执行后,整型变量 i 的值是()。
a . 29 . 5;
b . 30;
c . 29;
d . 28
【 解 】 由条件, i 为整型变量知 a 项不对,应排除。 i=25 + 3 . 0**2 / 2=29 ,所以应选 c 项。
2.fortran 语句: b=10 . 0 -2/ 4 * 10 . 0 执行后,变量 b 的值是()。
a . 10 . 0;
b . 5 . 0;
c . 10;
d . 5
【 解 】 由条件, b=10 . 0 -0×10 . 0=10 . 0 ,所以应选 a 。
3.不等式 2 . 0≤y≤10.0对应的 y表达式是(a)
a . 2 . 0 . le . y . and . y . le .10.0;
b . 2 . 0 . ge.y. le .10.0;
c. 2 . 0 . le.y. le .10.0;
d y . ge.2.0 . or.le.10.0
4.下列各符号中, 可作为 rortran77 合法变量名的是(c)
a . 112fa ;
b . f- 312;
c. abd;
d π
5.若有语句: integerb (-1:2 , 3:7 ) ,则数组 b 中所包含的元素个数为(c)。
a . 10;
b . 15;
c . 20;
d . 24
六、控制语句
一般情况下, fortran程序是按语句顺序执行的,但需要时,可以改变这种顺序。 这种改变可以通过各种控制转移语句、逻辑条件语句等来实现。
(一)转移语句
1.无条件转移语句
无条件转移语句的一般形式为:
goto n
当程序流程到达goto语句时,随后就转向语句标号为n的语句。标号为n的语句必须是可执行语句,但它在程序中的排列位置,可以在引导到它的goto语句之后,也可以 在该goto 语句之前。无条件转移语句常和其他控制语句结合起来使用。
2.算术条件转移语句
算术条件转移语句的一般形式为:
if (e) nl, n2, n3
其中, e必须是算术表达式,当表达式运算结果e<0时,程序转向标号为n1的语句;当 e=0时,转向标号为n2的语句;当e>0时,转向标号为n3的语句。
例如,计算边长为b的正方形中挖去半径为r的圆后的面积,若b<2r,则给出相 关信息。该问题的fortran程序可用别辽条件转移语句编写如下。
c computation of area.
read*b.r
if (b-2*r) 5, 15, 15
5 write (*, 10)
10 format ('error message: b less than 2*r‘)
goto 20
15 area=b*b-3.14159*r*r
write *area
20 continue
end
本例中,在算术条件转移语句的第1个分支后,使用了goto语句;倘没有此语句,则 程序按顺序仍会执行标号为15的语句,从而得出不正确的结果。
3.计算转移语句
计算转移语句的一般形式为:
goto (n1, n2,……, nm), e
其中, ni (i = 1, 2,……, m)是被转向的语句标号,共m个; e是一个整型算术表达 式,其值不得小于1且不得大于m。当e的值等于1时,程序转向标号nl的语句,当e 的值等于2时转向标号n2的话句,当e的值为m时转向标号为nm的语句。整型算术表 达式e前的逗号可以省略。计算转移语句通常也和goto语句结合起来使用。 例如,有如下一个程序:
read*,m
goto (20, 30, 40, 50) m
20 n=m goto 60
30 n=m*2 goto 60
40 n=m*3 goto 60
50 n=m*4
60 write*,n
end
程序运行时,若输入1,则转向标号为20的语句,x的值为1 ;若输入2,则转向标号为 30的语句,x的值为4;输入3,转向标号为40的语句,x的值为9,输入4,转向标号 为50的语句,x的值为16
(二)逻辑条件语句
1.逻辑if语句
逻辑if 语句用来实现选择结构。它的一般形式为:
if (逻辑表达式)内嵌语句
其中内嵌语句是单独的一个可执行语句。逻辑if语句执行时,首先计算逻辑表达式的值, 如果逻辑表达式的值为"真",则执行内嵌语句,若内嵌语句非转移语句,则执行该语句 后继续按顺序往下执行,若内嵌语句是转移语句,则转向指定的语句;如果逻辑表达式的值为"假",则不执行内嵌语句,而直接执行该语句后面的语句。
例如,从键盘读入一个代表百分制成绩的数据,如果数据在90-100之间就输出 ‘excellent' ,在80-89之间输出‘good' ,在60-79之间输出‘pass' ,在60以下则输出 ‘not pass' 。其程序可以如下编写:
read (*.*) ipoint
if (ipoint. gt .100. or. ipoint. lt. 0) write (*,*) 'data error'
if (ipoint.ge.90.and. ipoint. le.100) write (*.*) 'excellent'
if (ipoint.ge.80.and.ipoint.le89) write ( * . *'good'
if (ipoint.ge.60.and. ipoint. le. 79) write (*.*) 'pass'
if (ipoint.ge.0.and. ipoint. le.59) write (*.*) 'not pass'
end
2.块if结构的各种形式
(1)块if和endif形式
if (逻辑表达式) then
语句块
endif
当逻辑表达式的值为"真"时,执行语句块,否则按顺序执行endif后的语句。例如, 如下程序段:
read*, rn, an
if (rn.ge.0.0.and.an.gt.0.0) then
stress=rn/an
write*rn,an,stress
endif
end
当rn大于等于零且an大于零时,执行赋值语句和输出语句。
(2)使用else的形式
if (逻辑表达式) then
语句块1
else
语句块2
endif
当逻辑表达式的值为"真"时,执行语句块1 ,当逻辑表达式的值为"假"时,执行语句块2。由此可见,使用else的形式,可以进行两个分支的选择。
(3)使用else if的形式
if (逻辑表达式1) then
语句块1
else if (逻辑表达式2) then
语句块2
else
语句块3
endif
这种形式,允许在三个分支中作出选择。当逻辑表达式1的值为"真"时,执行语句 块1表示的分支;当逻辑表达式1的值为"假"而逻辑表达式2的值为"真"时,执行语 句块2表示的分支;当逻辑表达式1的值和逻辑表达式2的值均为"假"时,执行语句块 3表示的分支。
3.块if结构的嵌套
在一个块if结构的语句块中,可以完整地包含另一个或多个块if结构,称为块if 的嵌套。块的嵌套可以多层。
七、函数与子程序(过程)
(一)内部函数
内部函数是预先编制的一些常用函数或算法的过程,由fortran语言提供,可以, 直接调用。内部函数调用时的一般形式是:
内部函数名(实元表)
实元表中元素的数据类型、个数是预先规定的。
常用内部函数及其功能可查阅fortran教材或用户手册。
(二)语句函数
1.语句函数的定义
定义语句函数的语句称为语句函数语句。其一般形式为:
函数名(形参表) =表达式。
其中,函数名的命名规则与一般变量名相同,所以它也可以用类型说明语句等来说明。形参又称哑元,是一些变量名,一般应出现在表达式中。
语句函数在程序单位中的位置,应在所有可执行语句之前。
2.语句函数的调用
调用语句函数的结果是得到一个函数值,因此,调用语句函数时代之以实际变量(又称实元)。
(三)函数子程序
一个函数子程序是一个独立的fortran程序单位。它的第一个语句必须是function语句,最后一个语句必须是end 语句。即函数子程序的一般结构为:
[类型说明] function函数名(形参表)
语句块
[return]
end
也可以写为:
function函数名(形参表)
[类型说明函数名]
语句块
[return]
end
其中函数名的命名规则与变量相间,而函数名的类型决定了函数值的类型。在函数子程序中,形参可以是变量名、数组名、外部过程名,而形参的命名与类型说明也与变量相同,形参数组也必须在函数子程序中予以定义。
函数子程序的函数值由函数名带回到调用该函数子程序的程序,因此,在函数子程序 中必须对函数名赋值。在函数子程序中,函数名应该像普通变量那样来使用。在函数子程序中,所有的名字、语句标号都可以和其他程序单位中的相同而彼此没有 任何关系。
在函数子程序中, end语句的功能有两个:一是表示该程序单位的结束,二是具有返回语句return的功能。函数子程序中必须有并且只有一个end语句,而且只 能是子程序的最后一个语句。当在子程序的其他位置须要返回时,可以使用return 语句。
(四)子程序
1.子程序的结构
一个子程序是一个独立的fortran程序单位。
子程序的第一个语句必须是subroutine语句,最后一个语句必须是end 语句。 即子程序的一般结构为:
subroutine子程序名(形参表)
语句块
[return]
end
子程序名的命名规则与普通变量相同。但是子程序中的子程序名不能用于返回数值,这与函数子程序是不同的。因此,子程序名没有类型,它不能在本程序单位中使用。 subroutine 语句中的形参表可以省略。这时子程序名后的括弧不要保留。对子程序的其他有关规定与函数子程序相同。
2.子程序的调用
子程序调用通过call 语句实现。其形式为:
call子程序名(实参)
其他有关对子程序的调用规定与函数子程序相同。
八、程序单位间的数据传递
(一)虚实结合
虚实结合又称哑实结合,是各程序单位(主程序和各种过程如函数子程序)之间传递数据的一种重要途径。
1.变量的虚实结合
当子程序等过程的形参为变量时,则在调用时所对应的实参可以是类型相同的常数、变量、数组元素或表达式;子程序调用后,其运行的结果通过这些实参返回到调用者。在fortran77中,当形参变量所对应的实参是变量或数组元素时,则它们之间的结合方 式是地址结合;而当形参变量所对应的实参是常数或表达式时,其结合方法对于不同的 fortran系统有可能是不同的。
2.数组的虚实结合
当子程序中的形参为数组名时,则在调用时所对应的实参必须是数组名或数组元素。
如果实参是数组名,则实参数组与形参数组按地址结合,实参数组与形参数组都从第 一个元素开始按列逐个对应。例如,有主程序与子程序如下:
program main
integer a (0:5)
call sb (a)
end
subroutine sb (b)
integer b (-1:2)
end
则在主程序中使用call语句调用子程序sb时,实参数组与形参数组的结合情况如下:
实参数组 形参数组
a (0)——b (-1)
a (1)一一b (0)
a (2)——b (1)
a (3)一一b (2)
a (4)
a (5)
也即调用sb时,a数组的头4个元素与b数组的元素对应,这些对应元素实际上为同一 存储地址。
如果实参是数组元素,则从该元素开始依次与形参数组的第一个元素起按列逐个对应,它们也是按地址结合。例如,有主程序与子程序如下:
program main
dimention a (8)
call sb (a(5))
end
subroutine sb (b)
dimension b (3)
end
则在调用语句执行时,实参数组a与形参数组b的结合情况如下: 实参数组形参数组
a (1)
a (2)
a (3)
a (4)
a (5)——b (1)
a (6)一一b (2)
a (7)——b (3)
a (8)
fortran 77规定,不管实参是数组名还是数组元素,用作实参的数组,其维数、各维下标的上下限及数组中元素个数可以和与之结合的形参数组不同,但要求从与形参数组的第一个元素结合的实参数组元素算起,以后的实参数组元素的个数不能少于形参数组元素的个数。
多维数组或数组元素虚实结合时,要特别注意fortran中数组按列存放的规定, 不要搞错存储地址的对应关系。例如:
program main
dimension a (3, 2)
call sb (a)
。。。
end
subroutine sb (b)
dimension b (2, 3)
。。。
end
这种情况下,数组元索地址的对应关系是:
实参数组 形参数组
a (1, 1)一一b (1, 1)
a (2, 1)一一b (2, 1)
a (3, 1) 一一b (1, 2)
a (1, 2) 一一b (2, 2)
a (2, 2) 一一b (1, 3)
a (3, 2) 一一b (2, 3)
3.可调数组
在主程序中定义数组元素时,定义说明符中各维下标的上下限必须为整常数,不能是 变量或算术表达式。但在子程序中定义数组时,允许用变量来定义各维下标的上下限。子程序中用变量来定义各维下标上下限的数组称为可调数组。但使用可调数组必须遵循以下 几个原则。
(1)可调数组名必须是形参数组名。
(2)说明可调数组各维下标上下限的表达式中只能出现整型变量,且这种变量必须是形参或出现在common 语句中。但在某些fortran 77子集中,定义可调数组各维下 标上下限时只能是整型变量,而不能是任何算术表达式。
(3)可调数组的大小不得超过对应实参数组的大小。
4.字符型变量的虚实结合
(1)当子程序中的形参为字符型变量时,对应的实参必须是字符型变量、字符常数、字符型数组元素或字符表达式。字符型实参必须用character 语句加以说明。
(2)如果字符型形参的长度小于对应的实参长度,则从实参中最左边的字符开始与形参结合,而实参中右边多余的字符被截去。例如:
character a*5
a=abcde'
call sb (a)
end
subroutine sb (x)
character x*3
write (* , *) x
end
程序执行后的输出结果为: abc。
(3)在fortran 77中,对字符型形参的长度还可以用"*"号来说明,此时,形 参字符变量自动与对应的实参取相同的长度。例如在上面的子程序sb中,如果将character x*3改变为character x* (*) ,则执行后,输出的结果为: abcde。
(4)当子程序中形参为字符型数组时,如果形参字符型数组元素的长度与对应实参字符型数组元素长度一致,则其虚实结合的情况与一般的数组虚实结合的情况相同。如果形参与实参的字符型数组元素长度不同,则按字符依次对应。例如,有主程序与子程序 如下:
character a (5) *3
data a(' abc', 'def', 'ghi', 'jkl', 'mno' )
call sb (a)
end
subroutine sb (d)
character d (4) *2
end
则形参数组d中元素的值为:
d (1):' ab'
d (2): 'cd'
d (3): 'ef'
d (4): 'gh'
(5)过程名的虚实结合 fortran允许子程序中的形参为过程名,此时,调用程序中的实参必须是过程名.如果实参是外部过程名(如函数子程序名、子程序名) ,则该外部过程名在调用程序 中必须用external 语句说明。
如果实参是内部过程名(如内部函数名) ,则该内部过程名在调用中必须用intrinsic语句说明。
(二)公用区语句
1.公用区语句的一般形式
common [公用区名l/]变量表1, [公用区名2/变量表2]…
没有公用区名的就称为无名公用区,其他都是有名公用区;一个完整的程序只能设置一个无名公用区,但可以有多个有名公用区;变量表中,可以是变量名、数组名、数组说明符,互相之间用逗号隔开。例如:
common a, b (3), c (2)
定义了b是3个元素的一维数组, c是2个元素的一维数组。这条语句与下面两句语句是 等价的:
dimension b (3), c (2)
common a, b, c
2.利用公用区进行数据传递时,在元名公用区或同名的有名公用区中,位置排列相 同的变量、数组,实际上使用同一存储地址,亦即共享同一数据。例如:
program main
common a, i (2) /coml/d, c
。。。
call sb
end
subroutine sb
common aa, ]k (2) /coml/f, g
end
其中,主程序中的变量a的数据与子程序的变量aa共享,数组1的数据与jk共享,而d, c的数据分别与f, g共享。由此可以知道,各个程序单位中common语句中的变量类型 必须按位置一一对应一致才能正确传递数据。
九、文件
fortran程序输入输出的基本单位称为记录。记录是数值或字符的序列。记录的集合称作文件。
(一)文件的存取方式
1.顺序文件
顺序文件中的记录是一个接一个按顺序存放的,即总从第1个记录开始,然后是第2 个记录,第3个记录,…,要取任何一个记录,都必须从第1个记录开始。
2.直接文件
直接文件又称直接存取文件,或随机文件。它可以按任意顺序读写某一记录。直接文件中每个记录的长度都是相等的。
(二)文件操作语句
文件操作语句有打开文件的open语句和关闭文件的close 语句。此外还有文件的 读写语句read语句和write语句。
(三)文件定位
设想在文件的读写操作时存在一根指针。起先指针停在文件的开始处,随着文件存取 的进行,指针在文件中移动。控制指针的位置,即定位,在fortran中可以通过如下语句来实现。
i.rewind语句
rewind语句也称回绕语句。它的形式是:
rewind设备号
它使与指定设备号相连的文件中的指针定位在文件的开头。
在fortran中,用open语句打开一个文件,指针也是在文件的开头位置。因此对一个已经打开的文件,要使指针移到开头,也可组合使用close和open 语句。
2.backspace语句
语句backspace的形式是:
backspace设备号
它使与指定设备号相连的文件中的指针退回一个记录。
例题:
1.阅读下列 fortran 程序:
integer sum
sum=0
do 10 i= 1 , 10 , 4
do 10 j = 5 , 100 , 20
do 10 k =-10 ,-5 ,2
10 sum = sum + 1
上面程序的运行结果为(c)。
a . 15;
b .30;
c .45;
d .60
k取值3次,j取值5次,i取值3次,共取值45次
2.若有integer a (-2:2, 0: 3, 1: 2) ,按照在内存中的存储次序,数组a中第8号元素为(b)
(a) a (-1,0,2)
(b) a (0,1,1)
(c) a (2, 1,2)
(d) a (1, 1,1)
a中数据按列排序,a(5,4,2)第八个元素是a(3,2,1),对应本题应为a (0,1,1)
3.对下列程序段
read (*,*) x
if ( (x. lt. - 5.0) .or. (x.eq. -1.0)) then
y=0.0
elseif (x.lt.0.0) then
y=1.0/(x+1.0)
elseif (x. lt.5.0) then
y=1.0/(x+2.0)
else
y=0.0
endif
write (*,*) y
若输入4.0,则结果为:(c)
(a) 0.0
(b) 1/5
(c) 1/6
(d) 1/4十2.0
输入的是4,小于5,所以输出结果为1/(2+4)=1/6
4.阅读下列 fortran 程序:
dimension a ( 2 , 2 )
integer a , y
y =0
do 20 i=1,2
do 20 j = 1 , 2
a ( i , j ) = i * i + j*j
y = ( y + a ( i , j ) ) / 2
20 continue
write ( * ,*) y
end
此程序运行的结果为(a)。
a . 6;
b . 9 ;
c . 10 ;
d 20
y1=2/2=1,y2=(1+5)/2=3,y3=(3+5)/2=4,y4=(4+8)/2=6
5.阅读下列 fortran 程序:
k = 0
do 10 i= 1 , 6 , 2
do 10 j= 1 , 6 , 3
if ( k . lt . i * j )
k = i*j
10 continue write (*,* ) k
end
此程序执行后的输出结果为(c)。
a . 18;
b . 30;
c . 20 ;
d . 36
i,j乘积的最大值为4×5=20
6.以下程序段
dimension a (4)
read*,a
i=1
10 j = i + 1
20 if (a (i) . lt. a (j)) then
t=a (j)
a (j)=a (i)
a (i)=t
endif
j=j+l
if (j.le. 4) goto 20
i=i+1
if (1. le.3) goto 10
print*, a (4)
end
若输入4, 2, 3, 5,则程序运行结果为(b)
(a) 4
(b) 2
(c) 3
(d) 5
相当于把数列从大到小排列,最后5,4,3,2,故选b
7.对下列程序段
parameter (n=3)
integer a (n, n)
read*,a
do 10 j=1, n
ls=0
do 20 1= 1, n
20 ls= ls+ a (i, j)
ls=ls/n
do 30 i=1, n
30 a (i, j) = a(i, j)-ls
10 continue
print*,a
end
若输入2, 4, 6, 8, 10, 12, 14, 16, 18
则程序运行后a (3, 2)为(c)
(a) -2
(b) 0
(c) 2
(d) 12
2 8 14
原数组注意是按列存储数据,a=4 10 16
6 12 18
每一列和除三,每个元素减去上述结果,a变为
-2 -2 -2
a= 0 0 0
2 2 2
a(3,2)为2