Aller au contenu

aide en C


percubabs

Messages recommandés

bonjour

Je galère à écrir une fonction

Voici mon code

Il me donne bien les X quand le chiffre est a la bonne place mais il ne gère pas bien les occurence exmple :

pour un code secret 1 1 2 1 1 et un essai joueur 2 2 2 2 2, le résultat devrais être O O X O O mais il me donne I IXI I

merci de votre aide!

void compare(char resulCompare[], int combiBase[],int saisieJ[] ){int i = 0;int T = 0;int j = 0;for(i = 0; i < 5; i++){if (saisieJ[i] == combiBase[i]){resulCompare[i] = 'X';}else{j = 0;while (saisieJ[i] != combiBase[j] && j != 5){j = j+1;}if (j == 5){resulCompare[i] = ' ';}else{resulCompare[i] = 'I';}}for(i = 0; i < 5; i++){printf("[%c]", resulCompare[i]);}printf("\n");}}
Lien vers le commentaire
Partager sur d’autres sites

Hello,

Je sais pas si c'est ton soucis, et je dois avouer que j'ai pas creusé des masses, mais je vois déjà un truc qui va merder :

for(i = 0; i < 5; i++)

{

if (saisieJ[i] == combiBase[i])

{

resulCompare[i] = 'X';

}

}

else

