Fonction en C
Fermé
Moustiquet
Messages postés
212
Date d'inscription
samedi 3 octobre 2009
Statut
Membre
Dernière intervention
27 juin 2011
-
18 nov. 2009 à 22:10
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 22 nov. 2009 à 21:49
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 22 nov. 2009 à 21:49
12 réponses
Pacorabanix
Messages postés
3248
Date d'inscription
jeudi 23 août 2007
Statut
Membre
Dernière intervention
19 mai 2013
661
19 nov. 2009 à 00:52
19 nov. 2009 à 00:52
il y a un problème de conception logique de ton programme.
Récapitulons les étapes.
1) Tu remplis ton tableau avec des valeurs au hasard
2) Tu l'affiches ainsi
3) Tu le tries
4) Tu affiches le tableau trié
Déjà là on voit dans ton programme que tu tries en premier, ensuite tu affiches des nombres aléatoires, et enfin tu affiches le tableau. ça ne peut pas marcher :)
Pour t'aider, décompose un peu ton programme en blocs simples comme ma liste 1) 2) 3) 4).
Par exemple une ligne /* ------------------------------------------------ */ assortie d'un commentaire.
Ou séparer en des fonctions (tu as déjà fait trier() par exemple, tu pourrais faire une fonction afficher() pour afficher un tableau, une fonction remplir() qui s'occupe de remplir ton tableau.
ça peut paraitre inutile, mais si tu fais ça ton main() sera beaucoup plus clair et tu pourras "admirer" les étapes simples de ton programme sans voir tout le détail du code mêlé.
ensuite c'est bien joli de faire :
mais ce n'est pas afficher que tu souhaites, c'est mettre cette valeur dans ton tableau. Ce n'est pas en faisant printf() qu'elle vont se mettre dans le tableau... tab[i]=rand() serait déjà plus qqchose comme tu veux faire.
De plus rand() te donne un nombre entre 0 et 1. Tu veux des nombres entre 1 et 10. Comme tu dis, le mieux serait de créer une fonction, par exemple int AuHasard(), qui te donne un nombre entre 1 et 6 à utiliser à la place de rand()
Alors déjà, peu importe si tu ne sais pas comment faire, tu pourrais au moins la déclarer pour commencer ;).
Ensuite un indice :
rand() donne un nombre entre 0 et 1
3*rand() donnerait un nombre entre 0 et 1, multiplié par 3, donc un nombre entre 0 et 3.
5*rand() donnerait un nombre entre 0 et 5.
en le mettant dans un variable int il sera, si je ne me trompe pas, tronqué.
de là à avoir un nombre entier entre 1 et 6, il n'y a qu'un pas...
Récapitulons les étapes.
1) Tu remplis ton tableau avec des valeurs au hasard
2) Tu l'affiches ainsi
3) Tu le tries
4) Tu affiches le tableau trié
Déjà là on voit dans ton programme que tu tries en premier, ensuite tu affiches des nombres aléatoires, et enfin tu affiches le tableau. ça ne peut pas marcher :)
Pour t'aider, décompose un peu ton programme en blocs simples comme ma liste 1) 2) 3) 4).
Par exemple une ligne /* ------------------------------------------------ */ assortie d'un commentaire.
Ou séparer en des fonctions (tu as déjà fait trier() par exemple, tu pourrais faire une fonction afficher() pour afficher un tableau, une fonction remplir() qui s'occupe de remplir ton tableau.
ça peut paraitre inutile, mais si tu fais ça ton main() sera beaucoup plus clair et tu pourras "admirer" les étapes simples de ton programme sans voir tout le détail du code mêlé.
ensuite c'est bien joli de faire :
for(i=0;i<6;i++) printf("%d",rand());
mais ce n'est pas afficher que tu souhaites, c'est mettre cette valeur dans ton tableau. Ce n'est pas en faisant printf() qu'elle vont se mettre dans le tableau... tab[i]=rand() serait déjà plus qqchose comme tu veux faire.
De plus rand() te donne un nombre entre 0 et 1. Tu veux des nombres entre 1 et 10. Comme tu dis, le mieux serait de créer une fonction, par exemple int AuHasard(), qui te donne un nombre entre 1 et 6 à utiliser à la place de rand()
Alors déjà, peu importe si tu ne sais pas comment faire, tu pourrais au moins la déclarer pour commencer ;).
Ensuite un indice :
rand() donne un nombre entre 0 et 1
3*rand() donnerait un nombre entre 0 et 1, multiplié par 3, donc un nombre entre 0 et 3.
5*rand() donnerait un nombre entre 0 et 5.
en le mettant dans un variable int il sera, si je ne me trompe pas, tronqué.
de là à avoir un nombre entier entre 1 et 6, il n'y a qu'un pas...
Moustiquet
Messages postés
212
Date d'inscription
samedi 3 octobre 2009
Statut
Membre
Dernière intervention
27 juin 2011
20 nov. 2009 à 00:07
20 nov. 2009 à 00:07
Ma question est beaucoup plus fondamental,
Lorsque je veut definir un fonction dans laquelle, je veut utiliser ou plutot avoir un resultat aleatoire. Comment je doit definir le nom de ma fonction et quel parametre formel je dois utiliser et a quel moment ou de quel facon dans le corps de ma fonction j'utiliserais rand.? J'ignore même si ma question fait du sens pour vous.
Si ma fonction s'appelle dé, par exemple
aleatoire dé (parametre formel)...{..
Peut-être avez vous déja repondu et j'y n'ai rien vu.!!??
Lorsque je veut definir un fonction dans laquelle, je veut utiliser ou plutot avoir un resultat aleatoire. Comment je doit definir le nom de ma fonction et quel parametre formel je dois utiliser et a quel moment ou de quel facon dans le corps de ma fonction j'utiliserais rand.? J'ignore même si ma question fait du sens pour vous.
Si ma fonction s'appelle dé, par exemple
aleatoire dé (parametre formel)...{..
Peut-être avez vous déja repondu et j'y n'ai rien vu.!!??
Moustiquet
Messages postés
212
Date d'inscription
samedi 3 octobre 2009
Statut
Membre
Dernière intervention
27 juin 2011
20 nov. 2009 à 00:38
20 nov. 2009 à 00:38
J'ai peut-être besoin d'une recommendation de lecture...enfin
Pacorabanix
Messages postés
3248
Date d'inscription
jeudi 23 août 2007
Statut
Membre
Dernière intervention
19 mai 2013
661
20 nov. 2009 à 00:44
20 nov. 2009 à 00:44
ok, je crois que je vois ce que tu veux dire, et c'est plus clair et plus précis comme question ;) . Mais oui on en a déjà parlé un peu.
Tu veux une fonction qui fonctionne ainsi :
Elle te donne un nombre aléatoire entier.
Je suppose que tu as envie de te laisser une certaine marge de manoeuvre : tu souhaites avoir une fonction qui peut te donner un entier entre 1 et 6 par exemple, ou entre 1 et 10, ou entre 4 et 8. Alors nécessairement ce seront ces nombres que tu devras utiliser en paramètre : une borne inférieure et une borne supérieure.
le type de la fonction sera int car elle oit te onner un entier.
son prototype serait donc quelque chose comme :
En fait, ta fonction sera essentiellement un appel à rand() (rand() renvoie un nombre entre 0 et RAND_MAX, à virgule).
si tu divises le résultat que te donne rand() par RAND_MAX tu auras un nombre entre 0 et 1.
double nombre=rand()/(double)RAND_MAX ; //ici nombre est un nombre entre 0 et 1
ensuite tu multiplies par (borneSuperieure-borneInferieure) pour avoir un nombre entre 0 et borneSuperieure-borneInferieure
Puis tu ajoutes borneInferieure, et alors tu auras un nombre entre borneInferieure et borneSuperieure.
Tu retournes ce dernier nombre en le castant en "int" auparavant.
Tu veux une fonction qui fonctionne ainsi :
Elle te donne un nombre aléatoire entier.
Je suppose que tu as envie de te laisser une certaine marge de manoeuvre : tu souhaites avoir une fonction qui peut te donner un entier entre 1 et 6 par exemple, ou entre 1 et 10, ou entre 4 et 8. Alors nécessairement ce seront ces nombres que tu devras utiliser en paramètre : une borne inférieure et une borne supérieure.
le type de la fonction sera int car elle oit te onner un entier.
son prototype serait donc quelque chose comme :
int NombreAuHasard(int borneInf, int borneSup)
En fait, ta fonction sera essentiellement un appel à rand() (rand() renvoie un nombre entre 0 et RAND_MAX, à virgule).
si tu divises le résultat que te donne rand() par RAND_MAX tu auras un nombre entre 0 et 1.
double nombre=rand()/(double)RAND_MAX ; //ici nombre est un nombre entre 0 et 1
ensuite tu multiplies par (borneSuperieure-borneInferieure) pour avoir un nombre entre 0 et borneSuperieure-borneInferieure
nombre = nombre * (borneSup-borneInf);
Puis tu ajoutes borneInferieure, et alors tu auras un nombre entre borneInferieure et borneSuperieure.
Tu retournes ce dernier nombre en le castant en "int" auparavant.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Moustiquet
Messages postés
212
Date d'inscription
samedi 3 octobre 2009
Statut
Membre
Dernière intervention
27 juin 2011
22 nov. 2009 à 13:35
22 nov. 2009 à 13:35
Est ce que ca porrai etre quelque chose du genre?
/*Mon programme a pour but de jouer au dé, je lance le dé 10 fois dans lequelle je met les resultat dans un*/ /*Tableau et afficher les resultat de ce tableau.*/ #include <stdio.h> #include <time.h> #define LIMITE 10 #define RAND_MAX 6 int NombreAuHasard(int borneInf, int borneSup) { int j; int rand {j=1+(int)(6.0*rand/RAND_MAX+1.0) }
Moustiquet
Messages postés
212
Date d'inscription
samedi 3 octobre 2009
Statut
Membre
Dernière intervention
27 juin 2011
22 nov. 2009 à 16:53
22 nov. 2009 à 16:53
En passant, je cherche toujours a ecrire une fonction (donc que je pourrai utiliser plus tard) qui me permet d'obtenir en nombre entier entre 1 et 6. Merci
nobie-cs
Messages postés
155
Date d'inscription
samedi 21 novembre 2009
Statut
Membre
Dernière intervention
15 mai 2010
17
22 nov. 2009 à 17:04
22 nov. 2009 à 17:04
cette exemple affiche un int compris entre 1 et 5
#include <stdio.h> #include <time.h> int main() { srand (time (NULL)); int nb=1 +(rand()%5); printf("%d",nb); return 0; }
Moustiquet
Messages postés
212
Date d'inscription
samedi 3 octobre 2009
Statut
Membre
Dernière intervention
27 juin 2011
22 nov. 2009 à 18:15
22 nov. 2009 à 18:15
quest-ce que je peut faire pour fixer le resultat dans la fenetre DOS, j'ai essayé system("pause"), mais cela ne fonctionnne pas
nobie-cs
Messages postés
155
Date d'inscription
samedi 21 novembre 2009
Statut
Membre
Dernière intervention
15 mai 2010
17
22 nov. 2009 à 18:24
22 nov. 2009 à 18:24
tu peut détailler ta question stp
Moustiquet
Messages postés
212
Date d'inscription
samedi 3 octobre 2009
Statut
Membre
Dernière intervention
27 juin 2011
22 nov. 2009 à 18:26
22 nov. 2009 à 18:26
C'est que lorsque je compile c'est ok, mais la fenetre DOS disparait si vite que j'ai le temps de rien voir. Merci
nobie-cs
Messages postés
155
Date d'inscription
samedi 21 novembre 2009
Statut
Membre
Dernière intervention
15 mai 2010
17
22 nov. 2009 à 18:31
22 nov. 2009 à 18:31
tu met une petit getchar() ou getch() avant return
system("pause") sa marche aussi mais c'est pas la bon façon de faire
system("pause") sa marche aussi mais c'est pas la bon façon de faire
c'est vrais que la fonction RAND() ne renvoi pas la valeur 0, pour surmenter cette difficulté, vous pouvez établir un tableau de correspondance entre le resultat retourné par la fonction RAND et une valeur comprise entre 0 et 6
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
22 nov. 2009 à 21:49
22 nov. 2009 à 21:49
Oh, il y a une fonction qui a échappé à ma vigilance. Pas de fflush(stdin); en C ;-))).
Cdlt
Cdlt
19 nov. 2009 à 06:28
rand() renvoie un entier entre 0 et RAND_MAX. Il faut donc effectuer une division par RAND_MAX pour avoir un double entre 0 et 1 (en castant) et ensuite remettre à l'échelle.
Cdlt
19 nov. 2009 à 10:57
19 nov. 2009 à 11:42
int NBRMAX //le nombre maximal pour ton aléa
int N //le nombre de cases de ton tableau
Int Tab[N] //le tableau sera un ensemble d'entiers
srand((unsigned)time(NULL));
for (i=0,i<N,i++) /*Cette boucle pour créer les N nombres aléatoires de ton tableau*/
{
Tab[i]=((int)((int)NBRMAX*(float)rand()/(float)RAND_MAX));
}
/*Comme ça tu force Tab[i] à être un entier et tu rempli ton tableau d'entiers pseudo-aléatoires
19 nov. 2009 à 19:33
Tab[i] étant déja déclaré comme int, les cast sont implicites et n'aident pas trop à la lecture.
Cdlt
19 nov. 2009 à 22:22
Attention N ici est une variable. Ce qui est interdit en C89/90. Il vaut mieux utiliser #define N ou faire de l'allocation dynamique.
Ensuite tu castes de trop comme pacorabanix a précisé. Et vaut mieux caster en double qu'en float.