RENITIALISER EN LANGAGE C

Fermé
lucas01 Messages postés 1835 Date d'inscription samedi 31 janvier 2009 Statut Membre Dernière intervention 15 octobre 2014 - 30 mai 2009 à 21:45
lucas01 Messages postés 1835 Date d'inscription samedi 31 janvier 2009 Statut Membre Dernière intervention 15 octobre 2014 - 29 juil. 2009 à 07:37
Bonjour,
j'avais déjà poser un poste, mais je me souvient plus trop. Enfin, je débute en c et je veut faire un jeu, ce jeu est un pendu. Mais avec la commande random, il choisi toujours le même nombre (ou mot). On ma dit de signaler #includ time... Je sais plus. Bon voici mon code:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
char tab[10][15];
char buf[15];

int main(int argc, char *argv[])
{
int nb, res, r=0, i;

srand(time(NULL));

res= rempli_tab();
nb= nombre_hasard();
res= affiche_mot(tab[nb]);
for(i=0; i<20; i++)
{
res=saisie_car();
if(res==10) continue;
r=comp_car(res, tab[nb]);
if(r==0) {
printf("penalite= %d\n", r);
}
else {
printf("buf = %s\n",buf);
if(strcmp(buf, tab[nb])==0) {
printf("Vous avez GAGNE !!!!\n");
break;
}
}
}

system("PAUSE");
return 0;
}

int rempli_tab()
{
sprintf(tab[0],"%s","clavier");
sprintf(tab[1],"%s","maison");
sprintf(tab[2],"%s","voiture");
sprintf(tab[3],"%s","pelouse");
sprintf(tab[4],"%s","rateau");
sprintf(tab[5],"%s","souvenir");
sprintf(tab[6],"%s","souris");
return(0);
}

int nombre_hasard()
{
int nb;
//srand((unsigned int)time(NULL));
nb=rand();

return nb;
}

int affiche_mot( mot)
char * mot;
{
int b;

buf[0]= mot[0];

for(b=1;b<strlen(mot);b++)
{
buf[b]='-';
}
buf[strlen(mot)-1]=mot[strlen(mot)-1];
printf("buf = %s\n",buf);
return(0);
}

int saisie_car()
{
char c;
c=getchar();
return(c);
}

int comp_car( c, mot)
char c;
char *mot;
{
int b, trouve=0;
for(b=1;b<strlen(mot);b++)
{
if(c==buf[b]){
printf("Cette lettre est DEJA DIT\n");
break;
}
if(mot[b]==c) { buf[b]=c; trouve=1; }

}

return(trouve);
}


Merci pour votre aide.
A voir également:

13 réponses

Bonjour,

Je veux bien t'aider, mais quelle est ta question au juste ? As-tu testé avec srand ?
Un conseil au passage pour ton hasard, si tu veux que la fonction "nombre_hasard" te renvoie un nombre en 0 et 6, il faut que tu mettes srand % 7.

J'attends ta question...




Yakari
0
the F Messages postés 150 Date d'inscription dimanche 22 mars 2009 Statut Membre Dernière intervention 22 mars 2011 13
31 mai 2009 à 13:06
le debogage donne ce resultat :


Program received signal SIGSEGV, Segmentation fault.
0x08048787 in affiche_mot (mot=0xe9d795ff <Address 0xe9d795ff out of bounds>)
at U.c:67
67 buf[0]= mot[0];
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
31 mai 2009 à 14:58
Salut,
N'oublie pas de déclarer les prototypes des fonctions avant le main.
Sinon l'erreur vient du rand().
rand() te renvoie une valeur pseudo-aléatoire entre 0 et RAND_MAX. Il faut donc normer cette valeur pour obtenir une valeur dans l'intervalle que tu veux. Le mieux est d'utiliser les multiplications et les divisions. Mais pour tester, tu peux essayer avec un simple modulo 7. (%7).
Cdlt
0
lucas01 Messages postés 1835 Date d'inscription samedi 31 janvier 2009 Statut Membre Dernière intervention 15 octobre 2014 102
31 mai 2009 à 16:18
Je vous remercie, mais je débute juste. Mon père (ancien programmeur) m'a fait ce codage. Enfin il ma donné les bases. Et il m'a dit en gros débrouille toi. Quand tu auras fini le programme, je peut te montrer autre chose.

