Italian community of Lazarus and Free Pascal

Programmazione => LCL => Topic aperto da: petrusic - Agosto 23, 2022, 03:58:37 pm

Titolo: digitare un'espressione aritmetica e risolverla
Inserito da: petrusic - Agosto 23, 2022, 03:58:37 pm
Ho sentito il bisogno di inserire nel mio programma, in riscrittura, di contabilità familiare importi parziali, disposti all'interno di un'espressione aritmetica per risolvere quest'ultima alla fine della digitazione.

Ho perciò pensato di scrivere due funzioni, la prima di digitazione, dentro una TEdit, degli elementi dell'espressione, la seconda di calcolo, a fine digitazione, dell'importo finale che ne deriva.
La function TestDigit esegue il controllo formale di caratteri immessi.
La function CalcolaFormula esegue il calcolo e la restituzione dell'importo totale.

- la function TestDigit va richiamata dentro l'evento "KeyPress" della TEdit di immissione caratteri. I caratteri immessi devono essere  numerici, ma anche caratteri di simboli aritmetici (',', '=', '{', '}', '(', ')', '+', '-', '*', '/', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9').
Inoltre essa tiene conto di quanto segue:
- l'espressione deve essere delimitata da "={" all'inizio e da "}", alla fine
sono ammessi i numeri decimali con, al massimo, due cifre decimali; sono ammessi valori decimali come ",99" che poi la funzione di calcolo penserà a trasformare in "0,99";
- sono ammesse le parentesi tonde per la costruzione di proposizioni "(x....x)" o sottoproposizaioni  "(..(x..x)..)";
- non sono ammessi due simboli di operazione consecutivi #Es. +- , *+ , *- , /- , . . . #, ma neanche #(- , (+#, ciò perchè essendo rivolto lo strumente allo svolgimento di operazioni contabili, non ho considerato la possibilità di digitare valori numerici negativi, ma solo rappresetazioni di tipo Dare o Avere.
Può essere digitato anche solamente un importo e non un'espressione. La funzione infatti riconosce dal primo carattere digitato se si sta dando corpo ad un'espressione o ad un importo semplice.

La function CalcolaFormula,  richiamata dentro l'evento "Exit" della stessa Tedit  di immissione caratteri, esegue il calcolo vero e proprio, per cui c'è poco da dire intorno ai suoi dettagli operativi, salvo che viene controllato che il numero totale delle parentesi tonde aperte e quello delle parentesi tonde chiuse, sia  uguale. Come la TestDigit, riconosce l'importo semplice e lo tratta come tale, mentre quando ha in input un'espressione, riconoscendola come tale, ne calcola il valore finale, e lo restituisce in formato stringa, come 2° elemento di un array, dove il 1° elemento contiene il codice d'errore di ritorno del calcolo ('0' = NON ci sono Errori)

Allego le due funzioni in un unico file .zip