Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 19

Discussione: [C] parsing di formule

  1. #1

    [C] parsing di formule

    ciao,

    sto scrivendo un programma gestionale che al mutare di certe condizioni utilizza formule di riferimento diverse per i suoi calcoli interni. Vorrei poter scrivere le formule in un file di testo:

    formule.txt
    ----------------
    form1, a+b*c
    form2, a-c*(d-f)
    ...
    ----------------

    e farle eseguire come espressioni al programma. In questo modo potrei modificare le formule senza dover ricompilare e potrei dare all'utente finale la possibilità di personalizzare le formule stesse.

    Qual è secondo voi l'approccio migliore al problema?

    grazie

  2. #2
    prova a definirle come funzioni, poi le richiami tutte le volte che vuoi, e se devi modificarle semplicemente vai a modificare la funzione...

    oppure prova a settartele come costanti..ma non penso sia fattibile

  3. #3
    L'unico modo è scriverti un tuo iterprete di comandi che esegua le formule caricate da file.Laboriosetto direi... VVoVe:
    Il centro dell'attenzione non è sempre un buon posto in cui trovarsi

    Mai discutere con uno stupido, la gente potrebbe non capire la differenza. (O. W.)

  4. #4
    Allora...
    per il momento ho risolto in questo modo.
    consideriamo una formula banale

    var1 + var2 + 10 - 3

    con var1 = 5.4 e var2 = 3.2

    Tenendo presente che una formula, utilizza un vocabolario di termini limitato e relativo alle variabili presenti, creo una hashtable che associa ciascun vocabolo (il nome della variabile) alla sua definizione (il valore in essa contenuto), in modo da avere:

    (attenzione questi non sono assegnamenti sono solo esempi)
    var1 -> name = var1
    var1 -> defn = 5.4

    var2 -> name = var2
    var2 -> defn = 3.2

    tratto tutto quanto (nome e definizione) come una stringa.
    A questo punto creo un array di puntatori a struttura entro cui salvo il vocabolario.

    In questo modo ogni formula dispone di un proprio vocabolario. Chiaramente questa procedura presuppone che il vocabolario di una formuna non cambi il numero dei vocaboli, il che è abbastanza frequente. Ciò che può cambiare a piacimento è invece: 1) il valore associato a ciascun vocabolo, 2) il modo in cui i vocaboli (le variabili), sono usate nella formula, nonchè 3) il numero e il tipo di tutti i simboli costanti: operatori, parentesi e valori costanti.
    Il programma, preleva da un file la formula

    var1 + var2 + 10 - 3

    la analizza sottostringa per sottostringa e sostituisce i vocaboli (variabili) noti (quelli dell'array di puntatori) con la loro definizione (il loro valore), lasciando inalterato tutto il resto:

    5.4 + 3.2 + 10 - 3

    per il momento non ho trovato il modo di parsare quest'ultima stringa ma...
    anteponendo alla stringa un bel SELECT e inviandola a MYSQL ottengo il risultato utilizzando il parser di quest'ultimo

    spero che qualcuno possa suggerirmi il modo di non disturbare mysql (in effetti programmo in C da poco)

    ciao

  5. #5
    per il momento non ho trovato il modo di parsare quest'ultima stringa ma...
    anteponendo alla stringa un bel SELECT e inviandola a MYSQL ottengo il risultato utilizzando il parser di quest'ultimo

    spero che qualcuno possa suggerirmi il modo di non disturbare mysql (in effetti programmo in C da poco)
    Infatti la difficoltà sta proprio in quelloarsare la formula.In generale devi usare degli alberi binari e costruire l'albero di espressione,io queste cose le ho fatte a scuola ma trattando casi molto semplici,cioè solo gli operatori +,-,/,*,% e considerando solo operandi a una cifra,se consideri il caso reale le cose si complicano di molto.Comunque niente è impossibile,inoltre credo che cercando un pò troverai anche del codice già pronto che può fare al caso tuo o magari solo da adattare,questi sono problemi noti che mooolti altri hanno trattato prima di noi.
    Il centro dell'attenzione non è sempre un buon posto in cui trovarsi

    Mai discutere con uno stupido, la gente potrebbe non capire la differenza. (O. W.)

  6. #6
    Capito proprio al posto giusto nel momento giusto!!


    Proprio stamattina ho scaricato qualcosa che fa per te:
    http://www.bloodshed.net/c/eval_expr.tar.gz

    E' un parser di formule scritto in C.
    Non so se ti serve qualcosa di complesso, questo tratta solo gli operatori '+', '-', '*', '/' e '%'.

    In certi punti il codice è un po' ostico , se qualcosa non ti è chiaro chiedi ché io sto già cercando di analizzarlo, me lo sto studiando perché vorrei estenderne le capacità e implementare il calcolo anche con altri operatori o intere funzioni (sqr(), fattoriale(), sin()...ecc). L'avrei già fatto (almeno per una buona parte) questo lavoro, però è in versione "beta", per domani dovrei completarlo.
    Se ti interessa questo che sto facendo (ma suppongo di no) fammi sapere.

    In ogni caso il link è quello.


  7. #7
    ti ringrazio... vado subito a studiarmi il codice

  8. #8

  9. #9
    Ho dato uno sguardo al parser: è molto carino e poi mi piace come è stato steso il codice è piuttosto elegante.Sfrutta la ricorsione e qundi lo stack di sistema per elaborare gli operandi nel giusto ordine.L'unica (piccolissima) pecca sono i nomi un pò troppo sintetici di variabili e funzioni in alcuni punti.


    Se ti interessa questo che sto facendo (ma suppongo di no) fammi sapere.
    Interessa me!
    Il centro dell'attenzione non è sempre un buon posto in cui trovarsi

    Mai discutere con uno stupido, la gente potrebbe non capire la differenza. (O. W.)

  10. #10

    Potenziamento dell'analizzatore di formule matematiche

    Questi giorni proprio non si riesce a codare in pace...
    ...ma d'altronde domani è ferragosto!


    Scusa ma la stesura del codice è proceduta a rilento e solo oggi ho avuto il tempo per rivederla bene (ciò non significa che il programma sia completo...)

    Ho implementato la risoluzione di molte funzioni trascendenti senza però intaccare il codice già scritto e la struttura di base del programma, ben progettata e facilmente estendibile ed ampliabile.

    Per l'ottimizzazione avrei potuto fare qualcosa in più, ma comunque non è un problema molto rilevante.

    L'unica neo è la precisione: avrei voluto basare il tutto sui long double, ma le funzioni che li gestiscono non mi risulta che siano standard, quindi l'ho lasciato così.


    Se hai qualche idea per migliorare il programmino (senza appesantirlo troppo!), parla pure! consigliami!


    Vabbeh ti saluto!






    PS: il main() è poco portabile, ma sta' tranquillo che l'altro modulo lo è al 100%!
    (ora vedo come postarlo)



    AI MODERATORI: non posso allegare un file zip (6KB)? Devo per forza fare il copia/incolla del sorgente?

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.