Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2011
    Messaggi
    339

    Metodo da implementare...Aiuto

    Ciao a tutti ragazzi.
    Avrei bisogno di qualche dritta su come implementare un metodo di un esercizio.

    Il metodo che mi interessa si chiama Soldi sub(Soldi s1, Soldi s2) ed è un quesito di un esercizio che vi riporto a seguito prima di postarvi il codice che ho scritto

    la traccia è un piccolo papello.....

    Esercizio 1. (package poo.soldi)
    Una classe Denaro è associata ad una specifica moneta o banconota in euro. Attributi di un oggetto Denaro sono: il suo valore (es. 10.00 per una banconota da dieci euro) e la sua quantità, ossia il numero dei pezzi disponibili di quel valore.
    I possibili valori sono quelli correntemente in circolazione ovvero: 0.01, 0.02, 0.05, 0.10, 0.20, 0.50, 1.00, 2.00, 5.00, 10.00, 20.00, 50.00, 100.0, 200.00 e 500.00. Se tenta di creare un oggetto Denaro di un taglio differente occorre sollevare un’opportuna eccezione.
    La classe Denaro implementa l’interfaccia Comparable con il criterio che d1 precede d2 se il valore di d1 è maggiore di quello di d2. La classe Denaro offre (almeno) i seguenti metodi: costruttori, getValore(), getQuantita(), setQuantita(...), equals(), toString(), hashCode().
    Un’interfaccia Soldi modella una somma di denaro in euro rappresentata da una collezione ordinata di oggetti Denaro. L’interfaccia estende Comparable e Iterable ed esporta i seguenti metodi:
    • double totale(), che ritorna il valore complessivo della somma di denaro;
    • void add(Denaro d), che aggiunge alla somma di denaro (this) il contenuto dell’oggetto d ricevuto come parametro;
    • void add(Soldi s), che aggiunge alla somma di denaro this la somma di denaro s ricevuta come parametro;
    • Soldi sub(Soldi s1, Soldi s2), che effettua un “pagamento” s1 con una somma s2. In particolare il metodo aggiunge alla somma di denaro this la somma s2 e restituisce un oggetto Soldi contenente la differenza esatta (resto) “s2-s1” prelevandola dalla somma this. Attenzione che l’oggetto Soldi da restituire deve essere costituito dal minimo numero di oggetti Denaro sulla base di quelli disponibili in this. In più, se non è possibile restituire la differenza esatta, il metodo si deve concludere con una runtime exception lasciando inalterato lo stato dell’oggetto this. Il metodo solleva un’ulteriore eccezione se il totale di s2 è più piccolo del totale di s1.


    Ecco quello che ho fatto (Il codice del metodo che non ho capito è alla fine) :

    codice:
    package poo.soldi;
    import java.util.*;
    
    
    public class Denaro implements Comparable<Denaro> {
    	
    	private double Valore;
    	private int quantità;
    	
    	public Denaro(double Valore, int quantità){
    		
    		if(Valore!=0.01 && Valore!=0.02 && Valore!=0.05 && Valore!=0.10 && Valore!=0.20 && Valore!=0.50 && Valore!=1.00 && Valore!=2.00 && Valore!=5.00 && Valore!=10.00 && Valore!=20.00 && Valore!=50.00 && Valore!=100.00 && Valore!=200.00 && Valore!=500.00){
    			throw new RuntimeException("Attenzione! Taglio moneta non compatibile con il distributore, inserire taglio differente");
    		}
    		this.Valore=Valore;
    		this.quantità=quantità;
    		
    	}
    	
    	public int getQuantità(){
    		return quantità;
    	}
    	
    	public double getValore(){
    		return Valore;
    	}
    	
    	public void setQuantità(int n){
    		this.quantità=n;
    	}
    	
    	public int compareTo(Denaro other){
    		
    		if(Valore>other.Valore) return -1;
    		if(Valore<other.Valore)return 1;
    		return 0;
    		
    	}//COMPARETO
    	
    	public boolean equals(Object Other){
    		if(Other==this) return true;
    		if(Other==null) return false;
    		if(!(Other instanceof Denaro)) return false;
    		Denaro d = (Denaro) Other;
    		return d.Valore==Valore && d.quantità==quantità ;
    		
    	}//EQUALS
    	
    	public String toString(){
    		return ("Banconota da " +Valore+ " ; Pezzi disponibili : " +quantità);
    		
    	}//TOSTRING
    	
    	public int hashCode(){
    		return  3 * new Double(Valore).hashCode() +  5 * new Integer(quantità).hashCode();
    		
    	}//HASHCODE
    	
    
    }//DENARO
    
    public interface Soldi extends Comparable<Denaro>, Iterable<Denaro>{
    	
    	double totale();
    	void add(Denaro d);
    	void add(Soldi s);
    	Soldi sub(Soldi s1, Soldi s2);
    	
    	
    	
    }//INTERFACCIA SOLDI
    
    public abstract class SoldiAbstract implements Soldi{
    	
    	TreeSet<Denaro> Soldi = new TreeSet<Denaro>();
    	
    	@Override
    	public double totale(){
    		double totale = 0;
    		Iterator<Denaro> it = this.iterator();
    		while(it.hasNext()){
    			Denaro d = it.next();
    			totale+= d.getValore() * d.getQuantità();
    		}
    		return totale;
    		
    	}//TOTALE
    	
    	@Override
    	public void add(Denaro d){
    		this.add(d);
    		
    	}//ADD_DENARO
    	
    	@Override
    	public void add(Soldi s){
    		this.add(s);
    		
    	}//ADD_SOLDI
    	
    	@Override
    	public Soldi sub(Soldi s1, Soldi s2){
    		double resto;
    		if(s2.totale()<s1.totale()) throw new RuntimeException ("Soldi insufficienti per il pagamento!");
    		double residuo = s1.totale() - s2.totale();;
    		Iterator<Denaro> it = this.iterator();
    		while(it.hasNext()){
    			Denaro d = it.next();
    			int pezzi = 0;
    			while(d.getValore()<=residuo){
    				pezzi++;
    			residuo-=d.getValore();
    			resto+=d.getValore()*pezzi;
    			
    			
    			}//WHILE INTERNO
    			
    			
    		}
    
    		
    	}
    }
    Beh credo che in parte l'ultimo metodo sia corretto , ma come faccio a restituire un oggetto soldi che contiene il resto?
    Mi scrivereste la versione corretta di questo metodo?
    Grazie
    Ciao

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,480

    Moderazione

    Originariamente inviato da Markus85
    Ciao a tutti ragazzi.
    Avrei bisogno di qualche dritta su come implementare un metodo di un esercizio.
    Prova a documentarti e ad abbozzare una soluzione, e in caso di problemi gli utenti ti verranno in aiuto, ma non chiedere agli altri di scrivere il metodo al posto tuo secondo le specifiche che hai dettato.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2011
    Messaggi
    339
    Ciao.
    La soluzione che ho abbozzato si trova nel codice (precisamente alla fine) .
    Ho postato tutto il codice e la traccia per rendere più chiaro il mio quesito.

    Mi interessava appunto il metodo Soldi sub(Soldi s1, Soldi s2) che ho scritto (abbozzato) alla fine del codice come avevo specificato.


    Magari tu mi puoi aiutare?
    Grazie
    Ciao

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    si ma in concreto cosa non ti è chiara e/o non riesci a fare?
    Scopo dell'esercizio è che tu capisca cosa fare, non che su forum ti diano una bozza della soluzione.

    Per i problemi di comprensione del testo c'è ovviamente il prof e/o i suoi assistenti, ma se non dici chiaramente cosa non riesci a fare dubito che puoi avere un aiuto.

  5. #5
    Originariamente inviato da Markus85
    Mi interessava appunto il metodo Soldi sub(Soldi s1, Soldi s2) che ho scritto (abbozzato) alla fine del codice come avevo specificato.
    Prima di passare a questo metodo, rivediti bene le implementazioni di questi due:
    Originariamente inviato da Markus85
    codice:
    	@Override
    	public void add(Denaro d){
    		this.add(d);
    		
    	}//ADD_DENARO
    	
    	@Override
    	public void add(Soldi s){
    		this.add(s);
    		
    	}//ADD_SOLDI
    I metodi ricadono in ricorsione infinita..

  6. #6
    Utente di HTML.it
    Registrato dal
    Feb 2011
    Messaggi
    339
    Allora...

    potrei lasciare astratto il metodo add(Denaro d) e scrivere l'altro cosi:

    codice:
    public void add(Soldi s){
    
        Iterator<Denaro> it = s.iterator();
        while(it.hasNext()){
          Denaro d = it.next();
          this.add(d);
         }
       }
    Che dici?

    Per quanto riguarda il metodo sub , mi puoi aiutare?

    P.S. scusa l'ignoranza ma come si fa nei messaggi ad inserire la citazione?

    Ciao

  7. #7
    Originariamente inviato da Markus85
    potrei lasciare astratto il metodo add(Denaro d) e scrivere l'altro cosi:
    Ti conviene concretizzarli entrambi..

    Originariamente inviato da Markus85
    Per quanto riguarda il metodo sub , mi puoi aiutare?
    Devi calcolare il resto tra s1 e s2 usando l'istanza corrente su cui viene invocato il metodo, cioè devi verificare se this contiene un insieme di quote la cui somma è pari al resto.
    Quindi, se tale verifica risulta essere positiva, allora rimuovi tali quote da this, gli aggiungi le quote di s2 e restituisci un nuovo oggetto Soldi che appunto rappresenta tale resto.

    Originariamente inviato da Markus85
    P.S. scusa l'ignoranza ma come si fa nei messaggi ad inserire la citazione?
    In basso a destra di ogni messaggio c'è anche il bottone Quote.

  8. #8
    Utente di HTML.it
    Registrato dal
    Feb 2011
    Messaggi
    339
    Ho perfezionato un pò il codice...


    codice:
    public abstract class SoldiAbstract implements Soldi{
    	
    	
    	
    	@Override
    	public double totale(){
    		double totale = 0;
    		Iterator<Denaro> it = this.iterator();
    		while(it.hasNext()){
    			Denaro d = it.next();
    			totale+= d.getValore() * d.getQuantità();
    		}
    		return totale;
    		
    	}//TOTALE
    	
    	//IL METODO ADD DENARO RIMANE ASTRATTO
    	
    	
    	@Override
    	public void add(Soldi s){
    		Iterator<Denaro> it = s.iterator();
    		while(it.hasNext()){
    			Denaro d = it.next();
    			this.add(d);
    		}
    		
    	}//ADD_SOLDI
    	
    	protected abstract Soldi creaSalvadanaio();  //MA QUESTO E' UN METODO FACTORY?
    	
    	@Override
    	public Soldi sub(Soldi s1, Soldi s2){
    		
    		Soldi SR = creaSalvadanaio();
    		this.add(s2);
    		double SommaS1 = s1.totale();
    		double SommaS2 = s2.totale();
    		double resto = SommaS2 - SommaS1;
    		if(resto<0) throw new RuntimeException("Soldi insufficienti per il pagamento, devi aggiungere :" +resto*(-1));
    		if(resto==0) System.out.println("Pagamento Effettuato!");
    		while(resto>0){
    			Iterator<Denaro> it = this.iterator();
    			while(it.hasNext()){
    				int pezzi = 0;
    				Denaro d = it.next();
    				while(resto>=d.getValore()){
    					resto-=d.getValore();
    					++pezzi;
    				}//WHILE INTERNO
    				if(pezzi>0) SR.add(new Denaro(d.getValore(), pezzi));
    				
    			}//WHILE ITERATORE
    			
    		}// WHILE RESTO
    		
    		return SR;
    	
    	}//SOLDI_SUB
    	
    	
    	
    }//SOLDI ABSTRACT
    Non capisco come concretizzare il metodo add(Denaro d)...
    Il metodo sub dovrebbe andare, che dici?

  9. #9
    Originariamente inviato da Markus85
    Non capisco come concretizzare il metodo add(Denaro d)...
    Devi aggiungere d alla tua istanza di TreeSet.

    Originariamente inviato da Markus85
    Il metodo sub dovrebbe andare, che dici?
    Secondo me non può andare .. questa parte non è corretta:
    codice:
    while(resto>=d.getValore()){
    	resto-=d.getValore();
    	++pezzi;
    }
    if(pezzi>0) SR.add(new Denaro(d.getValore(), pezzi));
    Non puoi incrementare pezzi a tuo piacimento, perchè i soldi per fornire il resto li prendi da this, come dice la specifica:
    ...
    restituisce un oggetto Soldi contenente la differenza esatta (resto) “s2-s1” prelevandola dalla somma this
    ...
    anche la condizione del ciclo è in chiaro contrasto con la specifica.

    Ti conviene pensare ad un algoritmo diverso, perchè non è una buona idea scorrere le quote come hai pensato di fare.

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 © 2026 vBulletin Solutions, Inc. All rights reserved.