Problèmes de tableaux

Problèmes de tableaux - C - Programmation

Marsh Posté le 14-05-2008 à 10:52:51    

Bonjour à ceux qui passeront par ici. ^^
Je suis en train de me battre avec un devoir depuis plusieures semaines (pas en continu), et plusieurs sujets dans le forum m'ont déjà aidée à avancer, donc merci!  :D  
 
Je ne suis pas très douée, je m'excuse d'avance si mes questions sont trop bêtes.
 
Le programme à faire est une version simple du mastermind :  
5 chiffres, et comme réponse : 2 si bien placé, 1 si présent mais mal placé et 0 sinon.
 Voici ce à quoi je suis arrivée :

Code :
  1. #include<stdio.h>
  2. #include<time.h>
  3. #define N 5
  4. void verifier(int REP[N], int Jeu[N]){  // fonction pour donner la réponse de l'ordinateur.
  5.         int i, j;
  6.         for(i=0;i<N;i++){
  7.           for(j=0;j<N;j++){
  8.             if(REP[i]==Jeu[j]){
  9.               REP[i]=1;
  10.               if(i==j) REP[i]=2;
  11.      
  12.             }
  13.             // ici j'avais mis "else REP[i]=0;" mais évidemment après on ne peux plus comparer la valeur proposée.
  14.           }
  15.  
  16. }
  17. }
  18. int afficher(int T[N]){  // fonction pour afficher mes tableaux.
  19.   int i;
  20.   for(i=0;i<N;i++) printf("%i", T[i]);
  21.   return 0;
  22. }
  23. int main(){
  24.   srand(time(NULL));
  25.   int Combi[N], PROP[N], Res[N];
  26.   int FIN[N]={2,2,2,2,2};
  27.   int i, p;
  28.   p=1;
  29.   for(i=0;i<N;i++){
  30.     Combi[i]=rand()%(7)+1;  // génère une combinaison aléatoire de 5 chiffres entre 1 et 8.
  31.     printf("%i",Combi[i]);   // l'affiche pour vérifications.
  32.   }
  33.   do{
  34.     printf("Entrez 5 chiffres entre 1 et 8.\n" );
  35.     scanf("%i %i %i %i %i", &PROP[0], &PROP[1], &PROP[2], &PROP[3], &PROP[4]);
  36.     for(i=0;i<N;i++) Res[i]=PROP[i];   // copie la proposition de l'utilisateur pour ensuite donner une réponse.
  37.     verifier(Res, Combi);
  38.     p++;
  39.     afficher(PROP);
  40.     printf("\n" );
  41.     afficher(Res);
  42.     printf("\n" );
  43.   }while(Res!=FIN && p<=12);  // l'utilisateur a droit à 12 tentatives.
  44.   if(Res==FIN) printf("Vous avez gagné!!\n" );
  45.   else printf("Perdu.\n" );
  46.   return 0;
  47. }


 
