begin process at 2012 05 27 18:27:06
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Divers

 > LISTE AVEC LES CLASSES C++

LISTE AVEC LES CLASSES C++


 Information sur la source

Note :
Aucune note
Catégorie :Divers Classé sous :Liste chainée, Liste, Noeud, classe Niveau :Débutant Date de création :01/11/2008 Vu / téléchargé :7 933 / 203

Auteur : alberd_m

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

 Description

Cliquez pour voir la capture en taille normale
Bonjour, depuis peu, j'ai un travail à faire dans le cadre de mon cours de programmation en c++. Le travail que j'avais à faire était un peu plus compliqué, mais je voulais bien comprendre avant de mit lancer, donc j'ai chercher des sources qui montrais comment bien faire avec les classes. Je n'ai pas trouver de sources bien expliquer. Je vais tenter de vous faire voir ce que j'y ai comprit.

J'aimerais bien que vous me disiez comment vous trouvez à votre tour.

Source

  • /**************************************************
  • Les noeuds que j'utiliserai seront pour des entier.
  • **************************************************/
  • class Noeud
  • {
  • friend class Liste; //cette ligne est bien important pour le concept. En fait elle dit que
  • //la classe 'Liste' est son ami, donc la classe 'Liste' va pouvoir utiliser
  • //ces Méthode et Attribut même s'ils sont privé. PS:(1)bas de page.
  • //Par défaut tout se qui se trouve dans la classe est privé, mais cela n'empèche pas de faire
  • //mieu voir que pour les méthodes/attributs suivante c'est le cas.
  • private:
  • Noeud ( int unNombre ); //un constructeur pour un nouveau noeud qui prend en paramètre un nombre.
  • Noeud ( const Noeud & unNoeud ); //on peut aussi créer un noeud avec un Noeud déjà existant.
  • int m_iMonNombre; //le nombre que le noeud contient.
  • Noeud * m_pNoeudSuivant; //un pointeur vers le noeud suivant.PS:(2)bas de page.
  • };
  • /**************************************************
  • La liste appartir duquel on peut ajouter des noeud.
  • ps: cette classe est l'ami de la classe Noeud, donc
  • elle peut utilisé les choses définies plus haut.
  • Note: Pour une première lecture, ne vous occupé pas
  • du constructeur 'Liste(const Liste &uneListe)'
  • et de l'operator = . Vous comprendrez plus tard.
  • De toute façons, ceux-ci ne sont pas si important.
  • Et p-e dure à comprendre...
  • **************************************************/
  • class Liste
  • {
  • public:
  • Liste(); //constructeur par défault de la classe 'Liste' le plus important.
  • Liste( const Liste & uneListe ); // ce constructeur ne sert que si l'on veut copier une liste
  • // déja existante dans une autre.
  • ~Liste();//Descrtructeur de la classe. (important car il faut bien supprimer tout les noeuds que
  • //l'on a créé pour libérer l'espace mémoire.
  • const Liste & operator = ( const Liste & uneListe ); //Redéfinition de l'opérateur '='
  • void Ajouter( int leNombre ); //une méthode pour ajouter un nouveau 'Noeud' à la liste.
  • bool Suivant(); //méthode pour faire avancer le pointeur du noeud courant d'un noeud.
  • void Premier(); //Pour mettre le pointeur du noeud courant au premier élément
  • int NoeudCourant(); //Pour retourner la valeur(int) du noeud courant.
  • void Vider(); //Méthode pour vider la liste.
  • private:
  • Noeud * m_pPremierNoeud; // pointeur sur sur le premier noeud de la liste.
  • Noeud * m_pNoeudCourant; // pointeur pour pouvoir se déplacer dans la liste.
  • };
  • //Ce constructeur de la classe noeud reçoit en paramètre un
  • // nombre car la liste va contenir des nombres.
  • //On initialise l'attribut 'int' de la classe avec la valeur passé
  • // en paramètre, puis on initialise le pointeur vers le noeud suivant
  • // à zéro
  • Noeud :: Noeud( int unNombre )
  • {
  • m_iMonNombre = unNombre;
  • m_pNoeudSuivant = 0; //on aurais aussi pu remplacer 0 par 'NULL'
  • }
  • //Ce constructeur de la classe reçois en paramètre un noeud.
  • //On initialise l'attribut 'int' avec la valeur que le noeud contient.
  • //Ps: j'ai mit un '&' pour dire que l'on passe la référence de l'objet Noeud
  • // et pas de faire une copie. Cette référence est constante, on ne peut pas la modifier.
  • Noeud :: Noeud( const Noeud & unNoeud )
  • {
  • m_iMonNombre = unNoeud.m_iMonNombre;
  • m_pNoeudSuivant = 0;
  • }
  • /**********************************************
  • Auteur : Alberd_m
  • but: L'implémentation de la classe Liste
  • **********************************************/
  • //Ce constructeur de la classe Liste met les attributs à zéro.
  • Liste :: Liste()
  • {
  • m_pPremierNoeud = 0; // on peut toujours remplacer le 0 par 'NULL' si l'on le désir.
  • m_pNoeudCourant = 0;
  • }
  • //PS: PAS IMPORTANT POUR COMPRENDRE LES LISTE...
  • //Sauter ceci pour une première lecture.
  • //Ce constructeur permet de créer la liste avec une liste existante passé en paramètre.
  • //'* this' signifie l'objet présent/courant(la Liste) va égaler la liste passé en paramètre.
  • //Pour que ce constructeur marche, nous devons redéfinir le = car le = ne peut pas marcher
  • // de base avec un objet.
  • Liste :: Liste( const Liste & uneListe )
  • {
  • * this = uneListe;
  • }
  • //Le destructeur de la classe Liste est très importante. Nous devons libérer l'espace mémoire
  • // que nous avons utilisé en créant plusieurs noeud.
  • //Le destructeur appele la méthode Vider().
  • //PS: il appele la méthode vider car il met utile de faire un méthode avec la procédure pour
  • // libéré la mémoire car je vais l'utilisé plusieurs fois.
  • Liste::~Liste()
  • {
  • Vider();
  • }
  • //PS: PAS IMPORTANT POUR COMPRENDRE LES LISTE...
  • //Saute ceci pour une première lecture.
  • //On redéfini l'opérateur = pour pouvoir copier un objet.
  • //On commence par vider la liste, puis on copie les attributs voulu.
  • //La méthode = va faire en sorte que les attributs se copie donc avec l'attribut
  • // passé en paramètre on copie les pointeurs dans la classe courante.
  • //ps: le return sert a pouvoir faire comme ( x = y = 1) x va == 1 car y =1 return 1 a sont tour.
  • const Liste & Liste :: operator = ( const Liste & uneListe )
  • {
  • Vider();
  • m_pPremierNoeud = uneListe.m_pPremierNoeud; // copie le pointeur du premier noeud
  • m_pNoeudCourant = uneListe.m_pNoeudCourant; // copie le pointeur du noeud courant
  • return * this; //retourn l'objet courant.
  • }
  • //la méthode ajouter ajoute un nouveau noeud(un entier) à la liste.
  • //Créer un pointeur sur un nouveau noeud avec la valeur du nombre passé en paramètre.
  • //Si c'est le premier élément copie l'adresse créer dans le pointeur du premier Noeud.
  • //sinon va au dernier noeud et copie l'adresse du pointeur créer dans l'attribut
  • // noeud suivant pour pouvoir les lier.
  • void Liste :: Ajouter( int leNombre )
  • {
  • Noeud * punNouveauNoeud = new Noeud( leNombre );
  • if ( m_pPremierNoeud == 0 )
  • {
  • m_pPremierNoeud = punNouveauNoeud;
  • }
  • else
  • {
  • while( Suivant() ){} //Suivant() retourne vrai tant que l'attribut noeudSuivant pointe sur un
  • // Noeud valide(ben différent de 0) Si il retourne false(stop la boucle)
  • // puis l'attribut de la classe liste NoeudCourant va pointer sur le
  • // dernier noeud. Donc en fin de liste.
  • m_pNoeudCourant->m_pNoeudSuivant = punNouveauNoeud;
  • }
  • m_pNoeudCourant = m_pPremierNoeud; //on remet le noeud courant au début.
  • }
  • //La méthode Suivant() retourne un booléen.
  • //Elle retourne vrai si l'attribut NoeudSuivant du noeud courant est pointe sur un noeud
  • //valide(différend de 0)
  • //Dans le cas contraire retourne faux.(donc nous serions à la fin de la liste.)
  • bool Liste :: Suivant()
  • {
  • if ( m_pNoeudCourant == 0 ) //Si le noeud courant pointe sur un noeud non valide.
  • //met le noeud courant au premier noeud.
  • {
  • m_pNoeudCourant = m_pPremierNoeud;
  • }
  • if ( m_pNoeudCourant->m_pNoeudSuivant != 0 )
  • {
  • m_pNoeudCourant = m_pNoeudCourant->m_pNoeudSuivant;
  • return true;
  • }
  • else
  • {
  • return false;
  • }
  • }
  • //La méthode Premier() met le noeud courant au premier noeud.
  • void Liste :: Premier()
  • {
  • m_pNoeudCourant = m_pPremierNoeud;
  • }
  • //La méthode NoeudCourant() retourne la valeur du noeud courant si le noeud courant
  • //pointe sur un noeud valide.
  • //Sinon j'ai decider de faire retourner -1.
  • int Liste :: NoeudCourant()
  • {
  • if ( m_pNoeudCourant != 0 )
  • {
  • return m_pNoeudCourant->m_iMonNombre;
  • }
  • else
  • {
  • return -1;
  • }
  • }
  • //La méthode Vider() vide la liste de ces noeuds.
  • //elle créer un noeud pour pouvoir garder une référence sur le prochain noeud.
  • //supprime le noeud puis remet le noeud suivant au premier noeud.
  • void Liste :: Vider()
  • {
  • Noeud * tmpNoeudSuivant;
  • do //fait cette boucle tant que le premier noeud va être valide.
  • {
  • tmpNoeudSuivant = m_pPremierNoeud->m_pNoeudSuivant;
  • delete m_pPremierNoeud;
  • m_pPremierNoeud = tmpNoeudSuivant;
  • }while( m_pPremierNoeud != 0 );
  • m_pPremierNoeud = m_pNoeudCourant = 0;
  • }
  • //Par la suite on peut utilisé la classe.
  • int main()
  • {
  • Liste * uneListe = new Liste(); //Créer un pointeur sur une nouvelle liste.
  • int i = 0;
  • uneListe->Ajouter(5); //ajoute à la liste la valeur 5
  • uneListe->Ajouter(15);//ajoute à la liste la valeur 15...
  • uneListe->Ajouter(25);
  • do //pour faire afficher les éléments dans la liste.
  • {
  • cout << i << " : " << uneListe->NoeudCourant() << endl;
  • i++;
  • }while(uneListe->Suivant());
  • system("PAUSE"); //une pause.
  • //Parti deux:
  • //Pour tester l'opérateur = que j'ai redéfini.
  • Liste * uneAutreListe = uneListe;
  • uneAutreListe->Premier(); //remet la liste au début et fait afficher par la suite a lécran.
  • do
  • {
  • cout << i << " : " << uneListe->NoeudCourant() << endl;
  • i++;
  • }while(uneListe->Suivant());
  • system("PAUSE");
  • return 0;
  • }
