Нужна помощь с программой FORTRAN 77

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

D:\Postgraduate\Programming\FORTRAN>a.exe 8 3 2 КОРНИ КВАДРАТНОГО УРАВНЕНИЯ КОМПЛЕКСНЫЕ КОРНИ КВАДРАТНОГО УРАВНЕНИЯ КОМПЛЕКСНЫЕ

D:\Аспирант\Программирование\ФОРТРАН>


person Lucien Mavor    schedule 29.11.2010    source источник
comment
Корни являются сложными, а не являются сложными.   -  person John Alexiou    schedule 29.11.2010


Ответы (4)


Вау, я не видел вычисляемого GOTO более 20 лет.

Неужели они до сих пор не могут учить людей писать на 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 
person duffymo    schedule 29.11.2010
comment
Это действительно постдипломное программирование? - person duffymo; 29.11.2010
comment
Аспирантура для людей без опыта работы с компьютерами - person Lucien Mavor; 01.12.2010
comment
Я думал, что квадратные уравнения изучают в средней школе. И зачем учить Фортран таким вещам, когда есть так много других жизнеспособных вариантов языка? Это тайна. - person duffymo; 01.12.2010
comment
Почему бы не преподавать Фортран? Он по-прежнему широко используется и развивается. Я использую Fortran (но не 77 ;) ) и Perl, и я очень доволен этой комбинацией; особенно возможности обработки массивов Fortran великолепны! - person canavanin; 12.12.2010
comment
Я не говорил не учить Фортран, я сказал Фортран таким образом. GOTO и метки вместо if/then/else? Это даже не близко. - person duffymo; 12.12.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
person Rook    schedule 29.11.2010
comment
Большое спасибо за все ответы. - person Lucien Mavor; 01.12.2010
comment
Красивый код, Рук. Я бы закодировал НАСТОЯЩИЕ константы как 4.0 и 2.0, но только по стилистическим соображениям. (Потому что часть .* в 2.*a мне кажется регулярным выражением!) - person Steve Rawlins; 01.04.2016
comment
@Steve Rawllins - Большое спасибо. Во что бы то ни стало, измените пример, если считаете, что это поможет. - person Rook; 01.04.2016

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

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

person John Alexiou    schedule 29.11.2010

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

person djr    schedule 04.12.2010