Risolutore di espressioni algebriche step by step.

di il
3 risposte

Risolutore di espressioni algebriche step by step.

Partendo da una RPN (notazione polacca inversa) ho memorizzato il segno sull' operando seguito da un'addizione per gli operatori + e -.La logica sembra corretta per risolvere espressioni con numeri reali ma su notazioni infisse dove prima della parentesi compare un meno ci sono problemi legati al cambio di segno. Ho provato ad aggiungere zero e forzare la sottrazione (il tutto per rimanere sul formato RPN) ma su un centinaio di espressioni campione alcune vengono errate proprio su questa mia modifica. Mi fuma il cervello anche col debug...

Qualche altra idea?

3 Risposte

  • Re: Risolutore di espressioni algebriche step by step.

    Dipende come hai realizzato il parser delle parentesi. Non puoi elaborare un caso speciale che se il primo carattere è un - tutto ciò che sta tra parentesi cambia di segno e poi eseguire il parser come se tutto fosse senza segno tipo:
    
    -((a-b) + (b - c)) = (b-a) + (c-b)
    
    da quì esegui il RPN.

    ho trovato un esempio quà anche se questo è un risolutore e non scrive in espressione algebriche:

    http://www.fredosaurus.com/notes-cpp/examples/rpn/rpn.html
  • Re: Risolutore di espressioni algebriche step by step.

    Una possibile spiegazione di un algoritmo lo trovi quà (anche se in java).

    http://www.ibm.com/developerworks/java/library/j-w3eval/
    nella sezione:
    Converting infix notation to postfix notation.
  • Re: Risolutore di espressioni algebriche step by step.

    Grazie per l'interessamento.
    Ho guardato attentamente i due link che mi hai proposto. Nel primo è presente la semplice RPN che non mi da problemi, mentre risulta interessante l'articolo del secondo che mi fa trarre la conclusione che la cosa non sia possibile su numeri reali e tantomeno sui numeri complessi. Quì si esprime un algoritmo differente l'W3Eval che lavora sul parsing e simula un normale svolgimento dell'espressione come facciamo con carta e penna.

    E' anche vero che la mia era una ricerca di fattibilità apportando modifiche ad semplice algoritmo già utilizzato. L'idea di apporre zero sottraendo semplificava il cambio di segno su piccole espressioni, ma nella conversione infix -> postfix di alcune più complesse a livello parentesi intendo avrei dovuto probabilmente rielaborare i dati facendo attenzione di non trovarmi nella situazione iniziale.

    Comunque butto tutto nel cesso e tiro la catenella.

    Grazie ancora,
    Max

    EDIT:
    Esempio sempice:
    
    in:-((1-2) + (2-3))
    out="1 -2 + 2 -3 + + - " ---> 1 + -2=-1
    out="-1 2 -3 + + - " ---> 2 + -3=-1
    out="-1 -1 + - " ---> -1 + -1=-2
    out="-2 - " ---> 0 - -2=2
    result: 2
    
    Altro esempio funzionante:
    
    in:-{-2-[9-3-(14-7)+(-1-3)]-20}=17
    out="-2 9 -3 14 -7 + - -1 -3 + + + - -20 + - 17 = " ---> 14 + -7=7
    out="-2 9 -3 7 - -1 -3 + + + - -20 + - 17 = " ---> -3 - 7=-10
    out="-2 9 -10 -1 -3 + + + - -20 + - 17 = " ---> -1 + -3=-4
    out="-2 9 -10 -4 + + - -20 + - 17 = " ---> -10 + -4=-14
    out="-2 9 -14 + - -20 + - 17 = " ---> 9 + -14=-5
    out="-2 -5 - -20 + - 17 = " ---> -2 - -5=3
    out="3 -20 + - 17 = " ---> 3 + -20=-17
    out="-17 - 17 = " ---> 0 - -17=17
    out="17 17 = " ---> 17  EQUAL 17
    result: 0
    
    ma sbagliato come logica
    Ancora uno con aggiunta di zero:
    
    in:13-{-2-[4-(3-5)]+1}-22=-2
    out="13 0 -2 0 4 0 3 -5 + - + - 1 + + - -22 + + -2 = " ---> 3 + -5=-2
    out="13 0 -2 0 4 0 -2 - + - 1 + + - -22 + + -2 = " ---> cambio segno a -2 ---> 2
    out="13 0 -2 0 4 2 + - 1 + + - -22 + + -2 = " ---> 4 + 2=6
    out="13 0 -2 0 6 - 1 + + - -22 + + -2 = " ---> cambio segno a 6 ---> -6
    out="13 0 -2 -6 1 + + - -22 + + -2 = " ---> -6 + 1=-5
    out="13 0 -2 -5 + - -22 + + -2 = " ---> -2 + -5=-7
    out="13 0 -7 - -22 + + -2 = " ---> cambio segno a -7 ---> 7
    out="13 7 -22 + + -2 = " ---> 7 + -22=-15
    out="13 -15 + -2 = " ---> 13 + -15=-2
    out="-2 -2 = " ---> -2  EQUAL -2
    result: -2
    
Devi accedere o registrarti per scrivere nel forum
3 risposte