Ragazzi sto letteralmente impazzendo con questo programma che dovrebbe creare una calcolatrice(ancora non è evoluto infatti non ho scritto codice per assegnare le priorità degli operatori semplicemente perchè prima vorrei farlo funzionare per risolvere una semplice espressione e poi lo vado a complicare!)il codice commentato è il seguente:
Se volete spiegato passo dopo passo quello che voglio fare(perchè magari dai commenti non si capisce) chiedete pure.Grazie a tutticodice:* @(#)Calcolatrice.java *Questo programma si pone come scopo *quello di implementare una calcolatrice *in grado di eseguire tutti i calcoli *seguendo il corretto ordine delle parentesi. * *Risoluzione grafica: dopo aver implementato 3stack nel sugente ordine: *1)Stack numeri; *2)Stack operatori; *3)Stack parentesi; *si procederà come segue: con una push si inseriscono i vari *caratteri(numeri operatori e parentesi)nei vari stack di apparteneza *dopodichè tramite la pop verranno estratti uno alla volta e in ordine *i caratteri e verranno immessi in uno stack temporaneo.Con una successiva *pop verranno estratti e di volta in volta si procederà al calcolo del *risultato finale. * * @author soeca * @version 1.00 2010/7/6 */ public class Calcolatrice { public static void main(String args[]) { String string="(5+3+2)"; Stacc sNumeri=new Stacc(string.length()); Stacc sOperatori=new Stacc(string.length()); Stacc sParentesi=new Stacc(string.length()); Stacc sTemp=new Stacc(string.length()); for (int i = 0; i<string.length(); i++) { sNumeri.Push('N'); //in ogni livello mettera' N a meno che _ _ _ _ _non e' presente sParentesi.Push('N'); //o un operatore o un numero oppure una parentesi in tal caso verra' sOperatori.Push('N'); //posizionata nello stack di appartenenza if(string.charAt(i)=='(' || string.charAt(i)==')') sParentesi.Push(string.charAt(i)); else { if(string.charAt(i)=='+' || string.charAt(i)=='-' || string.charAt(i)=='*' || string.charAt(i)=='/') sOperatori.Push(string.charAt(i)); _ _ else _ _ sNumeri.Push(string.charAt(i)); _ _ _ _ } _ _ } for (int j = 0; j<string.length(); j++) { if(string.charAt(j)=='(' || string.charAt(j)==')') //tutti gli elementi dello stack devono essere presi sTemp.Push(sParentesi.Pop( )); //e inseriti in uno stack temporaneo if(string.charAt(j)=='N') { if(string.charAt(j)=='+' || string.charAt(j)=='-' || string.charAt(j)=='*' || string.charAt(j)=='/') sTemp.Push(sOperatori.Pop( )); else sTemp.Push(sNumeri.Pop( )); } } String str=""; System.out.println("comincio a fare i calcoli delle parentesi"); int cont=0;//contatore di parentesi int mem=0;/*memorizza la posizione dell'array dove è presente una parentesi così da poterla richiamare successivamente per assegnare la priorità ai vari blocchi di operazioni dentro le parentesi.*/ int mem1=0;//memorizza la posizione della parentesi chiusa for (int i = 0; i<string.length(); i++) //con questo for entro dentro lo stack temp e memorizzo in una stringa tutti gli elementi, se //trovo una parentesi aperta memorizzo la sua posizione e partendo da li comincio a svolgere le operazioni //fino alla parentesi chiusa { str+=sTemp.Pop(); if(str.charAt(i)=='(') { System.out.println("sono dentro l'if delle parentesi"); cont++; mem=i; System.out.println("cont vale"+cont+" mem vale:"+mem); } if(str.charAt(i)==')') mem1=i; System.out.println("cont vale"+cont+" mem vale:"+mem+" mentre mem1 vale:"+mem1); } cont=0; Calc c =new Calc(); String risultato=""; //Comincio a fare i calcoli System.out.println("fuori dal for mem vale:"+mem+" mentre mem1 vale:"+mem1); for (int i = mem; i<mem1; i++) { System.out.println("sto entrando nel for per fare i calcoli!"); if(str.charAt(i+2)=='+') { System.out.println("sono dentro l'operazione somma e gli sto passando i seguenti valori:"+str.charAt(i+1)+ "e "+str.charAt(i+3)); risultato+=c.Somma(str.charAt(i+1),str.charAt(i+3)); } if(str.charAt(i+2)=='*') risultato+=c.Prodotto(str.charAt(i+1),str.charAt(i+3)); if(str.charAt(i+2)=='-') risultato+=c.Differenza(str.charAt(i+1),str.charAt(i+3)); if(str.charAt(i+2)=='/') risultato+=c.Quoziente(str.charAt(i+1),str.charAt(i+3)); System.out.println("esco dal for dei calcoli e il risultato fino ad ora e':"+risultato); } //Stampiamo il risultato finale System.out.println("Il risultato e':"+risultato); } }

Rispondi quotando