Mais le problème c'est que je bloque je sais plus quoi faire. Si vous pouviez me montrer ou carrément me le faire, ce serait cool. :p :p.

@ Yakari

Je te remercie bien vouloir m'aider. Avec srand oui j'ai essayer.

@Tous, apparemment le truc marche mais sa beug, quand j'exécute et tout,
il m'affiche: buf=----------------------------------------------------------------------------------------------------------------[...]
sur 7.8 ligne de la console.
et quand je ferme et RE- exécute le programme il affiche: buf= [rien].
>>> tout le temps
Merci de m'aider.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
lucas01 Messages postés 1835 Date d'inscription samedi 31 janvier 2009 Statut Membre Dernière intervention 15 octobre 2014 102
31 mai 2009 à 16:18
>>> J'ai oublier, il beug avec le code que j'ai mis en haut.
0
Comme l'a dit Fiddy, la fonction rand() retourne une valeur aléatoire dans un intervalle bien défini. Cet intervalle est [0; RAND_MAX] sachant que RAND_MAX est une valeur assez grande (pour plus de précision sur cette valeur, voir le header stdlib).
Mais toi ce que tu veux, c'est un nombre aléatoire compris entre 0 et 6, car tu as 6 mots dans ton tableau, donc afin de réduire ce nombre aléatoire sortant de rand() dans l'intervalle [0;6] il faut que tu effectues un modulo (symbole %).

int nombre_hasard()
{
int nb;

nb=rand() % 7; /* renvoie le reste de la division euclidienne de rand() par 7 -> un nombre dans [0;6]*/

return nb;
}

Après si tu veux utiliser srand(), qui permet une plus grande entropie, tu devras faire un truc de ce style :

int nombre_hasard()
{
int nb;

srand(time(NULL));

nb=rand() % 7; /* Dans ce cas, on appelle le générateur pseudo-aléatoire qui a été initialisé au préalable avec une "graine" de départ */

return nb;
}

Après j'ai pas compilé ni exécuté, je te laisse le soin de le faire.

Yakari
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
1 juin 2009 à 11:11
Non le srand() n'est à appeler qu'une seule fois. Il ne faut donc pas la mettre dans la fonction nombre_hasard(). Il faut bel et bien la laisser dans une fonction d'initialisation ou tout simplement dans le main().

Cdlt
0
lucas01 Messages postés 1835 Date d'inscription samedi 31 janvier 2009 Statut Membre Dernière intervention 15 octobre 2014 102
1 juin 2009 à 11:48
Merci, mais pourquoi 7 et pas 6. Je n'est pas 7 mots a choisir! ?

Si je met comme tu as mis euh... Yakari. Le programme va marcher?

Donc on dit que c'est un générateur pseudo-aléatoire quand il y a % [suivi d'un chiffre ou nb].
Si je comprend bien, le % [chiffre ou nb]>>> ce chiffre ou nb est la valeur maximum que "j'autorise a l'ordinateur ( ou programme ) de choisir au hasard"

Mais je vais essayer avec ton post, Yakari

@ Tous: encore une foie merci d'aider un jeune débutant ! ! ! !
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
1 juin 2009 à 11:58
Tu sais, c'est ce que je t'avais dit dans mon post ;-))).
Pourquoi 7 ? Car 7%7=0. De 0 à 6, cela te fait 7 éléments.

Donc, tu reprends le post de yakari, et tu enlèves le srand(time(NULL)), et tu le laisses dans ta fonction main() comme t'avais fait. Ca devrait mieux marcher.

Cdlt
0
dream666 Messages postés 735 Date d'inscription mardi 8 juillet 2008 Statut Membre Dernière intervention 24 février 2014 104
1 juin 2009 à 13:13
Pour ceux que sa intéresse je viens de faire un exemple du hasard :

#include <iostream>
#include <stdlib.h>
#include <time.h>

using namespace std;

char question[25] ;
int presentation ;
int hasard;
int nombre;
int choisir ;



