Problème de classe en Java....pitié ^^

Résolu/Fermé
Utilisateur anonyme - 15 mars 2009 à 13:05
 Utilisateur anonyme - 17 mars 2009 à 13:39
Salut tout le monde, voila j'implore votre aide ^^

J'ai, pour un TP, du écrire une classe Complexe pour...représenter les nombres complexes bien evidemment ^^
Ensuite j'utilise une classe TestComplexe pour.....hé oui tester ma classe Complexe comme vous l'aurez deviné !
MAIS !
Mon problème est que dans ma classe Test Complexe, alors que je teste pour voir si l'addition et la multiplication de Complexe fonctionne, je m'aperçois que la multiplication ne fonctionne pas comme je veux argh...il trouve bien la bonne partie entière, mais la partie imaginaire qu'il donne est.....imaginaire XD



Donc voici la classe Complexe :
class Complexe {
	private float reel;
	private float imaginaire;
	
	public Complexe(float reel, float imaginaire){   
		this.reel = reel;
		this.imaginaire = imaginaire;
	}
	
	public Complexe(){      
		this.reel = 0;
		this.imaginaire = 0;
	}
	
	public float getReel(){
		return reel;
	}
	
	public float getImaginaire(){
		return imaginaire;
	}

	public void multiScal(float scalaire){
		reel = reel * scalaire;
		imaginaire = imaginaire*scalaire;
	}
	
	public void additionCompl(Complexe c){
		reel = reel + c.getReel();
		imaginaire = imaginaire + c.getImaginaire();
	}
	
	public void multiComplexe(Complexe c){
		reel = reel * c.getReel() - imaginaire * c.getImaginaire();
		imaginaire = reel * c.getImaginaire() + imaginaire * c.getReel();
	}
	
	public void affichage(){
		System.out.println( reel + " + " + imaginaire + "i");
	}
}



Et voila ci-dessous la classe de test qui affiche dans la console les résultats dse opérations :
public class TestComplexe {
	public static void main(String[] args) {
		int x = 4;
		Complexe c1 = new Complexe(3,4);
		Complexe c11 = new Complexe(3,4);
		Complexe ctest = new Complexe(3,4);
		Complexe c2 = new Complexe(5,-10);
		Complexe c3 = new Complexe(20,2);
		Complexe cx = new Complexe(1,2);
		Complexe cy = new Complexe(3,5);
		c1.multiScal(x);			// c1 * x
		c1.affichage();			// affichage
		c11.additionCompl(c2);		// c11 + c2
		c11.affichage();			//affichage
		c3.multiComplexe(ctest);	         // c3 * ctest
		c3.affichage();			// affichage
		cx.multiComplexe(cy);	         // cx * cy
		cx.affichage();			// affichage
		cy.multiComplexe(cy); 	         // cy * cy
		cy.affichage();			// affichage
	}

}


J'ai retourné ce code au moins 7 ou 8 fois, j'ai changé les noms des variables, j'ai tenté plein de trucs.....mais rien a faire la multiplication ne fonctionne pas comme elle devrait.....c'est pourquoi j'ai besoin de vous ^^

c3 * ctest :
résultat attendu / affiché ==> 52 + 86i / 52.0 + 214.0i
cx * cy :
résultat attendu / affiché ==> -7 + 11i / -7.0 + -29.0i
cy * cy :
résultat attendu / affiché ==> -16 + 30i / -16.0 + -160.0i

Au fait j'ai une petite question subsidiaire; quand j'essaie de déclarer un Complexe avec des coeficients réels dans le genre :
Complexe c = new Complexe(3.5,4); 

Hé ben Eclipse n'est pas trop d'accord.....il me demande soit de faire un cast de 3.5 en float, soit de changer le constructeur Complexe(float,float) en Complexe(double,float). Pourquoi ? Je ne comprends vraiment pas, un float suffit pourtant non ? Enfin voila, et ça me travaille depuis quelques jours sans que je trouve la solution ^^

Merci infiniment donc aux personnes qui prendront le temps de m'aider (et de lire mon code ;-)
A voir également:

5 réponses

Utilisateur anonyme
15 mars 2009 à 18:25
Alors, toujours personne ?
0
Utilisateur anonyme
15 mars 2009 à 20:12
Bonjour,


Pour:
Complexe c = new Complexe(3.5,4); écrire Complexe c = new Complexe(3.5f,4); (3.5f ou 3.5F)

Sinon 3.5 est double par défaut.

Pour le reste je vais regarder.

A++

Cordialement,

Dan
0
Utilisateur anonyme
16 mars 2009 à 15:16
Ouf merci beaucoup ^^
Ha d'accord en fait je ne savais pas que c'était un double par défaut.....donc si je comprends bien il vaut mieux à la base déclarer un double plutot qu'un float quoi....merci !
0
Utilisateur anonyme > Utilisateur anonyme
16 mars 2009 à 17:11
Salut,

Pourquoi pas, mais (oui il y a quand même un mais que ce soit un double ou un float...) :

Prenon le cas float, si l'on fait par exemple
Complexe c3 = new Complexe(29999991234,2f); sans décimales donc

java considère qu'il doit reserver en mémoire un emplacement pour un integer.
Le mais: c'est que 29999991234 dépace la longueur maxi d'un int et nous avons ce message "integer number too large: 29999991234" lors de la compilation. (ce serait pareil avec un long par exemple et bien entendu un double)

La conclusion est qu'il vaut mieux ajouter le f, ou le d, voir le l

Dan
0
Utilisateur anonyme
16 mars 2009 à 08:30
Bonjour,

Bon, j'ai testé en ajoutant quelques traces (println), notamment dans les getReel et getImaginaire

public float getReel(){
System.out.println( "getReel>>>>>>>>>>>>> reel = " + reel);
return reel;
}

public float getImaginaire(){
System.out.println( "getimaginaire>>>>>>>>>>>>> imaginaire = " + imaginaire);
return imaginaire;
}

Et, comme on pouvait s'y attendre, tel que c'est écri, les résultats obtenus sont tout à fait correct .

J'aimerais savoir pourquoi on attend, par exemple pour c3, le résultat 52 + 86 (je ne parle pas des .0 car nous travaillons avec des float et nous pourions avoir des décimales autres que .0)

J'attend donc de savoir pourquoi on attend 86 pour modifier et obtenir ce résultat.

Cordialement,

Dan
0
Utilisateur anonyme
17 mars 2009 à 08:01
Désolé pour mon retard ^^ mais j'ai pas internet chez moi donc je dois me taper le trajet jusqu'a l'université XD

Pour c3 on fait l'opération c3 * ctest = (20+2i) * (3+4i) = 52 + 86i
D'ou le résultat qu'on attend.

Enfin à moins que je ne me sois trompé dans la multiplication ??????? La honte......
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Utilisateur anonyme
17 mars 2009 à 12:10
Salut,

Bon j'ai vu pourquoi on a 214 et pas 86:

Avant le second calcul reel est à 52 (résultat du 1er calcul) et n'est plus à 20 la valeur initiale passée par Complexe c3 = new Complexe(20,2);

Si on ne veut pas tenir compte du 1er calcul
Pour faire le second calcul avec 20, il suffit de sauvegarder avant de faire le 1er calcul float reelSv = reel;

et réinitialiser avant le second reel = reelSv;

Soit:

public void multiComplexe(Complexe c){
float reelSv = reel;
reel = reel * c.getReel() - imaginaire * c.getImaginaire();
reel = reelSv;
imaginaire = reel * c.getImaginaire() + imaginaire * c.getReel();

Cordialement,

Dan
0
Utilisateur anonyme
17 mars 2009 à 13:39
Mon sauveuuuuuuuuuuuuur ^^

Merci infiniment tu as toute ma gratitude, ma reconnaissance et tout et tout....;toi, t'iras au paradis c'est sur XD

En plus jamais j'aurais pensé à ça......merci merci merci tu me débloque là, j'arrivai plus a réfléchir sur la suite de mes exos tout en sachant que j'arrivai pas a faire fonctionner un "simple" (pas tant que sa :-) programme d'addition de complexes....



Merciiiiiiiiiiiiiiiiiiiii et topic résolu bien sur !

A bientot pour de nouvelles aventures ^^
0