Avis sur mon programme C++ "Multitâches"

Résolu
F0rEign Messages postés 57 Date d'inscription vendredi 22 mars 2013 Statut Membre Dernière intervention 6 septembre 2016 - 12 févr. 2016 à 23:37
F0rEign Messages postés 57 Date d'inscription vendredi 22 mars 2013 Statut Membre Dernière intervention 6 septembre 2016 - 14 févr. 2016 à 11:48
Bonjour ou Bonsoir...

Alors voilà je me suis remis au C++ mais ne sachant malheureusement pas du tout maîtriser la POO (Programmation Orienté Objet) Je me suis orienté sur du code basique.
(Après 1 ou 2 ans de C++ faudrait peut être que j'avance donc n'hésitez pas à me donner des conseils) Donc je voudrais vous faire part de mon programme, n'hésitez pas à me donner vos avis et à me donner des conseils d'améliorations.
C'est un genre de programme sous console "multitâches" qui en autre permet d'utiliser une calculatrice et un carnet de note (pour l'instant.)


Le code :

#include <iostream>
#include <string>
#include <stdlib.h>
#include <fstream>

using namespace std;

int main()
{


double VersionProg(1.4);

system("color f9");
cout << "Vous voici sur un programme multi-taches" << endl;
cout << "Ce programme est mis a jour regulierement" << endl;
cout << "Ecrivez le contenu des parentheses pour utiliser une fonctionnalite" << endl;
cout << " ********** Fonctionnalites : ********** " << endl;
string Fonction1;
cout << " Version du programme (vers)" << endl;
cout << " Calculatrice (calc) " << endl;
cout << " Carnet de note (carn) " << endl;
cin >> Fonction1;
if(Fonction1 == "calc")
{
string Fonction2;
int const nombreCasesTableau(4);
string tableauFonction[nombreCasesTableau];
cout << "vous avez choisis la fonction Calculatrice" << endl;
tableauFonction[0] = " Addition (addi)";
tableauFonction[1] = " Soustraction (sous) ";
tableauFonction[2] = " Multiplication (mult)";
tableauFonction[3] = " Division (divi)";
for(int i(0); i<nombreCasesTableau; ++i)
{

cout << tableauFonction[i] << endl;

}
cin >> Fonction2;
while (Fonction2 == "addi")
{
double A;
double B;
cout << "entrez deux nombres entier ou decimaux a additionner. " << endl;
cout << " Premier nombre entier ou decimal : " << endl;
cin >> A;
cout << " Deuxieme nombre entier ou decimal : " << endl;
cin >> B;
int resultat;
resultat = A + B;
cout << A << " + " << B << " = " << resultat << endl;
}
while (Fonction2 == "sous")
{
double C;
double D;
cout << "entrez deux nombres entier ou decimaux a soustraire. " << endl;
cout << " Premier nombre entier ou decimal : " << endl;
cin >> C;
cout << " Deuxieme nombre entier ou decimal : " << endl;
cin >> D;
int resultat;
resultat = C - D;
cout << C << " - " << D << " = " << resultat << endl;

}
while (Fonction2 == "mult")
{
double E;
double F;
cout << "entrez deux nombres entier ou decimaux a multiplier. " << endl;
cout << " Premier nombre entier ou decimal : " << endl;
cin >> E;
int resultat;
resultat = E * F;
cout << E << " x " << F << " = " << resultat << endl;

}
while (Fonction2 == "divi")
{
double G;
double H;
cout << "entrez deux nombres entier ou decimaux a diviser. " << endl;
cout << " Premier nombre entier ou decimal : " << endl;
cin >> G;
cout << " Deuxieme nombre entier ou decimal : " << endl;
cin >> H;
int resultat;
resultat = G / H;
cout << G << " : " << H << " = " << resultat << endl;

}

}

else if(Fonction1 == "vers")
{

cout << " Ce programme est actuellement en version : " << VersionProg << endl;
cout << " Pour signaler des bugs, veuillez nous contacter a " << endl;
cout << " ---------- nicolas.buchot@hotmail.fr ---------- " << endl;
cout << " Fin du programme, envoyez une lettre pour quitter le programme " << endl;
char EndProgramm;
cin >> EndProgramm;
return 0;
}
else if (Fonction1 == "carn")
{
string text1;
cout << " Vous pouvez ecrire puis envoyer en appuiant sur entrer " << endl;
cout << " Vous devez prealablement creer un dossier sur le disque C portant ce nom : " << endl;
cout << " CarnetDeNote " << endl;
cout << " Quand vous envoyer un texte sur la console, il s'enrengistre automatiquement" << endl;
cout << " Votre fichier texte avec vos notes se trouve dans le dossier CarnetDeNote " << endl;
cout << " --------- Votre Texte : " << endl;
cin >> text1;
string const nomFichier2("C:/CarnetDeNote/CarnetDeNote.txt");
ofstream monFlux(nomFichier2.c_str());
if(monFlux)
{
monFlux << text1 << endl;


}
else
{
wcout << "Erreur, Impossible d'ecrire dans le fichier " << endl;
return 0;
}



}
else
{
cout << " Au revoir ! " << endl;
}

return 0;
}

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
Modifié par cptpingu le 13/02/2016 à 17:50
Bonjour.

Tout d'abord attention, ce n'est pas un programme multi-tâches, mais multi-fonctions. Le multi-tâche sous entend du multi-threading (ce qui est assez avancé pour l'instant pour toi).
Quelques conseils:
- Le C++ n'est pas un langage objet, mais un langage multi-paradigme. Ca ne sert à rien de se forcer à faire de la POO, sans savoir à quoi ça sert, ni si c'est adapté à la situation. Ici, la POO n'aurait servi à rien, et je trouve plus élégant de faire sans. Avant de se forcer à rentrer dans de la POO, parce que tu as entendu le mot quelque part, il est important d'assoir d'abord ses bases. Notamment, en apprenant à découper son code en petites fonctions. Si tu ne sais pas faire cela correctement, la POO que tu vas sortir va être de faible qualité. Ce qui différencie un bon programmeur d'un mauvais, c'est sa faculté à découper le code proprement. La POO permet de faire cela, mais les fonctions aussi (la POO c'est un niveau de découpage "au dessus" des fonctions, pourrait-on vulgariser). Maîtrise déjà un découpage par fonction. Une bonne fonction ne fait qu'une seule "action", et dépasse rarement 25 à 50 lignes.
- Evite les "using namespace", c'est ultra crade. Voir: http://0217021.free.fr/portfolio/axel.berardino/articles/bon-usage-using-namespace
- Ne demande pas des choses en "dur". Par exemple, tout le monde n'a pas de disque "C:" (notamment sous Linux). Préfère utiliser des choses "relatives". Utilise plutôt le dossier courant.
- Pour demander du texte, il faut utiliser std::getline, car std::cin >> text, ne prend pas les espaces.
- Dans ma correction j'ai viré les header Windows inutiles (ça ne servait pas vraiment, et ça empêchait de compiler si on n'était pas sous Windows).
- std::cin.clear() suivi de std::cin.ignore permet de protéger contre les "mauvaises entrées". Si tu demandes un int, et qu'on te donne un std::string, le comportement risque d'être "étrange". Il faut nettoyer le flux après une mauvaise entrée. Pour comprendre l'intérêt de cela, retire les "clear" et "ignore" de ma correction. Recompile et lance le programme. Quand on te demande un choix entre 1 et 5, entre du texte (par exemple "azerty"), et observe ce que ça fait.

