fortran课后习题答案解析.docx
《fortran课后习题答案解析.docx》由会员分享,可在线阅读,更多相关《fortran课后习题答案解析.docx(18页珍藏版)》请在冰豆网上搜索。
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.下列符号中为合法的FORTRAN90标识符的有哪些?
(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)
LOGICALP
INTEGERI,I1,I2,I3
P=.FALSE.
READ*,I
I1=MOD(I,10)
I2=MOD(I/10,10)
I3=I/100
IF(I1+I3.EQ.2*I2)P=.TRUE.
PRINT*,P
END
输入123时,输出:
T
输入132时,输出:
F
(2)
REALX,Y,Z
READ*,X,Y
IF((X*Y)>0.AND.(X.NE.1.0))THEN
Z=10.0
ELSEIF(X*Y<0.0)THEN
Z=0.0
ELSE
Z=-1.0
ENDIF
WRITE(*,*)Z
END
输入1,4,输出:
-1.0
输入4,1,输出:
10.0
输入1,-4,输出:
0.0
(3)
INTEGERX,Y,A,B
X=1
Y=0
A=3
B=4
SELECTCASE(X)
CASE
(1)
SELECTCASE(Y)
CASE(0)
A=A+1
CASE
(1)
B=B+1
ENDSELECT
CASE
(2)
A=A+1
B=B-1
CASEDEFAULT
A=A+B
B=A+B
ENDSELECT
PRINT*,"A=",A,"B=",B
END
输出结果是:
A=4B=4
2.将下列数学运算转换成对应的FORTRAN表达式或写出语句。
(1)x∈(3,6)FORTRAN表达式:
x>0.AND.x<6
(2)2.5≤y≤8FORTRAN表达式:
y>=2.5.AND.y<=8
(3)x+y≠z+6FORTRAN表达式:
(x+y)/=(z+6)
(4)2x+4y+xy=0FORTRAN表达式:
2*x+4*y+x*y=0
(5)|a-b|≤c2FORTRAN表达式:
ABS(a-b)<=c*c
(6)如果xFORTRAN语句:
IF(x(7)实数a,b,c能否构成三角形三边
FORTRAN表达式:
a>0.AND.b>0.AND.c>0.AND.(a+b)>c.AND.(b+c)>a.AND.(c+a)>b
(8)a,b之一为0但不同时为0
FORTRAN表达式:
(a==0.OR.b==0).AND.(.NOT.(a==0.AND.b==0))
(9)如果m与n相等,则k为1,否则k为0
FORTRAN语句:
IF(m==n)THEN
k=1
ELSE
k=0
ENDIF
(10)a,b是否相同号
FORTRAN表达式:
a*b>0
3.如果A=2.5,B=7.5,C=5.0,D=6.0,L=.TRUE.,M=.FALSE.,请求出下列逻辑表达式的值。
(1)(A+B).LT.(C+D).AND.A.EQ.3.5逻辑表达式的值:
.FALSE.
(2)A+B/2.0.NE.C-D.OR.C.NE.D逻辑表达式的值:
.TRUE.
(3).NOT.L.OR.C.EQ.D.AND.M逻辑表达式的值:
.FALSE.
(4)C/2.0+D.LT.A.AND..NOT..TRUE..OR.C.EQ.D逻辑表达式的值:
.FALSE.
(5)(C.GT.D).OR.C.NOT.(A+B.LT.D)该表达式错误
(6)(A.LT.B).AND.(B.LT.A)逻辑表达式的值:
.FALSE.
5、某运输公司在计算运费时,按照运输距离S对运费打一定的折扣D,其标准如下:
S<250kmD=0
250≤S<500kmD=2.5%
500≤S<1000kmD=4.5%
1000≤S<2000kmD=7.5%
2000≤S<2500kmD=9.0%
2500≤S<3000kmD=12.0%
3000km≤SD=15.0%
编写程序,输入基本运费Price,货物重量Weight,距离S,计算总运费Freight。
其中Freight=Price*Weight*S*(1-D)。
REALPrice,Weight,S,Freight,D
READ*,Price,Weight,S
IF(S<250)THEN
D=0
ELSEIF(S<500)THEN
D=0.025
ELSEIF(S<1000)THEN
D=0.045
ELSEIF(S<2000)THEN
D=0.075
ELSEIF(S<2500)THEN
D=0.09
ELSEIF(S<3000)THEN
D=0.12
ELSE
D=0.15
ENDIF
Freight=Price*Weight*S*(1-D)
WRITE(*,*)"Freight=",Freight
END
6、编程判断自然数M是否为N的因子,是输出YES,不是输出NO。
INTEGERM,N
READ(*,*)M,N
IF(MOD(N,M)==0)THEN
WRITE(*,*)"YES"
ELSE
WRITE(*,*)"NO"
ENDIF
END
7、编程判断两位整数M是否为守形数。
所谓守形数是指该数本身等于自身平方的低位数,如25是守形数,因为252=625,而625的低两位为25。
是输出YES,不是输出NO。
INTEGERM
READ(*,*)M
IF(MOD(M*M,100)==M)THEN
WRITE(*,*)"YES"
ELSE
WRITE(*,*)"NO"
ENDIF
END
9已知
从键盘输入x,求出y的值。
REALX,Y
READ(*,*)X
IF(X>-15.AND.X<0)THEN
Y=COS(X+1)
ELSEIF(X>=0.AND.X<10)THEN
Y=LOG(X*X+1)
ELSEIF(X>15.AND.X<20)THEN
Y=X**(1.0/3)
ELSE
Y=X*X
ENDIF
WRITE(*,*)"Y=",Y
END
第四章循环结构程序设计第64页1、2、5、11、12
1.写出下列程序的执行结果
(1)1.0
(2)811
(3)k=6
(4)145
(5)5167
P.652.利用下式计算π的近似值。
IMPLICITNONE
REALPI
INTEGERI
PI=0
DOI=1,N
PI=PI+1.0/(4*I-3)-1.0/(4*I-1)
ENDDO
PRINT*,PI*4
END
P66习题5
IMPLICITNONE
INTEGERN,S,M,I
LOGICALFLAG
DON=3,999,2
FLAG=.TRUE.
M=SQRT(REAL(N))
DOI=2,M
IF(MOD(N,I)==0)THEN
FLAG=.FALSE.
EXIT
ENDIF
ENDDO
IF(FLAG)THEN
S=N/100+MOD(N/10,10)+MOD(N,10)
IF(MOD(S,2)/=0)PRINT*,N
ENDIF
ENDDO
END
P.66习题11
REALY0,Y1
READ(*,*)X
Y0=X
Y1=2*Y0/3+X/(3*Y0**2)
DOWHILE(ABS(Y1-Y0)>1E-5)
Y0=Y1
Y1=2*Y0/3+X/(3*Y0**2)
ENDDO
PRINT*,Y1
END
P.66习题12
Reala,b,m,x
f(x)=x**3-x**2-1
Read*,a,b
Dowhile(Abs(a-b)>1e-6)
m=(a+b)/2
If(f(a)*f(m)>0)then
a=m
Else
b=m
Endif
Enddo
Print*,(a+b)/2
END
第五章FORTRAN90数据类型第88页4、10
4.有一个三角形,顶点为X,Y,Z,其坐标分别为(1.5,2.0),(4.5,4.5),(18.0,10.5)。
求三角形的面积和重心(提示:
重心坐标=(X+Y+Z)/3利用复数计算)。
COMPLEXX,Y,Z,W
REALA,B,C,S,P
READ(*,*)X,Y,Z
A=ABS(X-Y)
B=ABS(Y-Z)
C=ABS(Z-X)
P=(A+B+C)/2
S=SQRT(P*(P-A)*(P-B)*(P-C))
W=(X+Y+Z)/3
WRITE(*,*)S
WRITE(*,*)W
END
10.设有 4个圆,圆心分别在(2,2),(-2,-2),(2,-2),(-2,2),半径为1。
当X,Y坐标点落在圆上和圆内时,Z=1;落在圆外时,Z=1;落在圆外时,Z=0。
编出相应的的程序(要求利用逻辑变量)。
IMPLICITNONE
LOGICALP,Q,R,S
REALX,Y
INTEGERZ
READ*,X,Y
Z=0
P=(X-2)**2+(Y-2)**2<=1
Q=(X+2)**2+(Y+2)**2<=1
R=(X-2)**2+(Y+2)**2<=1
S=(X+2)**2+(Y-2)**2<=1
IF(P.OR.Q.OR.R.OR.S)Z=1
PRINT*,Z
END
第七章数组第124页1、3、4、7、9、12
1.写出下列程序的执行结果
(1)
5.0
5.0
5.0
5.0
4.0
(2)K=5
(3)
123
456
789
101112
14710
25811
36912
(4)S=15.00
3.将一个数组的元素按逆序重新存放,例如,原来存放顺序为:
8,6,5,4,1。
要求改为:
1,4,5,6,8。
IMPLICITNONE
INTEGER,PARAMETER:
:
N=5
INTEGERA(N),I,T
DATAA/8,6,5,4,1/
WRITE(*,10)(A(I),I=1,5)
DOI=1,N/2
T=A(I)
A(I)=A(N-I+1)
A(N-I+1)=T
ENDDO
WRITE(*,10)(A(I),I=1,5)
10FORMAT(1X,5I4)
END
4.求数组中的最大和最小元素,并将最大和最小元素分别与数组的第一和第二元素互换。
IMPLICITNONE
INTEGERX(10),I,T,MA
!
变量MA存放最大数下标序号
X=(/10,55,25,70,45,15,25,85,45,35/)
WRITE(*,10)(X(I),I=1,10)
MA=1
DOI=2,10
IF(X(I)>X(MA))MA=I
ENDDO
T=X
(1)
X
(1)=X(MA)
X(MA)=T
WRITE(*,10)(X(I),I=1,10)
10FORMAT(1X,10I4)
END
7.求3×4矩阵中的最大元素和最小元素。
REALA(3,4),AMAX,AMIN
INTEGERI,J
DOI=1,3
READ(*,*)(A(I,J),J=1,4)
ENDDO
AMAX=A(1,1)
AMIN=A(1,1)
DOI=1,3
DOJ=1,4
IF(A(I,J)>AMAX)AMAX=A(I,J)
IF(A(I,J)ENDDO
ENDDO
WRITE(*,*)"最大值:
",AMAX
WRITE(*,*)"最小值:
",AMIN
END
9.输入5×5矩阵a,完成下列要求:
(1)输出矩阵a。
(2)将第2行和第5行元素对调后,输出新的矩阵a。
(3)用对角线上的各元素分别去除各元素所在行,输出新的矩阵a。
PARAMETER(N=5)
INTEGERA(N,N),I,J,T
DOI=1,N
READ(*,*)(A(I,J),J=1,5)
ENDDO
DOI=1,N
WRITE(*,10)(A(I,J),J=1,N)
ENDDO
DOI=1,N
T=A(2,I)
A(2,I)=A(5,J)
A(5,J)=T
ENDDO
DOI=1,N
WRITE(*,10)(A(I,J),J=1,N)
ENDDO
DOI=1,N
DOJ=1,N
A(I,J)=A(I,J)/A(I,I)
ENDDO
ENDDO
DOI=1,N
WRITE(*,10)(A(I,J),J=1,N)
ENDDO
10FORMAT(1X,5I5)
END
12.按以下格式打印出杨辉三角形的前N行。
1
11
121
1331
14641
15101051
PARAMETER(N=10)
INTEGERA(N,N),I,J
DOI=1,N
A(I,1)=1
A(I,I)=1
ENDDO
DOI=3,N
DOJ=2,I-1
A(I,J)=A(I-1,J)+A(I-1,J-1)
ENDDO
ENDDO
DOI=1,N
WRITE(*,10)(A(I,J),J=1,I)
ENDDO
10FORMAT(1X,10I5)
END
第八章子程序第173页1、6、8、12、13
1.指出下列错误的语句函数定义:
(1)F(X,Y)=X+Y+2+A-B正确
(2)SUM(X
(2),Y,Z)=3*Y+(X
(2)+Z)*Z错误
(3)F(X,Y,X)=X**2-Y+X+C-SIN(A)错误
(4)X2(Z,Y(I)=EXP(Z+1)-A*Y(I)错误
(5)LAN(A,B,C)=A*X+(B-C)**2-X*Y正确
6.设计一个计算n!
的函数子程序,并调用该子程序计算数e的近似值。
当n!
>1E8时停止计算。
计算公式是:
FUNCTIONJC(N)
JC=1
DOI=1,N
JC=JC*I
ENDDO
END
PROGRAMEX6
REAL*8E,T
E=0
T=1.0
I=0
DOWHILE(T>1E-8)
E=E+T
I=I+1
T=1.0/JC(I)
ENDDO
PRINT*,E
END
8.对任意自然数n,设计一个求n的各数位立方和的函数子程序F(n)(如F(121)=1**3+2**3+1**2=1+8+1=10),并调用F(n)求1000以内的所有水仙花数(水仙花数的概念请参看例8.5)。
!
子程序
FUNCTIONF(N)
INTEGERF,N,S,T
S=0
T=N
DOWHILE(T>0)
K=MOD(T,10)
S=S+K**3
T=T/10
ENDDO
F=S
END
!
主程序
PROGRAMEX8
INTEGERF,I
DOI=100,999
IF(F(I)==I)PRINT*,I
ENDDO
ENDDO
12.设计一个子例行程序,计算一个任意数组A中正数、负数和0的个数及其和。
!
子程序
SUBROUTINETJ(A,M,P,N,Z,S)
INTEGERA(M),M,P,N,Z,S,I
P=0
N=0
Z=0
S=0
DOI=1,M
IF(A(I)>0)THEN
P=P+1
ELSEIF(A(I)<0)THEN
N=N+1
ELSE
Z=Z+1
ENDIF
S=S+A(I)
ENDDO
END
!
主程序
INTEGERX(10),P,N,S,Z,I
DOI=1,10
READ(*,*)X(I)
ENDDO
CALLTJ(X,10,P,N,Z,S)
WRITE(*,*)"正数个数",P
WRITE(*,*)"负数个数",N
WRITE(*,*)"零数个数",Z
WRITE(*,*)"所有数的和",S
END
13.设计一个子例行程序SORT(A,N,K),其中A是一个一维数组,N是A的元素个数,SORT的功能是:
当K=1时,将数组A按升序排列;当K=0时,将数组A按降序排列;当K为其它数值时,数组A保持原序。
!
子程序
SUBROUTINESORT(A,N,K)
INTEGERA(N),K,P,T
DOI=1,N-1
P=I
DOJ=I+1,N
IF(K==1)THEN
IF(A(J)ELSE
IF(A(J)>A(P))P=J
ENDIF
ENDDO
T=A(I)
A(I)=A(P)
A(P)=T
ENDDO
END
!
主程序
PARAMETER(N=10)
INTEGERX(10),I
READ(*,*)X
WRITE(*,10)(X(I),I=1,N)
CALLSORT(X,N,1)!
将数组A按升序排列
WRITE(*,10)(X(I),I=1,N)
CALLSORT(X,N,0)!
将数组A按降序排列
WRITE(*,10)(X(I),I=1,N)
10FORMAT(1X,10I5)
END