begin process at 2010 09 09 09:31:40
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Maths et Algorithmes

 > ENSEMBLE COMPLEXE

ENSEMBLE COMPLEXE


 Information sur la source

Note :
Aucune note
Catégorie :Maths et Algorithmes Classé sous :Ensemble Complexe, Nombre Imaginaire, Opération Arithmétique, Math Niveau :Initié Date de création :29/11/2008 Date de mise à jour :05/12/2008 11:21:52 Vu :2 701

Auteur : rocky87

Ecrire un message privé
Commentaire sur cette source (9)
Ajouter un commentaire et/ou une note

 Description

Il existe différents types en java, caractère, boolean, entier, réel... Mais il n'existe pas de type complexe pour réaliser des opérations dans C, alors j'ai créé moi même une petite classe complexe qui permet de faire addition, soustraction, conjugaison, multiplication, division, inversion, racine nième et puissance nième.

Source

  • public class Complexe {
  • private double im;
  • private double re;
  • private double arg;
  • private double mod;
  • //##############################################
  • //constructeurs (a+ib)
  • //pour entrer a et b séparément
  • public Complexe(double reel, double imag) {
  • im = imag;
  • re = reel;
  • this.modArg();
  • }
  • //pour entrer le nombre sous la forme "a+ib"
  • public Complexe(String aib) {
  • this.decompose(aib);
  • this.modArg();
  • }
  • //##############################################
  • //méthodes annexes pour les constructeurs
  • //permet de décomposer une string "a+ib" en 2 nombres, a et b
  • private void decompose(String aib) {
  • String a;
  • String b;
  • if(aib.indexOf("i") == 0 && aib.length() == 1){
  • a = "0";
  • b = "1";
  • } else if(aib.indexOf("-") == 0 && aib.indexOf("i") == 1 && aib.length() == 2) {
  • a = "0";
  • b = "-1";
  • } else if(aib.indexOf("+") != -1) {
  • a = aib.substring(0,aib.indexOf("+"));
  • b = aib.substring((aib.indexOf("+")+1), aib.indexOf("i"));
  • if(b.length() == 0) {
  • b = aib.substring((aib.indexOf("i")+1),aib.length());
  • }
  • } else if(aib.indexOf("-") != -1) {
  • if(aib.indexOf("-") == 0) {
  • a = "0";
  • b = aib.substring((aib.indexOf("-")), aib.indexOf("i"));
  • } else {
  • a = aib.substring(0,aib.indexOf("-"));
  • b = aib.substring((aib.indexOf("-")), aib.indexOf("i"));
  • }
  • if(b.length() == 1) {
  • b = "-" + aib.substring((aib.indexOf("i")+1),aib.length());
  • }
  • } else if(aib.indexOf("i") != -1) {
  • a = "0";
  • b = aib.substring(0, aib.indexOf("i"));
  • if(b.length() == 0) {
  • b = aib.substring((aib.indexOf("i")+1),aib.length());
  • }
  • } else {
  • a = aib;
  • b = "0";
  • }
  • try {
  • re = Integer.parseInt(a);
  • im = Integer.parseInt(b);
  • } catch(NumberFormatException e) {
  • System.out.println("Erreur, Mauvais format de nombre");
  • re = 0;
  • im = 0;
  • }
  • }
  • //méthode pour récupérer le module |z| et l'argument Arg(z) à partir des nombres a et b
  • private void modArg() {
  • mod = Math.sqrt((re*re + im*im));
  • if(re != 0 && im != 0) {
  • arg = Math.atan((im/re));
  • } else if (re != 0 && im == 0) {
  • if(im >= 0) {
  • arg = 0;
  • } else if(im < 0) {
  • arg = Math.PI;
  • }
  • } else if(re == 0 && im != 0){
  • if(im >= 0) {
  • arg = Math.PI/2;
  • } else {
  • arg = -Math.PI/2;
  • }
  • }
  • }
  • //##############################################
  • //Opérations sur les complexes
  • //conjugué a+ib -> a-ib
  • public Complexe conj() {
  • Complexe conj = new Complexe(re, -im);
  • return conj;
  • }
  • //addition (a+ib)+(c+id)
  • public Complexe add(Complexe comp) {
  • double imag = im + comp.getIm();
  • double reel = re + comp.getRe();
  • Complexe add = new Complexe(reel, imag);
  • return add;
  • }
  • //soustraction (a+ib)-(c+id)
  • public Complexe minus(Complexe comp) {
  • double imag = im - comp.getIm();
  • double reel = re - comp.getRe();
  • Complexe minus = new Complexe(reel, imag);
  • return minus;
  • }
  • // multiplication (a+ib)*(c+id)
  • public Complexe time(Complexe comp) {
  • double imag = im*comp.getRe() + re*comp.getIm();
  • double reel = re*comp.getRe() - im*comp.getIm();
  • Complexe time = new Complexe(reel, imag);
  • return time;
  • }
  • //inversion 1/(a+ib)
  • public Complexe inverse() {
  • double imag = (-im)/(mod*mod);
  • double reel = re/(mod*mod);
  • Complexe inverse = new Complexe(reel, imag);
  • return inverse;
  • }
  • //division (a+ib)/(c+id)
  • public Complexe divide(Complexe comp) {
  • return time(comp.inverse());
  • }
  • //puissance (a+ib)^x
  • //pour les puissances 0 < x < 1, utiliser la racine (.root(int))
  • //pour les puissances x < 0, meixu vaut faire la puissance |x| puis une inversion
  • public Complexe pow(double x) {
  • double argu = arg*x;
  • double modu = Math.pow(mod, x);
  • double imag = reduce(modu*Math.sin(argu));
  • double reel = reduce(modu*Math.cos(argu));
  • Complexe pow = new Complexe(reel, imag);
  • return pow;
  • }
  • //racine xroot(a+ib) !!!ATTENTION: x != 0
  • //racines entières seulement (sinon il y en a une infitinité)
  • //Si x appartient à N, il y a x racines, raison pour laquelle cette méthode retourne un tableau
  • //pour les racines 0 < x < 1, utiliser la puissance (.pow(int))
  • //pour les racines x < 0, meixu vaut faire la racine |x| puis une inversion
  • public Complexe[] root(int x) {
  • Complexe[] root = new Complexe[x];
  • double modu;
  • double reel;
  • double imag;
  • double argu;
  • if(x != 0 ) {
  • modu = Math.pow(mod, (1/x));
  • } else {
  • modu = 0;
  • }
  • for(int i = 0; i < x; i++) {
  • argu = (arg+2*i*Math.PI)/x;
  • imag = reduce(modu*Math.sin(argu));
  • reel = reduce(modu*Math.cos(argu));
  • root[i]= new Complexe(reel, imag);
  • }
  • return root;
  • }
  • //################################################
  • //Getters
  • public double getIm() {
  • return im;
  • }
  • public double getRe() {
  • return re;
  • }
  • //#################################################
  • //autres méthodes utiles
  • //permet de réduire un nombre à 2 décimale seulement.
  • //pour changer la réduction, il suffit de changer 1000
  • //méthode utilisée dans les méthodes racines et puissance, peut être retirée facilement
  • private double reduce(double nombre) {
  • double n = nombre * 1000;
  • n = (int)n;
  • n = n / 1000;
  • return n;
  • }
  • //redéfinition de la méthode toString(), pour qu'elle affiche le nombre sous la forme a+ib
  • public String toString() {
  • String out = "";
  • if(re == 0) {
  • if(im == 0) {
  • out += "0";
  • } else if(im == 1) {
  • out += "i";
  • } else if(im == -1) {
  • out += "-i";
  • } else {
  • out += im + "i";
  • }
  • } else {
  • out += re;
  • if(im == 0) {
  • out += "";
  • } else if(im == 1) {
  • out += "+i";
  • } else if(im == -1) {
  • out += "-i";
  • } else if(im > 0){
  • out += "+" + im + "i";
  • } else {
  • out += im + "i";
  • }
  • }
  • return out;
  • }
  • //redéfinition de la méthode equals(), pour comparer si deux nombres complexes sont identiques
  • //on ne peut pas évaluer si un nombre complexe est supérieur ou inférieur à un autre
  • //on ne peut que savoir s'ils sont égaux (même partie réelle et même même partie imaginaire)
  • public boolean equals(Object o) {
  • if(o != null && o.getClass() == this.getClass()){
  • Complexe comp = (Complexe) o;
  • return (this.re == comp.getRe() && this.im == comp.getIm());
  • } else {
  • return false;
  • }
  • }
  • }
