Recherche dans tableau de structure

Résolu/Fermé
Drayx Messages postés 124 Date d'inscription dimanche 15 novembre 2015 Statut Membre Dernière intervention 4 décembre 2018 - Modifié par Drayx le 17/02/2017 à 12:51
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 - 20 févr. 2017 à 09:35
Bonjour, je fais un programme qui utilise les types structurés en remplissant des informations pour plusieurs utilisateurs. Comment pourrais je faire une recherche dans ce tableau en fonction d'une donnée avec strcmp par exemple ?
Merci par avance.
A voir également:

1 réponse

Drayx Messages postés 124 Date d'inscription dimanche 15 novembre 2015 Statut Membre Dernière intervention 4 décembre 2018 10
17 févr. 2017 à 17:33
up pls
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
17 févr. 2017 à 19:18
Si tu as un tableau de struct, il suffit de parcourir le tableau avec une boucle et d'utiliser la fonction strcmp avec les membres de la struct sur lesquels la recherche se fait.

http://www.cplusplus.com/reference/cstring/strcmp/

La recherche sera sensible à la casse, sauf à ce que tu convertisse en majuscules ou minuscules avant de comparer. Par exemple avec tolower

http://www.cplusplus.com/reference/cctype/tolower/

Dal
0
Drayx Messages postés 124 Date d'inscription dimanche 15 novembre 2015 Statut Membre Dernière intervention 4 décembre 2018 10
Modifié par Drayx le 18/02/2017 à 15:12
Merci pour tes conseils !
j'ai essayé ça :

do {
i=0;
comparaison = strcmp(entiterecherche,tab[i].entite);
i++;
}while (comparaison!=0&&i<d); //d étant le nombre de cases de mon tableau

mais je ne sais pas pourquoi ça fonctionne pas. Qu'en pense tu ?
0
Drayx Messages postés 124 Date d'inscription dimanche 15 novembre 2015 Statut Membre Dernière intervention 4 décembre 2018 10 > Drayx Messages postés 124 Date d'inscription dimanche 15 novembre 2015 Statut Membre Dernière intervention 4 décembre 2018
Modifié par Drayx le 18/02/2017 à 18:48
Une de mes erreurs était que je n'avais pas déclaré la taille maximal de entiterecherche mais la ca ne fonctionne toujours pas. Maintenant mon programme ne fait rien apres m'avoir demandé de saisir entiterecherche
Je me suis dit qu'une autre erreur pouvait venir de "comparaison" donc j'ai modifié un peu le code :

printf("\nEntite utilisateur :");
scanf("%s",&entiterecherche);
do {
i=0;
strcmp(entiterecherche,tab[i].entite);
i++;
}while (strcmp(entiterecherche,tab[i].entite)!=0&&i<d);

Edit : une fois de temps en temps le programme fonctionne mais pas à tous les coup
Edit 2: mon programme me permet de choisir combien d'utilisateur j'ai, lorsque j'en ai 2 et que je choisis une entité correspondant au premier ca ne fonctionne pas et lorsqu'elle correspond au second ca fonctionne.
j'ai fait afficher i par curiosité et i= 6 356 704 soir une valeur largement supérieur à d.
0
Drayx Messages postés 124 Date d'inscription dimanche 15 novembre 2015 Statut Membre Dernière intervention 4 décembre 2018 10 > Drayx Messages postés 124 Date d'inscription dimanche 15 novembre 2015 Statut Membre Dernière intervention 4 décembre 2018
Modifié par Drayx le 19/02/2017 à 02:20
finalement ca fonctionne il fallait sortir le i=0; de la boucle et le mettre avant le do.
Mais du coup j'ai une autre question. Comment je peux comparer des nombres et le metre dans le while ?

printf("\nEntite utilisateur :");
scanf("%s",&entiterecherche);
printf("\nDate utilisateur :");
scanf("%d",&daterecherche);
i=0;
do {
strcmp(entiterecherche,tab[i].entite);
i++;
}while (strcmp(entiterecherche,tab[i].entite)!=0&&daterecherche!=tab[i].date||i<d);

Comme ça par exemple sauf que la ça ne fonctionne pas.
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
20 févr. 2017 à 09:35
Salut Drayx,

Si je comprends bien
d
contient le nombre maximal d'entrées dans le tableau.

1.

Si c'est bien cela, alors, tu dois boucler et incrémenter
i
tant que
i
est inférieur à
d
ou tant que tu n'as pas trouvé le motif texte recherché. Si l'une ou l'autre de ces conditions est vraie, tu dois sortir de la boucle.

donc, pour le premier cas où tu ne testes qu'une chaîne, le while donnerait :
} while ( i<d || strcmp(entiterecherche,tab[i].entite)!=0);
en mettant le test
i<d
en premier, car tu ne veux pas effectuer un test sur un tableau avec un index au-delà des limites.

En faisant cela, cependant, tu ne disposes pas d'un moyen de savoir si tu es sorti de la boucle parce que ta recherche a réussi, ou si tu es sorti parce que tu as testé toutes les possibilités.

Pour cela, tu peux déclarer une variable "drapeau", que tu mets à 0 avant la boucle, et que tu mets à 1 (ou une autre valeur) en cas de réussite, par exemple
int matched = 0;
.

Donc, il faudra que tu sortes strcmp du while, que tu fasse ce test dans la boucle, et que tu mettes ton drapeau à sa place dans le while.

donc :
} while ( i<d || matched);


A la sortie du while, tu testes
matched
et selon le cas tu affiches "motif trouvé", ou "motif non présent".

2.

Si, en plus de rechercher un motif texte, tu recherches un motif numérique, la première question qui m'interpelle est que ton "nombre" soit une "date" d'après les variables que tu utilises.

Si tu cherches une date du type 20170220, c'est effectivement un "nombre" entier, ton scanf va fonctionner, et si tu as quelque chose d'identique stocké dans ta structure, tu vas pouvoir comparer efficacement les choses. Autrement, si tu as des tirets, des slashs, ou une autre forme de représentation de date non purement sous la forme de nombre entier, c'est aussi une chaîne de caractères, et tu dois faire le scanf correspondant et comparer avec strcmp.

En supposant que ce soit bien un entier, tes tests dépendent ensuite de savoir si tu veux que les conditions se cumulent (la bonne "entité" et la bonne "date", ou si tu matches si l'un ou l'autre est bon).

Je te laisse réfléchir là dessus :-)


Dal
0