Saturday, December 23, 2017

Rezolvarea ecuației de gradul al II-lea

Programatorul care se respectă, înainte de a se năpusti să scrie un text sursă oarecare stă și cugetă. El se întreabă:
- dacă se ia în calcul scrierea programului pentru a,b și c diferiți de zero?
- dacă programul calculează numai în cazul rădăcinilor reale și diferite?
- dacă se iau în considerare și cazurile particulare?
- dacă se scrie forma cea mai generală de program?
Răspunsurile la aceste întrebări îl duc pe programator către variante mai simple sau mai complicate de program. Aici este prezentată o variantă de soluționare a problemei folosind un subprogram.

            SUBROUTINE REZECGR2(A,B,C,X1RE,X1CMPL,X2RE, X2CMPL,IK)
            IF((A.EQ.0).AND.(B.EQ.0).AND.(C.EQ.0)) GO TO 70
            IF((A.EQ.0).AND.(B.EQ.0).AND.(C.NE.0)) GO TO 60
            IF((A.EQ.0).AND.(B.NE.0).AND.(C.EQ.0)) GO TO 50  
            IF((A.EQ.0).AND.(B.NE.0).AND.(C.NE.0)) GO TO 40
            IF((A.NE.0).AND.(B.EQ.0).AND.(C.NE.0).AND.(-C/A.GT.0)) GO TO 30
            IF((A.NE.0).AND.(B.EQ.0).AND.(C.NE.0).AND.(-C/A.LT.0)) GO TO 20
            DELTA=B*B 4*A*C
            IF(DELTA.LT.0) GO TO 10
            IK=1
            SQRDELTA=SRQT(DELTA)
            X1RE=(-B+SQRDELTA)/(2*A)
            X2RE=(-B-SQRDELTA)/(2*A)
            X1CMPL=0.
            X2CMPL=0.
            GO TO sigma
10        IK=2
            SQRDELTA=SRQT(-DELTA)
            X1RE=(-B)/(2*A)
            X2RE=(-B)/(2*A)
            X1CMPL=(SQRDELTA)/(2*A)
            X2CMPL=(-SQRDELTA)/(2*A)
            GO TO sigma
20        IK=3
            SQRDELTA=SRQT(-C/A)
            X1RE=0.
            X2RE=0.
            X1CMPL=SQRDELTA
            X2CMPL=-SQRDELTA
            GO TO sigma
 30       IK=4
            SQRDELTA=SRQT(C/A)
            X1RE=0.
            X2RE=0.
            X1CMPL=SQRDELTA
            X2CMPL=-SQRDELTA
            GO TO sigma
40        IK=5
            X1RE=-C/B
            X2RE=-C/B
            X1CMPL=0
            X2CMPL=0
            GO TO sigma
50        IK=6
            X1RE=0
            X2RE=0
            X1CMPL=0
            X2CMPL=0
            GO TO sigma
60        IK=7
            GO TO sigma
70        IK=8
            RETURN
            STOP
Variabila IK va avea următoarele valori:
            IK = 1 dacă a, b și c sunt toți diferiți de zero și discriminantul este pozitiv;
            IK = 2 dacă a, b și c sunt toți diferiți de zero și discriminantul este negativ;
            IK = 3 dacă a și c sunt diferiți de 0, b este zero și raportul c/a este negativ;
            IK = 4 dacă a și c sunt diferiți de 0, b este zero și raportul c/a este pozitiv; 
            IK = 5 dacă a este zero, b și c sunt nenuli;
            IK = 6 dacă a, și c sunt nuli și b este nenul, soluția este X1=0; 
            IK = 7 dacă a, b  sunt nuliși c este nenul, situație imposibilă;
            IK = 8 dacă a, b și c sunt toți egali cu zero și nu avem o ecuație. 
Semnificațiile identificatorilor utilizați în subrogram  sunt:
REZECGR2 - numele subprogramului de rezolvare ecuație de gradul al II-lea;
A,B,C - coeficienții ecuației de gradul al II-lea;
X1RE - partea reală a primei soluții;
X2RE - partea reală a celei de a doua soluții;
X1CMPL- partea imaginară a primei soluții;
X2CMPL- partea imaginară a primei soluții;
IK  -  indicatorul de stare al subprogramului;
SQRDELTA - valoarea radicalului din modulul discriminantului.
Cel ce utilizează acest subprogram este obligat să testeze valoarea indicatorului de stare IK și prelucrările sale să fie adaptate la semnificația valorilor atribuite prin execuția subrutinei.

(23 decembrie 2017)

No comments:

Post a Comment