2010-11-29 2 views
0

Я пытаюсь написать программу для решения квадратного уравнения. Если значение (B ** B-4 * A * C) равно 0 или отрицательно, оно должно немедленно написать, что " Корни уравнения сложны », но если положительный, он должен оцениваться. Кажется, моя логика ошибочна, независимо от того, какие значения я даю для A, B & C, я продолжаю получать «Корни уравнения сложны». Пожалуйста, смотрите код и результаты ниже. Благодарю.Нужна помощь с программой FORTRAN 77

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 КОРЫ КВАДРАТИЧЕСКОГО УРАВНЕНИЯ КОМПЛЕКСА КОРЕЙЫ КВАДРАТИЧЕСКОГО УРАВНЕНИЯ КОМПЛЕКСА

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

+2

Корни * * сложные, а не * is * сложные. – ja72 2010-11-29 14:00:28

ответ

3

Вау, я не видел вычисленный 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 
+1

Это действительно аспирантура? – duffymo 2010-11-29 13:23:13

+0

Аспирант для людей, не имеющих фона в вычислениях – 2010-12-01 11:34:57

1

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

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

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 
0

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

Смежные вопросы