Je te propose la correction suivante:
#include <iostream>
#include <sstream>
#include <fstream>
#include <string>
#include <limits>

namespace
{
  const double version = 1.4;
  const std::string filename = "carnet.txt";

  template <typename T> // Adapte le type automatiquement
  T ask(const std::string& message)
  {
    T res = 0;

    std::cout << message;
    std::cin >> res;
    std::cin.clear();
    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

    return res;
  }

  std::string askText(const std::string& message)
  {
    std::string res;

    std::cout << message;
    std::getline(std::cin, res);
    std::cin.clear();

    return res;
  }

  void pause_until_presskey()
  {
    std::cout << "Appuyez sur une touche pour continuer..." << std::endl;
    std::cin.get();
  }

  int menu(const std::string& message, int nb_menu)
  {
    int choice = 0;

    while (choice <= 0 || choice > nb_menu)
    {
      choice = ask<int>(message);
      if (choice <= 0 || choice > nb_menu)
        std::cout << choice << " est un choix invalide!" << std::endl;
    }

    return choice;
  }

  int mainMenu()
  {
    std::ostringstream buff;
    buff << " ********** Programme v" << version << " **********\n"
         << "  1) Calculatrice\n"
         << "  2) Carnet\n"
         << "  3) Version/Info\n"
         << "  4) Quitter"
         << std::endl;

    return menu(buff.str(), 4);
  }