/**************************************************

Les noeuds que j'utiliserai seront pour des entier.

**************************************************/
class Noeud 
{
  friend class Liste; //cette ligne est bien important pour le concept. En fait elle dit que
                      //la classe 'Liste' est son ami, donc la classe 'Liste' va pouvoir utiliser
                      //ces Méthode et Attribut même s'ils sont privé. PS:(1)bas de page.
  //Par défaut tout se qui se trouve dans la classe est privé, mais cela n'empèche pas de faire
  //mieu voir que pour les méthodes/attributs suivante c'est le cas.
  private:
    Noeud ( int unNombre ); //un constructeur pour un nouveau noeud qui prend en paramètre un nombre.
    Noeud ( const Noeud & unNoeud ); //on peut aussi créer un noeud avec un Noeud déjà existant.

    int m_iMonNombre; //le nombre que le noeud contient.
    Noeud * m_pNoeudSuivant; //un pointeur vers le noeud suivant.PS:(2)bas de page.
};
/**************************************************

La liste appartir duquel on peut ajouter des noeud.
ps: cette classe est l'ami de la classe Noeud, donc
    elle peut utilisé les choses définies plus haut.

Note: Pour une première lecture, ne vous occupé pas
      du constructeur 'Liste(const Liste &uneListe)'
      et de l'operator = . Vous comprendrez plus tard.
      De toute façons, ceux-ci ne sont pas si important.
      Et p-e dure à comprendre...

**************************************************/
class Liste
{
  public:
    Liste(); //constructeur par défault de la classe 'Liste' le plus important.
    Liste( const Liste & uneListe ); // ce constructeur ne sert que si l'on veut copier une liste
                                     // déja existante dans une autre.
    ~Liste();//Descrtructeur de la classe. (important car il faut bien supprimer tout les noeuds que 
             //l'on a créé pour libérer l'espace mémoire.