public class Complexe {
	
	private double im;
	private double re;
	private double arg;
	private double mod;
	
	//##############################################
	//constructeurs (a+ib)
	//pour entrer a et b séparément
	public Complexe(double reel, double imag) {
		im = imag;
		re = reel;
		this.modArg();
	}
	//pour entrer le nombre sous la forme "a+ib"
	public Complexe(String aib) {
		this.decompose(aib);
		this.modArg();
	}
	
	//##############################################
	//méthodes annexes pour les constructeurs
	//permet de décomposer une string "a+ib" en 2 nombres, a et b
	private void decompose(String aib) {
		String a;
		String b;
		if(aib.indexOf("i") == 0 && aib.length() == 1){
			a = "0";
			b = "1";
		} else if(aib.indexOf("-") == 0 && aib.indexOf("i") == 1 && aib.length() == 2) {
			a = "0";
			b = "-1";
	 	} else if(aib.indexOf("+") != -1) {
			a = aib.substring(0,aib.indexOf("+"));
			b = aib.substring((aib.indexOf("+")+1), aib.indexOf("i"));
			if(b.length() == 0) {
				b = aib.substring((aib.indexOf("i")+1),aib.length());
			}
		} else if(aib.indexOf("-") != -1) {
			if(aib.indexOf("-") == 0) {
				a = "0";
				b = aib.substring((aib.indexOf("-")), aib.indexOf("i"));
			} else {
				a = aib.substring(0,aib.indexOf("-"));
				b = aib.substring((aib.indexOf("-")), aib.indexOf("i"));
			}
			if(b.length() == 1) {
				b = "-" + aib.substring((aib.indexOf("i")+1),aib.length());
			}
		} else if(aib.indexOf("i") != -1) {
			a = "0";
			b = aib.substring(0, aib.indexOf("i"));
			if(b.length() == 0) {
				b = aib.substring((aib.indexOf("i")+1),aib.length());
			}
		} else {
			a = aib;
			b = "0";
		}
		try {
			re = Integer.parseInt(a);
			im = Integer.parseInt(b);
		} catch(NumberFormatException e) {
			System.out.println("Erreur, Mauvais format de nombre");
			re = 0;
			im = 0;
		}
	}
	//méthode pour récupérer le module |z| et l'argument Arg(z) à partir des nombres a et b
	private void modArg() {
		mod = Math.sqrt((re*re + im*im));
		if(re != 0 && im != 0) {
			arg = Math.atan((im/re));
		} else if (re != 0 && im == 0) {
			if(im >= 0) {
				arg = 0;
			} else if(im < 0) {
				arg = Math.PI;
			}
		} else if(re == 0 && im != 0){
			if(im >= 0) {
				arg = Math.PI/2;
			} else {
				arg = -Math.PI/2;
			}
		}
	}
	
	
	//##############################################
	//Opérations sur les complexes
	
	
	//conjugué a+ib -> a-ib
	public Complexe conj() {
		Complexe conj = new Complexe(re, -im);
		return conj;
	}
	
