[C] euh.... Probleme sur un truc pas tres dur (1er post + lisible)

euh.... Probleme sur un truc pas tres dur (1er post + lisible) [C] - C - Programmation

Marsh Posté le 18-06-2004 à 23:36:15    

bah voila en fait j'ai un projet a faire en C mais je suis vraiment pas tres fort (licence maths-géographie) je dois faire le jeu du master mind dans lequel l'utilisateur aura le choix entre jouer et assister a une partie, j'ai fait 70% du truc et ca marche pas trop mal mais j'ai un probleme a un moment, j'ai crée une fonction de conversion couleur-chiffre, cette fonction marche quand je doix trouver la combinaison mais elle ne marche pas quand je dois donner le code clé. j'ai aussi un autre probleme de compteur
 
y'a 1 mois mon prof avait corrigé un truc en rajoutant un scanf donc c'est peut etre la que ca ne va pas, j'ai fait une recherche ici et j'ai vu que je suis pas le seul a avoir eu des problemes avec cette fonction, mais comme je suis nul je comprends pas ce que je dois changer/rajouter :/
 
je pense que ca vous prendra pas trop de temps, j'ai un probleme dans la fonction clé et pour le numéro de l'essai
 
merci d'avance  :D  
 
 

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
 
  struct combinaison{ int toto[4] ;};
   
  typedef struct combinaison tab;
   
   
 
     
     
     
     int conv(char i) {int j;
 
            switch(i){
      case 'r' : {j=0;break;}
      case 'j' : {j=1;break;}
      case 'b' : {j=2;break;}
      case 'v' : {j=3;break;}
      case 'n' : {j=4;break;}
      case 'c' : {j=5;break;}
      default : j=10;
                   }
 
           return j;
       }
 
 
    tab saisie()
           {
  int i,j,k; char caract;tab essai;
 
     
      for(i=0;i<4;i++){
              printf(" tapez le code couleur pour l'emplacement numero %d : \n ", i+1);
                       scanf("%c", &caract);
 
                        j=conv(caract);
                         scanf("%c", &caract);
                          printf (" \n \n" );
 
                     if (j!=1 && j!=2 && j!=3 && j!=4 && j!=5 && j!=0)
                    {
            printf ("cette couleur n'existe pas, veuillez recommencer \n" );
 
       i=i-1;
    }
 
 
 
   else essai.toto[i]=j;
/*    printf (" %d  ", essai.toto[i]); */
   }
 
 
                      /* for(k=0;k<4;k++) {printf (" %d  ", essai.toto[k]);} */              return essai;
                     }
 
 
 
 
                               
           
          tab cle() {
          int a,b,c,d; tab key;char coul;
 
 
 
                printf ("     r pour rouge    j pour jaune   b pour blanc   \n  " );
 
         printf ("   v pour vert    n pour noir    c pour cyan  \n  \n" );
 
         printf ("Vous n'avez pas le droit de mettre deux fois la meme couleur dans la clé \n \n" );
 
 
 
         
         printf(" tapez le code couleur pour l'emplacement numero 1  " );
 
       scanf("%c", &coul);
                            a=conv(coul);
                             scanf("%c", &coul);
                            key.toto[0]=a;
                            printf("%c ", coul);
                            printf("%d",a);
 
             
       
                       printf("\n tapez le code couleur pour l'emplacement numero 2  " );
 
         scanf("%c", &coul);
                              b=conv(coul);
                              scanf("%c", &coul);
                              printf("%c ", coul);
                              printf("%d", b)
 
  /*             while (b!=a) {
                           printf (" \n Vous avez déja utilisé cette couleur \n " );
      printf(" re-tapez le code couleur pour l'emplacement numero 2  " );
 
      scanf("%c", &h);
                           b=conv(h);
                          scanf("%c", &h);}
       key.toto[1]=b;
           
 
 
               printf("\n tapez le code couleur pour l'emplacement numero 3  " );
 
         scanf("%c", &h);
                              c=conv(h);
                              scanf("%c", &h);
 
 
 while ((c!=a) && (c!=b) ) {
 
                             printf ("\n Vous avez déja utilisé cette couleur \n " );
       printf("\n re-tapez le code couleur pour l'emplacement numero 3  " );
 
       scanf("%c", &h);
                            c=conv(h);
                            scanf("%c", &h);}
 
       key.toto[2]=c;
 
 
 
                            printf("\n tapez le code couleur pour l'emplacement numero 4  " );
 
         scanf("%c", &h);
                              d=conv(h);
                              scanf("%c", &h);
 
 
     while ((d==a) && (d==b) && (d==c) ) {
 
        printf (" \n Vous avez déja utilisé cette couleur \n " );
    printf(" \n re-tapez le code couleur pour l'emplacement numero 4  " );
 
     scanf("%c", &h);
                         d=conv(h);
                           scanf("%c", &h);}
       key.toto[3]=d; */
 
                           return key ;}
 
 
 
 
 
 
 
 
     
    tab generation (){
 
 
        int a,b,c,d;tab rep;srand( time(NULL) );
 
 
 
                      a=rand()%6;
                 /* printf("%d  ",a) */
                  ;rep.toto[0]=a;
                     srand( time(NULL) );
                            b=a;
 
    while (b==a){  
 
                        b=rand()%6;};
                        rep.toto[1]=b;
                     /* printf("%d  ",b) */ ;
                      srand( time(NULL) );
                              c=b;
 
    while (c==a || c==b ){
                         c=rand()%6;};
                         rep.toto[2]=c;  
                       /* printf("%d  ",c) */  
                      ;srand( time(NULL) );
                             d=c;
 
      while (d==a || d==b || d==c){
                          d=rand()%6;};
                         rep.toto[3]=d;
                         /* printf("%d  ",d) */ ;
                        srand( time(NULL) );
                          return rep;
 
 
                }
 
                 
           int bienplaces (tab a, tab b) /* donne le nombre de couleurs bien placées*/{
 
              int i,j;j=0;
 
               for(i=0;i<4;i++){
 
        if (a.toto[i]==b.toto[i]) j++;
                           }
            return j;}
 
 
 
 
         int malplaces (tab p, tab r) { /*p sera une proposition, r sera la réponse a trouver*/
 
  int a,c,b,d,i,w,x,y,z;i=0;
 
     
                           a=r.toto[0];
                           b=r.toto[1];
                           c=r.toto[2];
                           d=r.toto[3];
     
                           w=p.toto[0];
                           x=p.toto[1];
                           y=p.toto[2];
                           z=p.toto[3];
 
  if ( (w!=a) && ( (w==b) ||( w==c) || (w==d) ) ) i++;
                   
  if ( (x!=b) && ( (x==a) || (x==c)  || (x==d) ) ) i++;
     
  if ( ( y!=c) && ( (y==a) || (y==b) || (y==d) ) ) i++;
     
  if ( (z!=d) && ( (z==a ) ||  (z==c) || (z==b) ) ) i++;
 
                                                                     return i;   }
 
 
 
                   
     
     
         void recap (tab j, int y) { /*recapitule l'essai de l'utilisateur au yème coup */
  int i,p,t;
     
printf ("Voici Votre Proposition N° %d :    ", t);
 
     for (i=0;i<4;i++) {
 
                           p=j.toto[i];
   switch(p){
                               
                           case 0 : {printf ("rouge " );break;}
 
             case 1 :{ printf ("jaune " );break;}
 
             case 2 : {printf ("blanc " );break;}
 
              case 3 : {printf ("vert " );break;}
 
             case 4 : {printf ("noir " );break;}
 
             case 5 : {printf ("cyan " );break;}
                                    default : {printf("beti" );break;}
                                                                  }  }  printf ("\n \n" );}
 
 
   
   
 void bpmp(int i, int j){ /*cette fonction donnera a l'utilisateur le nombre de couleurs bien placés et mal placés */
     
       printf ("Vous avez %d couleur(s) bien placée(s) et %d couleur(s) mal placée(s) \n \n", i,j);
     
 
                   }
 
 
 
     int increm (int i){
  int j;
 
 
                       switch(i){
                       case 0 : {j=i++;break;}
 
                       case 1 :{j=i++;break;}
 
         case 2 : {j=i++;break;}
 
         case 3 : {j=i++;break;}
 
         case 4 : {j=i++;break;}
 
         case 5 : {j=0;break;}
                             default : {printf("beti" );break;}  }
                                                         
                                                       return j ; }
 
             
             
             
     
          /*  tab resol  (tab ancien , int i , int j) {
 
  int a,b,c,d,k;
 
   a=ancien.toto[0];
                        b=ancien.toto[1];
                        c=ancien.toto[2];
                        d=ancien.toto[3];
 
 
    */
 
     
 
 
 
 
       int main (int argc,char**argv)  {
    tab rep /* la rŽponse*/ ;
      int palette[6];
 
   tab indic;
   tab essai;tab k,key;char choix;
                int i,j,b,m,compt;compt=1;
 
  for (i=0;i<=5;i++) {
 
           palette[i]=i;};
 
 
  /*rouge=r=0   jaune=j=1   blanc=b=2
 
    vert=v=3    noir=n=4    cyan=c=5  */
 
     printf(" \n  \n " );
 
     printf ("               " );
 
     printf (" _____----MASTERMIND----____ \n \n" );
     
 
 
    printf ("Voulez vous etre le maitre du jeu??? \n          tapez o pour oui, n pour non      " );
 
                scanf("%c", &choix);  
           
            switch (choix){
     
 
                    case  'n' : { scanf("%c", &choix);
                                    rep=generation();
                                       printf("\n" );
                                         printf ("     r pour rouge    j pour jaune   b pour blanc   \n  " );
                                        printf ("   v pour vert    n pour noir    c pour cyan  \n  \n" );
 
                             do {k=saisie();
                             recap ( k, compt );
                             b=bienplaces(rep , k );
                              m=malplaces(rep , k );
      bpmp(b,m);compt++;
      }
  while (compt <30); break ;}
 
 
  case 'o' : {key=cle();break;}
 
                default : {printf("Au revoir \n  \n" );break;} }
 
 
return 0;
 
}


