Partage
  • Partager sur Facebook
  • Partager sur Twitter

Probleme avec "Exercice Venez vous entrainez"

Sujet résolu
    18 avril 2022 à 1:15:43

    Salut,)

    pour approfondir mes connaissances en C++ je me suis tourné vers ces exercices dans le forum spécialement celui-ci: [Exercices] Venez vous entraîner ! - Ce mois: Parseur de fonctions mathématiques par Nanoc - page 31 - OpenClassrooms (Crypto XOR)

    Pour resoudre, je pensais convertir les mots an binaire appliquer le XOR puis retourner le resultat mais j'ai trouvee la correction([Exercices] Venez vous entraîner ! - Ce mois: Parseur de fonctions mathématiques par Nanoc - page 34 - OpenClassrooms) assez "étrange", surtout ici:

        while (entree.read(&temp,1))
        {
            //On utilise le XOR sur le caractère avec le caractère courant de la clé
            temp ^= cle[i];
     
            //On écrit le résultat dans le fichier de sortie
            sortie.write(&temp,1);
     
            //On passe au caractère suivant de la clé
            ++i;
            i%=cle.size();
        }

    Un simple temp ^= cle[i]; reglait l'affaire? Et ^ c'est pas (ou c'etait pas, ou je confonds de langage) pour les puissances?
     

    • Partager sur Facebook
    • Partager sur Twitter
      18 avril 2022 à 1:24:48

      Salut,

      Oui, tu confond le langage ;) Car il n'y a pas d'opérateur de puissance en C ni en C++.  Au mieux, il existe une fonction qui peut les calculer ;)

      L'opérateur ^ est dédié au Ou Exclusif (XOR) de Boole et à l'instar de tous les opérateur "algébriques" (|, & et ^ pour l'algèbre de Boole,   +, -, *, / et % pour l'algèbre "décimale"), il existe en une version "d'assignation à l'opérande de gauche" ;)

      • Partager sur Facebook
      • Partager sur Twitter
      Ce qui se conçoit bien s'énonce clairement. Et les mots pour le dire viennent aisément.Mon nouveau livre : Coder efficacement - Bonnes pratiques et erreurs  à éviter (en C++)Avant de faire ce que tu ne pourras défaire, penses à tout ce que tu ne pourras plus faire une fois que tu l'auras fait
        18 avril 2022 à 1:28:02

        J'ai perdu du temps dans ma conversion pour rien. Au moins j'ai appris, merci.

        .

        Autre chose, comment on manipule argc et argv du main, je veux dire c'est même quoi ces paramètres ? J'ai jamais connu leur utilité.

        • Partager sur Facebook
        • Partager sur Twitter
          18 avril 2022 à 5:28:40

          Asmitta a écrit:

          J'ai perdu du temps dans ma conversion pour rien. Au moins j'ai appris, merci.

          A partir du moment où tu as appris quelque chose, ce n'est ni une perte de temps, ni inutile ;)

          Asmitta a écrit:

          Autre chose, comment on manipule argc et argv du main, je veux dire c'est même quoi ces paramètres ? J'ai jamais connu leur utilité.

          La fonction main n'est jamais qu'une fonction "comme les autres", dont la seule particularité qui nous intéresse vraiment ici est qu'elle est d'office connue du compilateur (comprend: qu'il ne faut pas la déclarer) sous deux formes possibles.

          Et donc, les paramètres que l'on peut éventuellement lui transmettre (argc et argv, pour reprendre les noms que tu as utilisés) ont pour objectif -- comme n'importe quel paramètre transmis à une fonction -- de modifier le comportement de la fonction appelée à partir de l'appelant (qui est, en simplifiant un peu ici, le système d'exploitation ;) )

          Ca, représente les paramètres que l'on peut éventuellement transmettre au programme lorsqu'il est lancé. par exemple, lorsque tu invoque le compilateur sous une forme qui pourrait être proche de

          g++ -c fichier.cpp -I someDir -o fichier.o

          (pour lui demander de générer un fichier objet qui sera nommé fichier.o à partir d'un fichier d'implémentation nommé fichier.cpp en ajoutant le dossier someDir à la liste des dossier dans lesquels il doit aller chercher les fichiers d'en-tête) argv (en fait le paramètre de type char **, quel que soit son nom) va contenir un "tableau de chaines de caractères (C style)" proche de

          argv[0]= "g++"  //le nom du programme, avec peut-être, en fonction du 
                          // système d'exploitation, le chemin qui y a mené
          argv[1] = "-c"           // la première chaine de caractères
                                   // introduite après le nom du programme
          argv[2] = "fichier.cpp"  // la deuxième chaine de caractères
                                   // introduite après le nom du programme
          argv[3] = "-I"           // la troisième chaine de caractères
                                   // introduite après le nom du programme
          argv[4] = "someDir"      // la quatrième chaine de caractères
                                   // introduite après le nom du programme
          argv[5] = "-o"           // la cinquième chaine de caractères
                                   // introduite après le nom du programme
          argv[6] = "fichier.o"    // la sixième chaine de caractères
                                   // introduite après le nom du programme

          Quant à argc (en fait, le premier paramètre qui sera d'office de type int, quel que soit son nom), il correspond au nombre de chaines de caractères (nom du programme compris) qui ont été introduites lors du lancement du programme (dans le cas présent: ca fait 7 :D)

          Si on utilise la version

          int main(int argc, char ** argv){
          
          }

          argc ne sera jamais inférieur à  1 (logique, vu qu'il y aura toujours au moins le nom du programme :D) et l'on peut donc, déjà vérifier le nombre de paramètres supplémentaires qui ont été fournis, et, selon le cas, forcer le fait que le programme s'attende -- par exemple -- a recevoir trois (ou quatre ou douze, ou autant que  tu veux/que tu en as besoin ;) ) chaines de caractères en plus du nom du  programme ou, "simplement" décider de "faire quelque chose de plus" si argc est plus grand que 1 ;).

          Quant à la manière de gérer ces paramètres, on va dire que cela dépend beaucoup trop du projet bien particulier qui les utilise. Cependant, "la bonne idée" lorsque tu dois gérer des paramètres au niveau du programme est peut-être d'aller voir ce que boost::program_options peut t'offrir ;)

          • Partager sur Facebook
          • Partager sur Twitter
          Ce qui se conçoit bien s'énonce clairement. Et les mots pour le dire viennent aisément.Mon nouveau livre : Coder efficacement - Bonnes pratiques et erreurs  à éviter (en C++)Avant de faire ce que tu ne pourras défaire, penses à tout ce que tu ne pourras plus faire une fois que tu l'auras fait
            18 avril 2022 à 7:37:28

            Merci. 

            Vraiment merci, exécuter un programme en envoyant les paramètres directement dans le terminal était seulement possible pour moi sur une distribution Linux. 

            ^^

            -
            Edité par Asmitta 18 avril 2022 à 7:42:14

            • Partager sur Facebook
            • Partager sur Twitter
              18 avril 2022 à 18:36:37

              >les paramètres directement dans le terminal était seulement possible pour moi sur une distribution Linux

              Absolument pas, on peut aussi le faire dans une console Windows, les fichiers ".bat" mais aussi via des réglages dans la base de registre pour que "explorer.exe" (le programme qui affiche le bureau, les explorateurs de fichiers, entre autre) ou encore dans les raccourcis.

              L'utilisation de ces paramètres est omniprésente.

              • Partager sur Facebook
              • Partager sur Twitter
              Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.

              Probleme avec "Exercice Venez vous entrainez"

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
              • Editeur
              • Markdown