[JAVA]Verificare se N è un quadrato perfetto

merlo1
Ho a che fare con il seguente esercizio:

Scrivere un metodo che, dato un numero naturale N, verifica se N è un quadrato perfetto(ovvero, se è il quadrato di un altro numero naturale), restituendo l'esito di tale verifica sotto forma di valore di tipo BOOLEAN.


E' la prima volta che mi trovo a lavorare con dei valori di tipo BOOLEAN e mi trovo un pò disorientato, qualcuno può darmi un mano?

Risposte
apatriarca
Si tratta semplicemente di un tipo che può contenere true o false (nota che come tutti i tipi primitivi di Java è scritto minuscolo...). Ogni espressione con operatori logici restituisce un valore di tipo boolean. Normalmente o si restituisce direttamente true e false a seconda dei casi, oppure si restituisce direttamente una espressione con operatori logici. Cosa non ti è chiaro esattamente?

merlo1
Ho scritto questo:
class MetodoQuadratoPerfetto{
	public static boolean quadrato(int n){
		double reale;
		int intero;
		boolean quadrato;
		reale=0;
		reale=Math.sqrt(reale);
		intero=(int)reale;

		intero=intero*intero;

		quadrato=intero==reale;

		return quadrato;
	}
}


Se inserisco il valore 16 mi restituisce true, ma anche se inserisco 17!!!
Dove ho sbagliato?

Luc@s
"merlo":
Ho scritto questo:
class MetodoQuadratoPerfetto{
	public static boolean quadrato(int n){
		double reale;
		int intero;
		boolean quadrato;
		reale=0; // qui lo dai 0
		reale=Math.sqrt(reale); // e fai $\sqrt{0} ?
		intero=(int)reale;

		intero=intero*intero;

		quadrato=intero==reale;

		return quadrato;
	}
}


Se inserisco il valore 16 mi restituisce true, ma anche se inserisco 17!!!
Dove ho sbagliato?

apatriarca
Ci sono due errori nel tuo codice. Il primo è quello che Luc@s ha già fatto notare e il secondo è il test che hai effettuato. L'espressione intero == reale è tra variabili di tipo diverso e si dovrebbe sempre cercare di evitare questo genere di test. Inoltre confrontare due double è sconsigliato perché per motivi di approssimazione due numeri double non sono quasi mai uguali. Il test corretto da effettuare è il seguente:

intero == n

La variabile quadrato è comunque inutile perché è possibile restituire direttamente il test dalla funzione (questa ha infatti valore boolean) e per evitare l'errore che ha notato Luc@s dovresti cercare di dichiarare e inizializzare correttamente le variabili subito prima del loro uso e utilizzare le variabili esclusivamente per uno scopo (se insomma contiene un numero non dovrebbe contenere il suo quadrato in seguito). Quindi una versione corretta della tua funzione sarebbe:

class MetodoQuadratoPerfetto{
   public static boolean quadrato(int n){

      double reale = Math.sqrt((double) n);
      
      int intero = (int)reale; // ovviamente si può anche fare a meno di reale...

      return (intero * intero) == n;
   }
}

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.