Existe t'il une fonction qui me donnerait le nombre de valeurs différentes contenues dans un tableau (à 1 seul dimension) ?
Version imprimable
Existe t'il une fonction qui me donnerait le nombre de valeurs différentes contenues dans un tableau (à 1 seul dimension) ?
Salut
Je ne crois pas, mais comme ce n'est pas très difficile à écrire 8)
alors peut être quel qu'un pourrait me dire ce qui cloche dans ma fonction ? c'est probablement une erreur toute bêt mais je ne vois pas laquelle :
Code:
1
2
3
4
5
6
7
8
9
10
11 int k=0; // mon compteur du nombre de valeurs distinctes int tmp[10]; // le tableau où stocker les différentes valeurs trouvées (pas plus de 10) for(int j=0;j<10;j++) // initialisé à 0 tmp[j]=0; for (i=0;i<nombre;i++) // je parcours le tableau for(int j=0;j<10;j++) // et ma "table de stockage" if (tmp[j]!=gph.niveau[i]) // est ce que la nouvelle valeur est déjà dans le tableau ? { tmp[k]=gph.niveau[i]; // sinon je l'ajoute au tableau k++; // et je compte un de plus }
k ne deviendrait pas plus grand que 9 à un moment ou un autre ? ==> débordement
Il faut regarder plutôt si la valeur est déjà dans la table de stockage et pas le contraire :
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 int k=0; // mon compteur du nombre de valeurs distinctes int tmp[10]; // le tableau où stocker les différentes valeurs trouvées (pas plus de 10) for(int j=0;j<10;j++) // initialisé à 0 tmp[j]=0; for (i=0;i<nombre;i++) // je parcours le tableau { trouve = 0; for(int j=0;j<10;j++) // et ma "table de stockage" if (tmp[j]==gph.niveau[i]) // est ce que la nouvelle valeur est déjà dans le tableau ? { trouve = 1; break; } if (trouve == 0) // on n'a rien trouve, on ajoute { tmp[k]=gph.niveau[i]; // sinon je l'ajoute au tableau k++; // et je compte un de plus } }
Oui, il y aussi le problème de la taille du tableau de stockage et dnas la boucle, tu peux simplement faire :
PuisCode:
1
2
3
4
5
6 for(int j=0;j<k;j++) // et ma "table de stockage" if (tmp[j]==gph.niveau[i]) // est ce que la nouvelle valeur est déjà dans le tableau ? { trouve = 1; break; }
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13 if (trouve == 0) // on n'a rien trouve, on ajoute { if (k < 10) { tmp[k]=gph.niveau[i]; // sinon je l'ajoute au tableau k++; // et je compte un de plus } else { puts("tableau tmp trop pettit"); return <code_erreur>: } }
salut,
et un truc comme ça :
:DCode:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 // mon tableau ici des chaines ma ca peut etre autre chose char *aszressai[]={"11","12","11","13","14","13","20" }; // un map key -> nb d'elements std::map<CString,int> MapItem; for(int i=0;i<sizeof(aszressai)/sizeof(char *);i++) MapItem[aszressai[i]]++; // comptage valeur unique. i=0; std::map<CString,int>::iterator itpos; for(itpos=MapItem.begin();itpos!=MapItem.end();itpos++) { if(itpos->second==1) i++; } TRACE("\n unique : %d",i); TRACE("\n nb sans doublons : %d",MapItem.size());
Encore mieux :
Avec comme seule restriction que les instances de MonType soient comparables.Code:
1
2
3
4 #include <set> std::set<MonType> Set(tmp, tmp + 10); std::size_t NombreDeDifferents = Set.size();
S'il n'y a pas besoin de l'histogramme, j'utiliserai directement un std::set.
Code:
1
2
3 std::set<type_des_elements> ens; std::copy(tab, tab+taille_tab, std::inserter(ens, ens.begin())); std::cout << "il y a " << ens.size() << " éléments différents.\n";
Le nombre de lignes de code serait-il inversement proportionnel au nombre d'étoiles ? :lol:
On peut encore épurer un peu et epargner quelques octets à la pile 8)
Code:int NbDifferents = std::set<MonType>(Tab, Tab + 10).size();
:lol:
Tiens je n'avais pas fait attention qu'il y a avait eu une réponse pendant que je tapais la mienne.
merci pour vos réponses