    const Liste & operator = ( const Liste & uneListe ); //Redéfinition de l'opérateur '='
    void Ajouter( int leNombre ); //une méthode pour ajouter un nouveau 'Noeud' à la liste.
    bool Suivant(); //méthode pour faire avancer le pointeur du noeud courant d'un noeud.
    void Premier(); //Pour mettre le pointeur du noeud courant au premier élément
    int NoeudCourant(); //Pour retourner la valeur(int) du noeud courant.
    void Vider(); //Méthode pour vider la liste.

  private:
    Noeud * m_pPremierNoeud; // pointeur sur sur le premier noeud de la liste.
    Noeud * m_pNoeudCourant; // pointeur pour pouvoir se déplacer dans la liste.
};

//Ce constructeur de la classe noeud reçoit en paramètre un
// nombre car la liste va contenir des nombres.
//On initialise l'attribut 'int' de la classe avec la valeur passé
// en paramètre, puis on initialise le pointeur vers le noeud suivant
// à zéro
Noeud :: Noeud( int unNombre )
{
  m_iMonNombre = unNombre;
  m_pNoeudSuivant = 0; //on aurais aussi pu remplacer 0 par 'NULL'
}

//Ce constructeur de la classe reçois en paramètre un noeud.
//On initialise l'attribut 'int' avec la valeur que le noeud contient.
//Ps: j'ai mit un '&' pour dire que l'on passe la référence de l'objet Noeud
// et pas de faire une copie. Cette référence est constante, on ne peut pas la modifier.
Noeud :: Noeud( const Noeud & unNoeud )
{
  m_iMonNombre = unNoeud.m_iMonNombre;
  m_pNoeudSuivant = 0;
}


