[C] Y'a un truc qui foire dans 1 soft (problème résolu)

Y'a un truc qui foire dans 1 soft (problème résolu) [C] - Programmation

Marsh Posté le 30-03-2002 à 17:01:36    

Salut,
 
Ca fait pas mal de temps que je tourne en rond avec la fonction ci-dessous.  Elle sert à comparer deux séries de 'dim' chiffres placés dans 2 vecteurs Tableau[1] & Tableau[2]
J'aimerais obtenir :
Ch_bien_place : nbre de chiffres à la bonne position  
Ch_mal_place : nbre de chiffres présents dans les 2 vecteurs mais à la mauvaise place
 
Ca tourne mais y'a des bugs, et je n'arrive pas à voir pourquoi ils apparaissent.  D'autant plus que si je fais le déroulement "sur papier", ça marche...
 
par exemple :  
3 3 5 5 1
5 3 5 1 3
--> 2 ch bien places et 2 ch mal places (3 en réalité)
 
3 7 9 2 2 6
6 7 9 3 2 2
--> 3 ch bien places et 2 mal places (3 en réalité)
 
 
void tester_solution(int tableau1[],int tableau2[],int dim,int *ch_bien_places,int *ch_mal_places)
{
 int i,j;
 *ch_bien_places=*ch_mal_places=0 ;
 for(i=0;i<dim;i++)
 { if(tableau1[i]==tableau2[i])
  { *ch_bien_places=*ch_bien_places+1 ;
   tableau1[i]=-1 ;
   tableau2[i]=-2 ;
  }
  else
  { for(j=0;j<dim;j++)
   { if(tableau1[i]==tableau2[j])
    { if(tableau1[j]==tableau2[j]) break ;
          *ch_mal_places=*ch_mal_places+1 ;
     tableau1[i]=-3 ;
     tableau2[j]=-4 ;
    }
   }
  }
 }
}

 
 
Si vous avez ne fut-ce que la moindre hypothèse...

 

[jfdsdjhfuetppo]--Message édité par eniac--[/jfdsdjhfuetppo]


---------------
If you really want something, all the Universe conspires in helping you to achieve it.
Reply

Marsh Posté le 30-03-2002 à 17:01:36   

Reply

Marsh Posté le 30-03-2002 à 18:01:37    

Citation :

if(tableau1[j]==tableau2[j]) break ;


 
ce ne serait pas un continue a la place d'un break?
 
LEGREG

Reply

Marsh Posté le 30-03-2002 à 18:42:35    

eniac a écrit a écrit :

 
 
void tester_solution(int tableau1[],int tableau2[],int dim,int *ch_bien_places,int *ch_mal_places)
{
 int i,j;
 *ch_bien_places=*ch_mal_places=0 ;
 for(i=0;i<dim;i++)
 { if(tableau1[i]==tableau2[i])
  { *ch_bien_places=*ch_bien_places+1 ;
   tableau1[i]=-1 ;
   tableau2[i]=-2 ;
  }
  else
  { for(j=0;j<dim;j++)
   { if(tableau1[i]==tableau2[j])
    { if(tableau1[j]==tableau2[j]) break ;
          *ch_mal_places=*ch_mal_places+1 ;
     tableau1[i]=-3 ;
     tableau2[j]=-4 ;
    }
   }
  }
 }
}

 




 
Moi je ferais ça comme ça :
 
void tester_solution(int tableau1[],int tableau2[],int dim,int *ch_bien_places,int *ch_mal_places)
{
 int i,j;
 *ch_bien_places=*ch_mal_places=0 ;
 for(i=0;i<dim;i++)
 { if(tableau1[i]==tableau2[i])
  { *ch_bien_places=*ch_bien_places+1 ;
   tableau1[i]=-1 ;
   tableau2[i]=-2 ;
  }
  else
  { for(j=0;j<dim;j++)
   {      
         if (i!=j)  
                if(tableau1[i]==tableau2[j])
               {
                          *ch_mal_places=*ch_mal_places+1 ;
                     tableau1[i]=-3 ;
                     tableau2[j]=-4 ;
               }
   }
  }
}
}

 

[jfdsdjhfuetppo]--Message édité par procat--[/jfdsdjhfuetppo]


---------------
[:procat]
Reply

Marsh Posté le 30-03-2002 à 20:54:25    

legreg > je ne pense pas, en fait c'est pour ne pas incrémenter ch_mal_places si j'ai déjà incrémenté ch_bien_places
 
procat > ça me semble correct et plus clair que ma manière, je vais tester voir si ça marche et je redirai quoi
 
Thanks A+


---------------
If you really want something, all the Universe conspires in helping you to achieve it.
Reply

Marsh Posté le 30-03-2002 à 21:50:19    

eniac a écrit a écrit :

legreg > je ne pense pas, en fait c'est pour ne pas incrémenter ch_mal_places si j'ai déjà incrémenté ch_bien_places
 




 
break = sortie de la boucle
continue = "annuler" l'itération courante et retourner dans le for pour l'intération suivante.


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 31-03-2002 à 00:36:24    

eniac a écrit a écrit :

legreg > je ne pense pas, en fait c'est pour ne pas incrémenter ch_mal_places si j'ai déjà incrémenté ch_bien_places




 
c'est donc bien ce que je te conseillais.
 
bon je vais derouler l'algo:
123
321
 
le premier 3 n'est pas bien place
je regarde s'il est mal place:
pas de bol 2 est bien place
donc je quitte la boucle
et je ne verrai pas le 3 de la ligne du dessus
donc je ne compterai pas 3 comme mal place.
 
Ce qu'il fallait faire:
le 3 de la ligne du dessous n'est pas bien place,
je regarde s'il est mal place:
je saute 2 = 2 pour ne pas le compter deux fois
mais je CONTINUE la boucle,
hop je tombe sur un 3 la au dessus :
ok mon 3 du dessous etait mal place.
etc..
 
bon c'est peut etre pas la methode la plus simple.
mais ca fera surement marcher ton programme
break -> continue;
 
LEGREG

Reply

Marsh Posté le 31-03-2002 à 12:26:38    

procat > ta méthode ne marche pas non plus
 
Pour le continue/break j'avais pas vu ça comme ça, à vrai dire j'étais persuadé du contraire :(  
je vais essayer par moi même voir ce que ça donne dans un soft plus simple
 
Grand merci de m'avoir remis dans le droit chemin  :jap:


---------------
If you really want something, all the Universe conspires in helping you to achieve it.
Reply

Marsh Posté le 31-03-2002 à 13:41:44    

Ok, ça a fait "tilt"
 
Ca marche nickel, je pense avoir testé tous les cas de figure possible et ça affiche la bonne solution à chaque fois.
 
Merci à vous Bye


---------------
If you really want something, all the Universe conspires in helping you to achieve it.
Reply

Marsh Posté le 31-03-2002 à 13:56:30    

...

 

[jfdsdjhfuetppo]--Message édité par ramirez--[/jfdsdjhfuetppo]

Reply

Sujets relatifs:

Leave a Replay

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