Fonction en C

Moustiquet Messages postés 212 Date d'inscription   Statut Membre Dernière intervention   -  
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   -
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.
A voir également:

12 réponses

Pacorabanix Messages postés 3248 Date d'inscription   Statut Membre Dernière intervention   663
 
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   Statut Contributeur Dernière intervention   1 846
 
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   Statut Membre Dernière intervention   663 > fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention  
 
Merci de corriger les bêtises que je dis fiddy ! :)
0
yann > Pacorabanix Messages postés 3248 Date d'inscription   Statut Membre Dernière intervention  
 
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   Statut Membre Dernière intervention   663 > yann
 
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   Statut Contributeur Dernière intervention   1 846 > yann
 
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   Statut Membre Dernière intervention  
 
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   Statut Membre Dernière intervention  
 
J'ai peut-être besoin d'une recommendation de lecture...enfin
0
Pacorabanix Messages postés 3248 Date d'inscription   Statut Membre Dernière intervention   663
 
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   Statut Membre Dernière intervention  
 
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   Statut Membre Dernière intervention  
 
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   Statut Membre Dernière intervention   17
 
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   Statut Membre Dernière intervention  
 
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   Statut Membre Dernière intervention   17
 
tu peut détailler ta question stp
0
Moustiquet Messages postés 212 Date d'inscription   Statut Membre Dernière intervention  
 
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   Statut Membre Dernière intervention   17
 
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é
 
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   Statut Contributeur Dernière intervention   1 846
 
Oh, il y a une fonction qui a échappé à ma vigilance. Pas de fflush(stdin); en C ;-))).

Cdlt
0