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:
codice:
* @(#)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);
}
}
Se volete spiegato passo dopo passo quello che voglio fare(perchè magari dai commenti non si capisce) chiedete pure.Grazie a tutti