Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Discussion: Tableau et indices

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    janvier 2014
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : janvier 2014
    Messages : 56
    Points : 32
    Points
    32

    Par défaut Tableau et indices

    Bonjour,

    Je n'arrive pas à trouver une logique dans une boucle

    Je saisis par exemple des numéros dans un tableau 10, 40, 2, 60, 4

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    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]));
     }
    Ce qui donne :
      0     10
      1     40
      2     2
      3     60
      4     4
    Je trie les numéros ... (routine de tri 2,4,10,40,60)

    Ensuite j'aimerais renommer chaque ind pour qu'il corresponde par numero par ordre croissant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
       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
    C'est peut-être tarte mais je ne trouve pas.

    Merci d'avance pour votre aide.

    Cordialement

  2. #2
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    décembre 2015
    Messages
    818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : décembre 2015
    Messages : 818
    Points : 4 243
    Points
    4 243

    Par défaut

    Bonjour,

    Une fois les numéros triés, on a perdu le lien avec les indices. Ça n'est pas la bonne méthode.
    Il faut immédiatement trier les indices ind[] sur le critère ind[i] est inférieur à ind[j] qui correspond à numero[ind[i]] < numero[ind[j]]. Et ensuite on peut si veut mettre à jour numsup[i] = numero[ind[i]].

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    janvier 2014
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : janvier 2014
    Messages : 56
    Points : 32
    Points
    32

    Par défaut

    Bonsoir Dalfab

    Merci pour votre réponse mais je ne comprends toujours pas car les ind[] sont déjà triés en ordre croissant avec i : 0,1,2,3,4.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    void __fastcall TForm2::Button1Click(TObject *Sender)
    {
      int numero[5];
      int numsup[5];
      int ind[5];
     
    for (int i = 0; i < 5; i++)
    {
     numero[0] = 10;
     numero[1] = 40;
     numero[2] = 2;
     numero[3] = 60;
     numero[4] = 4;
    }
     
     
      for (int i = 0; i < 5; i++)
      {
      ind[i]=i;  
      numsup[i] = numero[i];
      ListBox1->Items->Add(IntToStr(ind[i]) +" "+ IntToStr(numero[i]));
      }
    }

  4. #4
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    décembre 2015
    Messages
    818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : décembre 2015
    Messages : 818
    Points : 4 243
    Points
    4 243

    Par défaut

    Il faut trier les ind[] sur le bon critère, pas entre eux mais sur les valeurs dans numero[] :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    std::sort( std::begin(ind) , std::end(ind) , [&numero](int& a,int& b){
            return numero[a] < numero[b];
        });
    std::cout << "le plus petit c'est " << numero[ind[0]] << '\n';
    std::cout << "le plus grand c'est " << numero[ind[std::size(ind)-1]] << '\n';

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    janvier 2014
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : janvier 2014
    Messages : 56
    Points : 32
    Points
    32

    Par défaut

    Ça marche.

    Encore merci

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    janvier 2014
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : janvier 2014
    Messages : 56
    Points : 32
    Points
    32

    Par défaut

    Bonjour,

    Un souci car ni CodeBlocks ni C++ Builder Starter ne reconnaissent begin.

    À moins d'utiliser un conteneur ?

    [bcc32 Erreur] Unit2.cpp(25): E2316 'begin' n'est pas un membre de 'std'

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #include <algorithm>    // std::sort
     
     
    std::sort( std::begin(ind) , std::end(ind) , [&numero](int& a,int& b){
            return numero[a] < numero[b];
        });
    std::cout << "le plus petit c'est " << numero[ind[0]] << '\n';
    std::cout << "le plus grand c'est " << numero[ind[std::size(ind)-1]] << '\n';

  7. #7
    Expert éminent
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    mai 2010
    Messages
    2 427
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : mai 2010
    Messages : 2 427
    Points : 7 315
    Points
    7 315

    Par défaut

    Citation Envoyé par magdani Voir le message
    Un souci car ni CodeBlocks ni C++ Builder Starter ne reconnaissent begin.
    [bcc32 Erreur] Unit2.cpp(25): E2316 'begin' n'est pas un membre de 'std'
    CodeBlocks et C++ Builder sont des IDE , donc techniquement il reconnaissent rien du tout , il permettent juste d'avoir la coloration syntaxique et de ge gerer un compilateur.
    L'erreur générer c'est ton compilateur qui le fourni (et qu'un IDE l'affichera).

  8. #8
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    décembre 2015
    Messages
    818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : décembre 2015
    Messages : 818
    Points : 4 243
    Points
    4 243

    Par défaut

    Désolé, ici begin(Ind) c'est Ind, et end(Ind) c'est Ind+5 (sinon il te faut le C++17)
    Et pour std::size(Ind), il faut prendre 5.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     std::sort( ind , ind+5 , [&numero](int a, int b) {
            return numero[a] < numero[b];
        });
    Un minimum serait de mettre tes données dans un std::array<int,5>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     std::array<int,5>  ind;
     
     std::iota( ind.begin(), ind.end(), 0 );  // reçoit 0 1 2 3 4
     std::sort( ind.begin() , ind.end() , [&numero](int a, int b) {
            return numero[a] < numero[b];
        });

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    janvier 2014
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : janvier 2014
    Messages : 56
    Points : 32
    Points
    32

    Par défaut

    Bonjour,

    Merci pour vos réponses.

    Ma version c++ ne prend pas array :
    #include <array> [bcc32 Erreur] Unit2.cpp(12): E2209 Impossible d'ouvrir le fichier include 'array'
    Par contre, j'ai une erreur de syntaxe dans le code suivant (E2188 Syntaxe de l'expression) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    std::sort( ind , ind+5 , [&numero](int a, int b)
    	{
    		return numero[a] < numero[b];
    	});

  10. #10
    Membre chevronné
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    mars 2002
    Messages
    805
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : mars 2002
    Messages : 805
    Points : 1 777
    Points
    1 777

    Par défaut

    Salut
    je te conseille d'utiliser (si ce n'est pas le cas) la version Community de C++ Builder https://www.embarcadero.com/fr/produ...uilder/starter
    pour compiler du code en C11 ou C17
    cordialement
    vous trouverez mes tutoriels à l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les règles du forum

  11. #11
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    janvier 2014
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : janvier 2014
    Messages : 56
    Points : 32
    Points
    32

    Par défaut

    Merci pour le lien DJM

    J'ai installé C++Builder Community Edition qui ne prend pas non plus <array>, std :: begin ...

    Cordialement

  12. #12
    Membre chevronné
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    mars 2002
    Messages
    805
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : mars 2002
    Messages : 805
    Points : 1 777
    Points
    1 777

    Par défaut

    Salut tu n'a pas peut être bien regardé…

    Nom : Capture.PNG