  int calcMenu()
  {
    return menu("Fonction calculatrice\n"
                "  1) Addition\n"
                "  2) Soustraction\n"
                "  3) Division\n"
                "  4) Multiplication\n"
                "  5) Retour menu\n",
                5);
  }

  void compute(int type)
  {
    double a = ask<double>("Entrez deux nombres entiers ou decimaux\nNb1= ");
    double b = ask<double>("Nb2= ");

    switch (type)
    {
      case 1:
        std::cout << a << " + " << b << " = " << a + b << "\n" << std::endl;
        break;
      case 2:
        std::cout << a << " - " << b << " = " << a - b << "\n" << std::endl;
        break;
      case 3:
        if (b == 0)
          std::cout << "Division par 0 impossible!\n" << std::endl;
        else
          std::cout << a << " / " << b << " = " << a / b << "\n" << std::endl;
        break;
      case 4:
        std::cout << a << " * " << b << " = " << a * b << "\n" << std::endl;
        break;

      default:
        ;
    }
  }

  void calculatrice()
  {
    int choix = 1;

    while (choix > 0 && choix <= 4)
    {
      choix = calcMenu();
      if (choix > 0 && choix <= 4)
        compute(choix);
    }
  }

  void carnet()
  {
    std::cout << "Vous pouvez ecrire puis envoyer en appuyant sur entrer\n"
              << "Un fichier \"" << filename << "\" sera cree dans le repertoire courant.\n"
              << "Quand vous envoyez un texte sur la console, il s'enregistre automatiquement a la suite du fichier\n"
              << std::endl;

    const std::string text = askText("--------- Votre Texte ---------\n");

    std::ofstream file(filename.c_str(), std::ios::app);
    if (!file)
      std::cerr << "Impossible d'ecrire dans " << filename << "!" << std::endl;
    else
      file << text << std::endl;
  }
} // namespace

int main()
{
  int choix = 1;
  while (choix >= 1 && choix <= 3)
  {
    choix = mainMenu();
    switch (choix)
    {
      case 1:
        calculatrice();
        break;
      case 2:
        carnet();
        break;
      case 3:
        std::cout << "Ce programme est actuellement en version: " << version << "\n"
                  << "Pour signaler des bugs, veuillez nous contacter a\n"
                  << "---------- nicolas.buchot@hotmail.fr ----------\n" << std::endl;
        break;
      default:
        std::cout << "bye" << std::endl;
        pause_until_presskey();
    }
  }

  return 0;
}


N'hésite pas si tu as des questions :).


Améliorer votre expérience CodeS-SourceS avec ce plugin:
http://codes-sources.commentcamarche.net/forum/affich-10000111-plugin-better-cs-2#cptpingu-signature
0
F0rEign Messages postés 57 Date d'inscription vendredi 22 mars 2013 Statut Membre Dernière intervention 6 septembre 2016
Modifié par NicolasBuchot le 13/02/2016 à 18:08
Salut,

Merci d'avoir pris le temps de me corriger et de me donner des conseils car grâce à ça j'arriverais à m'améliorer.
Effectivement j'ai fait des fautes un peu idiotes mais justement ça m'aide à me corriger.
Pour la POO j'ai désormais bien compris son utilité, mais puisque je me suis déja lancé la dedans et que je voudrais plus tard faire des programmes utiles en POO, je me suis entraîné, j'ai effectivement fait un test sur mon programme "Multi-fonction" et j'ai étonnement bien réussis, mais je ne sais pas pourquoi mais j'ai l'impression que j'ai également fait des trucs que j'aurais pu faire plus facilement.
Je vais de ce pas corriger mon programme "Multi-Fonctions" et je laisse mon code test POO sur le forum par peine d'avoir une ou plusieurs personne le commenter ^^'

