Нужна помощь с программой FORTRAN 77 - PullRequest
0 голосов
/ 29 ноября 2010

Я пытаюсь написать программу для решения квадратного уравнения. Если значение (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: \ Аспирант \ Программирование \ FORTRAN> gfortran quad.f

D: \ Аспирант \ Программирование \FORTRAN> a.exe 8 3 2 Корни квадратного уравнения сложны Корни квадратного уравнения сложны

D: \ Аспирантура \ Программирование \ FORTRAN>

Ответы [ 4 ]

3 голосов
/ 29 ноября 2010

Написано немного более современным способом. Измените строки по своему вкусу.

  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
3 голосов
/ 29 ноября 2010

Ух ты, я не видел компьютерного GOTO более 20 лет.

Возможно, они все еще не могут научить людей, как писать на фортране, не так ли?

Я бы использовал более современный стиль, например:

    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 голос
/ 29 ноября 2010

Как сказал Даффимо, вы оцениваете D до того, как A, B и C будут прочитаны пользователем. В последний раз я проверял, что у Фортрана нет экстрасенсорных способностей читать мысли пользователей. На самом деле это обычно полностью игнорирует пожелания пользователя. Шучу.

Переместите D=(B**2-4*A*C) после READ операторов и модернизируйте стиль в соответствии с FORTAN 90

0 голосов
/ 04 декабря 2010

Другая проблема с вашей программой заключается в том, что, как только она выполнила строку 20, она затем перейдет к выполнению следующего исполняемого оператора, который в данном случае является строкой 10, а затем 15. Поэтому вы получаете «КОРНИ ИЗ КВАДРАТИЧЕСКОЕ УРАВНЕНИЕ СЛОЖНО Корни квадратичного уравнения СЛОЖНО ". Вы можете исправить это, используя оператор CONTINUE непосредственно перед STOP и используя GOTO, чтобы получить его, но было бы намного лучше использовать один из предложенных выше подходов.

...