Affichages : 77
Taille : 17,6 Ko

    cdlt
    vous trouverez mes tutoriels à l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les règles du forum

  13. #13
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    janvier 2014
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : janvier 2014
    Messages : 56
    Points : 32
    Points
    32

    Par défaut

    Re ....

    Il s'agit bien du compilateur BCC32C dans un fichier zip ?

  14. #14
    Membre chevronné
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    mars 2002
    Messages
    805
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : mars 2002
    Messages : 805
    Points : 1 777
    Points
    1 777

    Par défaut

    Une autre possibilité
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
    #include <vcl.h>
    #pragma hdrstop
     
    #include "Unit7.h"
    #include <algorithm>
    #include <array>
    #include <numeric>
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm7 *Form7;
    	std::array<int,5> numero={20,3,8,32,9};
    	std::array<int,5>  ind;
     
    //---------------------------------------------------------------------------
    __fastcall TForm7::TForm7(TComponent* Owner)
    	: TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
     
    void __fastcall TForm7::Button1Click(TObject *Sender) {
     
    	 struct {
    		bool operator()(int a, int b) const
    		{
    			return numero[a] < numero[b];
    		}
    	} customLess;
     
     std::iota(ind.begin(), ind.end(), 0 );  // reçoit 0 1 2 3 4
     std::sort(ind.begin() , ind.end() , customLess);
     for(int i=0;i<5;i++)
    	ListBox1->Items->Add(IntToStr(ind[i]) + "  " + IntToStr(numero[i]));
    }
    configuration du compilateur utilisé comme dans le bitmap précédemment employé

    cdlt
    vous trouverez mes tutoriels à l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les règles du forum

  15. #15
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    janvier 2014
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : janvier 2014
    Messages : 56
    Points : 32
    Points
    32

    Par défaut

    Bonsoir DJMSoftware

    J'ai de mon coté trouvé un autre code (solution1) et utilisé le tien (solution2)

    Dans les 2 cas, ça a l'air de marcher à condition que les numeros soient triés

    Qu'en penses-tu ?

    Cordialement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
     
    //---------------------------------------------------------------------------
     
    #include <vcl.h>
    #pragma hdrstop
     
    #include "Unit2.h"
    #include <iostream>
    #include <algorithm>    // std::sort
    #include <array>
    #include <numeric>
    #include <vector>
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm2 *Form2;
     using namespace std;
     
    // ****** solution 1
      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;});
    }
     
     // ****** solution 2
    std::array<int,5> numero={10,40,2,60,4};
    std::array<int,5>  ind;
     
    //---------------------------------------------------------------------------
    __fastcall TForm2::TForm2(TComponent* Owner)
    	: TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm2::Button1Click(TObject *Sender)
    {
    //*** solution 1
     int numero[5];
     
     for (int i = 0; i < 5; i++)
    {
     numero[0] = 10;
     numero[1] = 40;
     numero[2] = 2;
     numero[3] = 60;
     numero[4] = 4;
    }
      // tri des numeros
     int i,j;
       for (i = 1; i <5 ; ++i)
       {
    	   int elem = numero[i];
     
    	   for (j = i; j > 0 && numero[j-1] > elem; j--)
     
    		  numero[j] = numero[j-1];
     
    	   numero[j] = elem;
       }
     
    	for(int i=0;i<5;++i) datas.push_back({i, numero[i]});
     
      sortByValue(datas); // Tri par valeur
     
     ListBox1->Items->Add("*** Solution 1");
     ListBox1->Items->Add("Tri par valeur");
      for(auto const & d : datas){  ListBox1->Items->Add(IntToStr(d.index) + " " + IntToStr(d.value));
      }
     
     
      sortById(datas); // Tri par index
     
      ListBox1->Items->Add("Tri par index");
     
      for(auto const & d : datas){  ListBox1->Items->Add(IntToStr(d.index) + " " + IntToStr(d.value));
      }
     
    }
     
    //---------------------------------------------------------------------------
     
     
     
    void __fastcall TForm2::Button2Click(TObject *Sender)
    {
    //*** solution 2
        // tri des numeros
     int i,j;
       for (i = 1; i <5 ; ++i)
       {
    	   int elem = numero[i];
     
    	   for (j = i; j > 0 && numero[j-1] > elem; j--)
     
    		  numero[j] = numero[j-1];
     
    	   numero[j] = elem;
       }
     
     ListBox2->Items->Add("*** Solution 2");
     struct {
    		bool operator()(int a, int b) const
    		{
    			return numero[a] < numero[b];
    		}
    	} customLess;
     
     std::iota(ind.begin(), ind.end(), 0 );  // reçoit 0 1 2 3 4
     std::sort(ind.begin() , ind.end() , customLess);
     for(int i=0;i<5;i++)
    	ListBox2->Items->Add(IntToStr(ind[i]) + "  " + IntToStr(numero[i]));
    }
    //---------------------------------------------------------------------------

  16. #16
    Membre chevronné
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    mars 2002
    Messages
    805
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : mars 2002
    Messages : 805
    Points : 1 777
    Points
    1 777

    Par défaut

    Salut,
    je n'aurais qu'une réponse utilise la solution avec laquelle tu est le plus à l'aise
    cdlt
    vous trouverez mes tutoriels à l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les règles du forum

Discussions similaires

  1. Réponses: 11
    Dernier message: 01/03/2008, 17h59
  2. [VB6] Pb tableau 2D : indice en dehor de la plage
    Par belfaigore dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 03/10/2006, 18h15
  3. Réponses: 4
    Dernier message: 27/09/2006, 19h04
  4. Tri dans un tableau et indices
    Par size_one_1 dans le forum C
    Réponses: 10
    Dernier message: 16/05/2006, 01h17
  5. Tableau et indice
    Par gendalf37 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 03/05/2005, 11h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo