需要FORTRAN 77程序的帮助吗

需要FORTRAN 77程序的帮助吗,fortran,fortran77,Fortran,Fortran77,我正试图编写一个程序来解一个二次方程。如果(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 R

我正试图编写一个程序来解一个二次方程。如果(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:\prograduate\Programming\FORTRAN>gfortran quad.f

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


D:\prograduate\Programming\FORTRAN>

哇,我已经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 

正如达夫莫所说,在从用户读取
A
B
C
之前,您正在评估
D
。上次我检查FORTRAN没有通灵能力来读取用户的思想。实际上,它通常完全无视用户的意愿。只是开玩笑


D=(B**2-4*A*C)
移动到
READ
语句之后,并根据以稍微现代的方式编写的使样式现代化。根据您的喜好修改字符串

  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
程序根
!目的:
! 这个程序求解一个二次方程的根
! 表格a*x**2+b*x+c=0。不管怎样,它都会计算答案
! 方程所具有的根的类型。
隐式无
实数::a,b,c,判别式,imag_部分,实数_部分,x1,x2
写(*,*)“此程序求解二次曲线的根”
写下(*,*)“形式为A*X**2+B*X+C=0的方程式。”
写(*,*)'输入系数A、B和C:'
读(*,*)a、b、c
写(*,*)'系数A、B和C为:',A、B、C
判别式=b**2-4.*a*c
如果(判别式>0),则
!有两个真正的根,所以。。。
x1=(-b+sqrt(判别式))/(2.*a)
x2=(-b-sqrt(判别式))/(2.*a)
写(*,*)'这个方程有两个实根:'
写入(*,*)“X1=”,X1
写入(*,*)“X2=”,X2

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

这真的是研究生编程吗?没有计算机背景的人的研究生我以为二次方程是在高中教的。为什么要教Fort当有这么多其他可行的语言选择的时候,为什么不教Fortran呢?它仍然被广泛使用,而且还在开发中。我使用Fortran(不是77;)和Perl,我对这种组合感到非常高兴;特别是Fortran的数组处理能力非常强大!我没有说“不要教Fortran”,我说的是“用这种方式教Fortran”。转到和标签,而不是if/then/else?它甚至不接近。根是复杂的,不是复杂的。非常感谢所有的回复。漂亮的代码,Rook。不过,我会将实数常量编码为“4.0”和“2.0”——只是出于风格上的原因。(因为“2.*a”的“*”部分在我看来像一个正则表达式!)@Steve Rawlins-非常感谢。如果你认为这个例子有帮助的话,一定要修改它。