int main()
{

while ( question!="exit")
{


if ( choisir==0) {
srand(time(NULL));
hasard=(rand()%999)+1;
choisir=1 ;
}

if (presentation==0){
cout << "**Bienvenue au jeux du HASARD***" << endl;
presentation=1;
}


cout <<"entrer un nombre entre 1 et 1000"<< endl ;
cin >> nombre ;

if (hasard==nombre) {

cout << "vous avez GAGNER !!!"<< endl;
choisir=0;
}


cout << "vous avez mis "<< nombre << endl;
cout << "alor que le nombre est " << hasard << endl;

}

return 0;
}
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
1 juin 2009 à 13:44
Salut,
Oui, mais c'est du C++, nous on parlait de C ;-).
Ensuite : while ( question!="exit")
Sachant que question est un tableau de char, ce n'est pas terrible. Il faut utiliser strcmp. Sinon tu compares les adresses mémoires, qui sont différentes...
0
dream666 Messages postés 735 Date d'inscription mardi 8 juillet 2008 Statut Membre Dernière intervention 24 février 2014 104
1 juin 2009 à 13:46
oui mai il y a pas plus clair comme démonstration après il faut juste adapter le code.
celui qui cherche a créer du hasard dans son code peu facilement comprendre les choses par raport a mon code source et puis le language C
j'en en fait que un mois
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
1 juin 2009 à 13:58
Pas plus clair ?
Le mieux est de renvoyer sur un lien ou de faire un code exempt de fautes ^^.
Là tu utilises question!="exit" qui est totalement faux. Et tu parles de C++ alors que nous on parle de C.
Je ne parle même pas du fait que le modulo est à éviter pour le rand et qu'il vaut mieux utiliser la multiplication et la division afin d'éviter d'avoir une probabilité fausse.
Voici un exemple de rand :
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int alea(void) {
   return (int) (int)(rand() / RAND_MAX * 6);
}

int main(void) {
   int nb;
   srand(time(NULL));

   nb=alea();
   printf("%d\n",nb);
   return 0;
}


Sinon voici un lien qui explique cela : https://nicolasj.developpez.com/articles/libc/hasard/

Cdlt
0
dream666 Messages postés 735 Date d'inscription mardi 8 juillet 2008 Statut Membre Dernière intervention 24 février 2014 104
1 juin 2009 à 14:02
c'est pas parceque toi sa te plait pas que sa ne plaira pas a d'autre.
mon code fonctionne très bien pour débuter, la seule différence entre le C et le C++ c'est que j'utilise cout et cin qui me semble plus clair.
Adapte mon code a ta façon et du vérra la différence
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
1 juin 2009 à 14:18
Rahh,
Non ton code ne fonctionne pas très bien.
On n'utilise pas question!="exit" (lorsque question est un tableau de char), mais strcmp(question,"exit").
Ce n'est pas parce que ça me plaît pas, mais parce que ce que t'as mis c'est complètement faux.
0
Oui fiddy tu as raison pour le srand() (mais où avais-je la tête... ^^).
Sinon j'ai regardé les autres messages et je suis d'accord avec toi (fiddy), ce qu'a écrit dream666 est inexacte donc pas très utile pour un débutant. De plus, j'ajouterais (pour dream666) que quitte à utiliser le C++, je vois pas pourquoi tu n'utilises pas la classe string qui est plus facile à utiliser que les tableaux de "char".

Yakari
0
dream666 Messages postés 735 Date d'inscription mardi 8 juillet 2008 Statut Membre Dernière intervention 24 février 2014 104
2 juin 2009 à 17:32
Sauf que je n'ai pas chercher a faire quelque chose de propre pour mettre en boucle sinon j'orais fait une sortie de boucle deja, en s'en fou de while avec char le principal c'est qu'on peu jouer avec les conditions et le hasard
celui qui des le début regarde mon code, il va comprendre du premier coup d'oeil comment manier les if et rand()
la plus part des programmation sont les même il sufi de s'adapter au code, il n'est pas dificile de modifier mon code en pure language C en tant que débutant.
et dalleur mon code fonctionne
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
2 juin 2009 à 21:41
et dalleur mon code fonctionne
Bon bah, revois tes bases de C alors car pour comparer un tableau de char avec un pointeur sur un char, on n'utilise pas l'opérateur égal mais la fonction strcmp. Mais bon, si ça te fait plaisir de penser que t'as raison...
0
Yakari > fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022
2 juin 2009 à 22:27
Je crois qu'il ne faut pas insister, il veut le dernier mot, nous perdons notre temps... ;)
0
lucas01 Messages postés 1835 Date d'inscription samedi 31 janvier 2009 Statut Membre Dernière intervention 15 octobre 2014 102
29 juil. 2009 à 07:37
Merci comme même. :p
0