Partage
  • Partager sur Facebook
  • Partager sur Twitter

Indices et tableau c++ builder starter 10.1

    2 décembre 2018 à 11:11:54

    Bonjour,
     
    Je n'arrive pas à trouver la logique suivante dans une boucle
     
    Je saisis par exemple des numéros dans un tableau 10, 40, 2, 60, 4
     
    Code :  
     
      int numero[5];  
      int numsup[5]
      int ind[5];  
       
        for (int i = 0; i < 5; i++)
         {
           ind[i]=i;
          numsup[i] = numero[i];
          ListBox1->Items->Add(IntToStr(ind[i]) +"  "+ IntToStr(numero[i]));
         }
    Résultat :  
     
      0     10
      1     40
      2     2
      3     60
      4     4
     
    J'aimerais renommer chaque ind pour qu'il corresponde à numero en ordre croissant :  
     
    Exemple :  
         
       if  (numero[i] ==  numsup[i] )  ind[i] =*?;   // soit si numéro = 2  ind  = 0
       if  (numero[i] ==  numsup[i])   ind[i] =*?;   //      ''*               4  ind  = 1  
       if  (numero[i] ==  numsup[i] )  ind[i] =*?;   //      ''                10 ind  = 2
       if  (numero[i] ==  numsup[i] )  ind[i] =*?;   //      ''                40 ind  = 3
       if  (numero[i] ==  numsup[i])   ind[i] =*?;   //      ''                60 ind  = 4
     
     
    Merci d'avance pour votre aide.
     
    Cordialement  

    • Partager sur Facebook
    • Partager sur Twitter
      2 décembre 2018 à 12:39:36

      Salut,

      Ce que tu dois faire, c'est ce que l'on appelle une équivalence :

      Tu dois donc créer une strucutre qui te permettra d'avoir dans une seule donnée l'indice qui t'intéresse et la valeur correspondante.

      Tu peux donc -- au choix -- utiliser std::pair, de préférence sous la forme d'une alias de type proche de

      using Truc = std::pair<int, int>;

      en décidant une bonne fois pour toute que la première donnée (celle accessible au travers de first) représentera -- par exemple -- l'indice et que la deuxième (celle accessible au travers de second) représentera la valeur.

      Ou, tu peux aussi créer ta propre structure, sous une forme qui serait alors proche de

      struct MyStruct{
          int index;
          int value;
      };

      Bien sur, l'idéal serait d'utiliser au choix std::array (si tu es sur de ne pas vouloir plus de cinq éléments) ou std::vector (si tu ignore le nombre d'élément réel que tu devras prendre en compte), au  lieu des tableaux à la C que tu utilise ici, ne serait-ce que parce que ces deux classes exposent la notion d'itérateur, qui sera utile pour la suite.

      tu les utiliserais avec ta structre sous une forme qui ressemblerait à

      std::array<MyStruct, 5> datas;

      si tu a un nombre fixe d'éléments ou sous la forme de

      std::vector<MyStruct> datas;

      si tu as besoin d'un nombre d'élément inconnu à la compilation.

      La grosse difficulté sera alors de trier tes données, car le compilateur ne saura pas comment comparer la structure MyStruct.  Qu'à cela ne tienne, car il suffira d'une (ou deux) fonction(s) qui utiliseront les algorithmes fourni par la bibliothèque standard et qui utiliseront les expression lambda pour indiquer comment comparer les données.

      Elles pourraient prendre une forme proche de

      void sortByValue(std::vector<MyStruct> & tab){
          std::sort(tab.begin(), tab.end(), [&](MyStruct const & a, MyStruct const & b){return a.value < b.value;});
      }
      void sortById(std::vector<MyStruct> & tab){
          std::sort(tab.begin(), tab.end(), [&](MyStruct const & a, MyStruct const & b){return a.index< b.index;});
      }

      (le principe serait le meme avec std::array, il n'y a que le prototype de la fonction à remplacer)

      L'idée finale étant que tu remplira le tableau datas avec les structures, par exemple sous une forme proche de

      for(int i=0;i<5;++i){
          datas.push_back({i, numero[1]});
      }

      et qu'il te suffira ensuite de le trier selon l'ordre qui t'intéresse (par index ou par valeur), par exemple sous la forme de

      sortByValue(datas);

      ce qui te donnera un résultat -- en se basant sur les données d'exemple que tu nous montre -- proche de

      datas[0] : index = 2 , value = 2
      datas[1] : index = 4 , value = 4
      datas[2] : index = 0 , value = 10
      datas[3] : index = 1 , value = 40
      datas[4] : index = 3 , value = 60

      et que tu pourras utiliser sous une forme proche de

      for(auto const & d : datas){
          listBox->items->add(IntToStr(d.index) + " " + IntToStr(d.value));
      }






      • 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
        3 décembre 2018 à 10:03:14

        Je vais étudier ton code.

        En attendant, merci Koala01.

        • Partager sur Facebook
        • Partager sur Twitter
          3 décembre 2018 à 15:54:23

          Un simple std::sort après la saisie ne ferais pas l'affaire ?
          • Partager sur Facebook
          • Partager sur Twitter
            4 décembre 2018 à 12:44:04

            Merci pour les réponses et  ton code Koala01

            J'ai bien compris l'utilisation de struct et de vector,

            Par contre, je suis un peu largué au niveau des 2 fonctions pour lesquelles le compilateur trouve une

            erreur E2188 Syntaxe de l'expression à partir de [&](MyStruct const & a, MyStruct const & b){return a.value < b.value;});

            #include "Unit2.h"
            
            #include <algorithm> // std::sort
            
            #include <iostream>
            
            #include <vector>
            
            
            struct MyStruct
            
            {
            
            int index;
            
            int value;
            
            };
            
            
            std::vector<MyStruct> datas;
            
            
            void sortByValue(std::vector<MyStruct> & tab){
            
            std::sort(tab.begin(), tab.end(), [&](MyStruct const & a, MyStruct const & b){return a.value < b.value;});
            
            }
            
            void sortById(std::vector<MyStruct> & tab){
            
            std::sort(tab.begin(), tab.end(), [&](MyStruct const & a, MyStruct const & b){return a.index< b.index;});
            
            }


            • Partager sur Facebook
            • Partager sur Twitter
              4 décembre 2018 à 13:21:38

              Comment???  Un compilateur vendu en 2016 ne supporterait pas encore C++11 ????

              Je n'ose trop y croire, tellement ce serait honteux!!!

              Le fait est que la syntaxe proposée utilise ce que l'on appelle est expressions lambda, qui sont apparue en 2011.  Il se peut que le C++ builder continue à supporter C++03 par défaut (ce qui serait vraiment dommage), et qu'il faille donc ajouter une option de compilation au projet pour qu'il supporte C++11 (ou, mieux encore, vu que c'est une version parue en 2016, si possible C++14).

              Ceci étant dit:

              Une période d'un an est déjà presque une éternité en informatique, surtout quand une nouvelle norme du langage que l'on utilise voit le jour. 

              Je ne saurais trop te conseiller de veiller à mettre ton compilateur à jour très régulièrement, afin de profiter "dés que possible" des dernière possibilités offertes.

              En outre, bien que n'ayant plus testé C++builder depuis qu'il a été repris par embarcadero (ou peu s'en faut), et ne connaissant pas ta situation spécifique, je me pose très sérieusement la question de l'intérêt d'utiliser cet outil particulier.

              Pourquoi, par exemple, ne pas utiliser VisualStudio (complet et gratuit dans sa version community) ou QtCreator comme IDE et te tourner vers Qt pour tout ce qui a trait à l'interface graphique (et à plein d'autres aspect particulièrement au point) ?

              Il me semble en effet que tu obtiendra plus facilement de l'aide avec ces outils, la communauté les utilisant me semblant beaucoup plus développée :p

              A moins que tu ne sois réellement contraint d'utiliser l'outil d'embarcadero pour une raison particulière?

              • 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
                5 décembre 2018 à 12:15:15

                La version starter 10.1 était gratuite et je ne vois pas trop comment la mettre à jour.

                Le code marche avec la version Rad studio 10.3. Elle est normalement gratuite mais la licence dure 1 an ???

                Je ne suis pas informaticien. Étant autodidacte, j'ai appris avec des bouquins et Internet. Ce qui m'a permis de faire des applis avec Delphi pour moi et mon association. C'est pour ça que j'ai choisi c++ builder et FireMonkey me semble intéressant.

                La programmation est surtout un hobby pour moi et je fais actuellement un jeu de carte. J'aimerais également faire des petits jeux.

                Peut-être que QT ou VisualStudio seraient plus appropriés ?

                Cordialement.

                • Partager sur Facebook
                • Partager sur Twitter
                  5 décembre 2018 à 13:40:48

                  DanielMagron a écrit:

                  Peut-être que QT ou VisualStudio seraient plus appropriés ?

                  Autant prendre les bon outils dès le départ, ca évite de s'arracher les cheveux inutilement.

                  • Partager sur Facebook
                  • Partager sur Twitter

                  Indices et tableau c++ builder starter 10.1

                  × 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