› Excel e gli applicativi Microsoft Office › Sfida di Pasqua: calcolatore con notazione polacca
-
AutoreArticoli
-
Ciao a tutti e buona Pasqua,
io in questo periodo non ce la faccio,....se mi aspettate provero a ragionarci dopo l'8 di aprile
fighting!Risolto anche questo

Giusto per gioco, ho implementato una "calcolatrice RPN" veramente all'osso input solo da mouse) ma che credo possa essere un buon punto di partenza per implementare ulteriori funzioni e abbellimenti.

Il codice è tutto nella userform:
N.B.: è solo una bozza, non escludo la presenza di bug.
Allegati:
You must be logged in to view attached files.Peccato che il forum non gestisca le gif animate.
Per chi vuole divertirsi con il primo "giocattolino" che ho avuto per le mani (1975): hp 25
Siete solo dei "MOSTRI"
Nel mio piccolo sono riuscito a fare la mia prima Function (che non funziona), non mi ritorna la risposta ??? Mi dite il motivo?
@scossa, come funziona? A me da errore >>>LblHid.Caption = cStack(j) * LblHid.Caption
`Option Explicit Sub a() Dim stG As String stG = "- + 3 * / 6 2 5 1" '17 MsgBox CnP(stG) 'non funziona End Sub Function CnP(ByVal stG As String) Dim sT1 As String, sT2 As String, arr() As String Dim Val As Double, nN As Long, X As Long 'y As Long, tot As Long Do While Len(stG) - Len(Replace(stG, " ", "")) > 0 nN = Len(stG) - Len(Replace(stG, " ", "")) arr() = Split(stG, " ") For X = nN To 0 Step -1 sT1 = arr(X) If sT1 = "/" Or sT1 = "*" Or sT1 = "+" Or sT1 = "-" Then Val = Evaluate(arr(X + 1) & arr(X) & arr(X + 2)) sT2 = arr(X) & " " & arr(X + 1) & " " & arr(X + 2) stG = Replace(stG, sT2, Val) Exit For End If Next Loop stG = Val MsgBox stG 'questo funziona End Function`@scossa, come funziona?
Fondamentalmente così: click su una cifra poi click su Enter, poi su un'altra cifra poi click su un operatore (x + - / ^) e ottieni il risultato, poi click su un'altra cifra e poi operatore ....
Ciao Raffaele,
nella functio devi modificare: stG = Val con CnP = Val (Devi assegnare alla funzione il valore del calcolo)
Poi nella sub :
Dichiari una variabile double tipo Dim risutato as double
la function la chiami cosi' risultato = CnP(stG)
e poi msgbox risultato
@scossa, Ok funziona ma numero-virgola-4zeri mandano in confusione
@Aldo Ercolini
Grazie. Adesso mi funziona la Sub, credevo che se mettevo la stringa in A1 ed in A2=CnP(A1) dovesse andare (mi mancano altri passaggi)@scossa, Ok funziona ma numero-virgola-4zeri mandano in confusione
Serve per evidenziare che il numero è stato inserito nello stack, si possono mettere anche solo due zeri; del resto è così anche nelle calcolatrici hp (prova a cliccare una cifra e poi Enter: ti mette 2 decimali)
Peccato che il forum non gestisca le gif animate.
Ma che potenza
e' simile alla TI57 che mio fratello non sapeva usare e con cui hop giocato per diverso tempo all'epoca. Uno spettacolo... complicata per un ragazzino ma potente
ho implementato una "calcolatrice RPN" veramente all'osso
poi dicevo di non strafare vero?

