[updated 30.May.2000]
Librairie redlib > Fichier redmat.f |
SUBROUTINE REDMAT (TEXTE,TEXTEC,NER,N1,N2,FLOT)
Auteur : D.Martin (Mai 1996)
Derniere modification (D.Martin) le 20 Mai 1996
Valeur d'expression mathematique sous forme de chaine de caracteres ASCII
-- Argument d'entree --
TEXTE chaine de caractere "expression mathematique"
TEXTEC tableau de caracteres "equivalent"
NER numero d'erreur
=1 nombre invalide
=2 expression mathematique invalide
=3 operande invalide
N1 numero du 1er caractere de la sous-chaine contenant l'erreur
N2 numero du dernier caractere de la sous-chaine contenant l'erreur
FLOT valeur de l'expression si NER=0
CHARACTER TEXTE*(*),TEXTEC(*)
INTEGER NER,N1,N2
DOUBLEPRECISION FLOT
INTEGER NI,NF,RAN1OD,RAN1OF,RAN2OD,RAN2OF
DOUBLEPRECISION EPSI,FLOT2
DATA EPSI/3.D-16/
NI=1
NF=LEN (TEXTE)
IF (NI.GT.NF) RETURN
CALL REDOPE (TEXTE(NI:NF),RAN1OD,RAN1OF)
RAN1OD=RAN1OD+NI-1
RAN1OF=RAN1OF+NI-1
N1=NI
N2=NF
IF (RAN1OD.LE.0) THEN
Operation unaire
N1=NI
N2=NF
CALL REDVAL (TEXTE,TEXTEC,NER,FLOT)
RETURN
ELSE
CALL REDOPE (TEXTE(RAN1OF+1:NF),RAN2OD,RAN2OF)
IF (RAN2OD.GT.0) THEN
NER=4
RETURN
ENDIF
ENDIF
N1=NI
N2=RAN1OD-1
CALL REDVAL (TEXTE(N1:N2),TEXTEC(N1),NER,FLOT)
IF (NER.NE.0) RETURN
N1=RAN1OF+1
N2=NF
CALL REDVAL (TEXTE(N1:N2),TEXTEC(N1),NER,FLOT2)
IF (NER.NE.0) RETURN
IF (TEXTE(RAN1OD:RAN1OF).EQ.'**'
&.OR.TEXTE(RAN1OD:RAN1OD).EQ.'^') THEN
Exponentation
IF (FLOT.LE.0.D0.AND.ABS(FLOT2-INT(FLOT2)).GE.EPSI) NER=3
IF (NER.NE.0) RETURN
FLOT = FLOT**FLOT2
RETURN
ELSEIF (TEXTE(RAN1OD:RAN1OD).EQ.'*') THEN
Multiplication
FLOT = FLOT*FLOT2
RETURN
ELSEIF (TEXTE(RAN1OD:RAN1OD).EQ.'/') THEN
Division
IF (ABS(FLOT2).LE.EPSI) NER=3
IF (NER.NE.0) RETURN
FLOT = FLOT/FLOT2
RETURN
ELSEIF (TEXTE(RAN1OD:RAN1OD).EQ.'+') THEN
Addition
FLOT = FLOT+FLOT2
RETURN
ELSEIF (TEXTE(RAN1OD:RAN1OD).EQ.'-') THEN
Soustraction
FLOT = FLOT-FLOT2
RETURN
ENDIF
END !RedMat
redmat est appelé dans