J'aimerais que quelqun vérifi ce petit code :)

Résolu
ownagedx Messages postés 5 Date d'inscription dimanche 30 septembre 2007 Statut Membre Dernière intervention 20 avril 2009 - 17 avril 2009 à 23:10
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 - 20 avril 2009 à 04:04
Bonjours, j'aimerais que quelqun m'aide un peu avec ce code, et me donne quelques suggestion... parcontre, soyer indulgent, j'ai commencer a apprendre le c++ hier..:p

___________________________________________________________________________________________
#include
#include <math.h>
using namespace std;

// Prototype fonction pythagore
float carre(float x);
float squareroot(float x);

int main()
{
    int choixMenu,choixrecommencer;

    // Variables pour Pythagore
    float catheteAsquare, catheteA, catheteB, sommecathete, hypotenuse, catheteBsquare;

cout << " Bonjours! Choisissez quelle fonction vous voulez utiliser aujourd'hui!"<<endl<<endl;
cout << "1 = Pythagore"<<endl;
cout << "\n Veuillez entrer votre choix et appuyer sur Enter"<<endl<<endl;
cin >> choixMenu;
 /* FONCTION POUR PYTHAGORE
                        */

   while(choixMenu != 1)
   {
       cout << endl << endl<< "Je ne possede pas encore cette fonction!"<<endl<<endl;
       cout << " Veuillez entrer a nouveau un choix"<<endl<<endl<<"1 = Pythagore"<<endl;
       cin >> choixMenu;
   }
  if(choixMenu == 1)
 {
     cout<< " Veuillez entrer les 2 mesure des cathetes\n";
     cout <<"cathete a: ";
     cin >> catheteA;
     cout <<"cathete b: ";
     cin >> catheteB;
     catheteAsquare = carre(catheteA);
     catheteBsquare = carre(catheteB);
     sommecathete = (catheteBsquare + catheteAsquare);
     cout <<"\n a(au carre) + b(au carre) ="<< sommecathete<<"(au carre)"<<endl;
     cout <<endl<<" Maintenant on fait la racine carree de "<<sommecathete<<endl<<" pour connaitre la valeur de l'hypotenuse"<<endl;
     hypotenuse = squareroot(sommecathete);
     cout<<"\n\n\n L'hypotenuse vaut:" <<hypotenuse<<endl;

 }

 char response;
 cin >> response;
    return 0;
}

/* FONCTIONS */

float carre(float x)
 {
      return (x*x) ;
 }

 float squareroot(float x)
 {
     return sqrt(x);
 }

Oh, et aussi j'étais entrain de lire a propos des classes et je me demandait l'utilité que sa pourrait avoir dans ce programme.. d'ailleur je ne comprend pas vraiment a quoi sa sert ?
merci:)

12 réponses

cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
19 avril 2009 à 21:19
C'est assez rare que quelqu'un demande conseil sur le code qu'il a pondu.
Je vais donc t'en faire une revue exhaustive, pas à pas.

1) Tout d'abord:
#include <math.h>
Tu es en C++, donc pas d'include tiré du langage C. Préfère: #include <cmath>.

2) using namespace std;
Immonde. Le pire c'est que je le vois souvent. Ca ne sert à rien d'avoir crée les namespace en C++ si c'est pour les faire sauter... Mieux vaut écrire quelques caractères en plus, que d'introduire des ambiguïtés de portée de nom, ce qui arrive régulièrement, passé un code d'une certaine taille.
Toutefois, si tu veux réellement marquer "cout" au lieu de "std::cout", alors préfère la syntaxe suivante: "using std::cout;" qui est déjà beaucoup plus propre.
Ce genre d'instruction, devrait avoir sa place dans une portée limitée, comme par exemple dans une fonction ou dans un namespace, mais jamais, au grand jamais sur une portion de programe importante (par exemple, ne met jamais de using qqchose dans un .h !).

Au niveau de ton code, tu ne découpes pas assez celui-ci. Il faut toujours modulariser son code au maximum. Il est plus facile de coder plein de petites fonctions aisées, qu'une seule grosse bien difficile. C'est le principe de diviser pour mieux regner.

