percubabs Posté(e) le 23 novembre 2012 Partager Posté(e) le 23 novembre 2012 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 More sharing options...
Mcpanch Posté(e) le 23 novembre 2012 Partager Posté(e) le 23 novembre 2012 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 More sharing options...
percubabs Posté(e) le 23 novembre 2012 Auteur Partager Posté(e) le 23 novembre 2012 j'ai envie de dire que c'est pas grave c'est le fond du code qui merde, le crochet à du sauté quand j'ai recopié. j'ai modifié c bon mais sa ne fonctionne tjrs pas Lien vers le commentaire Partager sur d’autres sites More sharing options...
Mcpanch Posté(e) le 23 novembre 2012 Partager Posté(e) le 23 novembre 2012 Ok, pas le temps de creuser là, j'essaierai de jeter un oeil ce soir :) Lien vers le commentaire Partager sur d’autres sites More sharing options...
Tiduster Posté(e) le 23 novembre 2012 Partager Posté(e) le 23 novembre 2012 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. Lien vers le commentaire Partager sur d’autres sites More sharing options...
percubabs Posté(e) le 23 novembre 2012 Auteur Partager Posté(e) le 23 novembre 2012 et bien non ce la ne pose pas de problème Lien vers le commentaire Partager sur d’autres sites More sharing options...
foetus Posté(e) le 23 novembre 2012 Partager Posté(e) le 23 novembre 2012 Déja change tes codings styles: Sérieux je vieux de perdre un 1/ 10 ième Et ton code est logique: Effectivement le 2 est à la bonne place -> 'X' 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 More sharing options...
RinDman Posté(e) le 23 novembre 2012 Partager Posté(e) le 23 novembre 2012 Un mastermind ? Lien vers le commentaire Partager sur d’autres sites More sharing options...
percubabs Posté(e) le 23 novembre 2012 Auteur Partager Posté(e) le 23 novembre 2012 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. Lien vers le commentaire Partager sur d’autres sites More sharing options...
foetus Posté(e) le 23 novembre 2012 Partager Posté(e) le 23 novembre 2012 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 Parce qu'il faut retirer de ta clef le nombre recherché/ trouvé. Ton exemple clef: 22341 et test: 56222 Je recherche 5 -> non, résultat: [X], clef: [22341] Je recherche 6 -> non, résultat: [XX], clef: [22341] Je recherche 2 -> oui, mais mal placé, résultat: [XXI], clef: [ _ 2 3 4 1] Je recherche 2 -> oui, mais mal placé, résultat: [XXII], clef: [_ _ 3 4 1] Je recherche 2 -> non, résultat: [XXIIX], clef: [_ _ 3 4 1] Mais il est déjà tard Lien vers le commentaire Partager sur d’autres sites More sharing options...
treflemard Posté(e) le 23 novembre 2012 Partager Posté(e) le 23 novembre 2012 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 More sharing options...
foetus Posté(e) le 23 novembre 2012 Partager Posté(e) le 23 novembre 2012 Voir plus loin Lien vers le commentaire Partager sur d’autres sites More sharing options...
percubabs Posté(e) le 23 novembre 2012 Auteur Partager Posté(e) le 23 novembre 2012 merci je regarde ça demain matin! Lien vers le commentaire Partager sur d’autres sites More sharing options...
percubabs Posté(e) le 24 novembre 2012 Auteur Partager Posté(e) le 24 novembre 2012 foetus, je n'est pas eu le temp de creuser ton code mais pour 11211 et test 22222 il me donne I X X X X... perso je ne trouve pas la solution Lien vers le commentaire Partager sur d’autres sites More sharing options...
foetus Posté(e) le 24 novembre 2012 Partager Posté(e) le 24 novembre 2012 foetus, je n'est pas eu le temp de creuser ton code mais pour 11211 et test 22222 il me donne I X X X X... perso je ne trouve pas la solution C'est logique il faut réfléchir un peu. J'ai édité mon code au dessus Lien vers le commentaire Partager sur d’autres sites More sharing options...
percubabs Posté(e) le 24 novembre 2012 Auteur Partager Posté(e) le 24 novembre 2012 tu aurais la gentillesse d m’expliquer? j'ai inversé les X et les O, j’obtiens ce que je veux pour 11211 et 22222, je vais tester pour d'autre edit tjrs pas.... cet algo commence à me faire .... Lien vers le commentaire Partager sur d’autres sites More sharing options...
percubabs Posté(e) le 24 novembre 2012 Auteur Partager Posté(e) le 24 novembre 2012 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 More sharing options...
treflemard Posté(e) le 24 novembre 2012 Partager Posté(e) le 24 novembre 2012 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 More sharing options...
treflemard Posté(e) le 24 novembre 2012 Partager Posté(e) le 24 novembre 2012 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 More sharing options...
RinDman Posté(e) le 24 novembre 2012 Partager Posté(e) le 24 novembre 2012 T'inquiètes, en 1er année de licence math-info aussi Je vais voir mon code en profondeur ^^, d'ailleurs on devait implémenter une interface graphique omg XD Lien vers le commentaire Partager sur d’autres sites More sharing options...
foetus Posté(e) le 24 novembre 2012 Partager Posté(e) le 24 novembre 2012 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 More sharing options...
percubabs Posté(e) le 24 novembre 2012 Auteur Partager Posté(e) le 24 novembre 2012 merci beaucoup foetus! est ce que tu pourrais m'expliquer cela plus en détaille, j'aimerai bien comprendre. for(index2 = 0, is_found = 0; ((index2 < size) && (!is_found)); index2++) le '!' dans !is_found, quel est sa fonction? Lien vers le commentaire Partager sur d’autres sites More sharing options...
foetus Posté(e) le 25 novembre 2012 Partager Posté(e) le 25 novembre 2012 for(index2 = 0, is_found = 0; ((index2 < size) && (!is_found)); index2++) le '!' dans !is_found, quel est sa fonction? Ahahahahahahhahahahahahah 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 ] Mais en C la valeur "0" c'est faux ("false"), et tout le reste c'est vrai ("true"). 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" Lien vers le commentaire Partager sur d’autres sites More sharing options...
percubabs Posté(e) le 25 novembre 2012 Auteur Partager Posté(e) le 25 novembre 2012 thx Lien vers le commentaire Partager sur d’autres sites More sharing options...
percubabs Posté(e) le 27 novembre 2012 Auteur Partager Posté(e) le 27 novembre 2012 for(index2 = 0, is_found = 0; ((index2 < size) && (!is_found)); index2++) le '!' dans !is_found, quel est sa fonction? Ahahahahahahhahahahahahah 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 More sharing options...
Messages recommandés
Archivé
Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.