Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    Esercizio...

    codice:
    Si realizzi una classe che implementa l'interfaccia GenericNumber (descritta nella
    pagina seguente) e che sia in grado di manipolare numeri generici (numeri interi e
    numeri in virgola mobile). Trattare i numeri in virgola mobile come dei Double.
    In seguito si realizzi un programma Java, attraverso il metodo main() della stessa
    classe, che prenda in input un file di testo contenente, per ogni riga, un'espressione
    aritmetica e restituisca i risultati di tali espressioni in un file di output (i calcoli
    dovranno essere effettuati utilizzando la nuova classe che implementa
    GenericNumber).
    Input
    Il file di input contiene una sequenza di espressioni aritmetiche, una per ogni riga.
    Il primo valore di ogni riga rappresenta il numero di operandi presenti
    nell'espressione. Ogni espressione aritmetica coinvolge non pił di 10 operandi.
    Gli operatori sulla sinistra hanno prioritą rispetto agli operatori sulla destra, quindi
    l'espressione 3 + 4 – 5 * 7 – 3 č da interpretarsi come (((3 + 4) – 5) * 7) – 3.
    Ogni espressione puņ contenere sia numeri interi che numeri in virgola mobile.
    Il file di output contiene i risultati delle espressioni aritmetiche presenti nel file di
    input, uno per ogni riga. All'inizio di ogni riga č presente una stringa, tra parentesi
    tonde, che indica se il risultato č un integer (integer) o un floating point (floating)

    Ecco l'interfaccia
    codice:
    public interface GenericNumber {
    // ritorna true se il valore dell'oggetto č un intero
    public boolean isInteger();
    // ritorna true se il valore č un numero in virgola mobile
    public boolean isFloating();
    // assegna all'oggetto un valore intero pari a i
    public void setValue(int i);
    // assegna all'oggetto un valore in virgola mobile pari a d
    public void setValue(double d);
    // ritorna il valore delloggetto, se č in virgola mobile,
    // ritorna 0 altrimenti
    public double getFloatingValue();
    // ritorna il valore dell'oggetto, se č un intero, 0 altrimenti
    public int getIntValue();
    // confronta il valore dell'oggetto
    // con il valore del numero generico x
    public boolean equals(GenericNumber x);
    // effettua la moltiplicazione con il numero generico x
    // ritorna l'oggetto stesso
    public GenericNumber mul(GenericNumber x);
    // divide il valore dell'oggetto per un numero generico x
    // ritorna l'oggetto stesso
    public GenericNumber div(GenericNumber x);
    // effettua l'addizione con il numero generico x
    // ritorna l'oggetto stesso
    public GenericNumber add(GenericNumber x);
    // sottrae al valore dell'oggetto il numero generico x
    // ritorna l'oggetto stesso
    public GenericNumber min(GenericNumber x);
    // converte il valore dell'oggetto in una stringa
    public String toString();
    }
    Ora il fatto che ci siano isInteger e Double e il fatto che si parli di oggetti mi porta a pensare che si debbano usare variabili boxed, o sbaglio?

    Il mio problema č, quando creo la classe che implementa l'interfaccia, avrņ un oggetto che di per se come parametro avrą un valore, o Int, o Double.
    Come faccio io nel costruttore a inserire questo parametro dato che non posso specificare se č int o double a priori?

    Cioč in un costruttore si avrebbe una cosa cosģ:

    codice:
    int numero;
    String colore;
    
    public Pennarello(int numero, String colore)
    {
    	...
    }
    Molto facilmente, ma qui cosa passo come parametro?

    codice:
    public class NumeroGenerico implements GenericNumber
    {
    	private GenericNumber value;
    	
    	public NumeroGenerico(GenericNumber value)
    	{
    		this.value=value;
    	}
    Non credo funzioni...

  2. #2
    Puoi avere pił di un costruttore per una classe. Ad esempio ne fai uno con int, uno con double ecc. Inoltre non č detto che tu debba utilizzare necessariamente un costruttore per inizializzare l'oggetto. Esiste il costruttore vuoto che ti permette di istanziare l'oggetto e successivamente puoi impostare il suo valore con il metodo setValue(int i) o setValue(double d)
    "Mai discutere con un idiota. Ti trascina al suo livello e ti batte con l'esperienza." (Oscar Wilde)

  3. #3
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328

    Moderazione

    Dai un'occhiata alRegolamento Interno: il titolo non č assolutamente conforme.

    Correggo io.


    Ciao.
    "Perchč spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  4. #4
    C'č un altro problema.
    Alla fine ho optato per utilizzare due costruttori, il problema ora č in altri metodi.
    Nella mia interfaccia ci sono dei metodi che consentono le 4 operazioni tra oggetti, perņ ho degli errori di compilazione.

    La classe č:

    codice:
    public class NumeroGenerico implements GenericNumber
    {
    	private int value;
    	private double value2;
    	
    	public NumeroGenerico(int value)
    	{
    		this.value=value;
    	}
    	
    	public NumeroGenerico(double value2)
    	{
    		this.value2=value2;
    	}
    	
    	
    	// ritorna true se il valore dell'oggetto č un intero
    	public boolean isInteger()
    	{
    		String control=this.toString();
    	
    		for(int i=0; i<control.length(); i++)
    		if(control.charAt(i)=='.' && i==control.length()-2 && control.charAt(i+1)=='0')
    			return true;
    		
    		return false;
    	}
    	
    		
    	
    	// ritorna true se il valore č un numero in virgola mobile
    	public boolean isFloating()
    	{
    	String control=this.toString();
    	
    	for(int i=0; i<control.length(); i++)
    		if(control.charAt(i)=='.')
    			if(control.charAt(i+1)!='0' || i<control.length()-2)
    			return true;
    		
    		return false;
    	}
    	
    	
    	// assegna all'oggetto un valore intero pari a i
    	public void setValue(int i)
    	{
    		this.value=i;
    	}
    	
    	// assegna all'oggetto un valore in virgola mobile pari a d
    	public void setValue(double d)
    	{
    		this.value2=d;
    	}
    	
    	// ritorna il valore delloggetto, se č in virgola mobile,
    	// ritorna 0 altrimenti
    	public double getFloatingValue()
    	{
    		if(this.isFloating()==true)
    			return value2;
    		
                     return 0;
    	}
    	
    	// ritorna il valore dell'oggetto, se č un intero, 0 altrimenti
    	public int getIntValue()
    	{
    		if(this.isInteger()==true)
    		
    			return value;
    		return 0;
    	}
    	
    	// confronta il valore dell'oggetto
    	// con il valore del numero generico x
    	public boolean equals(GenericNumber x)
    	{
    		if(this.toString().compareTo(x.toString())==0)
    			return true;
    		
    		return false;
    	   
    	}
    
    	// effettua la moltiplicazione con il numero generico x
    	// ritorna l'oggetto stesso
    	public GenericNumber mul(GenericNumber x)
    	{
    		if(this.isInteger())
    		{
    		
    			int val1=this.getIntValue();
    		}
    		
    		
    		else {
    			double val1=this.getFloatingValue();}
    		
    		if(x.isInteger())
    		{
    		
    			int val2=x.getIntValue();
    		}
    		
    		
    		else {
    			double val2=x.getFloatingValue();}
    		
    		this.setValue(val1*val2);
    		
    		return this;
    		
    	}
    
    	// divide il valore dell'oggetto per un numero generico x
    	// ritorna l'oggetto stesso
    	public GenericNumber div(GenericNumber x)
    	{
    		if(this.isInteger()){
    		
    			int val1=this.getIntValue();}
    		
    		
    		else {
    			double val1=this.getFloatingValue();}
    		
    		if(x.isInteger()){
    		
    			int val2=x.getIntValue();}
    		
    		
    		else{ 
    			double val2=x.getFloatingValue();}
    		
    		this.setValue(val1/val2);
    		
    		return this;	
    	}
    
    	// effettua l'addizione con il numero generico x
    	// ritorna l'oggetto stesso
    	public GenericNumber add(GenericNumber x)
    	{
    		if(this.isInteger()){
    		
    			int val1=this.getIntValue();}
    		
    		
    		else {
    			double val1=this.getFloatingValue();}
    		
    		if(x.isInteger()){
    		
    			int val2=x.getIntValue();}
    		
    		
    		else {
    			double val2=x.getFloatingValue();}
    		
    		this.setValue(val1+val2);
    		
    		return this;
    	}	
    
    	// sottrae al valore dell'oggetto il numero generico x
    	// ritorna l'oggetto stesso
    	public GenericNumber min(GenericNumber x)
    	{
    		if(this.isInteger()){
    		
    			int val1=this.getIntValue();}
    		
    		
    		else {
    			double val1=this.getFloatingValue();}
    		
    		if(x.isInteger()){
    			int val2=x.getIntValue();}
    		
    		
    		else {
    			double val2=x.getFloatingValue();}
    		
    		this.setValue(val1-val2);
    		
    		return this;
    	}
    
    	// converte il valore dell'oggetto in una stringa
    	public String toString()
    	{
    		return this.toString();
    	}
    
    }
    Ma ho degli errori, non capisco perchč si perdono le variabili nei metodi sulle operazioni.

    codice:
    >javac NumeroGenerico.java
    NumeroGenerico.java:111: cannot find symbol
    symbol  : variable val1
    location: class NumeroGenerico
    		this.setValue(val1*val2);
    		              ^
    NumeroGenerico.java:111: cannot find symbol
    symbol  : variable val2
    location: class NumeroGenerico
    		this.setValue(val1*val2);
    		                   ^
    NumeroGenerico.java:137: cannot find symbol
    symbol  : variable val1
    location: class NumeroGenerico
    		this.setValue(val1/val2);
    		              ^
    NumeroGenerico.java:137: cannot find symbol
    symbol  : variable val2
    location: class NumeroGenerico
    		this.setValue(val1/val2);
    		                   ^
    NumeroGenerico.java:162: cannot find symbol
    symbol  : variable val1
    location: class NumeroGenerico
    		this.setValue(val1+val2);
    		              ^
    NumeroGenerico.java:162: cannot find symbol
    symbol  : variable val2
    location: class NumeroGenerico
    		this.setValue(val1+val2);
    		                   ^
    NumeroGenerico.java:162: cannot find symbol
    symbol  : method setValue(java.lang.String)
    location: class NumeroGenerico
    		this.setValue(val1+val2);
    		    ^
    NumeroGenerico.java:186: cannot find symbol
    symbol  : variable val1
    location: class NumeroGenerico
    		this.setValue(val1-val2);
    		              ^
    NumeroGenerico.java:186: cannot find symbol
    symbol  : variable val2
    location: class NumeroGenerico
    		this.setValue(val1-val2);
    		                   ^
    9 errors
    >Exit code: 1

  5. #5
    Se dichiari variabili all'interno di un costrutto (nel tuo caso nell'if) non puoi pretendere che esse siano visibili al di fuori di esso.
    Comunque secondo me stai facendo un po' di confusione. Ho buttato gił un po' di codice prova a dargli un'occhiata:

    codice:
    public class NumeroGenerico implements GenericNumber {
    	
    	private int iValue;
    	private double dValue;
    	private boolean isInteger;
    	private boolean isFloating;
    
    	public NumeroGenerico(int value) {
    		this.iValue = value;
    		isInteger = true;
    	}
    
    	public NumeroGenerico(double value) {
    		this.dValue = value;
    		isFloating = true;
    	}
    
    	public boolean isInteger() {
    		return isInteger;
    	}
    	
    	public boolean isFloating() {
    		return isFloating;
    	}
    	
    	public void setValue(int value) {
    		this.iValue = value;
    	}
    
    	public void setValue(double value) {
    		this.dValue = value;
    	}
    
    	public double getFloatingValue() {
    		if (isFloating) {
    			return dValue;
    		}
    		return 0;
    	}
    	
    	public int getIntValue() {
    		if(isInteger) {
    			return iValue;
    		}
    		return 0;
    	}
    
    	public boolean equals(GenericNumber x) {
    		if (isInteger && x.isInteger()) {
    			if (this.iValue == x.getIntValue()) {
    				return true;
    			}
    		} else if (isInteger && x.isFloating()) {
    			if (this.iValue == (int) x.getFloatingValue()) {
    				return true;
    			}
    		} else if (isFloating && x.isInteger()) {
    			if (this.dValue == (double) x.getIntValue()) {
    				return true;
    			}
    		} else if (isFloating && x.isFloating()) {
    			if (this.dValue == x.getFloatingValue()) {
    				return true;
    			}
    		} 
    		return false;
    	}
    
    	public GenericNumber add(GenericNumber x) {
    		// TODO Auto-generated method stub
    		return null;
    	}
    
    	public GenericNumber div(GenericNumber x) {
    		// TODO Auto-generated method stub
    		return null;
    	}
    
    	public GenericNumber min(GenericNumber x) {
    		// TODO Auto-generated method stub
    		return null;
    	}
    
    	public GenericNumber mul(GenericNumber x) {
    		// TODO Auto-generated method stub
    		return null;
    	}
    	
    }
    A te l'implementazione delle operazioni aritmetiche.
    "Mai discutere con un idiota. Ti trascina al suo livello e ti batte con l'esperienza." (Oscar Wilde)

  6. #6
    Devo farti i miei complimenti...sei davvero in gamba, hai scritto un codice molto molto elegante.
    La programmazione non č affatto il mio forte.

    Ho implementato gli altri metodi sulle operazioni, volevo sapere cosa ne pensi.
    Il codice compila, ma sarą corretto?

    codice:
    public class NumeroGenerico implements GenericNumber
    {
    
    	private int iValue;
    	private double dValue;
    	private boolean isInteger;
    	private boolean isFloating;
    
    	public NumeroGenerico(int value) {
    		this.iValue = value;
    		isInteger = true;
    	}
    
    	public NumeroGenerico(double value) {
    		this.dValue = value;
    		isFloating = true;
    	}
    
    	public boolean isInteger() {
    		return isInteger;
    	}
    	
    	public boolean isFloating() {
    		return isFloating;
    	}
    	
    	public void setValue(int value) {
    		this.iValue = value;
    	}
    
    	public void setValue(double value) {
    		this.dValue = value;
    	}
    
    	public double getFloatingValue() {
    		if (isFloating) {
    			return dValue;
    		}
    		return 0;
    	}
    	
    	public int getIntValue() {
    		if(isInteger) {
    			return iValue;
    		}
    		return 0;
    	}
    
    	public boolean equals(GenericNumber x) {
    		if (isInteger && x.isInteger()) {
    			if (this.iValue == x.getIntValue()) {
    				return true;
    			}
    		} else if (isInteger && x.isFloating()) {
    			if (this.iValue == (int) x.getFloatingValue()) {
    				return true;
    			}
    		} else if (isFloating && x.isInteger()) {
    			if (this.dValue == (double) x.getIntValue()) {
    				return true;
    			}
    		} else if (isFloating && x.isFloating()) {
    			if (this.dValue == x.getFloatingValue()) {
    				return true;
    			}
    		} 
    		return false;
    	}
    
    	public GenericNumber add(GenericNumber x) {
    		
    		int iValue1; //se l'oggetto chiamante č int
    		double dValue1; //se l'oggetto chiamante č double
    		int iValue2;    //se il parametro č int
    		double dValue2;         //se il parametro č double
    		
    		if (isInteger && x.isInteger())
    		{
    			iValue1=this.getIntValue();
    			iValue2=x.getIntValue();
    			this.setValue(iValue1+iValue2);
    		}
    		
    		 else if (isInteger && x.isFloating())
    		 {
    			 iValue1=this.getIntValue();
    			 dValue2=x.getFloatingValue();
    			 this.setValue(iValue1+dValue2);
    		 }
    		 
    		 else if (isFloating && x.isInteger())
    		 {
    			 dValue1=this.getFloatingValue();
    			 iValue2=x.getIntValue();
    			 this.setValue(dValue1+iValue2);
    		 }
    		 
    		 else if (isFloating && x.isFloating())
    		 {
    			 dValue1=this.getFloatingValue();
    			 dValue2=x.getFloatingValue();
    			 this.setValue(dValue1+dValue2);
    		 }
    		 
    		 return this;
    	
    	}
    
    	public GenericNumber div(GenericNumber x) {
    		
    	int iValue1;
    	double dValue1;
    	int iValue2;
    	double dValue2;
    		
    		if (isInteger && x.isInteger())
    		{
    			iValue1=this.getIntValue();
    			iValue2=x.getIntValue();
    			this.setValue(iValue1/iValue2);
    		}
    		
    		 else if (isInteger && x.isFloating())
    		 {
    			 iValue1=this.getIntValue();
    			 dValue2=x.getFloatingValue();
    			 this.setValue(iValue1/dValue2);
    		 }
    		 
    		 else if (isFloating && x.isInteger())
    		 {
    			 dValue1=this.getFloatingValue();
    			 iValue2=x.getIntValue();
    			 this.setValue(dValue1/iValue2);
    		 }
    		 
    		 else if (isFloating && x.isFloating())
    		 {
    			 dValue1=this.getFloatingValue();
    			 dValue2=x.getFloatingValue();
    			 this.setValue(dValue1/dValue2);
    		 }
    		 
    		 return this;
    	}
    
    	public GenericNumber min(GenericNumber x) {
    		
    		int iValue1;
    		double dValue1;
    		int iValue2;
    		double dValue2;
    		
    		if (isInteger && x.isInteger())
    		{
    			iValue1=this.getIntValue();
    			iValue2=x.getIntValue();
    			this.setValue(iValue1-iValue2);
    		}
    		
    		 else if (isInteger && x.isFloating())
    		 {
    			 iValue1=this.getIntValue();
    			 dValue2=x.getFloatingValue();
    			 this.setValue(iValue1-dValue2);
    		 }
    		 
    		 else if (isFloating && x.isInteger())
    		 {
    			 dValue1=this.getFloatingValue();
    			 iValue2=x.getIntValue();
    			 this.setValue(dValue1-iValue2);
    		 }
    		 
    		 else if (isFloating && x.isFloating())
    		 {
    			 dValue1=this.getFloatingValue();
    			 dValue2=x.getFloatingValue();
    			 this.setValue(dValue1-dValue2);
    		 }
    		 
    		 return this;
    	}
    
    	public GenericNumber mul(GenericNumber x) {
    		
    		int iValue1;
    		double dValue1;
    		int iValue2;
    		double dValue2;
    		
    		if (isInteger && x.isInteger())
    		{
    			iValue1=this.getIntValue();
    			iValue2=x.getIntValue();
    			this.setValue(iValue1*iValue2);
    		}
    		
    		 else if (isInteger && x.isFloating())
    		 {
    			 iValue1=this.getIntValue();
    			 dValue2=x.getFloatingValue();
    			 this.setValue(iValue1*dValue2);
    		 }
    		 
    		 else if (isFloating && x.isInteger())
    		 {
    			 dValue1=this.getFloatingValue();
    			 iValue2=x.getIntValue();
    			 this.setValue(dValue1*iValue2);
    		 }
    		 
    		 else if (isFloating && x.isFloating())
    		 {
    			 dValue1=this.getFloatingValue();
    			 dValue2=x.getFloatingValue();
    			 this.setValue(dValue1*dValue2);
    		 }
    		 
    		 return this;
    	}
    
    	public String toString()
    	{
    		return this.toString();
    	}
    
    }
    Ho fatto solamente le 4 operazioni, il resto era troppo bello e non si poteva cambiare..
    Ho dichiarato esternamente delle variabili, con i controlli ho assegnato i valori e modificato il valore dell'oggetto che invoca il metodo con il risultato dell'operazione, restituendo l'oggetto.
    Funziona secondo te?
    Fa l'operazione e restituisce l'oggetto su cui viene invocato il metodo settando come valore il risultato dell'operazione?

  7. #7
    Prima di tutto mi sono accorto di un bug nel metodo equals() nel quale avevo aggiunto, senza testare, i cast ad (ine) e a (double) che vanno tolti.
    Poi ho sistemato un po' le operazioni aritmetiche effettuando l'operazione indiscriminatamente sia su valori int che double. Ciņ mi ha permesso di rimuovere un bel po' di controlli.
    Comunque ho testato il tutto in maniera molto superficiale per cui ti consiglio di dare una buona controllata al codice e di effettuare dei test pił approfonditi.

    codice:
    public class NumeroGenerico implements GenericNumber {
    
    	private int iValue;
    	private double dValue;
    	private boolean isInteger;
    	private boolean isFloating;
    
    	public NumeroGenerico(int value) {
    		this.iValue = value;
    		isInteger = true;
    	}
    
    	public NumeroGenerico(double value) {
    		this.dValue = value;
    		isFloating = true;
    	}
    
    	public boolean isInteger() {
    		return isInteger;
    	}
    
    	public boolean isFloating() {
    		return isFloating;
    	}
    
    	public void setValue(int value) {
    		this.iValue = value;
    	}
    
    	public void setValue(double value) {
    		this.dValue = value;
    	}
    
    	public double getFloatingValue() {
    		if (isFloating) {
    			return dValue;
    		}
    		return 0;
    	}
    
    	public int getIntValue() {
    		if (isInteger) {
    			return iValue;
    		}
    		return 0;
    	}
    
    	public boolean equals(GenericNumber x) {
    		if (isInteger && x.isInteger()) {
    			if (this.iValue == x.getIntValue()) {
    				return true;
    			}
    		} else if (isInteger && x.isFloating()) {
    			if (this.iValue == x.getFloatingValue()) {
    				return true;
    			}
    		} else if (isFloating && x.isInteger()) {
    			if (this.dValue == x.getIntValue()) {
    				return true;
    			}
    		} else if (isFloating && x.isFloating()) {
    			if (this.dValue == x.getFloatingValue()) {
    				return true;
    			}
    		}
    		return false;
    	}
    
    	public GenericNumber add(GenericNumber x) {
    		if (x.isInteger()) {
    			iValue += x.getIntValue(); 
    			dValue += x.getIntValue(); 
    		} else {
    			iValue += x.getFloatingValue(); 
    			dValue += x.getFloatingValue(); 
    		}
    		return this;
    	}
    
    	public GenericNumber div(GenericNumber x) {
    		if (x.isInteger() && x.getIntValue() != 0) {
    			iValue /= x.getIntValue(); 
    			dValue /= x.getIntValue(); 
    		} else if (x.isFloating() && x.getFloatingValue() != 0) {
    			iValue /= x.getFloatingValue(); 
    			dValue /= x.getFloatingValue(); 
    		}
    		return this;
    	}
    
    	public GenericNumber min(GenericNumber x) {
    		if (x.isInteger()) {
    			iValue -= x.getIntValue(); 
    			dValue -= x.getIntValue(); 
    		} else {
    			iValue -= x.getFloatingValue(); 
    			dValue -= x.getFloatingValue(); 
    		}
    		return this;
    	}
    
    	public GenericNumber mul(GenericNumber x) {
    		if (x.isInteger()) {
    			iValue *= x.getIntValue(); 
    			dValue *= x.getIntValue(); 
    		} else {
    			iValue *= x.getFloatingValue(); 
    			dValue *= x.getFloatingValue(); 
    		}
    		return this;
    	}
    
    }
    "Mai discutere con un idiota. Ti trascina al suo livello e ti batte con l'esperienza." (Oscar Wilde)

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.