De plus, tu n'es pas obligé de réécrire std::cout à chaque ligne, tu peux directement tout "pousser" dans un seul.

Plutôt que d'écrire les prototypes de tes fonctions en haut du fichier, met directement celle-ci.

Lorsque des fonctions n'ont pas vocations à être exporté, c'est à dire à être utilisé en dehors du fichier dans lequelle elles sont, on les mets dans un namespace anonymes. Celui-ci sert à limité la visibilité de celles-ci a cet unique fichier.

Essaie de coder en anglais, même si les messages destiné à l'utilisateur sont en francais.
Pense à commenter tes fonctions, regarde notamment la norme "Doxygen".

Voila, ton code mis au propre, avec quelques petites améliorations, notamment au niveau de variables locales dont on pouvait se passer aisément:

#include
#include <cmath>

namespace
{
  /*!
  ** Compute the square of the given number.
  **
  ** @param x The given number
  **
  ** @return Square of the given number
  */
  float square(float x)
  {
    return x * x;
  }

  /*!
  ** Compute the square root of the given number.
  **
  ** @param x The given number
  **
  ** @return Square root of the given number
  */
  float squareroot(float x)
  {
    return sqrt(x);
  }

  /*!
  ** Display the menu, and ask the user, what to do.
  **
  ** @return Choice made by the user.
  */
  int get_choice()
  {
    int choixMenu = -1;

    while(choixMenu == -1)
    {
      std::cout << " Bonjour ! Choisissez quelle fonction vous voulez "
    "utiliser aujourd'hui !"
        << std::endl << std::endl
        << "0 = Quitter" << std::endl
        << "1 = Pythagore" << std::endl
        << "\n Veuillez entrer votre choix et appuyez sur Enter"
        << std::endl << std::endl;
      std::cin >> choixMenu;
      if (choixMenu < 0 || choixMenu > 1)
      {
    std::cout << std::endl << std::endl
          << "Je ne possede pas encore cette fonction !"
          << std::endl << std::endl;
    choixMenu = -1;
      }
    }

    return choixMenu;
  }

  /*!
  ** Display interactive computing off pythagore.
  */
  void pythagore()
  {
    float catheteA, catheteB, sommecathete;

    std::cout << " Veuillez entrer les 2 mesure des cathetes\n";
    std::cout << "cathete a: ";
    std::cin >> catheteA;
    std::cout << "cathete b: ";
    std::cin >> catheteB;
    sommecathete = square(catheteA) + square(catheteB);
    std::cout <<"\n a(au carre) + b(au carre) ="
          << sommecathete << "(au carre)" << std::endl
          << std::endl << " Maintenant on fait la racine carree de "
          << sommecathete << std::endl
          << " pour connaitre la valeur de l'hypotenuse" << std::endl
          << "\n\n\n L'hypotenuse vaut:"
          << squareroot(sommecathete) << std::endl;
  }
}

/*!
** Main function.
**
** @return 1 on unexpective error, 0 else.
*/
int main()
{
  bool continuer = true;

  while (continuer)
  {
    switch (get_choice())
    {
      case 0:
    continuer = false;
    break;
      case 1:
    pythagore();
    break;
      default:
    std::cerr << "Erreur inattendue !" << std::endl;
    return 1;
    }
  }

  return 0;
}

