[JAVA]Verificare se N è un quadrato perfetto
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?
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
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?
Ho scritto questo:
Se inserisco il valore 16 mi restituisce true, ma anche se inserisco 17!!!
Dove ho sbagliato?
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?
"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?
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:
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; } }