Visualizzazione dei risultati da 1 a 10 su 75

Visualizzazione discussione

  1. #11
    Utente di HTML.it
    Registrato dal
    Oct 2014
    Messaggi
    315
    Vorrei analizzare insieme a voi il codice di un esercizio che sto facendo.
    In poche parole questo esercizio deve gestire un portamonete e le sue monete con aggiunte e rimozioni di monete.
    Mi sono bloccato sulla rimozione di una moneta dal portamonete.

    Vi riporto il codice della classi:
    codice:
    public class TestMonete
    {
        public static void main(String args[])
        {
            
            Moneta moneta1 = new Moneta(20);
            Moneta moneta2 = new Moneta(1);
            Moneta moneta3 = new Moneta(100);
                    
    
            //creazione portamonete con 8 monete
            PortaMonete portamonete1 = new PortaMonete(2,5,100,10,50,10,100,200);
            
            // creazione portamonete con 11 monete
            PortaMonete portamonete2 = new PortaMonete(2,5,100,10,50,10,100,200,10,5,2);
            
            // aggiunta moneta da 50 centesimi a portamonete1
            portamonete1.aggiungi(new Moneta(50));
    
            
            portamonete1.stato();
            
            
            portamonete1.preleva(50);
            
        }
    }
    codice:
    public class Moneta 
    {
        public final static String VALUTA="EURO";
        
        private final int valore;
        
    
        public Moneta(int valore)
        {
            this.valore = valore;
            System.out.println("Creata " + getDescrizione());
        }
    
      
        public String getDescrizione()
        {
            String descrizione = "moneta da: " + formattaStringaDescrittiva(valore) + VALUTA;
            return descrizione;
        }
        
        
        private static String formattaStringaDescrittiva(int valore)
        {
            String stringa = " centesimi di ";
            if (valore == 1)
            {
                     stringa = " centesimo di ";
                        }
            else if (valore > 99)
            {
                stringa = " ";
                valore /= 100;
                            
            }
            return valore + stringa;
        }
    
        
    
        public int getValore()    
        {
                return valore;
        }
    
    }

    Questo è il codice della classe PortaMonete fatta da me:
    codice:
    public class PortaMonete
    { 
        
        private final Moneta monete [] = new Moneta [10];
        
        
        public PortaMonete(int... valori)
        {
            int numeroMonete = valori.length;
            for(int i=0; i<numeroMonete; i++)
            {
                if (i>=10)
                {
                    System.out.println("Sono state inserite 10 monete \n");
                    break;
                }
                monete[i] = new Moneta(valori[i]);
            }
        }
    
        
        
        public void aggiungi(Moneta moneta)
        {    
            System.out.println("Proviamo ad aggiungere una " + moneta.getDescrizione());
            int indiceLibero = primoIndiceLibero();        
            if (indiceLibero == -1)
            {
                System.out.println("Portamonete pieno \n");        
            }
            else
            {
                monete[indiceLibero] = moneta;
                System.out.println("Moneta inserita correttamente in posizione " + indiceLibero + "\n");
            }
        }
    
    
        
        private int primoIndiceLibero()
        {
            int indice = -1;
            for(int i=0; i<10; i++)
            {
                if(monete[i]==null)
                {
                    indice = i;
                    break;
                }                
            }
            return indice;
        }
    
    
    
        public void stato()
        {
            for(Moneta moneta : monete)   
            {
                if(moneta==null)
                {
                    System.out.println("scansione terminata \n");   
                    break;
                }
                System.out.println(moneta.getDescrizione());       
            }
            
        }
    
            
        public void preleva(int valoreMoneta)
        {    
            for(int i=0; i<monete.length; i++)
            {
                if(monete[i].getValore()==valoreMoneta)
                {
                    System.out.println("moneta trovata in posizione: " + i);
                    monete[i]=null;
                    System.out.println("moneta rimossa");
                }
            }    
        } 
        
    }
    Rispetto alla soluzione proposta dal manuale le differenze sono:
    codice:
    portaMonete.preleva(moneta1);
    nel main al posto di:
    codice:
    portamonete1.preleva(50);

    e:
    codice:
        public Moneta preleva(Moneta moneta) {
            System.out.println("Proviamo a prelevare una "  + moneta.getDescrizione());
            Moneta monetaTrovata = null;
            int indiceMonetaTrovata = indiceMonetaTrovata(moneta);
            if (indiceMonetaTrovata == -1) {
                System.out.println("Moneta non trovata!");
            } else {
                monetaTrovata = moneta;
                monete[indiceMonetaTrovata] = null;
                System.out.println("Una " + moneta.getDescrizione() + " prelevata");
            }
            return monetaTrovata;
        }
        
    
        private int indiceMonetaTrovata(Moneta moneta) {
            int indiceMonetaTrovata = -1;
            for (int i = 0; i < 10; i++) {
                if (monete[i] == null) {
                    break;
                }
                int valoreMonetaNelPortaMoneta = monete[i].getValore();
                int valore = moneta.getValore();
                if (valore == valoreMonetaNelPortaMoneta) {
                    indiceMonetaTrovata = i;
                    break;
                }
            }
            return indiceMonetaTrovata;
        }
    al posto del mio metodo preleva.

    La mia soluzione sembra funzionare, o meglio trova la moneta all'interno dell'array di monete però poi restituisce una NullPointerException.

    A vostro avviso la mia soluzione è accettabile (non considerando la NullPointerException)?
    Ultima modifica di newutente; 11-11-2014 a 15:42

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.