0

我正在尝试编写一个程序来求解一个二次方程。如果 (B**B-4*A*C) 的值为 0 或负数,它应该立即写出“方程的根是复数”,但是如果是肯定的,它应该评估。看来我的逻辑是错误的,因为无论我为 A、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 

结果

D:\Postgraduate\Programming\FORTRAN>gfortran quad.f

D:\Postgraduate\Programming\FORTRAN>a.exe 8 3 2 二次方程的根很复杂 二次方程的根很复杂

D:\研究生\编程\FORTRAN>

4

4 回答 4

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
于 2010-11-29T18:03:03.843 回答
3

哇,我已经 20 多年没有见过计算过的 GOTO 了。

他们不可能还在用这种方式教人们如何编写 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 
于 2010-11-29T13:03:15.463 回答
1

就像 duffymo 所说,您正在评估D之前A, B, 并且C是从用户那里读取的。最后我检查了 FORTRAN 没有阅读用户思想的通灵能力。实际上它通常完全无视用户的意愿。只是在开玩笑。

将语句D=(B**2-4*A*C)移至READ,并根据FORTAN 90对样式进行现代化改造

于 2010-11-29T14:14:49.853 回答
0

您的程序的另一个问题是,一旦它执行了第 20 行,它将继续执行下一个可执行语句,在本例中是第 10 行,然后是第 15 行。这就是为什么您会得到“二次方程的根是二次方程的根是复数”。您可以通过在 STOP 之前使用 CONTINUE 语句并使用 GOTO 来解决此问题,但使用上面建议的方法之一会更好。

于 2010-12-04T13:18:26.883 回答