	//addition (a+ib)+(c+id)
	public Complexe add(Complexe comp) {
		double imag = im + comp.getIm();
		double reel = re + comp.getRe();
		Complexe add = new Complexe(reel, imag);
		return add;
	}
	
	//soustraction (a+ib)-(c+id)
	public Complexe minus(Complexe comp) {
		double imag = im - comp.getIm();
		double reel = re - comp.getRe();
		Complexe minus = new Complexe(reel, imag);
		return minus;
	}
	
	// multiplication (a+ib)*(c+id)
	public Complexe time(Complexe comp) {
		double imag = im*comp.getRe() + re*comp.getIm();
		double reel = re*comp.getRe() - im*comp.getIm();
		Complexe time = new Complexe(reel, imag);
		return time;
	}
	
	//inversion 1/(a+ib)
	public  Complexe inverse() {
		double imag = (-im)/(mod*mod);
		double reel = re/(mod*mod);
		Complexe inverse = new Complexe(reel, imag);
		return inverse;
	}
	
	//division (a+ib)/(c+id)
	public Complexe divide(Complexe comp) {
		return time(comp.inverse());
	}
	
	//puissance (a+ib)^x
	//pour les puissances 0 < x < 1, utiliser la racine (.root(int))
	//pour les puissances x < 0, meixu vaut faire la puissance |x| puis une inversion
	public Complexe pow(double x) {
		double argu = arg*x;
		double modu = Math.pow(mod, x);
		double imag = reduce(modu*Math.sin(argu));
		double reel = reduce(modu*Math.cos(argu));
		Complexe pow = new Complexe(reel, imag);
		return pow;
	}
	
