November 23, 201213 yr 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");}}
November 23, 201213 yr 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 :)
November 23, 201213 yr Author 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
November 23, 201213 yr 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.
November 23, 201213 yr 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");}
November 23, 201213 yr Author 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.
November 23, 201213 yr 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
November 23, 201213 yr 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; } } }}}
November 24, 201213 yr Author 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
November 24, 201213 yr 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
November 24, 201213 yr Author 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 ....
November 24, 201213 yr Author 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
November 24, 201213 yr 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 çà ...
November 24, 201213 yr 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 çà.
November 24, 201213 yr 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
November 24, 201213 yr 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'; }; }
November 24, 201213 yr Author 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?
November 25, 201213 yr 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"
November 27, 201213 yr Author 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
Archived
This topic is now archived and is closed to further replies.