[C++] ExprParser - Risoluzione di espressioni matematiche

Stato
Discussione chiusa ad ulteriori risposte.

imported_BlackLight

Utente Silver
16 Agosto 2007
211
8
1
98
Libreria che ho sviluppato in C++, e compatibile sia con sistemi Unix-like che Windows, per la gestione, il parsing e la risoluzione di espressioni matematiche fornite semplicemente come stringhe, e contenenti, volendo, anche variabili (max 7 variabili), i cui valori vanno passati all'oggetto in un vettore di float. L'espressione può contenere anche le costanti e e pi e un gran numero di operatori e operazioni matematiche. La libreria ho cominciato a svilupparla inizialmente come appendice per un'altra applicazione su cui ho lavorato, ma poi di fronte alla crescita della sua complessità ho preferito darle un re-styling e rilasciarla come "ente" a se stante.

Esempio d'uso:

Codice:
#include <iostream>
#include <exprparser.h>
using namespace std;

main()  {
  try  {
    ExprParser e("log(e^2)+2*3");
    cout << "Result: " << e.solve() << endl;
  }

  catch (MathException e)  {
    cerr << e.what();
  }
}

Link diretto: http://blacklight.gotdns.org/prog/exprparser-0.01.tar.gz
Pagina con informazioni: http://blacklight.gotdns.org/cgi-bin/nopaste.pl?mode=view&id=1219044900
Informazioni sull'installazione sotto i vari sistemi, l'uso e la documentazione completa si possono trovare nella directory doc/ del progetto, sia in formato HTML che LaTeX (powered by Doxygen).
 
Ho letto un po il sorgento, devo dire che l'idea di base è ottima, anche se io forse migliorerei un po il codice.
In particolare quando fai il parsing dell'espressione matematica vai a cercare le funzioni trigonometriche di base, ecco, in quel punto, quando vai a fare i calcoli, fai delle operazioni ripetitive dove l'unica cosa che cambia la funzione matematica che vai a chiamate in base alla funzione trigonometrica che parsi.
Cioè, tu fai una cosa del genere
Codice:
if (e[i]=='s' && e[i+1]=='i' && e[i+2]=='n' && e[i+3]=='(')  {
  //operazioni di base ripetute
} 
//ecc per tutte le altre funzioni
Io se fossi in te farei una cosa di questo tipo
Codice:
string f_t = e[i]+e[i+1]+e[i+2]+e[i+3];
if(f_t == "cos(" || f_t == "sin(" ecc ecc) {
   //operazioni di base
  float result=0;
   if(f_t == "sin(") 
        result = sin(arg);
   else if(f_t) == "cos(")
        result=cos(arg);
   //operazioni conclusive
}
ad occchi credo che sia molto più semplice da modificare, correggere, espandere e così via..
Non so, dimmi che ne pensi.
 
Beh il grosso della funzione __f (che poi sarebbe il nucleo dell'oggetto) l'ho scritto di fretta (mi interessava avere qualcosa di funzionante in breve tempo senza badare troppo allo stile) e credo che ora si vedano i risultati XD
Ovviamente grazie per il suggerimento, non credevo davvero che qualcuno leggesse davvero il codice :D
 
BlackLight ha detto:
Ovviamente grazie per il suggerimento, non credevo davvero che qualcuno leggesse davvero il codice :D

Io pure credo di essere l'unico che commenta un sorgente soltanto dopo averlo letto per intero. :asd:

Vabè, comunque ancora complimenti per il parser ;)
 
Stato
Discussione chiusa ad ulteriori risposte.