Encore merci.

Ah et oui... je ne sais pas (dans ta correction) ce que signifie "ask" ou nt menu(const std::string& message, int nb_menu) par exemple... je suis un peu perdu mais je pense que j'allais m'en douter vu que tu es plus experimenté ^^'

PS : Le dossier courant ? comment ça ? car le programme peut effectivement créer un fichier lui même mais pas un dossier, ce qui me complique beaucoup la tâche

Le code POO :


#include <iostream>
#include <string>

using namespace std;

class Calculatrice
{
public :

   double A;
   double B;
   double resultat;

   void addition()
   {
      resultat = A + B;
      cout << A << " + " << B << " = " << resultat << endl;
   }

   void rep1()
   {
       cin >> A;
   }

   void rep2()
   {
       cin >> B;
   }


private :



};




int main()
{
     Calculatrice calc;
     cout <<  "entrez deux nombres entier ou decimaux a additionner. " << endl;
     cout << " Premier nombre entier ou decimal : " << endl;
     calc.rep1();
     cout << " Deuxieme nombre entier ou decimal : " << endl;
     calc.rep2();
     calc.addition();

    return 0;
}
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
13 févr. 2016 à 18:13
La POO que tu as faite, n'apporte rien de plus (ce n'est pas "mal fait", ce n'est juste pas "utile"). Tu peux le faire pour t'entraîner, mais cet exemple n'est pas le plus adapté. L'attribut "resultat" ne devrait pas être un attribut mais une variable locale à la fonction addition. Je te conseille *vraiment* de d'abord maîtriser les fonctions avant de te lancer dans de la POO.

Quand tu fais: std::ofstream file("toto.txt"), ça créer un fichier toto.txt, dans le répertoire courant (le répertoire où est lancé ton exécutable).
0
F0rEign Messages postés 57 Date d'inscription vendredi 22 mars 2013 Statut Membre Dernière intervention 6 septembre 2016
Modifié par NicolasBuchot le 13/02/2016 à 18:33
D'accord je vais suivre tes conseils.. après j'ai fait ce test juste pour mieux appréhender.
Après même si ta correction à l'air juste, je n'aime pas trop prendre les codes des autres pour les mettre dans les miens car après je ne sais pas de quoi ça parle. Par exemple vu que je suis "débutant" (pourtant ça fait 2 ans que j'essaye désespérément d'apprendre) je ne peux pas comprendre ce qu'il y a écrit.

Mais merci quand même, ça permet de voir mes erreurs,
Salut !
0

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

Posez votre question
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
13 févr. 2016 à 18:38
Le but n'est pas de "piquer" le code, mais de le lire et passer du temps à le comprendre pour t'améliorer. C'est en étudiant comment faire, que l'on apprend.
Certaines fonctions, peuvent être conservées pour être utilisées dans d'autres programmes (je pense notamment à "menu", "ask" et "pause_until_keypress").

Certes, prendre du code qu'on ne comprend pas n'est pas productif, mais ne pas reprendre une correction non plus. La meilleure chose à faire, c'est relire et comprendre le code pour le maîtriser et ainsi s'octroyer le droit de le "piquer" (si tu comprends correctement un code qui est libre de droit, tu peux considérer que le reprendre n'est ni du vol, ni de la triche).
0
F0rEign Messages postés 57 Date d'inscription vendredi 22 mars 2013 Statut Membre Dernière intervention 6 septembre 2016
13 févr. 2016 à 18:50
Oui après j'essaie notamment de comprendre mais comme je te l'ai dit la plupart des choses, je ne les comprends pas mais je ne suis pas là pour te demander tout les types de variables et de fonctions que t'utilise (sauf si tu veux) mais après les break, do ... c'est les boucles et les conditions mais par exemple comme tu dit "menu", "ask" et "pause_until_keypress"
je ne comprends pas mais bien sur il n'y pas que ça mais je vais pas te faire une liste, en fait la question sans réponse que je me pose c'est surtout comme tu a appris tout ça car suivant un cours (OpenClassroom, je sais ça peut pas être le meilleurs site) je ne vois pas encore ces types de fonctions, variables j'en suis qu'à la POO et justement j'en suis ici. J'arrive du coup à faire des petits test en POO mais après ils n'y a pas de lien avec la suite de leurs cours (hop direct la surcharge d'opérateurs).
Après j'ai déjà appris les pointeurs, tableaux aussi mais un peu complexe. En fait mon problème c'est de ne pas assez retenir .
C'est pour ça que je demande sans cesse de l'aide mais après on me prend pour un "noob", mais j'en ai besoin ^^'
Donc voilà désolé encore d'avoir écris un roman mais voilà j'espère que tu me comprends. Là je lis ta correction pour voir ce qui ne vas pas.
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
13 févr. 2016 à 19:13
c'est surtout comme tu a appris tout ça

