00001 #include "../../include/Parser/TParserValore.h"
00002 #include <math.h>
00003 int FlagErrore;
00004 #ifdef __WXWIN__
00005 int _matherr( struct _exception *except )
00006 #endif
00007 #ifdef __WXGTK__
00008 int _matherr( struct __exception *except )
00009 #endif
00010 {
00011 except->retval=0;
00012 FlagErrore=1;
00013 return 1;
00014 }
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034 double TParserValore::CalcolaValore(rif*vettore_rif, double valor[] ,int* errore)
00035 {
00036 int conta=0;
00037 double temp;
00038 int i;
00039 double valore;
00040
00041
00042 int numero_scomposizioni=vettore_rif->numero_scomposizioni;
00043 vettore_riferimenti=vettore_rif;
00044 valori=valor;
00045 FlagErrore=0;
00046 *errore=0;
00047
00048 try
00049 { while ((conta <numero_scomposizioni)&&(FlagErrore == 0))
00050 { temp = Elabora(((vettore_riferimenti+conta)->scomposizioni)) ;
00051 i = 2;
00052 while ((i <= (vettore_riferimenti+conta)->lunghezza_scomp)&&(FlagErrore == 0))
00053 {if (**((((vettore_riferimenti+conta)->scomposizioni)+i-1)->scomposizione)=='+')
00054 temp = temp + Elabora((((vettore_riferimenti+conta)->scomposizioni)+i));
00055 else
00056 temp = temp - Elabora((((vettore_riferimenti+conta)->scomposizioni)+i));
00057
00058 i = i + 2;
00059 }
00060 (vettore_riferimenti+conta)->valore = temp;
00061 conta++;
00062 }
00063 valore = (vettore_riferimenti+numero_scomposizioni-1)->valore;
00064 }catch(...)
00065 {
00066 *errore=1;
00067 return(0);
00068 }
00069 if (FlagErrore == 1)
00070 {*errore = 1;
00071 return(0);
00072 }
00073 return(valore);
00074 }
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095 double TParserValore::Elabora(scompos* scomposizione)
00096 { int i=1;
00097 char** matrice=(*scomposizione).scomposizione;
00098 double valore=Traduci(*matrice);
00099
00100 while (i <(*scomposizione).n_colonne-1)
00101 {
00102 switch(**(matrice+i))
00103 { case '*':
00104 valore*=Traduci(*(matrice+i+1));
00105 break;
00106 case '/':
00107 valore/=Traduci(*(matrice+i+1));
00108 break;
00109 default:
00110 valore=pow(valore,Traduci(*(matrice+i+1)));
00111 }
00112 i+=2;
00113 }
00114
00115 return(valore);
00116
00117 }
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140 double TParserValore::Traduci(char* funzione)
00141 {
00142
00143 char funzione_temp2[20];
00144
00145 if (Isnumeric(funzione)==0)
00146 { if (funzione[1] == '\0')
00147 return((vettore_riferimenti+funzione[0] - 97)->valore);
00148 else
00149 { if((funzione[0]=='S')&&(funzione[1]=='i')&&(funzione[2]=='n'))
00150 { if(funzione[3]=='[')
00151 return(sin(valori[funzione[4]-48]));
00152 else
00153 { Mid(funzione_temp2,funzione, 4, Len(funzione) - 3);
00154 if(Isnumeric(funzione_temp2))
00155 return(sin(atof(funzione_temp2)));
00156 else
00157 return(sin((vettore_riferimenti+funzione[3] - 97)->valore));
00158 }
00159 }
00160 if((funzione[0]=='C')&&(funzione[1]=='o')&&(funzione[2]=='s'))
00161 { if(funzione[3]=='[')
00162 return(cos(valori[funzione[4]-48]));
00163 else
00164 { Mid(funzione_temp2,funzione, 4, Len(funzione) - 3);
00165 if(Isnumeric(funzione_temp2))
00166 return(cos(atof(funzione_temp2)));
00167 else
00168 return(cos((vettore_riferimenti+funzione[3] - 97)->valore));
00169
00170 }
00171 }
00172 if((funzione[0]=='T')&&(funzione[1]=='a')&&(funzione[2]=='n'))
00173 { if(funzione[3]=='[')
00174 return(tan(valori[funzione[4]-48]));
00175 else
00176 { Mid(funzione_temp2,funzione, 4, Len(funzione) - 3);
00177 if(Isnumeric(funzione_temp2))
00178 return(tan(atof(funzione_temp2)));
00179 else
00180 return(tan((vettore_riferimenti+funzione[3] - 97)->valore));
00181
00182 }
00183 }
00184 if((funzione[0]=='L')&&(funzione[1]=='o')&&(funzione[2]=='g'))
00185 { if(funzione[3]=='[')
00186 return(log10(valori[funzione[4]-48]));
00187 else
00188 { Mid(funzione_temp2,funzione, 4, Len(funzione) - 3);
00189 if(Isnumeric(funzione_temp2))
00190 return(log10(atof(funzione_temp2)));
00191 else
00192 return(log10((vettore_riferimenti+funzione[3] - 97)->valore));
00193 }
00194 }
00195
00196 if((funzione[0]=='E')&&(funzione[1]=='x')&&(funzione[2]=='p'))
00197 { if(funzione[3]=='[')
00198 return(exp(valori[funzione[4]-48]));
00199 else
00200 { Mid(funzione_temp2,funzione, 4, Len(funzione) - 3);
00201 if(Isnumeric(funzione_temp2))
00202 return(exp(atof(funzione_temp2)));
00203 else
00204 return(exp((vettore_riferimenti+funzione[3] - 97)->valore));
00205
00206 }
00207 }
00208 if((funzione[0]=='A')&&(funzione[1]=='b')&&(funzione[2]=='s'))
00209 { if(funzione[3]=='[')
00210 return(fabs(valori[funzione[4]-48]));
00211 else
00212 { Mid(funzione_temp2,funzione, 4, Len(funzione) - 3);
00213 if(Isnumeric(funzione_temp2))
00214 return(fabs(atof(funzione_temp2)));
00215 else
00216 return(fabs((vettore_riferimenti+funzione[3] - 97)->valore));
00217
00218 }
00219 }
00220 if((funzione[0]=='L')&&(funzione[1]=='n'))
00221 { if(funzione[2]=='[')
00222 return(log(valori[funzione[3]-48]));
00223 else
00224 { Mid(funzione_temp2,funzione, 3, Len(funzione) - 2);
00225 if(Isnumeric(funzione_temp2))
00226 return(log(atof(funzione_temp2)));
00227 else
00228 return(log((vettore_riferimenti+funzione[2] - 97)->valore));
00229
00230 }
00231 }else
00232 return(valori[funzione[1]-48]);
00233 }
00234
00235
00236 }else
00237 return(atof(funzione));
00238 }
00239
00240
00241