Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
900 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Problèmes de tableaux

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Problèmes de tableaux

n°1731538
noamaq
Posté le 14-05-2008 à 10:52:51  profilanswer
 

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. ^^
 
 
 
 

mood
Publicité
Posté le 14-05-2008 à 10:52:51  profilanswer
 

n°1731554
ptitchep
Posté le 14-05-2008 à 11:11:04  profilanswer
 

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
n°1731817
noamaq
Posté le 14-05-2008 à 16:04:23  profilanswer
 

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:

n°1731861
ptitchep
Posté le 14-05-2008 à 16:46:30  profilanswer
 

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
n°1732008
noamaq
Posté le 14-05-2008 à 23:21:14  profilanswer
 

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:  

n°1732268
noamaq
Posté le 15-05-2008 à 16:05:51  profilanswer
 

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?

n°1732689
ptitchep
Posté le 16-05-2008 à 13:40:13  profilanswer
 

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
n°1732880
noamaq
Posté le 16-05-2008 à 19:17:25  profilanswer
 

Ok. ^^


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Problèmes de tableaux

 

Sujets relatifs
[Résolu] Problème de syntaxe?Petit problème trivial avec les tableaux
Problemes d'affichage de page et modes d'affichage de videos[Tableaux] problèmes d'espacement entre cellules
Problemes de tableaux sous Firefox[PHP] Problemes de tableaux svp
Problemes avec pointeurs/tableaux adressesproblemes sur les tableaux (résolu)
J'ai des problemes avec mes tableaux en HTML[HTML] Problèmes de tableaux.
Plus de sujets relatifs à : Problèmes de tableaux


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR