Partage
  • Partager sur Facebook
  • Partager sur Twitter

DO/While

Probleme de boucle

    25 novembre 2017 à 0:25:09

    Alors voici mon code : 

    #include <iostream>
    #include <string>
    #include <cstdlib>
    #include <ctime>
    #include <fstream>
    using namespace std;
    
    static const char alphanum[] =
    "0123456789"
    "!@#$%^&*"
    "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    "abcdefghijklmnopqrstuvwxyz";
    
    int stringLength = sizeof(alphanum) - 1;
    
    char genRandom()
    {
        
        return alphanum[rand() % stringLength];
    }
    
    int main()
    {   cout << "Choisissez la longueur du mot de passe: ";
        int erreur =0;
        int reponce = 0 ;
        int a;
        cin >> a;
    
        srand(time(0));
        std::string Str;
        for(unsigned int i = 0; i < a ; ++i)
        {
            Str += genRandom();
            
        }
        cout <<Str;
        do {
            cin.clear();
            cin.ignore(80 , '\n');
            cout <<" \nVoulez sauvegarder ce mot de passe dans un fichier ?";
            cin >> reponce;
            if (reponce = 'O')
            {
                cout << "OK,Copie";
            }
            if (reponce = 'N')
            {
                cout << "OK,Fin du programme";
            }
        
            if (cin.fail())
            {
                cout<<"Veuillez réessayer..";
                cin.clear();
                cin.ignore(80 , '\n');
            }
    
        }while(cin.fail());
    }
    
    Et voici ce que j'obtiens : 
    Choisissez la longueur du mot de passe: 4
    ty9H 
    Voulez sauvegarder ce mot de passe dans un fichier ?N
    Copie en cours ;Fin du programme, à bientôtVeuillez réessayer..Program ended with exit code: 0

    Ma question est pourquoi est ce que j'obtiens ça comme réponse et comment y remédier. Je crois que j'ai vraiment un problème avec le cin :/ 

    Merci de vos réponses 

    -
    Edité par ChrisPapa 25 novembre 2017 à 0:25:28

    • Partager sur Facebook
    • Partager sur Twitter
      25 novembre 2017 à 0:58:27

      Ne confonds pas le = de l'affectation avec le == de la comparaison dans tes if
      • Partager sur Facebook
      • Partager sur Twitter
        25 novembre 2017 à 1:05:34

        regarde ton do while, à ton avis, est il possible que le cin.fail()  qui se trouve dans le while() retourne autre chose que false? si oui pourquoi? si non pourquoi? comme tu peux le voir, je ne suis pas sectaire, je te propose toutes les possibilités ;) La bonne réponse est non, le cin.fail() dans le while renverra toujours false, la bonne question, c'est pourquoi il renverra toujours false ? Je te laisse méditer là dessus...

         La remarque de Zoup n'est pas à négliger non plus ;) Qu'est qui peut faire que l'évaluation de a=b (au sens C++ du terme) puisse donner false? qu'elle puisse donner true ? La probabilité qu'elle donne true est largement supérieure à celle qu'elle donne false, pourquoi?

        -
        Edité par int21h 25 novembre 2017 à 6:50:01

        • Partager sur Facebook
        • Partager sur Twitter
        Mettre à jour le MinGW Gcc sur Code::Blocks. Du code qui n'existe pas ne contient pas de bug
          25 novembre 2017 à 15:16:04

          Merci pour vos réponse très rapide. J'ai effectivement réussi grâce a vous :) 

          Mais j'ai quand même un autre question : Comment est ce que je fait pour copier le code qui sera générer dans un fichier ? Et Pouvez-vous me dire ce qui est éventuellement a changer ?

          //
          //  Code.cpp
          //  Test
          //
          //  Created by Chris on 21/11/17.
          //  Copyright © 2017 Chris. All rights reserved.
          //
          
          #include <iostream>
          #include "Header.h"
          #include <limits>
          #include <fstream>
          
          using namespace std;
          
          int main() {
              do{
              
                  cout<<"Veuillez choisir la longueur du mot de passe qui sera génerer aléatoirement"<<endl;
                  if (cin.fail()){
                      
                      cin.clear();
                      cin.ignore(80 ,'\n');
                      cout<<"(Veuillez entrez des chiffres)"<<endl;
                  }
                  cin>>longueur;
                  }while(cin.fail());
              
              srand(time(0));
              
              for(int i =0; i < longueur; i++)
              {
                  
                  cout<<lettres[rand() % size];
                  
              }
              
              do {
                  cin.clear();
                  cin.ignore(80 , '\n');
                  cout <<"\nVoulez vous enregistrer ce mot de passe dans un fichier ? -O -N";
                  cin >> choix;
                      if (choix == 'o')
                      {
                          cout << "Copie en cours..";
                          
                          
                      }
                      if (choix == 'n')
                      {
                          cout << "Fin du programme";
                      }
                  
              } while (  choix!='o' && choix!='n' );
              
              
              
              return 0;
                               }
          

          Merci 

          -
          Edité par ChrisPapa 25 novembre 2017 à 16:06:15

          • Partager sur Facebook
          • Partager sur Twitter
            25 novembre 2017 à 18:24:56

            Salut,

            Utilise la classe prévue tout spécialement pour l'écriture dans un fichier, à savoir la classe std::ofstream.

            Tu ouvres ton fichier, et tu l'utilise exactement comme tu utiliserait std::cout, à ceci près que tu remplace std::cout par le nom de la variable qui correspond à ton fichier ;)

            • 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
              25 novembre 2017 à 19:03:32

              D’accord merci pour cette réponse mais dans mon code J’ai un problème car si je fait un cout << lettres dans mon fichier qui sera générer, il m’ecriras juste les lettres de l’alphabet Et pas le code qui est généré automatiquement 😕
              //
              //  Code.cpp
              //  Test
              //
              //  Created by Chris on 21/11/17.
              //  Copyright © 2017 Chris. All rights reserved.
              //
              
              #include <iostream>
              #include "Header.h"
              #include <limits>
              #include <fstream>
              
              using namespace std;
              int main() {
                  do{
                  
                      cout<<"Veuillez choisir la longueur du mot de passe qui sera génerer aléatoirement"<<endl;
                      if (cin.fail()){
                          
                          cin.clear();
                          cin.ignore(80 ,'\n');
                          cout<<"(Veuillez entrez des chiffres)"<<endl;
                      }
                      cin>>longueur;
                      }while(cin.fail());
                  
                  srand(time(0));
                  
                  for(int i =0; i < longueur; i++)
                  {
                      
                       cout<<lettres[rand() % size];
                      
                  }
                  
                  do {
                      cin.clear();
                      cin.ignore(80 , '\n');
                      cout <<"\nVoulez vous enregistrer ce mot de passe dans un fichier ? -O -N";
                      cin >> choix;
                          if (choix == 'o' || choix == 'O')
                          {
                              cout << "Copie en cours..";
                              
                              ofstream code("/Users/chris/Desktop/code.txt");
                              cout << ("Votre code est : ");
                              code<<lettres;
                              
                              
                              return 0;
                          }
                      if (choix == 'n' || choix == 'N')
                          {
                              cout << "Fin du programme";
                              return 0;
                          }
                      else{
                          
                          cout << "Erreur , veuillez entrez soit -O -N";
                      }
                      
                  } while ( choix!= 'n' && choix!= 'o');
                  
                  
                  
                  return 0;
                                   }

              et voici ce que j'obtiens dans mon fichier, ce qui est assez logique mais je ne sais que faire 

              ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789




              -
              Edité par ChrisPapa 25 novembre 2017 à 19:41:29

              • Partager sur Facebook
              • Partager sur Twitter
                25 novembre 2017 à 21:57:46

                Ce ne sera déjà pas cout (d'ailleurs, ce devrait être std::cout, la directive using namespace std; étant une aberration à ne pas utiliser), mais bien le nom de la variable de type std::ofstream que tu aura créé.

                Ensuite, si tu veux qu'il écrive quelque chose qui est calculé, tu n'as qu'à lui dire quel calcul effectué ;)

                Ainsi, si tu veux "coder" une chaine de caractères, tu as sans doute intérêt à en créer une deuxième qui contiendra la chaine codée (à toi de voir comment copier la première dans la deuxième, avec les modifications à apporter :D)

                Et une fois que tu auras cette chaine "codée" (appelons la codedString, pour la compréhension), il suffira d'un

                std::ofstream ofs("fichier.txt");
                ofs<<codedString<<"\n";

                pour l'écrire dans un fichier qui sera nommé (selon mon exemple) fichier.txt ;)

                • 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
                  25 novembre 2017 à 22:40:51

                  Et bien j'ai chercher mais je suis coincé quand je doit coder la chaine de caractère dans un string :(

                  • Partager sur Facebook
                  • Partager sur Twitter
                    26 novembre 2017 à 0:13:48

                    Allon, c'est pourtant simple:

                    /* soit la chaine d'origine, introduite par l'utilisateur,
                     * str
                     *
                     * on va parcourir tous les caractères de cette chaine, et
                     * mettre le résultat des modification dans dest
                     */
                    std::string dest
                    for(auto c : str){
                       /* tu calcule la valeur à donner dans la chaine de destinaton
                        * d'une manière qui te convient
                        */
                        dest.append(1,c); // il y a d'autre moyens de le faire 
                    }
                    /* a partir d'ici, str contient (toujours) la chaine d'origine,
                     * et dest contient la chaine "codée".
                     */
                    • 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
                      26 novembre 2017 à 14:20:47

                      Un grand merci à toi koala01 pour ton aide. C’est vrai que en voyant la réponse ça ma l’air tellement bête..

                      Merci beaucoup 

                      • Partager sur Facebook
                      • Partager sur Twitter

                      DO/While

                      × 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