Pb avec java calcul de l'equation du 2em degr

Résolu/Fermé
Profil bloqué - 19 avril 2011 à 21:26
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 - 26 nov. 2012 à 19:37
Bonjour, je suis entrait de orogrammer un programme en java qui calcule une fonction du 2em degrer et voila mon code source:
import java.util.Scanner;
import java.math.*;
public class equation{
public static void main(String args[]){
double a,b,c,delta;
double z,x1,x2;
Scanner S=new Scanner(System.in);
System.out.println("entrer la valeure de a:");
a= S.nextDouble();
System.out.println("entrer la valeure de b:");
b= S.nextDouble();
System.out.println("entrer la valeure de c:");
c= S.nextFloat();
delta=b*b-4*a*c;
z=Math.sqrt(delta);
x1=(-b+z)/(2*a);
System.out.println(x1);
x2=(-b-z)/(2*a);
System.out.println(x2);
}
}


mais le problem c que dans la console x1 et x2 le resultat on m'affiche x1=x2=NaN
j'ai revu tous ca mais j'ai rien trouver alors si quelqu'un a une solution ou une autre propositoin je suis preunneuse merci d'avance

A voir également:

2 réponses

KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
20 avril 2011 à 13:56
Si tu fais la racine carrée d'un nombre négatif le résultat vaut NaN (Not a Number).
Il faut distinguer différents cas selon le signe de delta.

Double delta = b*b - 4*a*c;
switch (delta.compareTo(0.0))
{
case  0 : // delta=0, x est l'unique solution réelle
case  1 : // delta>0, x1 et x2 sont deux solutions réelles distinctes
case -1 : // delta<0, z1 et z2 sont deux solutions complexes conjuguées
}

Remarque : ton code marche quand même lorsque delta est positif (ex: a=1, b=0, c=-1)
1
Profil bloqué
20 avril 2011 à 20:56
merci bcp c vrai g fait une condition quand delta est positif ou negatif ca a marcher
0
cloridee Messages postés 47 Date d'inscription lundi 16 janvier 2012 Statut Membre Dernière intervention 9 juin 2023 8
26 nov. 2012 à 19:13
Bon voilà, pour tous ceux qui cherche encore le code d'un programme en java qui donne les solutions d'une équation de second degrés, je viens vous la donné
Elle est parfaite : respect des normes de codage, respect des 80 caractères max par clones, bien commenté, ...
En tant qu'étudiant en première année de DUT informatique vous pouvez me faire confiance.

Ce programme à une gestion des erreurs de saisie clavier, il calcule aussi les équations de degré 1 si vous rentrez une valeur nulle pour la valeur où se trouve le " x² "

Bref, voilà le code, à vous de modifier le " package " pour le bon fonctionnement du programme :



/*
* Delta.java
* Programme pour calculer les racines d'une équation de second degré
*/

package Programmes;

import java.util.Scanner;

