MatOCAD Logo

Main Page | Class Hierarchy | Class List | Directories | File List | Class Members | File Members | Related Pages

TParserValore.cpp

Go to the documentation of this file.
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   * Nome funzione:     CalcolaValore
00018   * Parametri:         vettore_riferimenti:  struttura contenente  la funzione scomposta
00019                        valori: vettore di double contenente i valori da sostituire alle
00020                                variabili della funzione
00021                       *errore: puntatore a int per l'evidenziazione di un eventuale errore
00022                                nel calcolo
00023 
00024   * Valori di ritorno: un valore double
00025   * Descrizione: questa funzione ha il compito di dirigere le operazioni per il calcolo del
00026                  valore utilizzando la struttura dati e richiamando altre funzioni al suo
00027                  interno
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   * Nome funzione:     Elabora
00079   * Parametri:         funzione: stringa che contiene una singola cella della struttura
00080                                  dati
00081                        valori:   vettore di double contenente i valori da sostituire alle
00082                                  variabili della funzione
00083                        vettore_riferimenti:  struttura contenente  la funzione scomposta
00084 
00085   * Valori di ritorno: un valore double
00086   * Descrizione: questa funzione ha il compito di calcolare, attraverso i valori numerici
00087                  passati come parametro,il risultato di una singola casella della struttura
00088                  dati, questo risultato verrĂ  utilizzato dalla funzione CalcolaValore per
00089                  l'obbiettivo finale
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   * Nome funzione:     Traduci
00124   * Parametri:         funzione: stringa che contiene solo una parte di una cella della
00125                                  struttura dati esente da operatori aritmentici
00126                        vettore_riferimenti:  struttura contenente  la funzione scomposta
00127                        valori:   vettore di double contenente i valori da sostituire alle
00128                                  variabili della funzione
00129 
00130 
00131   * Valori di ritorno: un valore double
00132   * Descrizione: questa funzione ha il compito di identificare funzioni matematiche note
00133                  come sin,cos,ecc scomposte dalla funzione Elabora e calcolarne il valore
00134                  numerico attraverso i parametri
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')// Se len(funzione)=1
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]));//sin(valori(indicevariabile))
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]); //SI TRATTA DELLA VARIABILE
00233        }
00234 
00235 
00236   }else
00237     return(atof(funzione));
00238 }
00239 
00240 
00241 

 

SourceForge Logo