Message édité par iolsi le 19-06-2004 à 01:36:17

---------------
Wenger m'a violé :/
Reply

Marsh Posté le 18-06-2004 à 23:36:15   

Reply

Marsh Posté le 19-06-2004 à 00:09:16    

je te debug ça pour demain


---------------
What if I were smiling and running into your arms? Would you see then what I see now?  
Reply

Marsh Posté le 19-06-2004 à 00:16:04    

merci
 
bah je pense que y'a pas grand chose a faire, juste quelques trucs de routiers a connaitre
 
j'ai mis en gras ce que le prof avait fait comme manip, je l'ai refait partout mais ca n'a pas marché:
 
for(i=0;i<4;i++){  
        printf(" tapez le code couleur pour l'emplacement numero %d : \n ", i+1);  
                    scanf("%c", &caract);  
 
               j=conv(caract);  
               scanf("%c", &caract) ;


Message édité par iolsi le 19-06-2004 à 00:17:24

---------------
Wenger m'a violé :/
Reply

Marsh Posté le 19-06-2004 à 00:23:38    

et j'ai lu qu'on pouvait mettre des "fflush(stdin)" partout, c'est préconisé ou pas??
 
edit: j'ai essayé et ca change rien


Message édité par iolsi le 19-06-2004 à 00:34:47

---------------
Wenger m'a violé :/
Reply

Marsh Posté le 19-06-2004 à 00:38:56    

à mon avis, tu dois dépasser la mémoire allouée quand tu fais le scanf. La taille de caract est peut-être en cause.
 
edit : finalement, j'installe cygwin, peut etre que je vais pouvoir t'aider avant l'an 3000.


Message édité par jotb le 19-06-2004 à 00:39:33

---------------
L'Europe sera définitivement foutue quand les USA auront gagné la Coupe du Monde de foot...
Reply

Marsh Posté le 19-06-2004 à 00:46:04    

j'essaye de rentre le truc + présentable mais c'est chaud :/


---------------
Wenger m'a violé :/
Reply

Marsh Posté le 19-06-2004 à 00:51:39    

iolsi a écrit :

j'essaye de rentre le truc + présentable mais c'est chaud :/


 
tu utilises quel soft pour éditer ton programme ?


---------------
L'Europe sera définitivement foutue quand les USA auront gagné la Coupe du Monde de foot...
Reply

Marsh Posté le 19-06-2004 à 00:54:01    

jotb a écrit :

tu utilises quel soft pour éditer ton programme ?


kwrite, je connais que ca, a la fac on "travaille" sur mac


---------------
Wenger m'a violé :/
Reply

Marsh Posté le 19-06-2004 à 01:01:28    

iolsi a écrit :

kwrite, je connais que ca, a la fac on "travaille" sur mac


 
ah, tu es sous linux là ?


---------------
L'Europe sera définitivement foutue quand les USA auront gagné la Coupe du Monde de foot...
Reply

Marsh Posté le 19-06-2004 à 01:06:46    

j'ai une partition linux, j'ai rien dessus sauf mastermind.c :sol:


---------------
Wenger m'a violé :/
Reply

Marsh Posté le 19-06-2004 à 01:06:46   

Reply

Marsh Posté le 19-06-2004 à 01:09:41    

iolsi a écrit :

j'ai une partition linux, j'ai rien dessus sauf mastermind.c :sol:


ok
pour ma part, j'ai réussi à installer cygwin + gcc, je vais pouvoir compiler ton fichier.


---------------
L'Europe sera définitivement foutue quand les USA auront gagné la Coupe du Monde de foot...
Reply

Marsh Posté le 19-06-2004 à 01:11:50    

jotb a écrit :

ok
pour ma part, j'ai réussi à installer cygwin + gcc, je vais pouvoir compiler ton fichier.


on continue en mp pour pas embeter les gens, on est pas sur le topik foot ici :/


---------------
Wenger m'a violé :/
Reply

Marsh Posté le 19-06-2004 à 09:00:46    

iolsi a écrit :

et j'ai lu qu'on pouvait mettre des "fflush(stdin)" partout, c'est préconisé ou pas??


 :o Faîtes en sorte que Taz ne tombe pas là dessus ...  :whistle:

Reply

Marsh Posté le 19-06-2004 à 09:47:14    

Cricri_ a écrit :

:o Faîtes en sorte que Taz ne tombe pas là dessus ...  :whistle:


 
je suis d'accord, le fflush n'est pas quelque chose de magnifiquement portable.


---------------
L'Europe sera définitivement foutue quand les USA auront gagné la Coupe du Monde de foot...
Reply

Marsh Posté le 19-06-2004 à 09:56:06    

C'est surtout que ça ne sert à rien sur stdin ...

Reply

Marsh Posté le 19-06-2004 à 10:34:24    

c'est fflush(STDOUT) :o


---------------
.
Reply

Marsh Posté le 19-06-2004 à 13:06:31    

bon bah merci a jotb qui m'a trouvé une macro qui a l'aire de marcher
 
#define CLEAR_STDIN { int c; while((c = getchar()) && (c != '\n')) {} }
 
 
c'est pas la peine de clore le topik, j'aurai surement d'autres problemes (enfin... j'espere pas)
 
