我正在尝试编写一个程序来解决二次方程式。如果(B ** B-4 * A * C)的值为0或负数,它应该立即写出“方程的根是复杂的“,但如果是积极的,它应该评估。无论我为A,B和B提供什么价值,我的逻辑似乎都是错误的。 C,我不断得到“等式的根源是复杂的”。请参阅下面的代码和结果。感谢。
PROGRAM QUADEQN
INTEGER A,B,C
REAL D,X,Y,Q
D=(B**2-4*A*C)
Q=SQRT(D)
READ(*,5)A
READ(*,6)B
READ(*,7)C
IF(B**2-4*A*C)10,15,20
X=(-B+Q)/(2*A)
Y=(-B-Q)/(2*A)
20 WRITE(*,25)X,Y
5 FORMAT(I2)
6 FORMAT(I2)
7 FORMAT(I2)
10 WRITE(*,*)'THE ROOTS OF THE QUADRATIC EQUATION IS COMPLEX'
15 WRITE(*,*)'THE ROOTS OF THE QUADRATIC EQUATION IS COMPLEX'
25 FORMAT(/,'THE ROOTS OF THE EQN ARE',1X,F8.4,'AND',1X,F8.4)
STOP
END
RESULT
D:\研究生\编程\ FORTRAN> gfortran quad.f
d:\研究生\编程\ FORTRAN> A.EXE 8 3 2 二次方程的根是复杂的 二次方程的根是复杂的
d:\研究生\编程\ FORTRAN>
答案 0 :(得分:3)
他们不可能仍然教人们如何以这种方式写FORTRAN,是吗?
我会使用更现代的风格,如下:
PROGRAM QUADEQN
INTEGER A,B,C
REAL D,X,Y,Q
READ(*,5)A
READ(*,6)B
READ(*,7)C
D=(B**2-4*A*C)
IF(D .LE. 0.0) THEN
10 WRITE(*,*)'THE ROOTS OF THE QUADRATIC EQUATION IS COMPLEX'
ELSE IF (D .EQ. 0.0) THEN
WRITE(*,*)'WHAT SHOULD YOU SAY ABOUT THE ROOTS HERE?'
ELSE
25 FORMAT(/,'THE ROOTS OF THE EQN ARE',1X,F8.4,'AND',1X,F8.4)
Q=SQRT(D)
X=(-B+Q)/(2*A)
Y=(-B-Q)/(2*A)
20 WRITE(*,25)X,Y
END IF
5 FORMAT(I2)
6 FORMAT(I2)
7 FORMAT(I2)
STOP
END
答案 1 :(得分:3)
以更现代的方式写作。根据自己的喜好修改字符串。
PROGRAM roots
!Purpose:
! This program solves for the roots of a quadratic equation of the
! form a*x**2 + b*x + c = 0. It calculates the answers regardless
! of the type of roots that the equation possesses.
IMPLICIT NONE
REAL :: a, b, c, discriminant, imag_part, real_part, x1, x2
WRITE(*,*) 'This program solvenes for the roots of a quadratic'
WRITE(*,*) 'equation of the form A * X**2 + B * X + C = 0.'
WRITE(*,*) 'Enter the coefficients A, B and C:'
READ(*,*)a,b,c
WRITE(*,*) 'The coefficients A, B and C are: ',a,b,c
discriminant = b**2 - 4.*a*c
IF (discriminant>0.) THEN
!there are two real roots, so ...
x1 = (-b + sqrt(discriminant)) / (2.*a)
x2 = (-b - sqrt(discriminant)) / (2.*a)
WRITE(*,*) 'This equation has two real roots:'
WRITE(*,*) 'X1 = ',x1
WRITE(*,*) 'X2 = ',x2
ELSE IF (discriminant<0.) THEN
!there are complex roots, so ...
real_part = (-b)/(2.*a)
imag_part = sqrt(abs(discriminant))/(2.*a)
WRITE(*,*) 'This equation has comples roots:'
WRITE(*,*) 'X1 = ',real_part,' +i ',imag_part
WRITE(*,*) 'X2 = ',real_part,' -i ',imag_part
ELSE
!here is one repeated root, so ...
x1 = (-b)/(2.*a)
WRITE(*,*) 'This equation has two identical real roots:'
WRITE(*,*) 'X1 = X2 =',x1
END IF
END PROGRAM roots
答案 2 :(得分:1)
就像duffymo所说,您在D
之前评估A
,B
,并且从用户处读取C
。最后我检查了FORTRAN没有心灵能力来阅读用户的思想。实际上它通常完全忽略用户的意愿。开个玩笑。
将D=(B**2-4*A*C)
移至READ
语句后,并根据FORTAN 90
答案 3 :(得分:0)
你的程序的另一个问题是,一旦它执行第20行,它将继续执行下一个可执行语句,在这种情况下是第10行,然后是15.这就是为什么你得到“的根本”二次方程是复杂的,二次方程的根是复杂的“。您可以通过在STOP之前使用CONTINUE语句并使用GOTO来实现此目的来解决此问题,但使用上面提到的方法之一会更好。