View Full Version : [java] equazione secondo grado
alberto t.
11-07-2009, 16:52
Ciao a tutti!
Devo realizzare un programma che chiesti in ingresso i coefficienti a,b,c di un’equazione di secondo grado, calcoli il numero di soluzioni (0 oppure 1 oppure 2) e stampi i valori
esempio:
a: 3
b: 4
c: 1
numero di soluzioni:2
soluzione1: -0.333333
soluzione2: -1
Il codice è il seguente:
package equazione2grado;
import java.math.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
System.out.println("Dammi il coefficiente a:");
String line = input.readLine();
int a = Integer.parseInt(line);
System.out.println("Dammi il coefficiente b:");
line = input.readLine();
int b = Integer.parseInt(line);
System.out.println("Dammi il coefficiente c:");
line = input.readLine();
int c = Integer.parseInt(line);
double soluzione1 = (-b + Math.sqrt(b ^ 2 - 4 * a * c)) / 2 * a;
double soluzione2 = (-b - Math.sqrt(b ^ 2 - 4 * a * c)) / 2 * a;
System.out.println("La prima soluzione è: " + soluzione1);
System.out.println("La seconda soluzione è: " + soluzione2);
}
}
Al momento dell'esecuzione del programma, mi compare il seguente errore:
init:
deps-jar:
compile:
run:
Dammi il coefficiente a:
3
Dammi il coefficiente b:
4
Dammi il coefficiente c:
1
La prima soluzione è: NaN
La seconda soluzione è: NaN
BUILD SUCCESSFUL (total time: 6 seconds)
Come mai?
Ciao e grazie
perchè non usi semplicemente l'util Scanner?
import java.util.scanner;
[...]
Scanner keyb = new Scanner(System.in);
System.out.println("Dammi il coefficiente a:");
int a = keyb.nextInt();
cosi risparmi un bel po' di casini
x tornare al tuo problema...nn hai trattato i casi in cui il determinante è negativo. cmq NaN => Not A Number, è probabile che mettendo qualche parentesi e usando semplicemente lo scanner di int, senza passare per String e poi per il metodo parseInt il problema si risolve
ps: piccolo consiglio, metti le parentesi, soprattutto quando fai operazioni! sebbene a volte inutili aiutano la lettura di terzi, ti aiutano a capire se sai quello che stai facendo e prevengono errori a volte stupidi ;)
alberto t.
11-07-2009, 17:21
ciao
e dunque quando fai la sqrt di un numero negativo ti ritorna NaN
non c'è un numero negativo sotto radice
a=3 b=4 c=1
(-4+sqrt(16-4*3*1))/6
b ^ 2
^ e' l'operatore di or esclusivo.. Devi usare Math.pow() per calcolare la potenza.. :)
alberto t.
11-07-2009, 17:35
Math.pow()
Come devo utilizzare quella funzione?
b*Math.pow(2) ?
Per motivi che non sto ad elencare, non voglio utilizzare:
import java.util.scanner;
Scanner keyb = new Scanner(System.in);
int a = keyb.nextInt();
C'è qualche altro modo?
Come devo utilizzare quella funzione?
b*Math.pow(2) ?
Per motivi che non sto ad elencare, non voglio utilizzare:
import java.util.scanner;
Scanner keyb = new Scanner(System.in);
int a = keyb.nextInt();
C'è qualche altro modo?
http://java.sun.com/javase/6/docs/api/java/lang/Math.html#pow(double,%20double)
Math.pow(b,2); per fare b^2
Per lo scanner va benissimo anche il tuo metodo, io ho sempre utilizzato quello ed e' sempre andato bene, quindi, perche' cambiare? :D
sisi, lo so che con a= 3, b = 4, e c= 1 ottieni un delta positivo, ma dalla tua descrizione di come dovrebbe funzionare il programma non li hai cmq tenuti in conto ;)
per evitare il math.pow(a, 2) fai semplicemente a * a
ps: si risparmiano molte linee di codice usando lo Scanner...cmq de gustibus ;)
alberto t.
11-07-2009, 19:31
Ora il codice è questo:
import java.io.*;
public class Main {
public static void main(String[] args)throws Exception {
BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
System.out.println("Dammi il coefficiente a:");
String line = input.readLine();
int a = Integer.parseInt(line);
System.out.println("Dammi il coefficiente b:");
line = input.readLine();
int b = Integer.parseInt(line);
System.out.println("Dammi il coefficiente c:");
line = input.readLine();
int c = Integer.parseInt(line);
double soluzione1 = (-b + Math.sqrt(Math.pow(b,2) - 4 * a * c)) / 2 * a;
double soluzione2 = (-b - Math.sqrt(Math.pow(b,2) - 4 * a * c)) / 2 * a;
System.out.println("La prima soluzione è: " + soluzione1);
System.out.println("La seconda soluzione è: " + soluzione2);
}
}
Ma il programma non funziona comunque:
init:
deps-jar:
Created dir: C:\Documents and Settings\alberto\Documenti\NetBeansProjects\Equazione secondo grado\build\classes
Compiling 1 source file to C:\Documents and Settings\alberto\Documenti\NetBeansProjects\Equazione secondo grado\build\classes
compile:
run:
Dammi il coefficiente a:
3
Dammi il coefficiente b:
4
Dammi il coefficiente c:
1
La prima soluzione è: -3.0
La seconda soluzione è: -9.0
BUILD SUCCESSFUL (total time: 8 seconds)
Come mai?
metti tra tonde il denominatore della formula 2 * a..
alberto t.
11-07-2009, 20:55
metti tra tonde il denominatore della formula 2 * a..
Ok, grazie a tutti!
figurati. hai capito il perchè? a parità di priorità tra operandi si eseguono da sinistra verso destra. nel tuo caso quindi veniva eseguita prima la divisione e poi la moltiplicazione.
banryu79
13-07-2009, 08:30
Math.pow(b,2); per fare b^2
Ma non basta fare così:
b*b;
Comuque guarda se questo codice può esserti d'aiuto:
public class Eq2grado
{
/** Attributi di Eq2grado */
double a, b, c; // i tre coefficienti di un'equazione di secondo grado
double[] s = new double[2]; // le (0-2) soluzioni possibili dell'equazione
boolean intersezioniOk = false; // TRUE se ci sono intersezioni valide
/**
* Risolve l'equazione di secondo grado
*
* @param a primo coefficiente
* @param b secondo coefficiente
* @param c terzo coefficiente
*/
public Eq2grado(double a, double b, double c)
{
this.a = a;
this.b = b;
this.c = c;
double delta = b*b - 4*a*c;
if (delta >= 0)
{
s[0] = ( -b + Math.sqrt(delta) ) / (2*a);
s[1] = ( -b - Math.sqrt(delta) ) / (2*a);
intersezioniOk = true;
}
else
{
intersezioniOk = false;
System.out.println("Eq2grado: non esiste un'intersezione reale.");
}
}
}
malocchio
14-07-2009, 14:28
Ma non basta fare così:b*b;
Cosa vuoi dire?
tranquillo è la stessa cosa, ti sta dicendo che Math.pow(b, 2) è uguale che b * b come Math.pow(n, 3) è uguale a n * n * n.
malocchio
14-07-2009, 14:37
tranquillo è la stessa cosa, ti sta dicendo che Math.pow(b, 2) è uguale che b * b come Math.pow(n, 3) è uguale a n * n * n.
Probabilmente si è dimenticato un punto di domanda alla fine della frase allora! :rolleyes:
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.