/**
* Ce programme demande à l'utilisateur de rentrer les valeurs d'une équation
* de second degré, le programme calculera ensuite le delta, puis les racines
* ( si possible ) de cette équation. Si le delta est négatif, aucun résultat
* à l'équation ne sera donné
* @author ??????
* @version 1.0
*/
public class Delta {

/**
* Programme principal
* @param args non utilisé
*/
public static void main ( String[] args ) {

// Déclaration du Scanner pour la saisie de données
Scanner sc = new Scanner(System.in);

// Declaration des variables
double a, // la valeur du nombre suivit de x² de l'équation
b, // la valeur du nombre suivit de x de l'équation
c, // la valeur du dernier nombre de l'équation
delta, // la valeur du delta qui sera calculé
racineUn, // la 1ere racine qui sera trouvé, si delta bon
racineDeux; // la 2eme racine qui sera trouvé, si delta bon

// Demande à l'utilisateur du premier chiffre de l'équation + vérif
System.out.print("L'equation de second degres est de type : "
+ " ax^2 + bx + c \nDonnez a : ");
while (!sc.hasNextDouble()) {
System.err.print("\" " + sc.nextLine() + " \" n'est pas correct, "
+ "\nVeuillez rentrer une valeur decimale ( ex :"
+ " 4 / 8 / 8.5 / 14.45 ). \nRedonez a : ");
}
a = sc.nextDouble();
sc.nextLine();
while ( Double.isInfinite(a) ) {
System.err.print("\"a\" est incorect, chiffre trop grand. "
+ "Redonnez a : ");
while (!sc.hasNextDouble()) {
System.err.print("\" " + sc.nextLine() + " \" n'est pas "
+ "correct.\nVeuillez rentrer une valeur "
+ "decimale ( ex : 4 / 8 / 8.5 / 14.45 )."
+ "\nRedonez a : ");
}
a = sc.nextDouble();
sc.nextLine();
}


// Demande à l'utilisateur du deuxieme chiffre de l'équation + vérif
System.out.print("Donnez b : ");
while (!sc.hasNextDouble()) {
System.err.print("\" " + sc.nextLine() + " \" n'est pas correct, "
+ "\nVeuillez rentrer une valeur decimale ( ex :"
+ " 4 / 8 / 8.5 / 14.45 ). \nRedonez b : ");
}
b = sc.nextDouble();
sc.nextLine();
while ( Double.isInfinite(b) ) {
System.err.print("\"b\" est incorect, chiffre trop grand. "
+ "Redonnez b : ");
while (!sc.hasNextDouble()) {
System.err.print("\" " + sc.nextLine() + " \" n'est pas "
+ "correct.\nVeuillez rentrer une valeur"
+ " decimale ( ex : 4 / 8 / 8.5 / 14.45 )."
+ "\nRedonez b : ");
}
b = sc.nextDouble();
sc.nextLine();
}


// Demande à l'utilisateur du troisième chiffre de l'équation
System.out.print("Donnez c : ");
while (!sc.hasNextDouble()) {
System.err.print("\" " + sc.nextLine() + " \" n'est pas correct, "
+ "\nVeuillez rentrer une valeur decimale ( ex :"
+ " 4 / 8 / 8.5 / 14.45 ). \nRedonez c : ");
}
c = sc.nextDouble();
sc.nextLine();
while ( Double.isInfinite(c) ) {
System.err.print("\"c\" est incorect, chiffre trop grand. "
+ "Redonnez c : ");
while (!sc.hasNextDouble()) {
System.err.print("\" " + sc.nextLine() + " \" n'est pas "
+ "correct.\nVeuillez rentrer une valeur "
+ "decimale ( ex : 4 / 8 / 8.5 / 14.45 )."
+ "\nRedonez c : ");
}
c = sc.nextDouble();
sc.nextLine();
}


// Calcul de delta :
delta = ( b * b ) - 4 * a * c;

/* Vérification que DELTA ne soit un chiffre infini si l'utilisateur
* rentre des valeurs trop grandes pour a, b ou c
*/
if ( Double.isInfinite(delta) ) {
System.err.println("La valeur de Delta est trop grande, le "
+ "resultat ne peut etre genere et donne.");
} else {
/* Les differents cas de la valeur de delta :
* Premierement vérification que "a" ne soit pas égal à 0 pour ne
* pas que le programme donne une valleur "NaN" / " Infinity
* Cas 1 : delta est un chiffre négatif donc racines non réelles,
* impossible.
* Cas 2 : delta est égal à 0 : solution = 0
* Cas 3 : delta est un chiffre positif donc racines réelles et
* calcul des racines
*/
if ( a == 0 ) {
// Cas de degres un
racineUn = - c / b;
// Vérification de la saisie
if ( b == 0 && c == 0 ) {
System.err.println("Erreur : \"a\", \"b\" et \"c\" ne doivent "
+ "pas etre egal a 0.");
} else if ( Double.isNaN(racineUn) ) {
// Le cas ou b = 0 et c = 0
System.err.println("Les valeurs donnees sont incorrectes."
+ " \"b\" et \"c\" ne doivent pas etre"
+ " egal a 0");
} else if ( b == 0 ) {
System.err.println("L'equation est absurde et n'a donc "
+ "pas de solutions.");
} else if ( c == 0 ) {
System.out.println("Racine = " + 0);
} else {
System.out.println("Une seule Racine = " + racineUn);
}
} else if ( delta < 0 ) {
// Cas 1
System.out.println("La valeur de delta est negative (" + delta
+ ") les solutions de l'equation sont donc"
+ " impossibles.");
} else if ( delta == 0 ) {
// Cas 2
System.out.println("La valeur de delta est egale a " + delta
+ " donc la solution de l'equation est egale"
+ " a 0");
} else {
// Cas 3
System.out.println("La valeur de delta est positive (" + delta
+ ") , deux racines reelles sont donc "
+ "distinctes : ");

// Calcul des racines
racineUn = ( - b + Math.sqrt(delta)) / ( 2 * a );
racineDeux = ( - b - Math.sqrt(delta)) / ( 2 * a );

// On affiche le résultat :
System.out.println("\nValeur 1 : " + racineUn + "\nValeur 2 "
+ ": " + racineDeux);
}
}
System.out.print("Fin du programme.");
}
}



Par contre, le copié / collé à décalé un peu tout le code, donc si vous avez la flemme de le remettre en place comme moi, contacté-moi et je peux vous l'envoyer en .java avec un code propre et parfait.

Cordialement.
-1
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
26 nov. 2012 à 19:37
Est-ce que tu acceptes les critiques aussi, ou est-ce que ton code est trop "parfait" ?

Copié/Collé/Exécuté !

Donnez a : 8.5
" 8.5 " n'est pas correct, 
Veuillez rentrer une valeur decimale ( ex : 4 / 8 / 8.5 / 14.45 ).

C'est bien de préciser des exemples de valeurs autorisées, faudrait-il encore qu'elles soient bonnes !
En fonction de la langue (et en français en particulier), c'est une virgule qu'il faut mettre, donc " 8,5 "

Donnez a : 1
Donnez b : 0
Donnez c : 1
La valeur de delta est negative (-4.0) les solutions de l'equation sont donc impossibles.

As-tu entendu parler des nombres complexes ? Car les solutions à cette équation existent...
Si Δ<0, alors les solutions sont -b/2a ± i√(-Δ))/2a

Et enfin, le meilleur pour la fin :
Donnez a : 1
Donnez b : -2
Donnez c : 1
La valeur de delta est egale a 0.0 donc la solution de l'equation est egale a 0

Là le résultat est carrément faux, la solution de cette équation c'est x=1.

Je n'ai même pas regardé le code, j'ai juste exécuté ton programme et testé quelques cas...
Alors replonge toi un peu dans ton programme, la "perfection" n'est pas pour aujourd'hui !
0