Publié par momo38 le 27/01/2007
entre une chaine ce caractéres,teste sa syntaxe,et l'evalue
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316
DEFINT A-Z
DECLARE FUNCTION INCALCUL$ ()
DECLARE FUNCTION RESULTAT$ (a$)
DECLARE FUNCTION Test (a$, er)
SCREEN 0, 0, 0, 0
ON ERROR GOTO ERREUR
DO
'cr‚ation d'une chaine valide … ‚valuer
CLS : k$ = INCALCUL$: IF k$ = CHR$(27) THEN EXIT DO
'‚valuation
G$ = RESULTAT$(k$): LOCATE , , 0
'affichage du r‚sultat ou d'une erreur
IF errcal$ = "" THEN
PRINT : PRINT G$;
ELSE
LOCATE 23, 1: PRINT errcal$; TAB(80); " "; : errcal$ = ""
END IF
k$ = INPUT$(1): LOCATE 23, 1: PRINT TAB(80); " ";
LOOP UNTIL k$ = CHR$(27)
CLS
END
ERREUR:
SOUND 4000, 3
SELECT CASE ERR
CASE 11
errcal$ = " PAS DE DIVISION PAR ZERO !"
CASE 6
errcal$ = " DEPASSEMENT DE CAPACITE DE CALCUL !"
CASE ELSE
errcal$ = "Erreur impr‚vue Nø" + STR$(ERR)
END SELECT
RESUME NEXT
DOC:
DATA " MODE D'EMPLOI"
DATA
DATA " [+] Addition, [-] Soustraction, [*] Multiplication, [/] Division"
DATA " [^] Puissance, [.] est la virgule d‚cimale [F1] Mode d'emploi"
DATA " [ESC] Quitter le programme [ENTER] Evalue l'expression en cours."
DATA " ÄÄ Le programme respecte la syntaxe alg‚brique classique, un texte d'aide"
DATA " (et/ou) un beep indique toutes erreurs de syntaxe."
DATA " ÄÄ Deux op‚rateurs cons‚cutifs sont refus‚s sauf *- , /- ou ^- compris"
DATA " comme la multiplication, la division ou la puissance n‚gative."
DATA " ÄÄ Chaque terme num‚rique doit ˆtre ‚crit sous forme d‚cimale de"
DATA " 16 caractŠres maximum, pas de forme exponentielle telle '1,3D+4',"
DATA " On peut toutefois ‚crire 10^6 , 10^-3 ou 1.475*5.1^-6.23"
DATA " ÄÄ La pr‚cision du r‚sultat est de 16 chiffres significatifs."
DATA " Ce r‚sultat est affich‚ avec sa pr‚cision maximum ."
DATA " ÄÄ Les r‚sultats sont arrondis (et/ou) ‚crits sous forme exponentielle"
DATA " si leurs repr‚sentations d‚passent la pr‚cision maximum."
DATA " ÄÄ Les flŠches [Gauche] et [Droite] d‚placent le curseur en vue de corriger."
DATA " ÄÄ L'appui sur les touches [backspace] ou [delete] permettent de corriger."
DATA
DATA " Observons quelques exemples de calculs r‚alis‚s:"
DATA " 10+4*2+1= 19 ;10-4*-2+1= 19 ;10.3-4/2-1= 7.3 ;-5+2.1*3/7*5-1.1= -1.6"
DATA " ÀÂÙ ÀÂÄÙ ÀÂÙ ÀÄÄÁÂÁÄÙ"
DATA " 10 +8 +1= 19 ;10 +8 +1= 19 ;10.3 -2 -1= 7.3 ;-5 +4.5 -1.1= -1.6"
DATA " 2^5*2^3/256=1 ; 2^.5 = 1.414213562373095 (La racine de 2)"
DATA " 1+10^-3^4 = 1+10 puissance(-3*4) = 1+10^-12 = 1.000000000001"
FUNCTION INCALCUL$
DIM e$(6)
e$(0) = " Seul un chiffre peut ˆtre derriŠre un point d‚cimal"
e$(1) = " Valeur num‚rique de plus de 16 chiffres significatifs"
e$(2) = " Valeur num‚rique contenant plusieurs points d‚cimaux"
e$(3) = " Le caractŠre pr‚c‚dent est d‚j… un op‚rateur"
e$(4) = " Pas d'expression … ‚valuer !"
e$(5) = " Le dernier caractŠre de la ligne ne peut ˆtre un op‚rateur"
e$(6) = " Les op‚rateurs *,/,^,! sont interdits en d‚but de ligne"
c1$ = ":=;,&‚" + CHR$(34) + "'(Š_‡…": c2$ = "/+..123457890"
dc = POS(0): dl = CSRLIN: LOCATE , , 1, 5, 7
DO
DO
k$ = INKEY$: WHILE k$ = "": k$ = INKEY$: WEND
IF sit > 0 THEN dcar$ = MID$(a$, sit, 1) ELSE dcar$ = ""
i = INSTR(c1$, k$): IF i THEN k$ = MID$(c2$, i, 1)
IF INSTR("0123456789", k$) <> 0 THEN
IF nch < 16 THEN
nch = nch + 1: EXIT DO
ELSE
IF ins = 1 THEN EXIT DO
er = 1: GOSUB AffEr
END IF
ELSEIF k$ = "." THEN
IF dec = 0 AND nch < 16 THEN
dec = 1: EXIT DO
ELSE
IF ins = 1 THEN EXIT DO
IF dec = 1 THEN er = 2 ELSE er = 1
GOSUB AffEr
END IF
ELSEIF k$ = "-" THEN
IF dcar$ = "." THEN
er = 0: GOSUB AffEr
ELSEIF dcar$ = "" THEN
dec = 0: nch = 0: EXIT DO
ELSEIF INSTR("+-", dcar$) = 0 OR dcar$ = "" THEN
dec = 0: nch = 0: EXIT DO
ELSE
er = 3: GOSUB AffEr
END IF
ELSEIF k$ = "+" THEN
IF dcar$ = "." THEN
er = 0: GOSUB AffEr
ELSEIF INSTR("*+-/", dcar$) = 0 OR dcar$ = "" THEN
dec = 0: nch = 0: EXIT DO
ELSE
er = 3: GOSUB AffEr
END IF
ELSEIF k$ = "*" OR k$ = "/" OR k$ = "^" THEN
IF dcar$ = "." THEN
er = 0: GOSUB AffEr
ELSEIF INSTR("*+-^/", dcar$) = 0 THEN
dec = 0: nch = 0: EXIT DO
ELSE
IF dcar$ = "" THEN er = 6 ELSE er = 3
GOSUB AffEr
END IF
ELSEIF k$ = CHR$(8) AND sit > 0 THEN
GOSUB EFCAR
ELSEIF k$ = CHR$(13) THEN
IF a$ = "" THEN
er = 4: GOSUB AffEr
ELSE
GOSUB teste
IF x = 0 THEN
LOCATE lin, col: INCALCUL$ = a$
EXIT FUNCTION
ELSE
sit = x - 1: icol = x MOD 80: ilin = dl + x \\ 80
IF icol = 0 THEN icol = 80: ilin = ilin - 1
ins = 1: LOCATE 23, 1: SOUND 99, 1
PRINT e$(er); " Corriger..."; TAB(80); " ";
LOCATE ilin, icol
k$ = INKEY$: WHILE k$ = "": k$ = INKEY$: WEND
x = 0: LOCATE 23, 1: PRINT TAB(80); " "; : LOCATE ilin, icol
END IF
END IF
ELSEIF k$ = CHR$(27) THEN
INCALCUL$ = k$: EXIT FUNCTION
ELSEIF k$ = CHR$(0) + CHR$(59) THEN
RESTORE DOC
FOR i = 1 TO 25: LOCATE i, 1: READ F$: PRINT F$; TAB(80); " "; : NEXT
SLEEP: CLS
ELSEIF k$ = CHR$(0) + CHR$(75) THEN 'gauche
IF sit = 0 THEN
SOUND 99, 1
ELSE
IF icol = 1 THEN icol = 80: ilin = ilin - 1 ELSE icol = icol - 1
ins = 1: sit = sit - 1: LOCATE ilin, icol: nch = 0: dec = 0
END IF
ELSEIF k$ = CHR$(0) + CHR$(77) THEN 'droite
IF sit = lon THEN
SOUND 99, 1
ELSE
IF icol = 80 THEN icol = 1: ilin = ilin + 1 ELSE icol = icol + 1
LOCATE ilin, icol: sit = sit + 1: nch = 0: dec = 0
IF sit = lon THEN ins = 0
END IF
ELSEIF k$ = CHR$(0) + CHR$(83) THEN 'supp
IF ins = 1 AND lon > sit THEN
a$ = LEFT$(a$, sit) + RIGHT$(a$, lon - sit - 1): LOCATE dl, dc
PRINT a$ + " "; : LOCATE dl, dc: PRINT a$;
col = POS(0): lin = CSRLIN: lon = lon - 1: LOCATE ilin, icol
IF lon = sit THEN ins = 0
ELSE
SOUND 99, 1
END IF
ELSEIF k$ = CHR$(0) + CHR$(79) THEN 'fin
ins = 0: LOCATE lin, col: icol = col: ilin = lin: sit = lon
ELSEIF k$ = CHR$(0) + CHR$(71) THEN 'debut
ins = 1: LOCATE dl, dc: icol = dc: ilin = dl: sit = 0
ELSE
SOUND 98, .5
END IF
LOOP
IF ins = 0 THEN
a$ = a$ + k$: FOR i = 1 TO LEN(k$): PRINT MID$(k$, i, 1); : NEXT
lon = lon + LEN(k$): sit = lon: col = POS(0): lin = CSRLIN: ilin = lin: icol = col
ELSE
a$ = LEFT$(a$, sit) + k$ + RIGHT$(a$, lon - sit): LOCATE dl, dc: PRINT a$;
lon = lon + LEN(k$): sit = sit + LEN(k$): col = POS(0): lin = CSRLIN
icol = icol + LEN(k$): IF icol > 80 THEN icol = icol MOD 80: ilin = ilin + 1
LOCATE ilin, icol
END IF
LOOP
AffEr:
pl = CSRLIN: pc = POS(0): LOCATE 23, 1: SOUND 99, 1
PRINT e$(er); TAB(80); " "; : LOCATE pl, pc
k$ = INKEY$: WHILE k$ = "": k$ = INKEY$: WEND
LOCATE 23, 1: PRINT TAB(80); " "; : LOCATE pl, pc: k$ = ""
RETURN
EFCAR:
a$ = LEFT$(a$, sit - 1) + RIGHT$(a$, lon - sit): LOCATE dl, dc
PRINT a$ + " "; : LOCATE dl, dc: PRINT a$;
col = POS(0): lin = CSRLIN: lon = lon - 1: sit = sit - 1
IF icol = 1 THEN icol = 80: ilin = ilin - 1 ELSE icol = icol - 1
LOCATE ilin, icol
IF ins = 0 THEN
IF nch OR dec THEN
IF dcar$ = "." THEN dec = 0 ELSE nch = nch - 1
ELSE
FOR F = LEN(a$) TO 1 STEP -1
IF INSTR("0123456789", MID$(a$, F, 1)) = 0 THEN EXIT FOR
nch = nch + 1
NEXT
END IF
END IF
RETURN
teste:
IF INSTR("*+/-^.", RIGHT$(a$, 1)) > 0 THEN x = LEN(a$): er = 5: RETURN
car$ = "": dec = 0: nch = 0
FOR II = 1 TO LEN(a$)
dcar$ = car$: car$ = MID$(a$, II, 1)
IF INSTR("0123456789", car$) THEN
nch = nch + 1: IF nch > 16 THEN er = 1: x = II: RETURN
ELSEIF car$ = "." THEN
dec = dec + 1: IF dec > 1 THEN er = 2: x = II: RETURN
ELSE
dec = 0: nch = 0
IF car$ = "+" THEN
IF dcar$ = "." THEN er = 0: x = II: RETURN
IF dcar$ <> "" THEN IF INSTR("*+-/", dcar$) > 0 THEN er = 3: x = II: RETURN
ELSEIF car$ = "-" THEN
IF dcar$ = "." THEN er = 0: x = II: RETURN
IF dcar$ <> "" THEN IF INSTR("+-", dcar$) > 0 THEN er = 3: x = II: RETURN
ELSEIF car$ = "*" OR car$ = "/" OR car$ = "^" THEN
IF dcar$ = "." THEN er = 0: x = II: RETURN
IF dcar$ = "" THEN er = 6: x = II: RETURN
IF INSTR("*+-^/", dcar$) > 0 THEN er = 3: x = II: RETURN
END IF
END IF
NEXT
RETURN
END FUNCTION
DEFDBL T
FUNCTION RESULTAT$ (ax$)
SHARED errcal$
FOR i = 1 TO LEN(ax$)
dcar$ = car$: car$ = MID$(ax$, i, 1)
IF INSTR("0123456789.", car$) > 0 THEN
a$ = a$ + car$
ELSEIF car$ = "+" THEN
IF dcar$ = "" OR INSTR("^", dcar$) > 0 THEN
'rien faire
ELSE
a$ = a$ + car$
END IF
ELSE
a$ = a$ + car$
END IF
NEXT
x = 1: CH$ = "": Px = 1: dcar$ = "": car$ = ""
FOR i = 1 TO LEN(a$)
IF errcal$ <> "" THEN EXIT FUNCTION
dcar$ = car$: car$ = MID$(a$, i, 1)
IF INSTR("0123456789.", car$) THEN
CH$ = CH$ + car$
ELSE
IF car$ = "^" THEN
IF P THEN Px = Px * VAL(CH$) ELSE TP = VAL(CH$)
P = P + 1: CH$ = ""
ELSEIF car$ = "+" THEN
IF INSTR("^+-*/", dcar$) = 0 THEN GOSUB ADDSOUS: x = 1
ELSEIF car$ = "-" THEN
IF i > 1 AND (k OR P) THEN
IF INSTR("*/^", MID$(a$, i - 1, 1)) THEN
CH$ = CH$ + car$
ELSE
GOSUB ADDSOUS: x = -1
END IF
ELSE
GOSUB ADDSOUS: x = -1
END IF
ELSEIF car$ = "*" OR car$ = "/" THEN
GOSUB MULTDIVPUIS: IF car$ = "*" THEN k = 1 ELSE k = 2
END IF
END IF
NEXT
GOSUB ADDSOUS
w$ = LTRIM$(STR$(T)): xxx = INSTR(w$, "D")
IF xxx THEN
xx$ = RIGHT$(w$, LEN(w$) - xxx)
IF ASC(xx$) = 43 THEN xx$ = RIGHT$(xx$, LEN(xx$) - 1)
w$ = LEFT$(w$, xxx - 1) + "*10^" + xx$
END IF
RESULTAT$ = w$
EXIT FUNCTION
ADDSOUS:
GOSUB MULTDIVPUIS
T = T + T2 * x: k = 0
RETURN
MULTDIVPUIS:
T1 = VAL(CH$): CH$ = ""
IF P THEN T1 = TP ^ (Px * T1): Px = 1: P = 0
IF k = 1 THEN
T2 = T2 * T1
ELSEIF k = 2 THEN
T2 = T2 / T1
ELSE
T2 = T1
END IF
RETURN
END FUNCTION