/**********************************************

  Auteur : Alberd_m

  but: L'implémentation de la classe Liste

**********************************************/

//Ce constructeur de la classe Liste met les attributs à zéro.
Liste :: Liste()
{
  m_pPremierNoeud = 0; // on peut toujours remplacer le 0 par 'NULL' si l'on le désir.
  m_pNoeudCourant = 0;
}

//PS: PAS IMPORTANT POUR COMPRENDRE LES LISTE...
//Sauter ceci pour une première lecture.
//Ce constructeur permet de créer la liste avec une liste existante passé en paramètre.
//'* this' signifie l'objet présent/courant(la Liste) va égaler la liste passé en paramètre.
//Pour que ce constructeur marche, nous devons redéfinir le = car le = ne peut pas marcher
// de base avec un objet.
Liste :: Liste( const Liste & uneListe )
{
  * this = uneListe;
}

//Le destructeur de la classe Liste est très importante. Nous devons libérer l'espace mémoire
// que nous avons utilisé en créant plusieurs noeud.
//Le destructeur appele la méthode Vider().
//PS: il appele la méthode vider car il met utile de faire un méthode avec la procédure pour 
// libéré la mémoire car je vais l'utilisé plusieurs fois.
Liste::~Liste()
{
  Vider();
}

//PS: PAS IMPORTANT POUR COMPRENDRE LES LISTE...
//Saute ceci pour une première lecture. 
//On redéfini l'opérateur = pour pouvoir copier un objet.
//On commence par vider la liste, puis on copie les attributs voulu.
//La méthode = va faire en sorte que les attributs se copie donc avec l'attribut
// passé en paramètre on copie les pointeurs dans la classe courante.
//ps: le return sert a pouvoir faire comme ( x = y = 1) x va == 1 car y =1 return 1 a sont tour.
const Liste & Liste :: operator = ( const Liste & uneListe )
{
  Vider();

  m_pPremierNoeud = uneListe.m_pPremierNoeud; // copie le pointeur du premier noeud
  m_pNoeudCourant = uneListe.m_pNoeudCourant; // copie le pointeur du noeud courant

  return * this; //retourn l'objet courant.
}