ma numero-virgola-4zeri mandano in confusione
Personalizzazione! Customizzazione! Enhancement!
non escludo la presenza di bug
Scovato il bug (non e' un bug, solo che non e' implementata la gestione dell'errore, in questo caso la divisione per zero).
Ma naturalmente bravo scossa, e' una figata, in cosi' poco tempo poi!
credevo che se mettevo la stringa in A1 ed in A2=CnP(A1) dovesse andare (mi mancano altri passaggi)
Raffaele a me funziona:
Function CnP(ByVal stG As String) As Double Dim sT1 As String, sT2 As String, arr() As String Dim Val As Double, nN As Long, X As Long Do While Len(stG) - Len(Replace(stG, " ", "")) > 0 nN = Len(stG) - Len(Replace(stG, " ", "")) arr() = Split(stG, " ") For X = nN To 0 Step -1 sT1 = arr(X) If sT1 = "/" Or sT1 = "*" Or sT1 = "+" Or sT1 = "-" Then Val = Evaluate(arr(X + 1) & arr(X) & arr(X + 2)) sT2 = arr(X) & " " & arr(X + 1) & " " & arr(X + 2) stG = Replace(stG, sT2, Val) Exit For End If Next Loop CnP = Val End FunctionRaffaele a me funziona:
Confermo che funziona
Avete aggiunto as double, comunque a me non funziona
Ok per la Sub a(), KO per la cella =CNP(C23)Non avete risposto alla mia domanda (post #45163)
vecchio frac scrive-->notazione polacca---------->"* / 15 3 2"
Scossa scrive-------->Notazione Polacca Inversa-->"2 3 * 5 +"
Mi sembra che una inizia da sinistra, l'altra da destra. Pertanto sono due cose similari ma diverse?Allegati:
You must be logged in to view attached files.Raffaele effettivamente nel tuo file non funziona e non capisco il motivo.
Hai provato a creare un file ex novo?
Mi sembra che una inizia da sinistra, l'altra da destra. Pertanto sono due cose similari ma diverse?
Si' esatto. Infatti la seconda (quella preferita da scossa in effetti) si chiama RPN dove la R sta per reverse.
Quando scrivi "2 3 * 5 +" la devi interpretare cosi': fissati il 2 da qualche parte (2, primo operando) poi considera 3 (secondo operando: quindi mi aspetto un'operatore), moltiplica (2*3=6) e considera il risultato come il primo operando percio' fissalo in memoria, poi considera 5 (secondo operando: quindi mi aspetto un'operatore), addiziona (6+5=11), fine.
In notazione polacca normale invece le operazioni si scrivono prima degli operandi somma (seguono due numeri? esegui; segue un altro operando? sospendi la prima operazione e prosegui chiedendoti se seguono due numeri).
L'esempio di prima si scrive invece si scrive "+ * 2 3 5" che si legge cosi': somma (segue altro operando quindi mi aspetto due operatori); moltiplica (2*3=6) : questo e' il primo operando della prima operazione; segue un altro numero: questo e' il secondo operando della prima operazione, eseguila (6+5=11).
e' simile alla TI57 che mio fratello non sapeva usare
Eh, la hp 25 del link invece era di mia sorella, universitaria a Padova (in fisica nucleare) e nei week-end a casa gliela sequestravo.
Era programmabile e mi ricordo che c'era un programma che simulava l'allunaggio dell'Apollo e dovevi immettere i valori dei controrazzi per frenare la discesa e fare un allunaggio senza scatafasciarti, quanti ricordi !
Era programmabile
Massimo cento posizioni, un tot di subroutine, mi pare con una nidificazione limitata, con la possibilita' di memorizzare i calcoli intermedi. Poi pero' sono comunque diventato un ciuccio di matematica, tra le altre cose
Oddio ho sbloccato un ricordo a scossa, adesso chi lo ferma?
Naturalmente scherzo, ottimo lavoro come sempre, e poi veramente bellissima l'immagine interattiva
non ti chiederemo comunque di attivare tutti i tasti e simulare la calcolatrice reale
Edit by VF: il font Liquid Crystal non ce l'ho ma e' molto bello, vado a cercarlo
non ti chiederemo comunque di attivare tutti i tasti e simulare la calcolatrice reale
Tranquillo, non ci penso proprio, anche perché alla fine sarebbe più noioso che interessante; anche perché sul cellulare ho installato l'app dell'HP 21 e sul pc l'emulatore dell'HP 15C
Ciao a tutti ecco la mia soluzione:
Public Function NP_LT(StrIni As String) Dim VettoreStr() As String Dim IndiceS As Long Dim IndiceSInt As Long Dim Errore As Boolean Dim ErrMsg As String Dim Risultato As Double Dim MioInd As Integer Dim Term1 As Double Dim Term2 As Double MioInd = 0 VettoreStr = Split(StrIni, " ") If UBound(VettoreStr) < 2 Then ErrMsg = "Stringa non Adeguata = corta" GoTo ErrGest ElseIf UBound(VettoreStr) Mod 2 = 1 Then ErrMsg = "Stringa non Adeguata = Numero Errato di Operatori" GoTo ErrGest Else Do Errore = True MioInd = MioInd + 1 For IndiceS = 2 To UBound(VettoreStr) If ((VettoreStr(IndiceS - 2) Like "[-+*/]") And (IsNumeric(VettoreStr(IndiceS - 1))) And (IsNumeric(VettoreStr(IndiceS - 0)))) Then Term1 = VettoreStr(IndiceS - 1) * 1 Term2 = VettoreStr(IndiceS - 0) * 1 Select Case VettoreStr(IndiceS - 2) Case "+" Risultato = Term1 + Term2 Case "-" Risultato = Term1 - Term2 Case "*" Risultato = Term1 * Term2 Case "/" If Term2 = 0 Then ErrMsg = "Divisione per 0 (Zero)" GoTo ErrGest Else Risultato = Term1 / Term2 End If Case Else ErrMsg = "Non un operatore Corretto" GoTo ErrGest End Select Errore = False If UBound(VettoreStr) = 2 Then NP_LT = Risultato Exit Do Else VettoreStr(IndiceS - 2) = Risultato For IndiceSInt = IndiceS + 1 To UBound(VettoreStr) VettoreStr(IndiceSInt - 2) = VettoreStr(IndiceSInt) Next ReDim Preserve VettoreStr(UBound(VettoreStr) - 2) Exit For End If End If Next IndiceS If Errore Then ErrMsg = "Stringa non Adeguata = sequenza non Corretta" GoTo ErrGest End If Loop Until (Errore = True Or MioInd > 1000) End If Exit Function ErrGest: 'MsgBox (ErrMsg) NP_LT = "ERRORE: " & ErrMsg End FunctionCiao a tutti ecco la mia soluzione:
Ti e' venuta bene! L'ho provata in molti modi e ha retto ad ogni stringa inserita con un messaggio appropriato!

-
AutoreArticoli

Raffaele53 ha scritto: 