Vérifier les doublons

cs_cognac Messages postés 50 Date d'inscription samedi 20 avril 2002 Statut Membre Dernière intervention 11 mars 2010 - 23 juil. 2002 à 03:41
cmarsc Messages postés 455 Date d'inscription mercredi 6 mars 2002 Statut Membre Dernière intervention 18 décembre 2003 - 5 août 2002 à 11:01
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

cs_kjus Messages postés 269 Date d'inscription mercredi 24 avril 2002 Statut Membre Dernière intervention 9 juin 2003
23 juil. 2002 à 13:20
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***
0
cs_cognac Messages postés 50 Date d'inscription samedi 20 avril 2002 Statut Membre Dernière intervention 11 mars 2010
23 juil. 2002 à 14:04
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
0
cs_kjus Messages postés 269 Date d'inscription mercredi 24 avril 2002 Statut Membre Dernière intervention 9 juin 2003
23 juil. 2002 à 14:24
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***
0
cs_cognac Messages postés 50 Date d'inscription samedi 20 avril 2002 Statut Membre Dernière intervention 11 mars 2010
24 juil. 2002 à 03:23
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_kjus Messages postés 269 Date d'inscription mercredi 24 avril 2002 Statut Membre Dernière intervention 9 juin 2003
25 juil. 2002 à 01:24
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***
0
cmarsc Messages postés 455 Date d'inscription mercredi 6 mars 2002 Statut Membre Dernière intervention 18 décembre 2003
5 août 2002 à 11:01
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 ;-)
0
Rejoignez-nous