{

Ton else ne correspond pas au niveau des fermetures de crochets à la fin du if.

Tu fermes ta boucle for, et le if est à l'intérieur du for. Donc soit le else est mal placé, soit tu fermes pas ta boucle for au bon endroit :)

Lien vers le commentaire
Partager sur d’autres sites

Déja change tes codings styles: Sérieux je vieux de perdre un 1/ 10 ième

Et ton code est logique:

  1. Effectivement le 2 est à la bonne place -> 'X'
  2. Et pour chaque 1, il n'y a que 4: donc il te colle un 'I'

Et pour la peine:

void compare(char resulCompare[], int combiBase[],int saisieJ[] ) {int i = 0, T = 0, j = 0;for(i = 0; i < 5; i++) {	if (saisieJ[i] == combiBase[i]) {		resulCompare[i] = 'X';	} else {		for(j = 0; ((j < 5 ) && (saisieJ[j] != combiBase[j])); j++) {}		resulCompare[i] = ((j < 5)? 'I': ' ');	}}for(i = 0; i < 5; i++) {	printf("[%c]", resulCompare[i]);}printf("\n");}
Lien vers le commentaire
Partager sur d’autres sites

pour être précis pour une clé 22341 et un test 56222

je devrais trouver O O I I O

et je trouve OO I I I.

vous voyez mon problème?

je n'arrive pas à contrôler le nombre de fois ou le même chiffre apparaît.

Et ouis c'est encore logique :siffle:

Parce qu'il faut retirer de ta clef le nombre recherché/ trouvé. Ton exemple clef: 22341 et test: 56222

  1. Je recherche 5 -> non, résultat: [X], clef: [22341]

  2. Je recherche 6 -> non, résultat: [XX], clef: [22341]

  3. Je recherche 2 -> oui, mais mal placé, résultat: [XXI], clef: [ _ 2 3 4 1]

  4. Je recherche 2 -> oui, mais mal placé, résultat: [XXII], clef: [_ _ 3 4 1]

  5. Je recherche 2 -> non, résultat: [XXIIX], clef: [_ _ 3 4 1]

Mais il est déjà tard :transpi:

Lien vers le commentaire
Partager sur d’autres sites

Salut,

il faut que tu "marques" quel chiffre as déjà "matché" dans la combinaison..

un code rapidos, l'idée est là mais le code peut être pas ... çà fait longtemps que je n'ai pas toucher de C

for(i = 0; i < 5; i++){chiffredejautilise[i]=0;if (saisieJ[i] == combiBase[i]){ resulCompare[i] = 'X'; chiffredejautilise[i]=1;}}int k=0;for(i = 0; i < 5; i++){if (chiffredejautilise[i]== 0){ for (k=i;k<5;k++){  if (chiffredejautilise[k]== 0)  {   if (saisieJ[k] == combiBase[i])   {   resulCompare[k] = 'X';   chiffredejautilise[k]=1;   }  } }}}
Lien vers le commentaire
Partager sur d’autres sites

Salut,

il faut que tu "marques" quel chiffre as déjà "matché" dans la combinaison..

un code rapidos, l'idée est là mais le code peut être pas ... çà fait longtemps que je n'ai pas toucher de C

for(i = 0; i < 5; i++){chiffredejautilise[i]=0;if (saisieJ[i] == combiBase[i]){ resulCompare[i] = 'X'; chiffredejautilise[i]=1;}}int k=0;for(i = 0; i < 5; i++){if (chiffredejautilise[i]== 0){ for (k=i;k<5;k++){  if (chiffredejautilise[k]== 0)  {if (saisieJ[k] == combiBase[i]){resulCompare[k] = 'X';chiffredejautilise[k]=1;}  } }}}

je n'arrive pas a run ton code pour le tester, je ne trouve pas l'erreur

Lien vers le commentaire
Partager sur d’autres sites

Salut,

je n'ai pas fait de C depuis un moment et je ne suis pas sur mon ordi donc difficile de t'aider ... ( j'ai un mastermind codé en C théoriquement sur mon ordi ... ) mais l'idée pour que çà marche est plus ou moins bonne ..

il manque dans mon code, les "impressions" du resultats ..

il faudrait également mettre le tableau resulcompare à 0 au début ....

je vais essayer mon code mais si je ne trouve pas j'ai pas trop le temps de m'y mettre plus que çà ...

Lien vers le commentaire
Partager sur d’autres sites

Salut,

il me semble que çà marche ... fait à l'arrache. désolé pas eu le temps de commenter mais j'ai gardé pour l'essentiel tes noms de variables.

#include <stdlib.h>#include <stdio.h>int main() {int combiBase[5];combiBase[0] = 1;combiBase[1] = 1;combiBase[2] = 2;combiBase[3] = 1;combiBase[4] = 1;int saisieJ[5];saisieJ[0] = 2;saisieJ[1] = 2;saisieJ[2] = 2;saisieJ[3] = 2;saisieJ[4] = 2;int resulCompare[5];void compare(int resulCompare[], int combiBase[],int saisieJ[] ){int i = 0;int T = 0;int j = 0;int k=0;int chiffredejautilise[5];int trouve = 0;for(i = 0; i < 5; i++){chiffredejautilise[i]=0;resulCompare[i] = 0;}for(i = 0; i < 5; i++){ trouve = 0;  for (k=i;k<5;k++){ if (chiffredejautilise[k]== 0 && trouve == 0) {  if (saisieJ[k] == combiBase[i])  {  resulCompare[k] = 1;  chiffredejautilise[k]=1;  trouve = 1;  } } }}}compare( resulCompare,  combiBase, saisieJ );int i;for(i = 0; i < 5; i++){printf("[%d]", resulCompare[i]);}printf("\n");for(i = 0; i < 5; i++){printf("[%d]", saisieJ[i]);}printf("\n");for(i = 0; i < 5; i++){printf("[%d]", combiBase[i]);}printf("\n");}

Mais je n'ai pas plus testé que çà.

Lien vers le commentaire
Partager sur d’autres sites

tu aurais la gentillesse d m’expliquer?

Voila ce que j'ai fait:

1 premier parcours pour rechercher les biens placés:

 for(index1 = 0; index1 < size; index1++) {if (test[index1] == key[index1]) {  result[index1] = '0';  key[index1] = FAKE_NUMBER;} }

Ensuite, il faut un deuxième parcours pour marquer les mal-placés et ceux qui ne sont pas dans la clef:

 for(index1 = 0; index1 < size; index1++) {  // Si c'est un "bien placé" on passe au suivant :-)if (key[index1] == FAKE_NUMBER) { continue; }// On va parcourir la clef pour voir si test[index1] est présentfor(index2 = 0, is_found = 0; ((index2 < size) && (!is_found)); index2++) {  if (test[index1] == key[index2]) {	result[index1] = 'I';	key[index2] = FAKE_NUMBER;	is_found = 1;   }}   // test[index1] n'est pas présent dans la clefif (!is_found) { result[index1] = 'X'; }; }
Lien vers le commentaire
Partager sur d’autres sites

for(index2 = 0, is_found = 0; ((index2 < size) && (!is_found)); index2++)

le '!' dans !is_found, quel est sa fonction?

Ahahahahahahhahahahahahah :transpi:

C'est l'opérateur "NOT" -> NOT(true) -> false, NOT(false) -> true

C'est simple sauf que ... en C il n'y a pas de type booléen [de base pour les coupeurs de poils de fion en 10 :siffle:]

Mais en C

  1. la valeur "0" c'est faux ("false"), et tout le reste c'est vrai ("true").

  2. Il y a des simplifications de tests: "if (!a) {...}" correspond à "if (a == 0) {...}" et "if (a) {...}" correspond à "if (a != 0) {...}"

Donc tout cela pour dire que:

  • "is_found = 0" -> on met "false" dans is_found

  • "is_found = 1" -> on met "true" dans is_found

  • "if (!is_found) {...}" -> "if (is_found == 0) {...}". On teste si is_found vaut "false"

  • "if (is_found) {...}" -> "if (is_found != 0) {...}". On teste si is_found vaut "true"

Donc, la condition de la boucle est "tant que je ne déborde pas et tant que je n'est pas trouvé la valeur"

PS: C'est super clair "until it's not found" :dix:

Lien vers le commentaire
Partager sur d’autres sites

for(index2 = 0, is_found = 0; ((index2 < size) && (!is_found)); index2++)

le '!' dans !is_found, quel est sa fonction?

Ahahahahahahhahahahahahah :transpi:

salut! marche pas!!!

pour key 4.0.3.6.5

test 0.5.6.3.4

je trouve I. . I . . I

au lieu de I.I.I.I.I

de plus la boucle ne rentre pas ici

if (!is_found) {  result[index1] = 'O'; }

X bien placé I mal placé, 0 mauvais ou sexiste pas

Lien vers le commentaire
Partager sur d’autres sites

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...