2010-11-29 30 views
0

J'essaie d'écrire un programme pour résoudre une équation quadratique. Si la valeur de (B ** B-4 * A * C) est 0 ou négative, il faut écrire immédiatement que " Les racines de l'équation sont complexes ", mais si elles sont positives, elles devraient être évaluées. Il me semble que ma logique est fausse, peu importe les valeurs que je donne pour A, B & C, je continue d'obtenir "Les racines de l'équation sont complexes". S'il vous plaît voir le code et les résultats ci-dessous. Merci.Besoin d'aide avec un programme 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 

RESULTAT

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

D: \ Postgraduate \ Programmation \ FORTRAN> a.exe LES RACINES DE L'ÉQUATION QUADRATIQUE SONT COMPLEXES LES RACINES DE L'ÉQUATION QUADRATIQUE SONT COMPLEXES

D: \ Postgraduate \ Programming \ FORTRAN>

+2

Les racines * sont * complexes, pas * est * complexe. – ja72

Répondre

3

Wow, je n'ai pas vu un GOTO calculé depuis plus de 20 ans.

Ils ne peuvent toujours pas enseigner aux gens comment écrire FORTRAN de cette façon, n'est-ce pas?

j'utiliser un style plus moderne, comme celui-ci:

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

Est-ce vraiment une programmation de troisième cycle? – duffymo

+0

Postgraduate pour les personnes sans expérience en informatique –

+0

Je pensais que les équations quadratiques étaient enseignées au lycée. Et pourquoi enseigner à Fortran une telle chose alors qu'il y a tant d'autres choix viables pour la langue? C'est un mystère. – duffymo

1

Comme duffymo dit, vous évaluez D avant A, B et C sont lues par l'utilisateur. Dernière fois que j'ai vérifié Fortran n'a pas les capacités psychiques de lire dans les pensées des utilisateurs. En fait, il habituellement complètement ignore les souhaits de l'utilisateur. Je rigole.

Déplacer le D=(B**2-4*A*C) à après les déclarations READ et modernisent le style selon FORTAN 90

3

Écrit façon un peu plus moderne. Modifiez les chaînes à votre goût.

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

Merci beaucoup pour toutes les réponses. –

+0

Beau code, Rook. J'aurais codé les constantes REAL comme "4.0" et "2.0 ", cependant - pour des raisons stylistiques seulement (parce que la partie". * "De" 2. * a "ressemble à une expression régulière pour moi!) –

+0

@Steve Rawllins - Merci beaucoup. vous pensez que ça va aider. – Rook

0

Un autre problème avec votre programme est qu'une fois qu'il a exécuté la ligne 20, il sera alors continuer à exécuter la prochaine instruction exécutable, qui dans ce cas est la ligne 10, suivie par 15. C'est la raison pour laquelle vous obtenez " LES RACINES DE L'ÉQUATION QUADRATIQUE SONT COMPLEXES LES RACINES DE L'ÉQUATION QUADRATIQUE EST COMPLEXE ". Vous pouvez corriger cela en utilisant une instruction CONTINUE juste avant STOP, et en utilisant GOTO pour y arriver, mais il serait préférable d'utiliser l'une des approches suggérées ci-dessus.