//la méthode ajouter ajoute un nouveau noeud(un entier) à la liste.
//Créer un pointeur sur un nouveau noeud avec la valeur du nombre passé en paramètre.
//Si c'est le premier élément copie l'adresse créer dans le pointeur du premier Noeud.
//sinon va au dernier noeud et copie l'adresse du pointeur créer dans l'attribut
// noeud suivant pour pouvoir les lier.
void Liste :: Ajouter( int leNombre )
{
  Noeud * punNouveauNoeud = new Noeud( leNombre );
  if ( m_pPremierNoeud  == 0 )
  {
    m_pPremierNoeud =  punNouveauNoeud;
  }
  else
  {
    while( Suivant() ){} //Suivant() retourne vrai tant que l'attribut noeudSuivant pointe sur un
                         // Noeud valide(ben différent de 0) Si il retourne false(stop la boucle)
                         // puis l'attribut de la classe liste NoeudCourant va pointer sur le 
                         // dernier noeud. Donc en fin de liste.
    m_pNoeudCourant->m_pNoeudSuivant = punNouveauNoeud;
    
  }
  m_pNoeudCourant = m_pPremierNoeud; //on remet le noeud courant au début.
}

//La méthode Suivant() retourne un booléen.
//Elle retourne vrai si l'attribut NoeudSuivant du noeud courant est pointe sur un noeud 
//valide(différend de 0)
//Dans le cas contraire retourne faux.(donc nous serions à la fin de la liste.)
bool Liste :: Suivant()
{
  if ( m_pNoeudCourant == 0 ) //Si le noeud courant pointe sur un noeud non valide. 
                              //met le noeud courant au premier noeud.
  {
    m_pNoeudCourant = m_pPremierNoeud;
  }
  if ( m_pNoeudCourant->m_pNoeudSuivant != 0 ) 
  {
    m_pNoeudCourant = m_pNoeudCourant->m_pNoeudSuivant;
    return true;
  }
  else
  {
    return false;
  }
}

//La méthode Premier() met le noeud courant au premier noeud.
void Liste :: Premier()
{
  m_pNoeudCourant = m_pPremierNoeud;
}

//La méthode NoeudCourant() retourne la valeur du noeud courant si le noeud courant
//pointe sur un noeud valide.
//Sinon j'ai decider de faire retourner -1.
int Liste :: NoeudCourant()
{
  if ( m_pNoeudCourant != 0 )
  {
    return m_pNoeudCourant->m_iMonNombre;
  }
  else
  {
    return -1;
  }
}

//La méthode Vider() vide la liste de ces noeuds.
//elle créer un noeud pour pouvoir garder une référence sur le prochain noeud.
//supprime le noeud puis remet le noeud suivant au premier noeud.
void Liste :: Vider()
{
  Noeud * tmpNoeudSuivant;
  do //fait cette boucle tant que le premier noeud va être valide.
  {
    tmpNoeudSuivant = m_pPremierNoeud->m_pNoeudSuivant;
    delete m_pPremierNoeud;
    m_pPremierNoeud = tmpNoeudSuivant;
    
  }while( m_pPremierNoeud != 0 );
  m_pPremierNoeud = m_pNoeudCourant = 0;

}

//Par la suite on peut utilisé la classe.