Pour répondre à ta dernière question:
Ici, l'utilisation d'une classe n'aurait pas grand intérêt. Tu découvriras au fur et à mesure que tu avanceras dans le langage objet, à quoi sert une classe.
3
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
19 avril 2009 à 21:23
Ne fait pas attention au fautes d'orthographe françaises et anglaises que j'ai laissée :S (même dans le code d'ailleurs !).
0
ownagedx Messages postés 5 Date d'inscription dimanche 30 septembre 2007 Statut Membre Dernière intervention 20 avril 2009
19 avril 2009 à 22:01
d'accord, merci pour tout ces conseils :P
Je suis entrain de refaire un code avec plus de chose a faire, c'est un peu plus organisé.
Est-ce une bonne idée de créer une classe pour le menu ?
0
cs_Chouchou182 Messages postés 252 Date d'inscription vendredi 13 juin 2003 Statut Membre Dernière intervention 25 avril 2011 1
19 avril 2009 à 22:19
Bonjour à tous,

Ce fil a l'air intéressant, alors je me permets de poser quelques questions qui me passent par la tête.

1/ Pourquoi utiliser le type float ? On n'a pas, semble-t-il, de problèmes cruciaux d'occupation de la mémoire. Les calculs ne sont-ils pas plus précis et peut-être plus rapides sur des doubles ?
2/ Les fonctions square et squareroot ne méritent-elles pas d'être « inline » explicitement ?
3/ Le point intéressant : std::cin. Si, lorsque c'est un entier qui est attendu, je saisis des caractères quelconques, le programme boucle. Comment détecter cette erreur ? En d'autres termes, quelles précautions peut-on prendre avec std::cin pour se méfier des saisies inadéquates de l'utilisateur, ou comment se passer de std::cin ?

Merci d'avance,
0

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

Posez votre question
ownagedx Messages postés 5 Date d'inscription dimanche 30 septembre 2007 Statut Membre Dernière intervention 20 avril 2009
19 avril 2009 à 22:42
J'ai fait un nouveau code en respectant plus tes conseil, cependant, j'ai mit un peu moin de commentaire, je trouvais qu'il y en avait trop pour que le code soit bien lisible, deplus, jai créer 2 classe avec les 2 chose que je voulait faire et je les ai mises dans des fichier.h, sa donne ceci:
j'aimerais simplement savoir si mes commentaires sont O.K et si ma fonction main() est ok, je serait méchant de vous demander une inspection complete :P

MAIN.CPP

#include
#include <string.h>
#include <cmath>
#include "Pythagore.h"
#include "Heron.h"

using std::cout;
using std::endl;
using std::cin;

//----------> FONCTIONS PROTOTYPES AT THE END OF MAIN.CPP<-----------
void CallPythagore();
void CallHeron();
void CallMenu();

//variables relatives au menu
int choixMenu;
string retour=("m");
string retour1="m";
bool try1;

////////////////////////////MAIN//////////////////////////////////
////////////////////////////MAIN//////////////////////////////////
////////////////////////////MAIN//////////////////////////////////
int main()
{

while (choixMenu<=2||choixMenu>=1)
{

CallMenu();

if(choixMenu==1)
{
     CallPythagore();
}

if(choixMenu==2)
{
     CallHeron();
}

}
return 0;
}
////////////////////////////MAIN//////////////////////////////////
////////////////////////////MAIN//////////////////////////////////
////////////////////////////MAIN//////////////////////////////////

//FONCTION PYTHAGORE---------------------------------------
void CallPythagore()
{
       Pythagore pyt;

       pyt.setcatheteA();
       pyt.setcatheteB();
       pyt.calculatehypotenuse();
       pyt.displayhypotenuse();
       cout<<"\nPour retourner au menu, appuyer sur M ou pour quitter appuyer sur Q: ";
       cin >> retour1;
       system("cls");

}
// FONCTION HERON-------------------------------------------
void CallHeron()
{
     Heron heron1;
   
     heron1.getCotes();
     heron1.changerVariable();
     heron1.calculHeron();
     heron1.calculHauteur();
     cout<<endl<<"Entrer M pour retourner au menu et Q pour quitter: ";
     cin>>retour1;

}
//------------------------------------------------------

//--------------MENU FONCTION--------------------------
void CallMenu()
{
   

 system("cls");
 cout<<" --------MENU-------"<<endl;
 cout <<" 1: Pythagore\n";
 cout <<" 2: Formule de Heron\n";
 cout<<"Veuillez entrer un choix\n";
 cin >> choixMenu;

// Show menu again if user didn't made a correct choice.

   while(choixMenu >2 || choixMenu<1)
 {
     system("cls");
     cout<<"1: Pythagore\n";
     cout<<"2: Formule de Heron";
     cout<<"\n\nDesole, je ne possede pas cette fonction, veuillez entrer un autre choix :";
     cin >> choixMenu ;
 }
 }
                                                                                 Pythagore.h

#ifndef DEF_PYTHAGORE
#define DEF_PYTHAGORE
using namespace std;

class Pythagore
{
    public:
void setcatheteA()
{
    system("cls");
    cout<<" Entrez la valeur de la cathete A : ";
    cin>> m_mcatheteA;
}

void setcatheteB()
{
    system("cls");
    cout<< "Entrez la valeur de la cathete B : ";
    cin >> m_mcatheteB;
}

void calculatehypotenuse()
{
    float a= m_mcatheteA;
    float b= m_mcatheteB;
    m_mhypotenuse = (sqrt)((a*a) + (b*b));
}
void displayhypotenuse()
{
    system("cls");
    cout<<"l'hypotenuse a une valeur de : "<<m_mhypotenuse<<endl<<"\n\n\n\n\n\n";
}
    protected:

    float m_mhypotenuse;
    float m_mcatheteA;
    float m_mcatheteB;

};

#endif

Heron.h

#ifndef DEF_HERON

#define DEF_HERON

using namespace std;

class Heron

{

    public:

    void getCotes()

    {

     system("cls");

     cout<<" \nEntrez la valeur du premier cote: ";

     cin>>m_coteA;

     cout<<" \nEntrez la valeur du deuxieme cote: ";

     cin>>m_coteB;

     cout<<" \nEntrez la valeur du troisieme cote: ";

     cin>>m_coteC;

    }

    void calculHeron()

    {

        float p= (m_coteA+m_coteB+m_coteC)/2;

        if(p<m_coteA||p<m_coteB||p<m_coteC)

        {

            m_try1=0;

            cout<<"\n ERREUR ! Ce triangle n'existe pas\n\n";

        }

        else

        {

                m_aireHeron = (sqrt)(p*(p-m_coteA)*(p-m_coteB)*(p-m_coteC));

        cout<<endl<<endl<<"l'aire du triangle vaut" <<m_aireHeron;

        }

    }

    void changerVariable()

    {

        float temp,temp1;

        if (m_coteA>m_coteB)

        {

            temp=m_coteB;

            m_coteB=m_coteA;

            m_coteA=temp;

        }

        if (m_coteB>m_coteC)

        {

            temp1=m_coteC;

            m_coteC=m_coteB;

            m_coteB=temp1;

        }

    }

    void calculHauteur()

    {

        if(m_try1!=0)

        {

        m_calculhauteur = (2*m_aireHeron)/m_coteC;

        cout<<endl<<endl<<"La hauteur vaut : "<<m_calculhauteur<<"\n\n\n";

        }

       

        else

        {cout<<"\n ERREUR";}

    }

    protected:

    float m_try1;

    float m_coteA;

    float m_coteB;

    float m_coteC;

    float m_aireHeron;

    float m_calculhauteur;

        };

#endif
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
19 avril 2009 à 22:45
Je ne vois pas l'utilité de créer une classe pour ton menu.
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
20 avril 2009 à 00:35
Je réponds d'abord à ownagedx, je te répondrais après chouchou182.

Tout plein de remarques:
#include <string.h>
Non, #include <string>.

Au niveau de l'extension des fichiers.
.cc ou .cpp pour les fichiers de code du C++
.hh ou .hpp pour les fichiers headers du C++
.hxx pour les templates et fonctions inlinés du C++ (tu verras ça bien plus tard)
.h pour les fichiers header du C
.c pour les fichiers de code du C

Donc, il faut éviter d'utiliser .h pour des headers, c'est une mauvaise habitude. Tous projets sérieux n'utilisent pas l'extension .h (voir le projet boost).

De plus, jamais de code dans un header. Tu dois avoir une description de ta classe dans un header et le code associé dans un fichier de code.

Ex:
test.hpp
class Test
{
public:
  void pouet();
};

test.cpp
void Test::pouet()
{
}

Jamais, jamais de "using namespace std;" dans un header. Si tu bosses en collaboration avec d'autre personne, ils auront envie de tuer (tu leurs fait sauter tout les namespaces dès qu'ils incluent l'une des tes classes, alors qu'ils n'ont rien demandés !).

La commande "system" est à éviter, c'est pas génial pour la portabilité.

Par exemple, chez moi : system("cls");
ne fait rien, puisque je suis sous linux.

Enfin, ne fait jamais de variables globales. On peut toujours éviter d'en faire. Un code qui possède des variables globales devient rapidement inmaintenable. De plus, tu brises la "réentrance". Si tu as du code multi-threadé, tu seras bien emmerdé ! (Bon ici, ce n'est pas ton cas).
0
ownagedx Messages postés 5 Date d'inscription dimanche 30 septembre 2007 Statut Membre Dernière intervention 20 avril 2009
20 avril 2009 à 00:45
D'accord, mais les variable globales que j'ai
int choixMenu;
string retour=("m");
string retour1="m";

