Vérifier les doublons

Signaler
Messages postés
50
Date d'inscription
samedi 20 avril 2002
Statut
Membre
Dernière intervention
11 mars 2010
-
Messages postés
455
Date d'inscription
mercredi 6 mars 2002
Statut
Membre
Dernière intervention
18 décembre 2003
-
Bonjour,

J'ai fai ce petit prog. qui vérifi les doublons dans un tableau. Comme je suis débutant et que ce prog est un de mes premiers je me demande si il n'y a pas une façon plus élégante de l'écrire.

Merci

#include
#include <time.h>
#include <conio.c>

void emplacement_disponible()
{
int emplacement,nombre,doublon,e,i;

nombre=rand()%(6); //Détermine le nombre d'emplacement

int solution[nombre];

cout << "choisir un emplacement parmi les suivants : \n";

for (i=0; i<nombre;)
{
emplacement =rand()%(64); //Détermine quelle emplacement parmi tous les emplacements
doublon=0;
for (e=0; e<nombre; e++)
{
if (emplacement==solution[e])
{
doublon++;
}
}
if (doublon>0)
continue;
solution[i]=emplacement;
cout <<"Emplacement no : "<<solution[i]<<"\n";
i++;
}
}

void main()
{
srand((unsigned)time(NULL));
emplacement_disponible();
getch();
}

6 réponses

Messages postés
269
Date d'inscription
mercredi 24 avril 2002
Statut
Membre
Dernière intervention
9 juin 2003

lors, plusieurs commentaires :

nombre=rand()%(6); //Détermine le nombre d'emplacement

int solution[nombre];

ca c mal. Ca peut marcher si ton compilo accepte, mais normalement ca devrait pas compiler.
en effet, le variable "nombre" doit etre connue au moment de la compilation. dans ton cas, le compilo doit rendre nombre un const, et peut-etre que ta premiere ligne emplacement=rand()%6 est ignorée.
en gros, tu dois connaitre a l'avance le nombre de cases que tu déclares, avec par exemple :
int tableau[10];
et le tour est joué.
(ce que tu veux faire, tu pourras le faire "proprement" avec les pointeurs et les allocations dynamiques)
sinon, ton prog est très tarabiscoté.
dis-moi exactement ce que tu veux que le prog fasse (étapes par étapes) si tu veux que je vois si ya pas une solution "plus elegante" ;)

***raph***
Messages postés
50
Date d'inscription
samedi 20 avril 2002
Statut
Membre
Dernière intervention
11 mars 2010

Bonjour,

Merci pour ton commentaire mais le prog compile très bien, d'ailleurs c'est la raison qui explique pourquoi j'ai placé mon tableau (solution[nombre]) après « nombre=rand()%(6);». La variable «nombre» est initialée au tout début.

J'aimerai simplement savoir s'il existe une fonction qui remplace les lignes suivantes:

for (e=0; e<nombre; e++)
{
if (emplacement==solution[e])
{
doublon++;
}
}
if (doublon>0)
continue;

Merci
Messages postés
269
Date d'inscription
mercredi 24 avril 2002
Statut
Membre
Dernière intervention
9 juin 2003

tu as quel compilo ?
paske ton truc compile très bien peut-etre, mais normalement, c'est pas du tout autorisé.
par exemple, mon compilo borland ne le compile pas et me sort : 11 : constant expression require..
ce qui est tout a fait normal.

sinon, tu peux faire ca :
for (e=0; e<nombre; e++)
{
if (emplacement!=solution[e])
{
solution[i]=emplacement;
cout <<"Emplacement no : "<<solution[i]<<"\n";
i++;
}
}

mais je te le redis pour ton tableau ca va pas ;)
***raph***
Messages postés
50
Date d'inscription
samedi 20 avril 2002
Statut
Membre
Dernière intervention
11 mars 2010

Merci de prendre le temps de m'écrire, c'est apprécié. J'utilise dev++ et je commence avec visual.

J'ai regardé ton code et je ne suis pas certain qu'il fait le travail recherché, je m'explique (dit le moi si je me trompe). Ton code ne semble vérifier que la première donnée du tableau et si la condition est vrai pour la première donnée il n'ira pas plus loin et exécutera ton bloc d'instruction mais ne vérifira pas les autres.

exemple:
nombre=4
donc nous avons le tableau «solution[4]»
disons que le tableau est ainsi «solution[4]={10,5,8,13}
si «emplacement=8» alors ton code va exécuter son bloc d'instruction parce que la condition est vrai pour la première donnée puisque c'est 10 et va insérer à l'emplacement selon «i».

J'avais trouvé le code suivant dans un livre:

int c;
char solution[maxPos+1];
int HowMany(const char*, char);

int count = HowMany (solution,c)
if (count>0)
continue;

La variable maxPos+1 ici n'est pas importante, ce qu'il faut retenir c'est que «solution» est un tableau.

Je cite
"Nous affectons à la variable entière «count» le résultat de la méthode membre HowMany(). Cette méthode accepte deux paramètres - un tableau de caratères et un caractère - et renvoie le nombre de fois où le caractère apparaît dans le tableau."

J'ai tenté d'adapter ce petit code pour les nombres au lieu des caractères exemple: «HowMany(const int*,int);» mais j'obtient le message d'erreur:

c:\daniel\achalandage\untitled1.o(.text+0x505):untitled1.cpp: undefined reference to `HowMany(int const *, int)'

Merci :)
Daniel
Messages postés
269
Date d'inscription
mercredi 24 avril 2002
Statut
Membre
Dernière intervention
9 juin 2003

j'avais répondu mais ca a foiré.
ptet que mon code est faux, mais je peux pas vérifier :
je peux pas compiler ton truc
c pas indenté

poiur la fonctino met un prototype
***raph***
Messages postés
455
Date d'inscription
mercredi 6 mars 2002
Statut
Membre
Dernière intervention
18 décembre 2003

salut,

si tu as des petits nombres tu peux toujours faire cette vérification en faisant un tableau de ce type :

for (i1 = 0; i1 < NBRE_MAXI; i1++) {

numero_tire[i1] = (rand () % (MAX_NUMERO))+1;
numero_deja_tire[ numero_tire[i1] ]++;

// tester si numero deja tire
if (numero_deja_tire[ numero_tire[i1] ] > 1) {
// tirer_autres_numeros;
}

} // fin de for (i1)

numero_deja_tire incrémente la valeur correspondante au numero_tiré ce qui fait que si un nombre sort il est compter si il sort encore il sera détecté rapidement.

cmarsc ;-)