merci


---------------
Wenger m'a violé :/
Reply

Marsh Posté le 19-06-2004 à 13:07:08    

Cricri_ a écrit :

C'est surtout que ça ne sert à rien sur stdin ...


ouais ca sert a rien en plus, mais j'avais lu ce truc sur pas mal de sites (et ici :D)


---------------
Wenger m'a violé :/
Reply

Marsh Posté le 19-06-2004 à 18:31:05    

iolsi a écrit :

bon bah merci a jotb qui m'a trouvé une macro qui a l'aire de marcher
 
#define CLEAR_STDIN { int c; while((c = getchar()) && (c != '\n')) {} }


 
hummm ca c'est sympa ca, ca peut toujours servir
thx

Reply

Marsh Posté le 19-06-2004 à 18:50:42    

weed a écrit :

hummm ca c'est sympa ca, ca peut toujours servir
thx


http://membres.lycos.fr/cultc/astuces.htm


---------------
Wenger m'a violé :/
Reply

Marsh Posté le 19-06-2004 à 21:00:24    

iolsi, c'est vraiment sympa d'avoir eu le courage de poster ce lien  
je te remercie  
j'ai bookmarké

Reply

Marsh Posté le 19-06-2004 à 21:16:53    

bof, tu ferais bien de tester EOF aussi :o

