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
Bonjour,
Je suis presque gêner de vous présenter cela, mais peut-être que je pourrai avancer.
Dans le programme que je veux monter je doit lancer un dé, 10 fois et mettre les resultats aléatoire dans un tableau que je devrais faire une série de manipulation
j'ai tanter pour commecer par


/*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 <stdlib.h>
#include <time.h>

#define LIMITE 10

void trier (int t[], int n) {

	int i;         /* position courante */
	int j;         /* position a droite de la position courante */
	int indMin;    /* position de la valeur minimale */
	int tempo;
	
   /* tri : pour chaque position du tableau (sauf la derniere) */
   for (i=0; i <= n - 2 ; i++)
   {
      indMin = i;
      /* on trouve la valeur minimale a droite */
      /* et on echange seulement si valeur minimale trouvee */ 

      for (j = i + 1; j <= n - 1; j++)
      {
         if (t[j] < t[indMin])
             indMin = j;
      }

      /* si necessaire, echange les valeurs de t[indMin] et t[i]*/
      if ( indMin != i )
      {
           tempo = t[i];
           t[i] = t[indMin] ;
           t[indMin] = tempo;
      }     
   }
}

int main ()
{
	int tab_des[i];    /* le tableau a trier */
	int nbElement; /* le nombre effectif d'elements dans le tableau t */
	int i;
	int des;
	trier(tab_des_[i], nbElement);
	srand(time(NULL));
	for(i=0;i<6;i++)
	printf("%d",rand());

	/* affichage du tableau trie */
	printf ("\nTableau trier: \n");

	for (i = 0 ; i < nbElement ; i++)
		printf("%d ", tab_des[i]);
	printf("\n");
	
	printf("Appuyez sur une touche pour terminer");
    fflush(stdin);
	getch();
}

Comme vous pouvez le remarquer j'ai de la difficulté a creéer une fonction aleatoire qui donnera les resultats d'un lancement de dé et qui seront "enregister" dans un tableau que je pourrais manipuler. Ci-haut il y a une tentative de tri, mais avant je doit reussir a creer ma fonction aleatoire et la mettre en tableau.
J'espère que ma question est claire.

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
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 :
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...
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
19 nov. 2009 à 06:28
D'accord avec toi, mais rand() ne renvoie pas un nombre en 0 et 1.
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
0
Pacorabanix Messages postés 3248 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013 661 > fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022
19 nov. 2009 à 10:57
Merci de corriger les bêtises que je dis fiddy ! :)
0
yann > Pacorabanix Messages postés 3248 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013
19 nov. 2009 à 11:42
sinon tu peux fixer les valeurs que tu veux trouver en tant qu'entier

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
0
Pacorabanix Messages postés 3248 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013 661 > yann
19 nov. 2009 à 19:33
j'ai un doute quand à l'utilité de tous ces cast.

Tab[i] étant déja déclaré comme int, les cast sont implicites et n'aident pas trop à la lecture.

Cdlt
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844 > yann
19 nov. 2009 à 22:22
Int Tab[N]
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.
0
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
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.!!??
0
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
J'ai peut-être besoin d'une recommendation de lecture...enfin
0
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
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 :
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.
0

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
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)
}
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
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
0
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
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;
}
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
quest-ce que je peut faire pour fixer le resultat dans la fenetre DOS, j'ai essayé system("pause"), mais cela ne fonctionnne pas
0
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
tu peut détailler ta question stp
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: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
0
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
tu met une petit getchar() ou getch() avant return
system("pause") sa marche aussi mais c'est pas la bon façon de faire
0
Profil bloqué
22 nov. 2009 à 19:38
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
0
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
Oh, il y a une fonction qui a échappé à ma vigilance. Pas de fflush(stdin); en C ;-))).

Cdlt
0