J'espère que ce n'est pas trop fouillis... mon problème se situe dans la fonction "vérifier", et je commence à être à court d'idées pour l'améliorer. :(  
J'ai enlevé la partie pour avoir un zéro, parce qu'en la laissant, il m'en affichait cinq.  Je suppose que je l'avais mal placée dans les boucles, mais je ne vois pas comment la mettre ailleurs.
 
J'avais aussi essayé d'initialiser la réponse à cinq zéros dans le main et de la changer ensuite avec la fonction, ... sans grands résultats.
Je pense qu'en ayant trois tableaux dans la fonction, ça marcherait, mais j'ai peur de tout compliquer.
 
(Il n'y a pas de message d'erreur pour si l'utilisateur entre un chiffre qui n'est pas entre 1 et 8, car c'est moi l'utilisateur pour le moment.)
 
Merci si quelqu'un parvient à m'éclairer!  
Si jamais vous avez autre chose à faire, aucun soucis, je pourrais toujours recommencer en m'inspirant de se que d'autres personnes de ma classe ont fait, mais je préfèrerais quand même comprendre mes erreurs et réussir mon propre programme. ^^
 
 
 
 

Reply

Marsh Posté le 14-05-2008 à 10:52:51   

Reply

Marsh Posté le 14-05-2008 à 11:11:04    

Bonjour,
 
while(Res!=FIN)
Ca c'est douteux comme comparaison de tableaux.
 
A mon avis (jamais fait de master mind moi) dans vérifier, tu devrais d'abord vérifier si le chiffre est bien placé avant de tout parcourir.
Je m'explique:
    faire quelque chose genre:

Code :
  1. Pour i =0 , i< nbChiffres
  2. {
  3.             resultat=0;
  4.         si Rep[i] = Jeu[i]
  5.                         resultat=2
  6.          sinon
  7.                   pour chaqe élément j de jeu
  8.                              si Rep[i] = j
  9.                                     resultat=1
  10.         rep[i]=resultat
  11. }


Message édité par ptitchep le 14-05-2008 à 11:22:21

---------------
deluser --remove-home ptitchep
Reply

Marsh Posté le 14-05-2008 à 16:04:23    

Ah oui merci beaucoup je vais essayer comme tu dis.
Je savais pas du tout comment comparer deux tableaux alors j'ai essayé plusieures façons et celle là avait l'air de marcher...  :sweat:

Reply

Marsh Posté le 14-05-2008 à 16:46:30    

noamaq a écrit :

Ah oui merci beaucoup je vais essayer comme tu dis.
Je savais pas du tout comment comparer deux tableaux alors j'ai essayé plusieures façons et celle là avait l'air de marcher...  :sweat:


Celle ci ne fonctionne pas du tout.
exemple:

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main()
  4. {
  5.     int a[5]={0,0,0,0,0};
  6.     int FIN[5]={2,2,2,2,2};
  7.     int i=0;
  8.     while (a!=FIN)
  9.     {
  10.         if(i<5)
  11.              a[i]=2;
  12.         else
  13.             printf("boucle infinie\n" );
  14.         printf("Etat de a: %d %d %d %d %dn",a[0],a[1],a[2],a[3],a[4]);
  15.         i++;
  16.     }
  17.     printf("%dn",i);
  18.     return 0;
  19. }


 
En fait tu compares les adresses des tableaux quand tu fais a!=FIN . Comme les tableaux sont différents, leurs adresses le seront toujours elles aussi.
Tu dois vérifier tous les éléments de ton tableau pour savoir s'il est bien rempli.
genre

Code :
  1. int verifierSiGagne (int tableau[], int taille)
  2. {
  3.      si au moins un élément de tableau entre 0 et taille est différent de 2
  4.            return 0;
  5.      sinon
  6.            return 1;
  7. }


 
 
tu peux aussi stocker les résultats dans un tableau de char avec par exemple
 - => faux  
 # => mal placé
 $ =>bien placé  
et un \0 à la fin de ton tableau
ensuite tu peux utiliser strcmp pour savoir si le joueur a gagné
 
       if (strcmp(tableau, "$$$$$" )==0)
              gagné();


Message édité par ptitchep le 14-05-2008 à 16:51:15

---------------
deluser --remove-home ptitchep
Reply

Marsh Posté le 14-05-2008 à 23:21:14    

Oooh. Je te remercie infiniment pour toutes tes expliquations!   :jap:  
 
Je n'avais pas compris que je comparais les adresses. Je me suis cassé la tête en voulant comparer des chiffres et je n'ai pas du tout pensé à les utiliser en tant que caractères.  
 
Bon, je vais tout recommencer demain et j'espère que je serai moins bête la prochaine fois...
Merci encore!  :whistle:  

Reply

Marsh Posté le 15-05-2008 à 16:05:51    

Maintenant j'ai réussi.  :D  
Merci beaucoup pour ces idées intelligentes! J'espère qu'un jour moi aussi je pourrai aider les autres...(je sais, c'est pas pour si tôt).
Je me suis un peu embrouillée avec les caractères, donc je les ai laissés tomber.
 
Juste pour savoir, si je dois comparer un jour des tableaux de grande taille, ça risque pas de poser problème en faisant élément par élément?

Reply

Marsh Posté le 16-05-2008 à 13:40:13    

Si c'est long, surtout si les tableaux sont identiques ou si la différence se fait vers la fin.
Peut-etre qu'il existe une fonction qui compare le contenu de 2 zones mémoire de façon optimisée...


---------------
deluser --remove-home ptitchep
Reply

Marsh Posté le 16-05-2008 à 19:17:25    

Ok. ^^

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed