Jump to content

aide en C


Recommended Posts

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");}}
Link to comment
Share on other 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 :)

Link to comment
Share on other sites

Moi je vois une erreur ici : while (saisieJ[i] != combiBase[j] && j != 5)

Quand j vaudra 5, ton programme va tenter de comparer saisieJ(i) avec combiBase(5) qui n'existe pas.

Lire en dehors d'un tableau, ça devrais te lâcher une bonne exception lors du debug d'ailleurs.

Link to comment
Share on other 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");}
Link to comment
Share on other sites

et ouai, vive le bts sio!

désolé foetus mais ça fonctionne encore moins bien!

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.

Link to comment
Share on other 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:

Link to comment
Share on other 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;   }  } }}}
Link to comment
Share on other 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

Link to comment
Share on other 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 çà ...

Link to comment
Share on other 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 çà.

Link to comment
Share on other 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'; }; }
Link to comment
Share on other 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:

Link to comment
Share on other 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

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.

×
×
  • Create New...