Un ti pb sur les tableaux

Julius Caesar - 30 oct. 2001 à 17:30
 Kaid - 4 nov. 2001 à 16:33
On range dans un tableau 8 entiers générés aléatoirement par l'ordi. coment faire pour être sur que chaque nombre généré soit uniquen c'est à dire qu'il n'y a pas 2 nbrs identiques générés.

4 réponses

Il faut comparer chacun des nombres aux autres.

Le plus simple (et légèrement mieux que comparer chaque nombre à tous les autres) :
bool tous_differents = true;
static const unsigned int TAILLE = 8;
int tableau[TAILLE];
for(unsigned int i = 0; tous_differents && i != TAILLE-1; ++i)
{
for(unsigned int j = i+1; tous_differents && j != TAILLE; ++j)
{
tous_differents = (tableau[i] != tableau[j]);
}
}

(attention : je n'ai pas testé ce programme, c'est juste une idée qui me passe par la tête)
0
Pour moi la meilleure solution est d'utiliser une collection permettant la recherche d'éléments.

Tu peux par exemple utiliser l'objet MFC CMap, ou std::map avec la STL.
0
Effectivement, mieux vaut utiliser la STL.
Cependant, je ne vois pas pourquoi tu proposes une map, puisque l'on gère des valeurs simples et non pas des paires clé/valeur. En plus, un std::map ne permet pas de multiples valeurs pour une même clé (il faudrait alors un std::multimap). Pour répondre spécifiquement au problème, sans doute vaudrait-il mieux un std::multiset.

Par ailleurs, le choix ne dépend pas de la recherche que l'on veut faire (qui n'est apparemment qu'une validation de données) mais de l'utilisation de ces données. En effet, si std::multiset semble adapté au problème de validation, il risque fort de ne pas l'être pour l'utilisation ultérieur du fait que l'on perd ici l'ordonnancement des données.

Voyons ainsi comment tranposer l'algorithme (avec une petite différence pour les pointilleux observateurs) en utilisant un std::vector. Cet exemple permet de voir l'utilisation d'une fonction d' plutôt que les méthodes spécifiques à std::multiset, comme std::multiset::equal_range qui semblerait assez adaptée si on avait choisit ce type collection. De plus, ce code a l'avantage d'être assez indépendant de la collection choisie (comptons donc le nombre de retouches à faire si on change le std::vector en une autre collection à éléments simples, comme std::list ou std::deque...)

#include
#include <vector>
typedef std::vector notre_collection;
bool tous_differents(const notre_collection & donnees)
{
for(notre_collection::const_iterator i = donnees.begin(); i != donnees.end(); ++i)
{
notre_collection::const_iterator j = i;
++j;
if(std::find(j,donnees.end(),*i) != donnees.end()) return false;
}
return true;
}

(attention : une fois de plus je n'ai pas testé ce programme)
0
J'ai dit std::map pour le principe car j'utilise très
rarement la STL.
0
Rejoignez-nous