int main()
{
  Liste * uneListe = new Liste(); //Créer un pointeur sur une nouvelle liste.
  int i = 0;
  uneListe->Ajouter(5); //ajoute à la liste la valeur 5
  uneListe->Ajouter(15);//ajoute à la liste la valeur 15...
  uneListe->Ajouter(25);
  do //pour faire afficher les éléments dans la liste.
  {
    cout << i << " : " << uneListe->NoeudCourant() << endl;
    i++;
  }while(uneListe->Suivant());

  system("PAUSE"); //une pause.

  //Parti deux:
  //Pour tester l'opérateur = que j'ai redéfini.
  Liste * uneAutreListe = uneListe;
  uneAutreListe->Premier(); //remet la liste au début et fait afficher par la suite a lécran.
  do
  {
    cout << i << " : " << uneListe->NoeudCourant() << endl;
    i++;
  }while(uneListe->Suivant());

  system("PAUSE");
  return 0;
}

 Conclusion

Vous pouvez télécharger le projet pour mieux voir tout le processus.

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Sources de la même categorie

Source avec Zip KISIEL CD INFO DRIVE par kisiel0147852
Source avec une capture SUPPRESSION DES REDONDANCES DE FICHIERS par cyberntique
Source avec Zip ÉDITEUR DE RECTANGLES EN CONSOLE par seoseo
CONVERSION DE FICHIER EN FICHIER BMP par seoseo
Source avec Zip DETECTEUR EJP par idpro

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture LISTE CHAINÉE par bazdig25
LISTE CHAINÉE (TEMPLATE, NOEUD LOCAL OU GLOBAL, INSERTION OU... par darkpoulpo
Source avec Zip CLASSE CLISTE par bobbyantho
Source avec Zip LISTE CHAINÉE DANS UNE CLASSE par horchaniwissem
Source avec Zip LISTE CHAINÉE SUPPORTANT LES TEMPLATES par Zer0 le Her0

Commentaires et avis

Commentaire de alberd_m le 11/11/2008 17:01:33

Comment vous trouvez mon petit bout de code? j'aimerais bien avoir quelque commentaire si sa vous chante.

Commentaire de spiesalex le 23/11/2009 14:40:06

salut jp je t'adore !!!!

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

liste chaînée et classes [ par yeager ] Bonjour!J'ai programmé pendant deux ans en C et actuellement j'étudie le C++. Pour moi une classe est l'équivalent d'une structure en plus évolué (hér Liste chainée d'objets de classes différentes [ par gillig ] Voici un problème auquel je ne trouve pas de réponse, enfin, rien d'efficace.J'ai une classe CDessin contenant une liste chaînée (CList) de pointeurs opengl liste [ par mat74 ] salut je suis en train de creer une classe pr afficher des forme geomethrique en 2d et en 3d avec opengl ( carre triangle cercle cube pave .... )et j' classe dans une liste chainé [ par briscard ] Question bête je pense mais bon:Est il possible de passer une classe en liste chainé?n'y a til pas de problème avec les méthodes?merci d'avance.Brisca insertion d'un noeud en premiere position d'une liste d'enfants [ par Cako19 ] Bonjour,J'utilise Visual C++ et MSXML4.0.Je souhaiterais insérer un noeud auparavant cloné au début d'une liste d'enfants et non à la fin comme avec l liste circulaire avec la classe <list> [ par maincpp ] Aidez moi svp !!!! je voudrai savoir si on peut modeliser une liste circulaire avec la classe &lt;list&gt; créer une liste à partir d'un arbre [ par morganistic ] bonjour a tous!voila deux structures : une liste et un arbre.je n arrive pas a parcourir un arbre&nbsp;en inserant chaque noeud&nbsp;de l arbre dans u CListBox [ par wanny ] Bonjour.Dans une classe d'une fonction, je déclare une autre classe (avec une boite de dialogue à afficher) :Dans la boite de dialogue, il y a une CLi Liste chaînée, besoin d'aide! [ par mystik007 ] Bonjour, je dois coder un programme qui manipule les listes chaînées, j'aurais besoin d'aide pour les fonction (initialiser la liste, allouerNoeud pou Probleme de taille d'une liste chainee static qui varie ... [ par rick_moins_moins ] Bonjour,j'ai besoin de&nbsp;faire&nbsp; une liste chainee dans mon programme afin de cataloguer tous les objets de mon projet. Pour cela&nbsp;ma liste


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
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 : 0,562 sec (4)

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