	//racine xroot(a+ib) !!!ATTENTION: x != 0
	//racines entières seulement (sinon il y en a une infitinité)
	//Si x appartient à N, il y a x racines, raison pour laquelle cette méthode retourne un tableau
	//pour les racines 0 < x < 1, utiliser la puissance (.pow(int))
	//pour les racines x < 0, meixu vaut faire la racine |x| puis une inversion
	public Complexe[] root(int x) {
		Complexe[] root = new Complexe[x];
		double modu;
		double reel;
		double imag;
		double argu;
		if(x != 0 ) {
			modu = Math.pow(mod, (1/x));
		} else {
			modu = 0;
		}
		for(int i = 0; i < x; i++) {
			argu = (arg+2*i*Math.PI)/x;
			imag = reduce(modu*Math.sin(argu));
			reel = reduce(modu*Math.cos(argu));
			root[i]= new Complexe(reel, imag);
		}
		return root;
	}
	
	
	//################################################
	//Getters
	public double getIm() {
		return im;
	}

	public double getRe() {
		return re;
	}
	
	//#################################################
	//autres méthodes utiles
	//permet de réduire un nombre à 2 décimale seulement.
	//pour changer la réduction, il suffit de changer 1000
	//méthode utilisée dans les méthodes racines et puissance, peut être retirée facilement
	private double reduce(double nombre) {
		double n = nombre * 1000;
		n = (int)n;
		n = n / 1000;
		return n;
	}
	
	//redéfinition de la méthode toString(), pour qu'elle affiche le nombre sous la forme a+ib
	public String toString() {
		String out = "";
		if(re == 0) {
			if(im == 0) {
				out += "0";
			} else if(im == 1) {
				out += "i";
			} else if(im == -1) {
				out += "-i";
			} else {
				out += im + "i";
			}
		} else {
			out += re;
			if(im == 0) {
				out += "";
			} else if(im == 1) {
				out += "+i";
			} else if(im == -1) {
				out += "-i";
			} else if(im > 0){
				out += "+" + im + "i";
			} else {
				out += im + "i";
			}
		}
		return out;
	}
	
	//redéfinition de la méthode equals(), pour comparer si deux nombres complexes sont identiques
	//on ne peut pas évaluer si un nombre complexe est supérieur ou inférieur à un autre
	//on ne peut que savoir s'ils sont égaux (même partie réelle et même même partie imaginaire)
	public boolean equals(Object o) {
		if(o != null && o.getClass() == this.getClass()){
			Complexe comp = (Complexe) o;
			return (this.re == comp.getRe() && this.im == comp.getIm());
		} else {
			return false;
		}
	}
}

 Conclusion

Si vous trouvez des erreurs, dites le moi. Si vous ne comprenez pas certains points du code, dites moi, je commenterai plus spécifiquement.


 Historique

01 décembre 2008 18:33:33 :
Ajout d'une méthode equals(Complexe) pour savoir si deux nombres sont identiques.
01 décembre 2008 19:41:40 :
Modification de la méthode decompose(String) afin qu'elle gère les nombres négatifs et "i" et "-i"
02 décembre 2008 20:22:36 :
Quelques modifications dans la méthode decompose(String) et dans la méthode equals(Complexe)
04 décembre 2008 19:56:49 :
Modification de la méthode .equals(Complexe) pour qu'elle reconnaisse si un objet est null
05 décembre 2008 11:21:52 :
Modification de la méthode .equals(Object) pour qu'elle puisse comparer un complexe avec n'importe quel auter objet

 Sources de la même categorie

Source avec Zip Source avec une capture TUTORIAL MORPION DÉBUTANT par jojolemariole
Source avec Zip RC4 BY SKYNET par kingcherchell
Source avec Zip Source avec une capture EDITEUR DE COURBES par jojolemariole
Source avec Zip Source avec une capture JEU DE LA VIE par jojolemariole
Source avec Zip Source avec une capture OUTILS STATISTIQUES AVEC REPRÉSENTATION GRAPHIQUE (RÉGRESSIO... par Julien39

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture SIMPLEXE ET DUAL par MrRenaud
ADDITION ET SOUSTRACTION AVEC VIRGULE N CHIFFRES par alpha5
Source avec Zip CLASS IDENTITEREMARQUABLE.JAVA par The Red Man
Source avec Zip Source avec une capture PROGRAMME DE RÉVISION EN MATHÉMATIQUES. par sarathai
COMBINATOIRE par vctrs

Commentaires et avis

Commentaire de fredmj le 01/12/2008 10:06:54

Initiative sympa.
je vais l'essayer si j'ai 5 minutes, mais le code semble propre.

Commentaire de petifa le 02/12/2008 14:26:23

slt
petites remarques
pour simplifier ta fonction decompose()
tu devrais découper en début de fonction ton aib  suivant - et i et initialiser a et b en faisant directement une conversion string/int
avec le try catch tu test si ca marche ou non.
De plus dans ton
#  try {
# Integer.parseInt(a);
# } catch(NumberFormatException e) {
# System.out.println("Erreur, Mauvais format de nombre");;
# }
# re = Integer.parseInt(a);

fait directement re = Integer.parseInt(a); dans ton try et si ca ne passe pas change re dans ton catch... parce que tu fais deux fois une conversion alors que une suffirait.


# // multiplication (a+ib)*(c+id)
# public Complexe time(Complexe comp) {
pourquoi appeler ta fonction time??


la fonction toString pourrait être grandement simplifiée
ptètre comme ça j'ai pas testé mais ça simplifie quand même ...
public String toString
{
    if (re==0 && im==0) return null;
    string out = (re==0)?:re;
    out += (im==1)?"+i":((im==-1)?"-i":((im>0)?"+":"")+"i")
    return out
}


Idem pour ta fonction
public boolean equals(Complexe comp) {
    return this.re == comp.getRe() && this.im == comp.getIm();
}


j'ai pas regardé plus en détail pour le reste, mais l'idée est pas mal

Commentaire de rocky87 le 02/12/2008 20:31:13

J'ai modifié la méthode .equals() et j'ai apporét les modifications à mon try{}catch{}, mais je comprends pas trop ce que tu veux dire pour simplifier ma méthode decompose()

J'ai pas modifié la méthode toString(), certes, ce que tu proposes est plus joli et plus cours, mais c'est d'une part pas forcément plus rapide à l'exécution et c'est surtout moins clairs.

Merci pour ce commentaire constructif

Commentaire de petifa le 03/12/2008 09:53:17

je comprend que c'est moins clair la fonction ToString que j'ai écris, mais ce que je voulais dire en mettant ca c'était de factoriser les traitements identiques en mettant le test dans l'affectation.

Pour la méthode decompose() je voulais juste dire de simplifier la fonction en supprimant les répétitions de aib.substring() et de aib.indexOf(); et donc effectuer ce traitement en début de fonction, cela allégera seulement la lectur du code.

Commentaire de ynabid le 04/12/2008 00:53:09

Si on fait

Complexe a=new Complexe("5"),b;
a.equals(b);

ça va causer un problème car vous n'avez pas traiter le cas où b est null

en plus pourquoi la surchage de equals et ne pas la redéfinir(1 mieux que 2) par exemple:
@Override
public boolean equals(Object o){
    if(o==null) return false;
    if(o.getClass()!=getClass()) return false;
    final Complexe a=(Complexe) o;
    if(a.re!=re || a.im!=im) return false;
    return true;
}
@Override
public int hashCode(){
    int hash=7;
    hash=41*hash+re;
    hash=41*hash+im;
    return hash;e
}

en tout cas, j'admire ta manière de programmer :)

Commentaire de rocky87 le 04/12/2008 19:51:41

Merci du compliment. Je ne comprend pas trop ce que tu veux faire avec ta méthode hashCode(). Et le fait de demander un objet de classe Complexe en paramètre de ma fonction .equals évite de devoir vérifier que l'objet est bien de classe Complexe.

Commentaire de ynabid le 04/12/2008 21:34:44

oui je suis d'accord avec toi, mais l'autre equals (boolean equals(Object) existera toujours si tu ne le redéfini pas. Dans ce cas là si un utilisateur veut utiliser une liste contigüe de complexe et veut chercher un complexe dans cette liste, normalement il va utiliser int :indexOf(Object) sachant que cette méthode utilise l'autre equals(qui compare les références) alors elle va lui retourner soit l'indexe de l'objet qui a la même référence soit -1. La plupart des Class redéfinissent la méthode equals.

Commentaire de Tarfaa le 05/12/2008 20:53:18

Hello ! Une bonne petite classe ça :) Cependant, je rejoins Ynabid pour la méthode equals() qui prend en effet bien un Object. Il serait aussi intéressant de gérer les erreurs possibles avec des exceptions. Le constructeur pourrait prendre plus de formats. Et pourquoi pas commenter le tout en Javadoc et faire le ménage dans le code (séparer les set/get, les méthodes publiques et celles privées).
Pour répondre à ta question, la méthode hashCode() permet de générer un entier à partir des variables d'instances. Bref, si deux objets sont "identiques" (ils ont les mêmes valeurs) leur hashCode le serra aussi. La méthode donnée par Ynabid est correct sauf le petit "e" à la dernière ligne... :D
Pour plus d'information sur cette méthode : http://java.developpez.com/faq/java/?page=divers#DIVERS_hashCode
(à lundi xD)

Commentaire de ynabid le 06/12/2008 14:41:40

xD

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

{Graphics2D] Arc de Cercle [ par deejimy ] Je récupère à partir d'un fichier txt, les coordonnées du centre de l'arc(x,y), le rayon r , l'angle de début d et l'angle de fin f. Je n'arrive pas à [Math]Manipuler les exposant avec un float [ par djodjoo ] Salut tous,Voil&#224; mon probl&#232;me, j'aimerais pouvoir manipuler les nombre tel qque 2.12E-4 par exemple.Ce que j'aimerais pouvoir faire :&nbsp;& Math.pow(10, 10) me renvoit 2147483647 [ par alonsyl ] bonjour,Math.pow(10, 10) me renvoit 2147483647 ! moi j'aimerais qu'il me renvoit 10^10 = 10000000000.que se passe t'il ? comment resoudre ce pbl ?merc midlet j2me ou est passé java.lang.Math.log [ par misterzinzin ] bonjour, je vien de commencer la programmation de midlet (java pour mobile) et je ne trouva pas la fonction permettant de calculer des logarithme dans Calcul de mémoire ... [ par threadom ] Bon d'abord j'explique ...En gros L_oStream.getFrameLength() me retourne un long qui m'indique combien de byte vont mettre retourné, et je veux stocke Arrondi à n chiffres significatifs [ par juancho2786 ] Bonsoir , je fais une méthode qui permet d'arrondir à n chiffres significatis seulement j'ai un problème. Par exemple lorsque le nombre à arrondir est double != Double [ par lafolle24320 ] Bonjour à tous, est ce que quelqu'un pourrait m'expliquer clairement la différence entre un double et un Double. En fait j'ai un calcul : avec beam en Sortir un zéro avec un Math.random()*10+1 [ par daviddubois ] Bonjour tout le monde,J'essaie d'avoir des chiffres de 0 à 10 avec un Math.random(), le problème est qu'il sort des chiffres entre 1 et 10.Il ne sort la fonction Math.random() [ par dorine82 ] bonjour,j'aimerais savoir comment utiliser deux threads chacun a son tour. si par exemple j' ai le thread A et le thread B , je dois avoir comme resul tableau sans repitition [ par gigi00 ] bonjourj ai besoin d' aide pour faire fonctioner se programmedans ce programme je veux réaliser un tableau de [9][9] et qui rempli aleatoirement les c


Nos sponsors


Sondage...

CalendriCode

Septembre 2010
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
27282930   

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,778 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales