Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2010
    Messaggi
    31

    Calcolatrice con gli stack in java

    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

  2. #2
    Utente di HTML.it L'avatar di desa
    Registrato dal
    Oct 2008
    Messaggi
    569
    Ok, ma... qual è il problema?

  3. #3
    Utente di HTML.it
    Registrato dal
    May 2010
    Messaggi
    31
    Se provi ad eseguire il programma ti accorgerai che l'output non viene proprio visualizzato, le variabili con,mem,mem1 non vengono completamente toccate e questo perchè nell'ultimo ciclo for neanche ci entra!!Se provo a fare il debug comincia ad aprire milioni di classi quindi non capisco come procedere!! :master:

  4. #4
    Utente di HTML.it L'avatar di desa
    Registrato dal
    Oct 2008
    Messaggi
    569
    Per un programma del genere non c'è bisogno di andare a scomodare il debugger: è molto più pratico utilizzare le System.out per tracciare chiamate e valori delle variabili.
    Sinceramente l'approccio con tre stack non mi pare il migliore, ma mi sembra di capire che tu debba seguire una traccia... comunque, perchè non provi a descrivere che tipo di algoritmo stai cercando di implementare?

  5. #5
    Utente di HTML.it
    Registrato dal
    May 2010
    Messaggi
    31
    Vorre implementare l'algoritmo standard per il calcolo di espressioni algebriche quindi per esempio se avessi (5+(3+2))*2 quello che mi aspetto dal programma è (5+5)*2 e poi 10*2!!quindi faccio le seguenti cose:
    s=(5+3+2) entro nel primo for e comincio:
    sNumeri sParentesi sOperatori
    N ) N
    2 N N
    N N +
    3 N N
    N N +
    5 N N
    N ( N
    Fatto ciò faccio una Push in uno stack temporaneo di ciò che estraggo dai vari stack(ecco perchè uso la N, perchè se al livello j trova la N allora controlla gli altri stack e poi il valore estratto lo mette in temp.
    sTemp:
    (
    5
    +
    3
    +
    2
    )
    si fa quindi una successiva pop e si mette in una stringa appena,facendo una pop, trova una parentesi tonda comincia i calcoli!Quindi se la parentesi la trova nella posizione i,andrà a controllare l'operatore presente in i+2......se in i+2 trova + allora richiama il metodo somma e così via!!In questo modo ho risolto graficamente il problema!!Ora sto tentando di risolverlo anche in java!!

  6. #6
    Utente di HTML.it L'avatar di desa
    Registrato dal
    Oct 2008
    Messaggi
    569
    Ma se tanto alla fine ti ritrovi con la stessa stringa che avevi in paretenza... a cosa serve fare tutte quelle push e pop sugli stack? E poi mi sembra che lo stack temporaneo possa essere riempito semplicemente leggendo la stringa a partire dalla fine...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.