Reply

Marsh Posté le 19-06-2004 à 21:17:29    

et la une macro surtout pas comme ça. faite une fonction puisque vous ne savez pas faire de macro


Message édité par Taz le 19-06-2004 à 21:19:30
Reply

Marsh Posté le 19-06-2004 à 21:19:15    

en somme cette page ne donne pas de bonne astuce, c'est comme si un paralytique voulait entrainer un courreur

Reply

Marsh Posté le 19-06-2004 à 21:38:22    

weed a écrit :

iolsi, c'est vraiment sympa d'avoir eu le courage de poster ce lien  
je te remercie  
j'ai bookmarké


c'est jotb qui a tout fait, moi je répete [:spamafote]


---------------
Wenger m'a violé :/
Reply

Marsh Posté le 19-06-2004 à 21:40:21    

iolsi a écrit :

c'est jotb qui a tout fait, moi je répete [:spamafote]

ça vous intéresse pas mon avis ?

Reply

Marsh Posté le 19-06-2004 à 21:43:48    

d'autant plus que virer toute une ligne est assez excessif, par contre sauter le jeton courant  me parait plus sain

Reply

Marsh Posté le 19-06-2004 à 22:44:21    

Taz a écrit :

ça vous intéresse pas mon avis ?


si, malheurusement c'est quasiment du chinois pour moi, tu veux que je rajoute un && (c!=EOF) ???


---------------
Wenger m'a violé :/
Reply

Marsh Posté le 19-06-2004 à 22:49:32    

déjà une macro qui a besoin de définir plusieurs instructions, donc un bloc, on la définit __toujours__ avec un  
 

Code :
  1. #define MA_MACRO(X) do { \
  2. instruction1; \
  3. instruction2; \
  4. } while(0)

j'ai bien dit toujours
 
après oui, rajoute un test pour EOF, pas la peine de boucler indéfiniment. ou utilise carrément fgets pourquoi pas. cela dit, si tu compte te servir de ta macro ou fonction par exemple sur une erreur de scanf pour vider la ligne courrante ... ça ne sera pas suffisant, une erreur marque le flux concerné avec un ou des drapeaux d'erreurs, il faudra donc veiller à marquer le flux comme opérationnel, si ça sert à quelque chose (ie. erreur non fatal)


Message édité par Taz le 19-06-2004 à 22:49:48
Reply

Marsh Posté le 20-06-2004 à 00:54:53    

laisse tomber, je crois que tu me surestimmes :D
 
merci quand meme


Message édité par iolsi le 20-06-2004 à 00:55:04

---------------
Wenger m'a violé :/
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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