Ou puis-je les mettres, si je les met dans la fonction du menu, mes autres fonction n'y aurons pas acces et je ne pourrai plus revenir au menu.
Est-ce que les pointeurs, que je ne comprend pas encore tout a fait, seraient la solution?
Je pointerait la valeur de la variable et ensuite je l'extrait ?
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
20 avril 2009 à 00:48
> 1/ Les calculs ne sont-ils
pas plus précis et peut-être plus rapides sur des doubles ?
http://www.digitalmars.com/ctg/ctgNumerics.html

> 2/ Les fonctions square et squareroot ne méritent-elles pas d'être « inline » explicitement ?
Absolument, mais l'inlining n'est pas triviale à comprendre. Je ne lui ai donc volontairement pas expliqué.

3/
Le point intéressant : std::cin. Si, lorsque c'est un entier qui est
attendu, je saisis des caractères quelconques, le programme boucle.
Comment détecter cette erreur ?
C'est parce que tout est bufferisé, donc quand tu tapes plusieurs caractères, il les gardes en mémoire. Il faut donc "flusher" le flux entre chaque appel pour éviter cela.

Ex:
std::cin.clear();
std::cin.get();
std::cin >> choixMenu;
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
20 avril 2009 à 00:53
> Ou puis-je les mettres ?
Regarde ce que je t'ai déjà envoyé. Tu verras que tu peux retourner le choix par la fonction CallMenu() (tu lui dit de retourner le choix de l'utilisateur).

