Bonjour, je souhaite écrire une fonction qui recherche un entier dans tableau. L’entier recherché et le tableau sont passés en paramètre.
Voici ma démarche pour réaliser cette fonction mais ça ne fonctionne pas. De plus ce que j'ai essayé de réaliser n'est pas très concis ni très efficace.
Avez-vous une idée pour m'aider ?
int nbMagique (int *nMagic, int tab[])
{
srand(time(NULL));
*nMagic = rand();
printf("le nombre magique est %f\n", nMagic);
while ((*nMagic)!=tab)
{
*nMagic=rand()%1000;
}
printf("le nombre magique est %d\n", *nMagic);
return *nMagic;
}
- Edité par Romain11111 25 février 2022 à 13:50:26
Ça serait une façon originale de tester une fonction qui recherche une valeur dans un tableau: int valeur = recherche(tableau, tableau[rand()%(sizeof(tableau)/sizeof(int))]);
Le Tout est souvent plus grand que la somme de ses parties.
Ligne 5 : tu essaies d'afficher un pointeur en tant que float ! Le résultat risque d’être loin de ce que tu souhaites !
Ligne 6 tu compares un float avec un pointeur ! Ce ne sont pas des choses comparable !
srand ne doit être appelé qu'une seule fois durant l'exécution du programme ! Il n'a donc rien a faire dans la fonction !
RomainThepaut a écrit:
Effectivement je me suis embrouillé dans mon énoncé avec un exercice que j'ai fait précédemment. J'ai rectifié mon code car oui, chercher un entier parmi des réels c'est totalement faux.
Justement, la ligne 6 de la boucle while est celle qui me bloque car je ne sais pas comment faire pour que le programme choisisse un entier (parmi le tableau d'entier que l'utilisateur aura saisi).
Mon idée était que le programme choisisse aléatoirement un entier et que Tant Que cet entier n'appartient pas au tableau alors il choisit un nouvel entier et ainsi de suite jusqu'à ce que l'entier choisit appartienne au tableau.
Effectivement je me suis embrouillé dans mon énoncé avec un exercice que j'ai fait précédemment. J'ai rectifié mon code car oui, chercher un entier parmi des réels c'est totalement faux...
Bon, donne l’énoncé correct, car je n'ai toujours pas compris ce que vient faire l’aléatoire dans ton code ?
Pour ton code mes premières remarques sont toujours valable :
Ligne 5 : tu essaies d'afficher un pointeur sur un int en tant que float ! Le résultat risque d’être loin de ce que tu souhaites !
Ligne 6 tu compares un int avec un pointeur ! Ce ne sont pas des choses comparable !
srand ne doit être appelé qu'une seule fois durant l'exécution du programme ! Il n'a donc rien a faire dans la fonction !
Bon, donne l’énoncé correct, car je n'ai toujours pas compris ce que vient faire l’aléatoire dans ton code ?
Pour ton code mes premières remarques sont toujours valable :
Ligne 5 : tu essaies d'afficher un pointeur sur un int en tant que float ! Le résultat risque d’être loin de ce que tu souhaites !
Ligne 6 tu compares un int avec un pointeur ! Ce ne sont pas des choses comparable !
srand ne doit être appelé qu'une seule fois durant l'exécution du programme ! Il n'a donc rien a faire dans la fonction !
Mais tu n'en a pas tenu compte !!!
Si j'en ai tenu compte, j'ai modifié mon programme pour essayer que ça marche. Le voici ci-joint.
L'objectif : je souhaite que le programme choisisse aléatoirement un entier parmi un tableau (que j'ai passé en paramètre) que l'utilisateur aura saisi préalablement.
int nbMagique (int *nMagic, int tab[])
{
int i=0;
srand(time(NULL));
*nMagic = rand()%100;
printf("le nombre magique est %d\n", *nMagic);
while (i<TAILLE && *nMagic!=tab[i])
{
srand(time(NULL));
*nMagic=rand()%100;
}
printf("le nombre magique est %d\n", *nMagic);
return *nMagic;
}
- Edité par Romain11111 25 février 2022 à 14:31:01
Maintenant oui ! sauf pour le srand ! Tu en a même rajouté un deuxième ! C'est donc encore pire !
RomainThepaut a écrit:
L'objectif : je souhaite que le programme choisisse aléatoirement un entier parmi un tableau que l'utilisateur aura saisi préalablement.
Ok, c'est déjà plus clair !
Donc dans ce cas tu tires au sort un indice dans la plage du tableau, et tu retournes la valeur correspondant à cet indice du tableau ! C'est pas plus compliqué ! Pas besoin de boucle !
Les paramètre de la fonction devrait être le tableau et sa taille ! Il est inutile de passer un pointeur pour récupérer la valeur. La retourner est suffisant !
Maintenant oui ! sauf pour le srand ! Tu en a même rajouté un deuxième ! C'est donc encore pire !
Ok, c'est déjà plus clair !
Donc dans ce cas tu tires au sort un indice dans la plage du tableau, et tu retournes la valeur correspondant à cet indice du tableau ! C'est pas plus compliqué ! Pas besoin de boucle !
Les paramètre de la fonction devrait être le tableau et sa taille ! Il est inutile de passer un pointeur pour récupérer la valeur. La retourner est suffisant !
Tirer un indice du tableau et retourner sa valeur, je n'y avait pas pensé c'est une superbe idée. Merci
Pourrais-tu m'en dire plus sur ma mauvaise utilisation du srand(time(NULL)) ?
srand ne doit être appelé qu'une seule fois durant l'exécution du programme ! Il n'a donc rien a faire dans la fonction !
Il sert à initialiser le générateur de nombre aléatoire, c'est pour cela qu'il faut l'appeler qu'une seul fois durant l'exécution de tout le programme ! Je ne vais pas rentrer dans les détails, il y a beaucoup de lecture sur le web à ce sujet ! C'est rand qui tire les nombre aléatoire !
Ne mets pas le texte de tes écrit en commentaire, ça rend le post difficile à lire !
et que tu exécutes le programme, tu auras toujours les même nombres. Pourquoi ? Car la "graine" qui initialise le générateur de nombres aléatoires est la même. Pour initialiser la "graine" de départ, on fait un srand(time(NULL)). On emploie time(NULL) car c'est (toutes les secondes) un nombre différent. On pourrait employer n'importe quelle fonction qui ne donne (que rarement) la même graine (getpid() par exemple sous linux). Et lorsque la graine a été initialisée, plus besoin de le refaire, une fois par exécution suffit.
- Edité par edgarjacobs 25 février 2022 à 15:40:28
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
C'est mieux, mais c'est inutile de passer nMagic en paramètre de la fonction, vu que tu ne fait rien de la valeur reçu ! (Peut-être une petite révision sur les fonctions est à prévoir) ?
C'est plutôt la taille du tableau qu'il faudrait passer, car ta fonction ne fonctionne que pour des tableaux de 100 int !
Pour le srand, je capitule ! Tu verras ça quand tu sera plus grand !
et que tu exécutes le programme, tu auras toujours les même nombres. Pourquoi ? Car la "graine" qui initialise le générateur de nombres aléatoires est la même. Pour initialiser la "graine" de départ, on fait un srand(time(NULL)). On emploie time(NULL) car c'est (toutes les secondes) un nombre différent. On pourrait employer n'importe quelle fonction qui ne donne (que rarement) la même graine (getpid() par exemple sous linux). Et lorsque la graine a été initialisée, plus besoin de le refaire, une fois par exécution suffit.
- Edité par edgarjacobs il y a moins de 30s
Merci de ton explication. Je pense avoir compris !
Il faudrait peut-être que tu reformules autrement ce que tu veux réellement faire. On pourra mieux te guider.
Le Tout est souvent plus grand que la somme de ses parties.
Choisir un nombre aléatoirement à un tableau
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Le Tout est souvent plus grand que la somme de ses parties.
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
Le Tout est souvent plus grand que la somme de ses parties.