Partage
  • Partager sur Facebook
  • Partager sur Twitter

une variable string ne veux pas se modifier Qt

et un problème de crash Qt

Sujet résolu
    30 mars 2020 à 16:27:46

    Bonjours,

    je suis actuellement en train de faire une application qui reproduit une évaluation sous formes de QCM pour les élèves de ma mère ,en confinement.

    Mais deux problèmes se pose vers la fin de l'application, si on coche les radioButton, le programme crash à la fin et, si on ne touche pas aux différents bouton, un fichier ce créer et il y a écrit la note dedans, le deuxième problème commence ici, j'utilise un fonction qui met en pratique le code césar et renvoie une chaîne de caractère. Après quelque tests je sais où se trouve le problème, il est dans la fonction citée précédemment dans un switch.

    Normalement le deuxième problème est bien où je l'ai dis donc je vais vous mettre cette fonction ainsi que la où l'on appelle cette dernière, si vous voulez le code en entier demander le moi sur ce topic.

    if(m_compteur > 22)
        {
            m_compteur = 0;
            m_continuer = false;
    
            std::ofstream flux("QCM.txt");
    
            if(flux)       // aller voir pour QFile
            {
                //std::string texte("test");
                //texte = melangeLettre("AAAA");
                flux << "test " << melangeLettre("AAAA") << m_points;
            }
            else
            {
                ui->lineEdit->show();
            }
        }
    
        if(!m_continuer)
        {
            ui->A->hide();
            ui->B->hide();
            ui->C->hide();
            ui->D->hide();
    
            ui->questions->hide();
            ui->next->hide();
    
        }
    }
    
    std::string MainWindow::melangeLettre(QString mot)
    {
        std::string melange("test");
    
        std::string text = mot.toStdString();
    
        for (unsigned int i = 0; i > 4; i++) {
    
            switch(text[i])
            {
    
            case 'A':
                melange = "F";
                break;
    
            case 'B':
                melange += 'G';
                break;
    
            case 'C':
                melange += 'H';
                break;
    
            case 'D':
                melange += 'I';
                break;
    
            case 'E':
                melange += 'J';
                break;
    
            case 'F':
                melange += 'K';
                break;
    
            case 'G':
                melange += 'L';
                break;
    
            case 'H':
                melange += 'M';
                break;
    
            case 'I':
                melange += 'N';
                break;
    
            case 'J':
                melange += 'O';
                break;
    
            case 'K':
                melange += 'P';
                break;
    
            case 'L':
                melange += 'Q';
                break;
    
            case 'M':
                melange += 'R';
                break;
    
            case 'N':
                melange += 'S';
                break;
    
            case 'O':
                melange += 'T';
                break;
    
            case 'P':
                melange += 'U';
                break;
    
            case 'Q':
                melange += 'V';
                break;
    
            case 'R':
                melange += 'W';
                break;
    
            case 'S':
                melange += 'X';
                break;
    
            case 'T':
                melange += 'Y';
                break;
    
            case 'U':
                melange += 'Z';
                break;
    
            case 'V':
                melange += 'A';
                break;
    
            case 'W':
                melange += 'B';
                break;
    
            case 'X':
                melange += 'C';
                break;
    
            case 'Y':
                melange += 'D';
                break;
    
            case 'Z':
                melange += 'E';
                break;
    
            case ' ' :
                melange += ' ';
                break;
    
            //les minuscules
    
            case 'a':
                melange += 'f';
                break;
    
            case 'b':
                melange += 'g';
                break;
    
            case 'c':
                melange += 'h';
                break;
    
            case 'd':
                melange += 'i';
                break;
    
            case 'e':
                melange += 'j';
                break;
    
            case 'f':
                melange += 'k';
                break;
    
            case 'g':
                melange += 'l';
                break;
    
            case 'h':
                melange += 'm';
                break;
    
            case 'i':
                melange += 'n';
                break;
    
            case 'j':
                melange += 'o';
                break;
    
            case 'k':
                melange += 'p';
                break;
    
            case 'l':
                melange += 'q';
                break;
    
            case 'm':
                melange += 'r';
                break;
    
            case 'n':
                melange += 's';
                break;
    
            case 'o':
                melange += 't';
                break;
    
            case 'p':
                melange += 'u';
                break;
    
            case 'q':
                melange += 'v';
                break;
    
            case 'r':
                melange += 'w';
                break;
    
            case 's':
                melange += 'x';
                break;
    
            case 't':
                melange += 'y';
                break;
    
            case 'u':
                melange += 'z';
                break;
    
            case 'v':
                melange += 'a';
                break;
    
            case 'w':
                melange += 'b';
                break;
    
            case 'x':
                melange += 'c';
                break;
    
            case 'y':
                melange += 'd';
                break;
    
            case 'z':
                melange += 'e';
                break;
    
            default :
                melange = "test";
                break;
            }
        }
        return melange;
    }

    j'en profite pour vous rappelez que j'aimerais si possible savoir aussi pourquoi mon programme crash si on appuie sur les radioButton

    le code utilisant les boutons :

    MainWindow.cpp :

    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    #include <QString>
    #include <QIcon>
    #include <fstream>
    #include <cstdio>
    #include <cstdlib>
    #include <ctime>
    
    MainWindow::MainWindow(QWidget *parent)
        : QMainWindow(parent)
        , ui(new Ui::MainWindow)
        , m_compteur(0)
        , m_points(0)
        , m_continuer(true)
        ,m_text("")
    {
        ui->setupUi(this);
        this->setWindowIcon(QIcon("0 sur 20 ico.ico"));
        this->setFixedSize(645, 325);
    
        ui->A->hide();
        ui->B->hide();
        ui->C->hide();
        ui->D->hide();
    
        ui->questions->hide();
    
        monTimer=new QTimer();
    
        QObject::connect(monTimer, SIGNAL(timeout()), this,SLOT(finTempo()));
        QObject::connect(ui->next,SIGNAL(clicked()), this,SLOT(nextPage()));
    }
    
    MainWindow::~MainWindow()
    {
        delete ui;
    }
    
    void MainWindow::finTempo()
    {
        nextPage();
    }
    
    void MainWindow::nextPage()
    {
        // ce tableau définit toutes tes questions
        QString questions[] = {"1. La réaction inflammatoire :",
                                "2. Les cellules impliquées dans la réaction inflammatoire incluent :",
                                "3. Des cellules de l'immunité sont mises en contact avec des bactéries. \nQuelle molécule présente dans le surnageant (liquide en surface)\npourrait expliquer l’apparition des symptômes inflammatoires\nau niveau de l'oreille de la souris de l'expérience A ? ",
                                "4. Les leucocytes sécréteurs d'anticorps sont :",
                                "5. Un anticorps est une protéine capable de se lier../0.5",
                                "5. La molécule d'anticorps est une lactoglobuline………./0.5",
                                "6. La molécule d'anticorps est composée:",
                                "7. Les 4 phases de la phagocytose sont  :",
                                "8. Lorsque des anticorps rencontrent un virus qui leur sont spécifiques :",
                                "9. Un Lymphocyte T8 se différencie en :",
                                "10. Les lymphocytes T4 ont pour rôle :",
                                "11. Les moyens de destruction d'un LT cytotoxique sont :",
                                "12.  L'immunité innée est : …/0.5",
                                "12 bis. Un Lymphocyte cytotoxique est capable /0.5",
                                "13. La réponse secondaire concernant un antigène A est plus rapide à cause :",
                                "14. Cette production importante et rapide d’anticorps est utilisée :",
                                "15. Quel élément, ne fait pas parti des défenses innées,\nnon spécifiques du corps :",
                                "16. Quel mécanisme de défense n'est pas non spécifique :",
                                "17. Les macrophages des tissus, naissent des .... de la circulation sanguine : ",
                                "18. La phagocytose consiste pour une cellule à :",
                                "19. La réaction inflammatoire se manifeste par … :",
                                "20. Les médiateurs chimiques de l’inflammation … :"};
        // le tableau de questions ce finit ici
        // le tableau de toutes les réponses A commence ci-dessous
        QString repA[] = {"A. Prépare la réaction innée.",
                            "A. Les cellules dendritiques.",
                            "A. anticorps",
                            "A. Les plasmocytes.",
                            "A. à un antigène spécifique.",
                            "A. Oui.",
                            "A. d'une chaine légère et une chaine lourde.",
                            "A. endocytose / adhérence / exocytose / digestion",
                            "A. Ils s'agglutinent sur le virus.",
                            "A. lymphocyte T4",
                            "A. de sécréter des anticorps.",
                            "A. la phagocytose",
                            "A. assurée par les cellules phagocytaires\ntrès rapidement mobilisées lors de\nl'entrée d'un antigène.",
                            "A. de neutraliser un élément étranger\ndans le plasma sanguin.",
                            "A. d’une concentration plus importante de virus",
                            "A. dans la technique de la vaccination",
                            "A. la réaction inflammatoire",
                            "A. la peau saine est une barrière que ni les bactéries\nni les virus ne peuvent franchir normalement",
                            "A. monocytes",
                            "A. libérer des anticorps",
                            "A. chaleur, irritation, gonflement et douleur",
                            "A. sont des cellules"};
        //
        //
        QString repB[] = {"B. Prépare la réaction adaptative.",
                         "B. Les globules rouges (hématies).",
                         "B. médiateur chimique",
                         "B. les lymphocytes T4.",
                         "B. à n'importe quel antigène.",
                         "B. Non.",
                         "B. de deux chaines légères et deux chaines lourdes.",
                         "B. endocytose / adhérence / digestion / exocytose",
                         "B. Les anticorps détruisent le virus.",
                         "B. plasmocyte.",
                         "B. d'inhiber la multiplication et des LB et LT8",
                         "B. le \"baiser de la mort\" (par libération\nde protéines \"perforines\" capables de perforer\nune membrane cellulaire).",
                         "B. assurée par des mécanismes qui ne deviennent efficaces qu'après un premier contact avec l'antigène, avec mise en mémoire de ce contact.",
                         "B. de détruire une cellule infectée.",
                         "B. de la mémoire immunitaire",
                         "B. dans la réaction inflammatoire",
                         "B. les anticorps",
                         "B. Les larmes, la salive et le mucus contiennent du\nlysozyme, une enzyme qui digère la paroi bactérienne",
                         "B. lymphocytes B",
                         "B. attirer les lymphocytes B",
                         "B. rougeur, chaleur, gonflement et douleur",
                         "B. sont sécrétés par des glandes"};
        //
        //
        QString repC[] = {"C. Est préparée par la réaction adaptative.",
                          "C. Les lymphocytes B.",
                          "C. interleukine de type 2",
                          "C. les lymphocytes T cytotoxiques.",
                          "C.",
                          "C.",
                          "C. d’une chaine lourde et de deux chaines légères",
                          "C. adhérence / endocytose / digestion / exocytose",
                          "C. Les anticorps pénètrent à l’intérieur du virus",
                          "C. lymphocyte cytotoxique.",
                          "C. de stimuler la multiplication et la différenciation des LB\net des LT8 sélectionnés par l'antigène introduit.",
                          "C. la formation d'un complexe immun par agglutination.",
                          "C.",
                          "C.",
                          "C. du contact avec l’antigène B",
                          "C. dans la réaction immunitaire éliminant les cellules infectées.",
                          "C. la phagocytose par les macrophages",
                          "C. les sécrétions des glandes sébacées donnent\nà la peau un pH acide qui empêche la multiplication\ndes bactéries",
                          "C. lymphocytes T",
                          "C. ingérer, digérer des bactéries",
                          "C. douleur, gonflement, démangeaison et chaleur",
                          "C. sont des molécules"};
        //
        //
        QString repD[] = {"D. Est préparée par la réaction innée.",
                         "D. Les lymphocytes T.",
                         "D. anti-inflammatoire",
                         "D. les cellules phagocytaires.",
                         "D.",
                         "D.",
                         "D. De deux chaines lourdes et d’une chaine légère",
                         "D. exocytose / digestion / adhérence / endocytose",
                         "D. Les anticorps « appellent » les cellules LT cytotoxiques \nà la rescousse",
                         "D. lymphocyte auxiliaire",
                         "D. de phagocyter l’élément pathogène.",
                         "D. par libération d’anticorps agglutinant la cellule infectée",
                         "D.",
                         "D.",
                         "D . de la courte durée entre les deux contacts.",
                         "D. dans la réaction innée",
                         "D. la phagocytose par les granulocytes",
                         "D. la sécrétion des anticorps par les lymphocytes B",
                         "D. granulocytes",
                         "D. attirer les lymphocytes T",
                         "D. gonflement, perte de sensibilité, pâleur et raideur",
                         "D. sont sécrétées par le pathogène"};
        //
        //
        QString bonneReponse[] = {"B",
                                 "A",
                                 "B",
                                 "A",
                                 "A",
                                 "B",
                                 "B",
                                 "C",
                                 "A",
                                 "C",
                                 "C",
                                 "B",
                                 "A",
                                 "B",
                                 "B",
                                 "A",
                                 "B",
                                 "D",
                                 "A",
                                 "C",
                                 "B",
                                 "C"};
        if(m_continuer)
        {
            ui->questions->setText(questions[m_compteur]);
            ui->A->setText(repA[m_compteur]);
            ui->B->setText(repB[m_compteur]);
            ui->C->setText(repC[m_compteur]);
            ui->D->setText(repD[m_compteur]);
            monTimer->setSingleShot(true); //active le mode singleShot
            monTimer->start(25000); //démarre une tempo de 15 secondes
        }
    
        if(m_compteur == 0 && m_continuer)
        {
            m_text = ui->lineEdit->text();
    
            ui->A->show();
            ui->B->show();
            ui->C->show();
            ui->D->show();
    
            ui->questions->show();
    
            ui->label2->hide();
            ui->lineEdit->hide();
        }
    
        if(m_compteur == 4 || m_compteur == 5 || m_compteur == 12 || m_compteur == 13)
        {
            ui->C->setEnabled(false);
            ui->D->setEnabled(false);
        }
        else
        {
            ui->C->setEnabled(true);
            ui->D->setEnabled(true);
        }
    
        if(ui->A->isChecked() && bonneReponse[m_compteur] == "A")
        {
            if(m_compteur == 4 || m_compteur == 5 || m_compteur == 12 || m_compteur == 13)
            {
                m_points += 0.5;
            }
            else
            {
                m_points += 1;
            }
        }
    
        if(ui->B->isChecked() && bonneReponse[m_compteur] == "B")
        {
            if(m_compteur == 4 || m_compteur == 5 || m_compteur == 12 || m_compteur == 13)
            {
                m_points += 0.5;
            }
            else
            {
                m_points += 1;
            }
        }
    
        if(ui->C->isChecked() && bonneReponse[m_compteur] == "C")
        {
            if(m_compteur == 4 || m_compteur == 5 || m_compteur == 12 || m_compteur == 13)
            {
                m_points += 0.5;
            }
            else
            {
                m_points += 1;
            }
        }
    
        if(ui->D->isChecked() && bonneReponse[m_compteur] == "D")
        {
            if(m_compteur == 4 || m_compteur == 5 || m_compteur == 12 || m_compteur == 13)
            {
                m_points += 0.5;
            }
            else
            {
                m_points += 1;
            }
        }
    
        if (m_continuer)
            m_compteur++;
    
        if(m_compteur > 22)
        {
            m_compteur = 0;
            m_continuer = false;
    
            std::ofstream flux("QCM.txt");
    
            if(flux)       // aller voir pour QFile
            {
                //std::string texte("test");
                //texte = melangeLettre("AAAA");
                flux << "test " << melangeLettre("AAAA") << m_points;
            }
            else
            {
                ui->lineEdit->show();
            }
        }
    
        if(!m_continuer)
        {
            ui->A->hide();
            ui->B->hide();
            ui->C->hide();
            ui->D->hide();
    
            ui->questions->hide();
            ui->next->hide();
    
        }
    }

    MainWindow.h:

    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
    
    #include <QMainWindow>
    #include "FenSecondaire.h"
    #include <QTimer>
    
    QT_BEGIN_NAMESPACE
    namespace Ui { class MainWindow; }
    QT_END_NAMESPACE
    
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
    
    public:
        MainWindow(QWidget *parent = nullptr);
        ~MainWindow();
        QTimer *monTimer;
    
    public slots:
        void nextPage();
        void finTempo();
    
    private:
        Ui::MainWindow *ui;
    
        int m_compteur;
        double m_points;
        bool m_continuer;
    
        QString m_text;
    
        std::string melangeLettre(QString mot);
    };
    #endif // MAINWINDOW_H
    

    -
    Edité par OPSFORCE 30 mars 2020 à 16:34:17

    • Partager sur Facebook
    • Partager sur Twitter

    il faut toujours persévérer pour avancer, donc n'abandonner jamais

      30 mars 2020 à 17:49:49

      Salut,

      Est ce que tu comprend ne serait-ce qu'un tout petit peu ce que tu fais, ou bien tu essaye "un peu à pouf" différentes solutions?

      Parce que, clairement, il y a quelque chose que tu n'as sans doute pas compris.

      Voyons un peu ce qui se passe, par exemple, à la ligne 12 du premier code que tu nous présente:

      tu appelle la fonction melangerLettre en lui fournissant (sous forme de QString, mais cela ne fait pas beaucoup de différence) la chaine de caractères "AAAA"

      On se retrouve donc dans la fonction melangerLettre avec la donnée mot qui vaut "AAAA".

      Puis tu déclares une chaine de caractères nommée "melange" et dont la valeur est définies à "test".

      Et comme mot est de type QString, tu crées une troisième donnée -- de type std::string -- et nommée text qui prendra le résultat de la conversion d'une QString (ta donnée mot) en std::string, mais du coup, text aura pour valeur ... "AAAA"

      Une fois que tu as fait tout cela, tu entre dans une boucle qui sera exécutée quatre fois (pourquoi quatre fois?) et qui prendra à chaque fois un caractères de la donnée mot.  Mais, comme les quatre caractères qui composent la valeur de mot (qui, rappelons le est égal à "AAAA") sont les mêmes, ton switch va toujours entrer dans le même case car, devine quoi?  Le caractère sera toujours égal à ... 'A'

      Du coup, peu importe les autres case que tu auras définis, ce qui va se passer, c'est que tu vas attribuer la valeur de "F" à melange.

      Et, une fois que la boucle est terminée, tu renvoie la donnée melange qui, en l'état, vaudra forcément "F".

      Quelle autre valeur voudrais tu que cette donnée puisse avoir?

      Note que, si tu donnais une chaine de (quatre) caractères différents -- par exemple "AZER", le résultat serait à peine différent, car la valeur finale correspondrait à la valeur assignée qui correspond au E, à savoir ... "J".

      De toute évidence, il y a "quelque chose" qui ne va pas dans ta logique, tu ne crois pas?

      • 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
        30 mars 2020 à 20:23:09

        Oui, désolé

        mais je faisais mes tests. C'est pour sa que je n'est mis que des A, et si tu regarde bien tu va voir aussi que il n'y a que sur le A majuscule qu'il y a le signe = sinon il y a des +=.

        Et pour l'histoire de la boucle et du nombre 4 c'est parce que je faisais aussi des tests mais sinon, quand le problème sera réglé, je mettrais text.size().

        Désolé si je me suis mal exprimer mais ce problème est que, dans le fichier texte QCM, il a marqué "test test0" ce qui correspond à

        flux << "test " << melangeLettre("AAAA") << m_points;

        et au retour de la fonction melangeLettre (le test vient de la première ligne de la fonction et le return, la dernière), c'est pour sa que je dis que l'erreur vient du switch

        std::string melange("test");
         
            std::string text = mot.toStdString();
         
            for (unsigned int i = 0; i > 4; i++) {
         
                switch(text[i])
                {
         
                case 'A':
                    melange = "F";
                    break;
         
                case 'B':
                    melange += 'G';
                    break;
         
                case 'C':
                    melange += 'H';
                    break;
         
                case 'D':
                    melange += 'I';
                    break;
         
                case 'E':
                    melange += 'J';
                    break;
         
                case 'F':
                    melange += 'K';
                    break;
         
                case 'G':
                    melange += 'L';
                    break;
         
                case 'H':
                    melange += 'M';
                    break;
         
                case 'I':
                    melange += 'N';
                    break;
         
                case 'J':
                    melange += 'O';
                    break;
         
                case 'K':
                    melange += 'P';
                    break;
         
                case 'L':
                    melange += 'Q';
                    break;
         
                case 'M':
                    melange += 'R';
                    break;
         
                case 'N':
                    melange += 'S';
                    break;
         
                case 'O':
                    melange += 'T';
                    break;
         
                case 'P':
                    melange += 'U';
                    break;
         
                case 'Q':
                    melange += 'V';
                    break;
         
                case 'R':
                    melange += 'W';
                    break;
         
                case 'S':
                    melange += 'X';
                    break;
         
                case 'T':
                    melange += 'Y';
                    break;
         
                case 'U':
                    melange += 'Z';
                    break;
         
                case 'V':
                    melange += 'A';
                    break;
         
                case 'W':
                    melange += 'B';
                    break;
         
                case 'X':
                    melange += 'C';
                    break;
         
                case 'Y':
                    melange += 'D';
                    break;
         
                case 'Z':
                    melange += 'E';
                    break;
         
                case ' ' :
                    melange += ' ';
                    break;
         
                //les minuscules
         
                case 'a':
                    melange += 'f';
                    break;
         
                case 'b':
                    melange += 'g';
                    break;
         
                case 'c':
                    melange += 'h';
                    break;
         
                case 'd':
                    melange += 'i';
                    break;
         
                case 'e':
                    melange += 'j';
                    break;
         
                case 'f':
                    melange += 'k';
                    break;
         
                case 'g':
                    melange += 'l';
                    break;
         
                case 'h':
                    melange += 'm';
                    break;
         
                case 'i':
                    melange += 'n';
                    break;
         
                case 'j':
                    melange += 'o';
                    break;
         
                case 'k':
                    melange += 'p';
                    break;
         
                case 'l':
                    melange += 'q';
                    break;
         
                case 'm':
                    melange += 'r';
                    break;
         
                case 'n':
                    melange += 's';
                    break;
         
                case 'o':
                    melange += 't';
                    break;
         
                case 'p':
                    melange += 'u';
                    break;
         
                case 'q':
                    melange += 'v';
                    break;
         
                case 'r':
                    melange += 'w';
                    break;
         
                case 's':
                    melange += 'x';
                    break;
         
                case 't':
                    melange += 'y';
                    break;
         
                case 'u':
                    melange += 'z';
                    break;
         
                case 'v':
                    melange += 'a';
                    break;
         
                case 'w':
                    melange += 'b';
                    break;
         
                case 'x':
                    melange += 'c';
                    break;
         
                case 'y':
                    melange += 'd';
                    break;
         
                case 'z':
                    melange += 'e';
                    break;
         
                default :
                    melange = "test";
                    break;
                }
            }
            return melange;




        • Partager sur Facebook
        • Partager sur Twitter

        il faut toujours persévérer pour avancer, donc n'abandonner jamais

          31 mars 2020 à 0:28:56

          Au fait, n'avais pas fait assez attention à la boucle en elle-même...

          Dis moi, dans une boucle commençant à 0 et dont la condition de sortie est "plus grand que 4", à combien d'itérations dois tu t'attendre?

          Ben, faisons le compte, on passe par les valeurs 0,1,2,3 ... et 4 (ben oui, 4 n'est pas plus grand que 4, jusqu'à preuve du contraire!)..

          Mais, du coup quel caractère trouve-ton à l'indice text[4] selon toi?

          OUUUPSSS! l la réponse est le "\0' qui dénote la fin de la chaine de caractères (à priori-), qui fera d'office passer cette dernière itération par defaut: melange="test"; ... Pas cool hein?

          (tu vois pourquoi utiliser directement la bonne règle, à savoir i < test.size() est important?)

          Donc,

          • du fait de la valeur utilisée comme paramètre, tu passe quatre fois par le mème cas (case 'A') qui, manque de bol, définit test sans y ajouter quoi que ce soit et
          • du fait de ton erreur de logique au niveau de la boucle, tu termines toujours en définissant mélange à ... test.

          Quoi qu'il en soit, la question que je posais dans mon intervention reste de pleine actualité :D

          En outre,  tu t'es vraiment fatigué pour pas grand chose  à écrire un switch case prenant toutes les lettres de l'alphabet., car tu aurais pu limiter ton code à quelques lignes à peine en lui donnant une forme proche de (j'en profite pour corriger l'erreur de logique et pour transformer le paramètre en std::string,  qui sera plus facile)

          std::string MainWindow::melangeLettre(std::string const & mot)
          {
              std::string melange;
              enum LetterType{
                  space,
                  minuscule,
                  majuscule
              };
              for(size_t i =0; i< mot.size();++i){
                  char current=mot[i];
                  LetterType type;
                  int toadd = 'f'-'a';
                  if(current >='a' && current <='z') 
                      type = minuscule;
                  else if(current >='A' && current <= 'Z')
                      type = majuscule;
                  else 
                       type = space;
                  switch(type){
                     case space: // nothing to do
                         break;
                      case minuscule:
                          current+=toadd;
                          if(current >'z')
                              current = current -'z' +'a';
                           break;
                      case majuscule:
                          current+=toadd;
                          if(current >'Z')
                              current = current -'Z' +'A';
                           break;
                  }
                  melange.append(1, current);    
              }
              return melange;
          }

          Avoue que c'est quand même plus simple, non?

          -
          Edité par koala01 31 mars 2020 à 14:45:38

          • 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
            31 mars 2020 à 12:19:18

            Merci pour ta réponse qui doit marché j'en suis sûr (je ne peux plus le tester de moi même car je ne suis plus chez ma mère, donc l'ordi que j'ai actuellement n'est pas assez puissant) et je vais essayer de transformer le code pour qu'il puisse accepter un QSring en paramètre car, l'idéal serai d'écrire seulement

                    std::ofstream flux("QCM.txt");
             
                    if(flux)       // aller voir pour QFile
                        flux << melangeLettre(ui->lineEdit->text()) << m_points;
                    else
                        QLabel error = new QLabel("une erreur s'est produite lors de l'ecriture du fichier");

            je vais donc modifier la fonction melange lettre comme je l'est dis et je vous donnerai le code.

            Mais une chose m'étonne, c'est que quand je faisait mes test, je pouvais juste modifié la valeur retourné en donnant,à l'assignation une valeur ; je m'explique. Par exemple si je mettais, au lieu de "test" 

            std::string melange("test");

            je mettais "exemple"

            std::string melange("exemple");

            la fonction renvoie exemple.

            PS : ta fonction est super et aussi très compliquer(je n'ai pas vu les listes, les énumération,...) donc je vais essayer de la comprendre.

            Et de souvenir la boucle for va faire 0,1,2,3 et le 4 est on-inclue

            je prend les exemple du cours :

            int main()
            {
                int compteur(0);
            
                for (compteur = 0 ; compteur < 10 ; compteur++)
                {
                    cout << compteur << endl;
                }
            
                return 0;
            }

            ceci affiche dans la console

            0
            1
            2
            3
            4
            5
            6
            7
            8
            9   

            EDIT : 

            je n'avais pas remarquer mais j'ai mis le signe supérieur au lieu de celui de l’inférieur.

            Et si vous avez une idée sur pourquoi sa crash quand on remplit le QCM, je suis preneur

            -
            Edité par OPSFORCE 31 mars 2020 à 12:22:52

            • Partager sur Facebook
            • Partager sur Twitter

            il faut toujours persévérer pour avancer, donc n'abandonner jamais

              31 mars 2020 à 14:52:01

              J'ai utilisé une énumération uniquement pour avoir des valeurs constantes qui ont un sens bien particuliers.

              Une énumération n'est en effet jamais qu'un ensemble de valeurs numériques (entières) bien précises auxquelles ont donne un nom bien particulier.

              Dans mon code, l'identifiant nommé  space est associé à la valeur 0, l'identifiant minuscule est associé à la valeur 1 et l'identifiant majuscule est identifié à la valeur 2.  Mais ca, tout le monde s'en fout royalement en réalité parce que ce qui importe c'est que

              1. les trois identifiants font partie "du même groupe" qui est LetterType (type de lettres en francais :D )
              2. chaque identifiant représente un concept bien particulier : space (espace en francais) représente un espace alors minuscule et majuscule représente les différentes "formes" de lettre
              3. chaque identifiant sera assimilé, au niveau de l'application à une valeur numérique différente.
              4. les valeurs associées à chaque identifiants ne risquent pas de changer (même si on s'en fout un peu en fait).
              Pour le reste, la logique que je suis est particulièrement simple en réalité:
              • ligne 10: je commence par récupérer le caractère qui m'intéresse dans le mot transmis par l'utilisateur, en fonction du nombre d'itérations déjà effectuées
              • ligne 11: je déclare une variable de type LetterType, car mon premier besoin est de définir si j'ai affaire à une minuscule, à une majuscule ou à un espace
              • ligne 12: je teste le caractère récupéré ligne 10 pour savoir s'il s'agit d'une minuscule ("plus grand ou égal à 'a' et plus petit ou égal à 'z', parce que les lettres minuscules ont une valeur dans la table ASCII qui suit l'ordre alphabétique)
              • ligne 13: si c'est le cas, je défini ma variable type comme ayant la valeur associée à l'identifiant "minuscule", car c'est effectivement le cas
              • lignes 14 et 15: le caractère courant n'est pas une minuscule je fais la même chose pour savoir s'il s'agit d'une majuscule ("plus grand ou égal à 'A' et plus petit ou égal à 'Z')
              • lignes 16 et 17 :Enfin, si le caractère courant n'est pas une majuscule (alors que je sais déjà que ce n'est pas une minuscule), je considère qu'il réagira comme si c'était un espace (sans modifier la valeur du caractère courant et, dans ce cas, je definis la valeur de type à ... space.

              Une fois que c'est fait, je peux appliquer une logique particulière à chacun des cas.  Pour les minuscule et pour les majuscules,  je vais commencer par y ajouter la valeur qui correspond à la position du caractère 'f' moins la position du caractère 'a' dans la table ASCII (j'aurais tout aussi bien pu lui donner la valeur 5 directement :D) et, selon le cas

              • si le caractère était une minuscule, je veille à ce que sa valeur finale soit comprise entre 'a' et 'z'
              • si le caractère était une majuscule, je vielle à ce que sa valeur finale soit comprise entre 'A' et 'Z' et
              • si le caractère est "considéré comme étant un espace" (ce qui implique tous les autres caractères qui ne sont pas des lettres, en réalité) je le laisse tout simplement inchangé.

              Une fois que tout cela est fait (nous arrivons à la ligne 33), j'ajoute le caractère dont je viens de calculer la "nouvelle valeur" à la chaine de caractères qui sera renvoyée par la fonction

              Et, enfin (nous sommes à la ligne 35) je renvoie le résultat final, qui est en réalité la chaine de caractères que j'ai créée tout au long de cette fonction.

              Ceci étant dit, si tu ne connais pas encore les énumérations, tu ne devrais -- à mon avis -- pas encore commencer à "jouer" avec Qt, car cela ajoute énormément de complexité à des problèmes qui auraient pu être traités de manière beaucoup plus simple (quoi que moins conviviale).

              Tu aurais, à mon sens, largement intérêt par apprendre le C++ "de base", et à jouer avec en mode console (terminal), histoire de t'habituer au langage et à ses possibilités avant de commencer à jouer avec Qt ;)

              • 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
                31 mars 2020 à 15:08:48

                Bonjours koala01,

                j'ai déjà survolé les titres des chapitres du cours de Mathieu Nebra sur le c++, c'est pour sa que je connais le mot énumération.

                Et il se trouve que le chapitre sur les énumérations se trouve après le chapitre de Qt, et un dernier petit point, I know, when I say "ma mère" it's like an little child say "ma maman" but I can speak english despite my age. :D

                • Partager sur Facebook
                • Partager sur Twitter

                il faut toujours persévérer pour avancer, donc n'abandonner jamais

                  31 mars 2020 à 16:14:06

                  OPSFORCE a écrit:

                  Bonjours koala01,

                  j'ai déjà survolé les titres des chapitres du cours de Mathieu Nebra sur le c++, c'est pour sa que je connais le mot énumération.

                  Et il se trouve que le chapitre sur les énumérations se trouve après le chapitre de Qt, et un dernier petit point, I know, when I say "ma mère" it's like an little child say "ma maman" but I can speak english despite my age. :D


                  Comment? on ne te l'as pas encore dit et répété?  Le cours de Mathieu est une véritable catastrophe et doit être fui comme la peste...

                  Tourne toi plutôt sur le cours (toujours en écriture, me semble-t-il) du zeste de savoir.  Tu n'auras pas besoin de t'intéresser à Qt avant longtemps, et au moins, tu n'apprendra pas une somme pharamineuse de conneries ;)

                  • 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
                    31 mars 2020 à 22:44:00

                    koala01 a écrit:

                    OPSFORCE a écrit:

                    Bonjours koala01,

                    j'ai déjà survolé les titres des chapitres du cours de Mathieu Nebra sur le c++, c'est pour sa que je connais le mot énumération.

                    Et il se trouve que le chapitre sur les énumérations se trouve après le chapitre de Qt, et un dernier petit point, I know, when I say "ma mère" it's like an little child say "ma maman" but I can speak english despite my age. :D


                    Comment? on ne te l'as pas encore dit et répété?  Le cours de Mathieu est une véritable catastrophe et doit être fui comme la peste...

                    Tourne toi plutôt sur le cours (toujours en écriture, me semble-t-il) du zeste de savoir.  Tu n'auras pas besoin de t'intéresser à Qt avant longtemps, et au moins, tu n'apprendra pas une somme faramineuse de conneries ;)

                    re-bonjour koala01,

                    non je n'en n’avais pas entendu parler de sa mais je pense que son cours peut quand même apprendre les bases et sinon je vais me tourner sur le zeste du savoir comme tu dis. 

                    Pour l'instant je n'ai pas pu tester le code mais sa sera fais demain, mais est ce que tu sais pourquoi mon programme crash si on remplie les radioButton.

                    -
                    Edité par OPSFORCE 31 mars 2020 à 22:44:44

                    • Partager sur Facebook
                    • Partager sur Twitter

                    il faut toujours persévérer pour avancer, donc n'abandonner jamais

                      1 avril 2020 à 8:07:49

                      OPSFORCE a écrit:

                      non je n'en n’avais pas entendu parler de sa mais je pense que son cours peut quand même apprendre les bases  

                      Oublies cette idée saugrenue tout de suite, veux tu?

                      Tiens, il y a justement une discussion intéressante sur le sujet.  Lis en toutes les interventions, et tu comprendras ;)

                      OPSFORCE a écrit:

                      mais est ce que tu sais pourquoi mon programme crash si on remplie les radioButton.

                      Déjà, as tu remarqué que tu as royalement vingt questions, et que donc les indices de tes différents tableaux vont de ... 0 à 19 inclus.

                      Comme tu teste m_compteur comme étant exclusivement supérieur à 22 à plus d'une occasion, que crois tu qu'il va se passer lorsqu'il passera par les valeur 20, 21 et 22 (qui sont "hors limites" pour les tableaux)?

                      -
                      Edité par koala01 1 avril 2020 à 8:20:00

                      • 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
                        1 avril 2020 à 11:27:02

                        Salut koala,

                        les numéro des questions vont jusqu'à 20 mais il me semble qu'il y en a 22 en tout (en plus quand je passe ma souris entre les crochets, (Qt me dis qu'il y a que c'est un tableau de 22 "case"), de toute façon je vais regarder si il n'y a pas d'erreur à ce niveau la mais je ne crois pas.

                        EDIT : 

                        je viens de lire le topic que tu m'as conseillé et je n'ai plus aucune envie de continuer son cours après sa

                        -
                        Edité par OPSFORCE 1 avril 2020 à 12:02:26

                        • Partager sur Facebook
                        • Partager sur Twitter

                        il faut toujours persévérer pour avancer, donc n'abandonner jamais

                        une variable string ne veux pas se modifier Qt

                        × 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