> Pointeurs
Non, ici nul besoin de pointeurs, c'est une notions qui ne sert pas à cela. C'est assez compliqué à expliquer. Attends d'avoir plus d'experience, avant de t'y pencher.
0
ownagedx Messages postés 5 Date d'inscription dimanche 30 septembre 2007 Statut Membre Dernière intervention 20 avril 2009
20 avril 2009 à 03:52
Ok merci, j'ai un autre probleme, j'ai séparer mon fichier h en 2 partir,

Le fichier .hh qui contien les information sur la classe
et un fichier .cpp qui contient les fonction et instruction
cependant, quand j'essait d'acceder a une des fonction de la classe a partir de main.cpp
j'ai l'erreur : undefined reference to "Pythagore::setcatheteA()"

dans mes fichier cpp j'ai inclue les fichier .hh aux quelle ils se rapportaient et dans mon fichier main j'ai aussi inclut ces fichier .hh
exemple :
                                           FICHIER CPP
#include
#include <string>
#include <cmath>
#include "Heron.h"

void getCotes()
    {
     system("cls");
     cout<<" \nEntrez la valeur du  cote a: ";
     cin>>m_coteA;
     cout<<" \nEntrez la valeur du deuxieme b: ";
     cin>>m_coteB;
     cout<<" \nEntrez la valeur du troisieme c: ";
     cin>>m_coteC;
    }

    void calculHeron()
    {
        float p= (m_coteA+m_coteB+m_coteC)/2;
        if(p<m_coteA||p<m_coteB||p<m_coteC)
        {
            m_try1=0;
            cout<<"\n ERREUR ! Ce triangle n'existe pas\n\n";
        }
        else
        {
                m_aireHeron = (sqrt)(p*(p-m_coteA)*(p-m_coteB)*(p-m_coteC));
        cout<<endl<<endl<<"l'aire du triangle vaut" <<m_aireHeron;
        }
    }

    void changerVariable()
    {
        float temp,temp1;
        if (m_coteA>m_coteB)
        {
            temp=m_coteB;
            m_coteB=m_coteA;
            m_coteA=temp;
        }
        if (m_coteB>m_coteC)
        {
            temp1=m_coteC;
            m_coteC=m_coteB;
            m_coteB=temp1;
        }
    }

    void calculHauteur()
    {

        if(m_try1!=0)
        {
        m_calculhauteur = (2*m_aireHeron)/m_coteC;
        cout<<endl<<endl<<"La hauteur relative a son coté le plus long vaut : "<<m_calculhauteur<<"\n\n\n";
        }

        else
        {cout<<"\n ERREUR";}
    }

                                                          FICHER .HH

