Partage
  • Partager sur Facebook
  • Partager sur Twitter

Tri par sélection

Problème taille tableau string

    23 janvier 2020 à 19:21:40

    Salut tout le monde ! Je suis en train de faire un TP C++, et on s’intéresse au tri par sélection. J'ai un soucis avec la taille de mon tableau, est-ce que vous pouvez m'aider ? Merci !

    Ps : Il y a des Noms + prénoms dans le string, je les enlève car ce sont les noms de me camarades (respect pour leur vie privée)

    Ps : ce n'est pas le fichier main, juste un autre fichier cpp pour inclure toutes les fonctions, et ainsi alléger le fichier main

    #include <iostream>
    #include <string>
    void tri_selection() {
    
    	string BtsSN2020[30] = { "edbdhb", "duudubud", "dbzudujbz" };
    
    	int taille;
    	int min;
    	string tmp;
    
    	for (int i = 0; i < taille - 1; i++) {
    		min = i;
    			for (int j = i + 1; j <= taille; j++) {
    				if (BtsSN2020[j] < BtsSN2020[min]) {
    					min = j;
    				}
    			}
    			if (min != i) {
    				tmp = BtsSN2020[min];
    				BtsSN2020[min] = BtsSN2020[i];
    				BtsSN2020[i] = tmp;
    			}
    	}
    }
    • Partager sur Facebook
    • Partager sur Twitter
      23 janvier 2020 à 19:52:44

      Salut

      Je suis en train de faire un TP C++

      J'ai un soucis avec la taille de mon tableau, est-ce que vous pouvez m'aider ?

      Oui, utiliser les tableaux du C++ comme std::vector.

      • Partager sur Facebook
      • Partager sur Twitter
        23 janvier 2020 à 20:07:25

        XxAnoth-ChaxX a écrit:

        Salut

        Je suis en train de faire un TP C++

        J'ai un soucis avec la taille de mon tableau, est-ce que vous pouvez m'aider ?

        Oui, utiliser les tableaux du C++ comme std::vector.


        Apparament il faudrait poursuivre comme c'est indiqué donc ...

        En fait c'est la ligne 19 qui met une erreur

        -
        Edité par Azurito 23 janvier 2020 à 20:13:05

        • Partager sur Facebook
        • Partager sur Twitter
          24 janvier 2020 à 10:08:04

          Salut,

          1- Tu définis un tableau (à la manière C) qui est sensé pouvoir contenir trente (30!!!) strings, mais tu ne le définis qu'avec trois (3 !!!) éléments

          • quelle est la taille du tableau?
          • quel est le nombre à prendre en compte pour le tri?
          • quel est le nombre à prendre en compte pour l'affichage?

          2- Tu utilises, dans tes boucles (aux lignes 11 et 13), une donnée nommée taille, dont on ne sait rien, vu qu'elle n'est pas définie.

          On ne sait même pas à quoi elle sert!!!

          • serait-il possible que ce soit la taille du tableau?
          • mais alors, pourquoi ne pas l'avoir utilisée lors de la déclaration de BtsSN2020 ?

          3- la classe string fournie par la bibliothèque standard se trouve dans l'espace de noms std.  Tu dois donc utiliser son nom pleinement qualifié (std::string)

          Il ne faut en effet JAMAIS utiliser la directive using namespace std; dans son code, car elle n'a été prévue que pour permettre au code qui existait avant la première standardisation de continuer à compiler.  Ton code étant écrit en 2020, on peut difficilement prétendre qu'il a été écrit avant ... 1995 ;)

          4- à moins que tu ne décide de créer une bibliothèque, lorsque l'éditeur  de liens va essayer de créer l'exécutable, il y a une fonction qu'il voudra absolument retrouver parce qu'elle représente le "point d'entrée" de tout ton code.  C'est la fonction int main().

          Cette fonction n'apparait nulle part, si bien que l'éditeur de liens ne peut rien faire d'autre que d'afficher un message d'erreurs (du genre undefined reference to int main() )avant de s'arrêter, sans avoir créé le fichier de ton exécutable.

          • 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
            24 janvier 2020 à 16:37:23

            koala01 a écrit:

            Salut,

            1- Tu définis un tableau (à la manière C) qui est sensé pouvoir contenir trente (30!!!) strings, mais tu ne le définis qu'avec trois (3 !!!) éléments

            • quelle est la taille du tableau?
            • quel est le nombre à prendre en compte pour le tri?
            • quel est le nombre à prendre en compte pour l'affichage?

            2- Tu utilises, dans tes boucles (aux lignes 11 et 13), une donnée nommée taille, dont on ne sait rien, vu qu'elle n'est pas définie.

            On ne sait même pas à quoi elle sert!!!

            • serait-il possible que ce soit la taille du tableau?
            • mais alors, pourquoi ne pas l'avoir utilisée lors de la déclaration de BtsSN2020 ?

            3- la classe string fournie par la bibliothèque standard se trouve dans l'espace de noms std.  Tu dois donc utiliser son nom pleinement qualifié (std::string)

            Il ne faut en effet JAMAIS utiliser la directive using namespace std; dans son code, car elle n'a été prévue que pour permettre au code qui existait avant la première standardisation de continuer à compiler.  Ton code étant écrit en 2020, on peut difficilement prétendre qu'il a été écrit avant ... 1995 ;)

            4- à moins que tu ne décide de créer une bibliothèque, lorsque l'éditeur  de liens va essayer de créer l'exécutable, il y a une fonction qu'il voudra absolument retrouver parce qu'elle représente le "point d'entrée" de tout ton code.  C'est la fonction int main().

            Cette fonction n'apparait nulle part, si bien que l'éditeur de liens ne peut rien faire d'autre que d'afficher un message d'erreurs (du genre undefined reference to int main() )avant de s'arrêter, sans avoir créé le fichier de ton exécutable.


            En quoi ce commentaire est-il censé m'aider à part me dire que j'ai fais des erreurs ? Cela fait à peine 1 mois que je pratique le C++ ! Aucune solution à m'apporter ...

            -
            Edité par Azurito 24 janvier 2020 à 16:40:11

            • Partager sur Facebook
            • Partager sur Twitter
              24 janvier 2020 à 19:29:01

              Pour pouvoir résoudre un problème, il faut en avoir conscience.

              Plutôt que de te donner la solution à tes problème, ce qui ne t'apprendrait rien, j'ai décidé de te faire prendre conscience de l'ensemble des problèmes auxquels tu es confronté.

              En réfléchissant un tout petit peu, même si tu es au tout début de ton apprentissage, les réponses aux questions que je te pose devraient au moins te mettre sur la voie quant aux différentes solutions à apporter ;)

              -
              Edité par koala01 24 janvier 2020 à 19:32:05

              • 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
                24 janvier 2020 à 20:44:44

                D'accord alors : 

                1 - J'ai dis dans mon premier post que c'était les Noms + Prénoms de mes camarades, il y en a bien 30, je les ai juste enlevé !

                2 - C'est bien la taille qui me pose problème avec d'autres lignes comme la ligne 19

                3 - Mon professeur nous as dis que l'on pouvait utiliser using namespace std, ce qui à mon goût facilite l'écriture du programme. Celui-ci dérange-t-il vraiment ? Pleins de programmes fonctionnait avec, donc je continue avec

                4 - J'ai également dis que c'était un autre fichier source, pour écrire toutes les fonction et alléger le fichier main ! Pour l'appel de la fonction je sais le faire, dans le fichier source avec int main() ! 

                Ce n'est pas le premier programme que je fais, donc je connais quand même les bases du C++

                • Partager sur Facebook
                • Partager sur Twitter
                  24 janvier 2020 à 22:13:20

                  Il te manque quand même le principal: configurer son environnement pour laisser passer le moins d'erreur. Ma liste par compilateur: https://github.com/jonathanpoelen/cpp-compiler-options/tree/master/output/cpp

                  > C'est bien la taille qui me pose problème avec d'autres lignes comme la ligne 19

                  On va faire simple, quelle est la valeur de taille ?

                  • Partager sur Facebook
                  • Partager sur Twitter
                    24 janvier 2020 à 22:34:56

                    jo_link_noir a écrit:

                    > C'est bien la taille qui me pose problème avec d'autres lignes comme la ligne 19

                    On va faire simple, quelle est la valeur de taille ?


                    Et point numéro 2, avec des indices qui commencent à 0, le dernier élément est à l'indice taille - 1.
                    • Partager sur Facebook
                    • Partager sur Twitter
                      25 janvier 2020 à 10:53:04

                      jo_link_noir a écrit:

                      Il te manque quand même le principal: configurer son environnement pour laisser passer le moins d'erreur. Ma liste par compilateur: https://github.com/jonathanpoelen/cpp-compiler-options/tree/master/output/cpp

                      > C'est bien la taille qui me pose problème avec d'autres lignes comme la ligne 19

                      On va faire simple, quelle est la valeur de taille ?


                      La taille de string BtsSN2020 est de 30
                      • Partager sur Facebook
                      • Partager sur Twitter
                        25 janvier 2020 à 12:04:38

                        Combien de fois faudra-t-il répéter que nous ne pouvons nous fier qu'au code que vous daignez nous donner?

                        On n'était pas à coté de toi lorsque tu as écrit ton code, et l'on ne peut donc absolument pas présumer de ce que tu as effectivement fait: nous, on vois un tableau de taille 30, mais qui ne contient effectivement que trois éléments, comment veux tu que l'on saches si tu as effectivement tes trente éléments ou si, au contraire, tu n'en as que trois (ou, qui sait, si tu n'as pas essayé d'en mettre 35)?

                        De plus, le tableau que tu nous montre ne vas exister que durant l'exécution de la fonction tri_selection, et ca, c'est quand même un sérieux problème, d'autant plus que l'algorithme est sensé fonctionner pour n'importe quel tableau, de n'importe quelle taille.

                        Dans l'idéal, le tableau qui devra être trié (ainsi que sa taille réelle) devraient être transmis par paramètres à ta fonction pour qu'elle puisse fonctionner correctement.

                        Cela signifie que ton tableau devrait être défini dans ta fonction main, et transmise lors de l'appel à la fonction tri_selection..

                        Et cela nous ramène à ce que disait XXAnotChaXX : tu aurasi largement à utiliser la classe std::vector de la bibliothèque standard, ne serait-ce que parce qu'il présente l'énorme avantage de connaître le nombre d'éléments qu'il contient ;)

                        Azurito a écrit:

                        La taille de string BtsSN2020 est de 30

                        Et on le sait comment, nous, vu que l'on ne voit apparaître cette donnée nulle part?

                        • 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 janvier 2020 à 14:43:05

                          Ligne 5 ?

                          Ps: btssn2020 est un très mauvais nom.

                          -
                          Edité par michelbillaud 25 janvier 2020 à 14:45:59

                          • Partager sur Facebook
                          • Partager sur Twitter
                            25 janvier 2020 à 16:46:05

                            > La taille de string BtsSN2020 est de 30

                            Tu ne réponds pas à la question qui est « quelle est la valeur de la variable taille ? », c’est-à-dire avec quoi cette variable est initialisée ?

                            Et pour le point de soulevé par michelbillaud: qu'elle est la valeur max de j ?

                            • Partager sur Facebook
                            • Partager sur Twitter
                              26 janvier 2020 à 1:58:58

                              Objectif : Trier un tableau de std::string.

                              Il existe un principe, celui de la responsabilité unique : une classe, une fonction libre ou une fonction membre doit avoir une et une seule responsabilité.

                              Ce principe te permettra de construire ta fonction de tri, tu vas voir.

                              Il te faut d’abord trouver un algorithme de tri, en voici un bien expliqué.

                              Le but est de faire remonter progressivement les éléments les plus grands à la fin de ton tableau.

                              En regardant l'algorithme il compare si un élément est supérieur à un autre.

                              Pour ton cas, pour savoir si une chaine de caractères est supérieure à une autre, tu as déjà un opérateur de comparaison.

                              Ensuite lorsqu'un élément est plus grand que le suivant, l'exemple de l'algorithme montre une permutation, ça veut dire qu'il échange les deux éléments de place. Il te faut faire une fonction qui s’appellera "permuter", elle prendra en paramètre ton tableau, l'index d'un élément et l'index d'un autre élément, ces deux éléments devront échanger leur place :

                              void permuter(std::string tableau[], size_t index_a, size_t index_b)
                              {
                                  // A implémenter
                              }

                              Avec tout ça, tu peux faire une fonction qui permet de remonter ton élément le plus grand à la fin de ton tableau, il te faut en paramètre ton tableau et sa taille pour qu'il puisse savoir quand s’arrêter (remarque : le nom de cette fonction peut-être mieux choisis) :

                              void remonterGrandElement(std::string tableau[], size_t taille)
                              {
                                  // A implémenter
                              }
                              

                              Le problème, c'est qu'il y aura des chances qu'il faudra exécuter plusieurs fois cette fonction pour que ton tableau soit entièrement trié (comme montré dans l'exemple de l'algorithme).

                              Comment savoir si le tableau est trié ?

                              Te faire une fonction "tableauTrier" qui renverra un boléen si oui ou non ton tableau est trié, pour cela comparer chaque élément, si un élément est supérieur au suivant, alors le tableau n'est pas trié :

                              bool tableauTrier(std::string tableau[], size_t taille)
                              {
                                  // A implémenter
                              }

                              A partir de là, tu as tout ce qui te faut pour faire ton fonction "trierTableau" :

                              void trierTableau(std::string tableau[], size_t taille)
                              {
                                  // A implémenter
                              }

                              L'avantage de séparer en plusieurs fonctions, c'est que tu vas pouvoir les tester individuellement, bien plus facile à corriger.

                              A chaque création d'une fonction, tu l'as teste, une fois validé, tu peux passer à la suite.

                              • Partager sur Facebook
                              • Partager sur Twitter
                                28 janvier 2020 à 9:37:10

                                Si jamais j'ai trouvé la solution, je pourrais la publier si certains sont intéressés !
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  28 janvier 2020 à 11:26:27

                                  Euh, des tris par sélection, il y en a des millions sur internet. Et en cherchant sur ce site, il doit bien y en avoir des dizaines d'exemplaires.

                                  C'est un algorithme très peu performant, qui sert d'exercice de programmation pour les débutants depuis plus d'un demi-siècle.

                                  https://en.wikipedia.org/wiki/Sorting_algorithm#History

                                  • Partager sur Facebook
                                  • Partager sur Twitter

                                  Tri par sélection

                                  × 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