Pas de magie, c'est surtout par expérience (j'ai 15 de prog derrière moi).

OpenClassroom, je sais ça peut pas être le meilleurs site

Pour apprendre le C++, je te déconseille fortement le tutorial mis sur le site du zéro (maintenant appelé OpenClassroom). Il est complètement dépassé :(. La plupart des membres de ce site le critique d'ailleurs vivement. A tel point, que l'un d'entre eux a décidé d'écrire son propre tutoriel C++ que je recommande: http://guillaume.belz.free.fr/doku.php?id=programmez_avec_le_langage_c

C'est pour ça que je demande sans cesse de l'aide

Tu demandes de l'aide car "tu t'éparpilles trop". Au lieu de sauter sur toutes les notions du C++, essaie d'en maîtriser déjà une. Oublie la poo pour l'instant, et fais des programmes avec des fonctions uniquement. Quand tu seras à l'aise avec le découpage de fonction (quand tu sauras proprement découper un code), alors tu auras appris le plus important, et les autres notions n'en seront que plus facile. Saute des étapes, et je te garantie que tu vas "galérer" tout en demandant pourquoi tu ne progresses pas. L'apprentissage c'est aussi de la patience.
0
F0rEign Messages postés 57 Date d'inscription vendredi 22 mars 2013 Statut Membre Dernière intervention 6 septembre 2016
Modifié par NicolasBuchot le 13/02/2016 à 19:59
Je suis allé sur le tuto que tu ma passé et il est pas mal, je vais allé m'y entraîner dessus. OpenClassroom même si au début je croyais que ça allais m'aider j'ai vite compris qu'ils ne font pas un cours lié entres chapitres et c'est assez complexe à comprendre ce qu’ils disent.
Merci tu m'a bien aidé je vais commencer d'autres programme déjà en maîtrisant les fonctions puis après je me suis décidé à me lancé dans la POO (bien sur pas comme ça dans la nature) je vais bien m'entraîner et éviter de trop m'éparpiller.
Et aussi à quoi sert les std::cout ?
Allez salut et merci ^^'

PS : Mon programme portera sur un RPG écrit sur console (je sais je suis ambitieux) même si c'est pas le meilleurs programme du monde vu qu'il n'y a pas d'interface graphique ça permettra de m'entraîner
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
13 févr. 2016 à 20:06
Mon programme portera sur un RPG écrit sur console


Ca peut être ambitieux au niveau contenu et travail, mais ça ne l'est pas au niveau technique (ce qui est une bonne chose). Ca peut être un bon moyen pour prendre de l'expérience. C'est une bonne idée.

Avant de te lancer là-dedans, je t'invite à pratiquer. Quand on débute, on ne manque pas de motivation, juste d'idée et d'orientation. Ce que je te conseille pour pratiquer un peu, c'est d'aller sur ce site: https://www.codingame.com qui propose des exercices de programmation dans tous les langages, à faire en ligne. Si tu fais tous les exercices "facile", tu auras déjà de bonnes bases. Les exercices "moyen" te feront progresser et découvrir de nouvelles choses. Les autres exercices, plus difficiles, tu les feras plus tard, après quelques années d'expérience.

Avant de te lancer dans ton rpg, je te conseille de faire tous les exos "faciles" (il n'y en a que 10, mais ça va vraiment t'aider).
0
F0rEign Messages postés 57 Date d'inscription vendredi 22 mars 2013 Statut Membre Dernière intervention 6 septembre 2016
Modifié par NicolasBuchot le 13/02/2016 à 20:27
Salut et je connaissais déjà ce site et je me suis déjà inscris.. Je n'avais fait que le tutoriel et le premier exercice facile mais puisque je l'avais oublié je vais continuer, et c'est quoi le niveau technique ?
Ah oui mon RPG sera en POO, je sais que tu aime pas trop (je crois) car je doit déjà m'entraîner sur les fonctions mais j'ai pensé à faire une classe MENU et dès que je créer le texte et que le personnage rencontre un ennemi, je fait perso.menu et ça active la classe menu qui contient du texte et des calculs du genre
"Voulez vous attaquez ?"
Oui
Non
Si oui, alors affiche 4 attaques
Comme un genre de pokémon

Dit moi ce que tu en pense, je ne trouve pas que ce genre de POO est très difficile
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
Modifié par cptpingu le 14/02/2016 à 11:19
c'est quoi le niveau technique

C'est la difficulté à coder le projet. Ca n'emploie pas de concepts avancés.

je sais que tu aime pas trop (je crois) car je doit déjà m'entraîner sur les fonctions

Ce n'est pas que je n'aime pas la POO, c'est que j'estime que sans lancer dedans sans maîtriser les techniques sous-jacentes, c'est mettre la charrue avant les boeufs.
La POO, c'est "faussement" facile. Ce n'est pas parce que tu crées une classe, que tu sais faire de la POO. La POO, c'est un concept (pas forcément lié à un langage de programmation) avec de nombreuses règles (Principe S.O.L.I.D, loi de Déméter, etc...). Réussir à faire une belle POO, ça demande pas mal de connaissance abstraite sur le sujet, et la connaissance d'un minimum de "design pattern". Oui créer une classe, c'est facile. Créer deux classes aussi. Mais choisir comment ces classes interagissent entre elles (Héritage ? Composition ? Association ? Abstraction ?), qui fait quoi, quelle(s) méthode(s) exposer et sous quelle forme, c'est déjà nettement plus difficile ! A tel point qu'on ne code généralement pas de suite, et qu'on fait des diagrammes UML avant de coder.

Pour te donner un exemple concret, on va reprendre celui que tu proposes: Tu crées une classe "Personnage" qui possède une classe menu. Lorsqu'on rencontre un ennemi, ça active le "menu". Techniquement, ça va fonctionner. Est-ce que ça respecte la POO ? Absolument pas ! Le design est horrible.
L'affichage devrait être décorrélé du Personnage (une seule action par unité logique, ce n'est pas le rôle du personnage d'afficher quoi que ce soit), le menu ne devrait pas être dans le "Personnage" (problème de design appelé: classe monolithique), un ennemi ne devrait pas déclencher une action au sein d'un personnage (brise l'encapsulation).
En une seule petite idée, tu viens de rater 3 règles de POO.

Mon point est que la POO est l'art de "designer" un code, et de maîtriser sa découpe. Si tu ne sais déjà pas découper ton code en petites fonctions, tu peux difficilement avoir le recul nécessaire pour comprendre tous les "types de découpe", plus difficiles, qu'introduit la POO. Libre à toi d'essayer de courir avant d'apprendre à marcher (métaphore un peu foireuse, mais c'est histoire que tu comprennes bien le souci :p).


Améliorer votre expérience CodeS-SourceS avec ce plugin:
http://codes-sources.commentcamarche.net/forum/affich-10000111-plugin-better-cs-2#cptpingu-signature
0
F0rEign Messages postés 57 Date d'inscription vendredi 22 mars 2013 Statut Membre Dernière intervention 6 septembre 2016
14 févr. 2016 à 11:48
Ok je vais réfléchir à ce que tu m'a dit et je vais faire plusieurs test, je te redonne le code plus tard si jamais j'ai fini et si jamais tu sera encore sur ce forum,
Salut ! ^^'
Et codingame c'est pas mal
0
Rejoignez-nous