#ifndef DEF_HERON
#define DEF_HERON

class Heron
{
    public:

    void getCotes();
    void calculHeron();
    void changerVariable();
    void calculHauteur();

    protected:
    float m_try1;
    float m_coteA;
    float m_coteB;
    float m_coteC;
    float m_aireHeron;
    float m_calculhauteur;
        };
#endif

et mon main

#include
#include <string>
#include <cmath>
#include "Pythagore.h"
#include "Heron.h"

using std::cout;
using std::endl;
using std::cin;

// FUCTION PROTOTYPES AT THE END OF MAIN.CPP
void CallPythagore();
void CallHeron();
void CallMenu();

//variables relatives au menu
int choixMenu;
string retour=("m");
string retour1="m";
bool try1;

////////////////////////////MAIN//////////////////////////////////
////////////////////////////MAIN//////////////////////////////////
////////////////////////////MAIN//////////////////////////////////
int main()
{

while (choixMenu<=2||choixMenu>=1)
{

CallMenu();

if(choixMenu==1)
{
     CallPythagore();
}

if(choixMenu==2)
{
     CallHeron();
}

}

return 0;
}
////////////////////////////MAIN//////////////////////////////////
////////////////////////////MAIN//////////////////////////////////
////////////////////////////MAIN//////////////////////////////////

//FONCTION PYTHAGORE---------------------------------------
void CallPythagore()
{
       Pythagore pyt;

       pyt.setcatheteA();
       pyt.setcatheteB();
       pyt.calculatehypotenuse();
       pyt.displayhypotenuse();
       cout<<"\nPour retourner au menu, appuyer sur M ou pour quitter appuyer sur Q: ";
       cin >> retour1;
       system("cls");

}
// FONCTION HERON-------------------------------------------
void CallHeron()
{
     Heron heron1;

     heron1.getCotes();
     heron1.changerVariable();
     heron1.calculHeron();
     heron1.calculHauteur();
     cout<<endl<<"Entrer M pour retourner au menu et Q pour quitter: ";
     cin>>retour1;

}
//------------------------------------------------------

//--------------MENU FONCTION--------------------------
void CallMenu()
{

 system("cls");
 cout<<" --------MENU-------"<<endl;
 cout <<" 1: Pythagore\n";
 cout <<" 2: Formule de Heron\n";

 cout<<"Veuillez entrer un choix\n";
 cin >> choixMenu;

// Show menu again if user didn't made a correct choice.

   while(choixMenu >2 || choixMenu<1)
 {
     system("cls");
     cout<<"1: Pythagore\n";
     cout<<"2: Formule de Heron";
     cout<<"\n\nDesole, je ne possede pas cette fonction, veuillez entrer un autre choix :";
     cin >> choixMenu ;
 }
 }

 //----------------------------------------------
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
20 avril 2009 à 04:04
#include "Heron.hh" et non #include "Heron.h"
Préfere la chose suivante:
.cc avec .hh (unix style)
.hpp avec .cpp (windows style)

Dans ton fichier .cpp, le problème vient du fait que tu ne dis pas à quelle classe sont associées tes fonctions.

Ex:
void getCotes()
{
}

En:

void Heron::getCotes()

{

}
0
Rejoignez-nous