SVP aide sur prog C
Fermé
Ensteit
-
21 juin 2005 à 18:30
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 - 22 juin 2005 à 20:17
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 - 22 juin 2005 à 20:17
A voir également:
- SVP aide sur prog C
- Robot prog - Télécharger - Édition & Programmation
- Prog dvb - Télécharger - Télévision
- Clear prog - Télécharger - Sécurité
- Problème avec mon p'tit prog! ✓ - Forum PHP
- Prog DVB ne fonctionne plus ✓ - Forum TV & Vidéo
7 réponses
blurk
Messages postés
486
Date d'inscription
vendredi 16 avril 2004
Statut
Membre
Dernière intervention
15 mars 2009
160
21 juin 2005 à 19:19
21 juin 2005 à 19:19
déjà i commence à 1
on a déjà une tentative avant d'avoir joué
ensuite quand on a joué ça incrémente même si on a trouvé,
et on rentre quand même dans la boucle while(i<=6 && trouve==0)
ce qui fait 5 tentatives et non 6
trouve n'étant pas mis à 1 quand le résultat est correct.
Il n'y a pas d'indentation, et comme tout est regroupé
dans la fonction main , avec plus de 7
imbrications, j'ai essayé ton source pas à pas.
il me parait curieux que "trouve=1;" quand on a perdu,
structurellement cela veut dire que ta boucle ne discerne pas
le nombre de "tentatives dépassé" du "résultat trouvé"
la condition:
n'est jamais remplie puisqu'on ne rentre pas dans la boucle, et si on ne rentre pas dans la boucle...
Ce que je peux donc te conseiller, c'est
1 de rendre ton programme plus lisible en respectant l'indentation
et en mettant plus de commentaires
2 faire une fonction pour chaque traitement spécifique
(tester si on a trouvé, chercher ce qui est bien placé, chercher ce qui est mal placé) tu pouras reprendre chaque problème un par un, et il y en a beaucoup.
3 d'exposer plus clairement ton problème, je ne suis même pas sûr
d'avoir compris à quoi sert ton programme (un master mind à 3 chiffres ?)
cordialement
on a déjà une tentative avant d'avoir joué
ensuite quand on a joué ça incrémente même si on a trouvé,
et on rentre quand même dans la boucle while(i<=6 && trouve==0)
ce qui fait 5 tentatives et non 6
trouve n'étant pas mis à 1 quand le résultat est correct.
Il n'y a pas d'indentation, et comme tout est regroupé
dans la fonction main , avec plus de 7
imbrications, j'ai essayé ton source pas à pas.
il me parait curieux que "trouve=1;" quand on a perdu,
structurellement cela veut dire que ta boucle ne discerne pas
le nombre de "tentatives dépassé" du "résultat trouvé"
la condition:
if(t2[k]==t1[j])
n'est jamais remplie puisqu'on ne rentre pas dans la boucle, et si on ne rentre pas dans la boucle...
Ce que je peux donc te conseiller, c'est
1 de rendre ton programme plus lisible en respectant l'indentation
et en mettant plus de commentaires
2 faire une fonction pour chaque traitement spécifique
(tester si on a trouvé, chercher ce qui est bien placé, chercher ce qui est mal placé) tu pouras reprendre chaque problème un par un, et il y en a beaucoup.
3 d'exposer plus clairement ton problème, je ne suis même pas sûr
d'avoir compris à quoi sert ton programme (un master mind à 3 chiffres ?)
cordialement
mamiemando
Messages postés
33079
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
23 avril 2024
7 749
22 juin 2005 à 02:53
22 juin 2005 à 02:53
1) Changer void main() par int main()
2) Rajouter à la fin du main un return 0;
3) Ton tentative 1 se répète en effet pour un nombre en dehors de [100,999].. logique c'est ce que tu as écris.
4) Si tu tapes un nombre entre 100 et 999 boucle infinie (en tout cas chez moi)
5) Le test if(i==7) ne sert à rien
6) Le dernier scanf ne sert à priori à rien.
7) Les while imbriques dans les for -> à changer par des for pour être plus lisibles (et quand tu trouves une correspondance : break;)
La boucle survinait si tu tombais tombais dans un cas ou ca corresponfdait : tu oubliais d'incrémenter j...
8) Si tu travaille avec des '*' il vaudrait mieux travailer avec un char[] pour t1 ce serait plus logique.
2) Rajouter à la fin du main un return 0;
3) Ton tentative 1 se répète en effet pour un nombre en dehors de [100,999].. logique c'est ce que tu as écris.
4) Si tu tapes un nombre entre 100 et 999 boucle infinie (en tout cas chez moi)
5) Le test if(i==7) ne sert à rien
6) Le dernier scanf ne sert à priori à rien.
7) Les while imbriques dans les for -> à changer par des for pour être plus lisibles (et quand tu trouves une correspondance : break;)
for(j=0;j<3;++j){ if(t2[k]==t1[j] &&k==j) { printf("\nTorreau:position%i",(k+1)); t1[j]='*'; break; } } }
La boucle survinait si tu tombais tombais dans un cas ou ca corresponfdait : tu oubliais d'incrémenter j...
8) Si tu travaille avec des '*' il vaudrait mieux travailer avec un char[] pour t1 ce serait plus logique.
Salut mamiemando,
Je te remerci pour ton interet.En ce qui concerne tes remarques:
3)Ve vois pas comment ma 1 tentative se repéte pour un nbr en dehorde[100,999].J'ai pas ecris ca mais plutot le contraire!!!
do{
printf("\n%i Tentative:\t",i); //la saisie du nbr va se repeter tant que le nbr saisie
scanf("%i",&nbr); n'est pas dans l'intervalle[100,999]
}
while(nbr<100 || nbr>1000);
4)c'est la mon probleme!!!
5)Justement pour que programma ne s'arrete pas a lui seul.
6)Tu as raison
8)Jai utiliser While imbriqué pour des objectifs d'optimisation et pour eviter qq iterations qui ne servent a rien.
Dans le cas ou ca correspandait" if(t2[k]==t1[j] &&k==j)" , j'ai mis "existe=1;".Et comme ca je sort du while imbriqué.
9)Je pense qu il y aura une conversion directement au code Ascii dans ce cas '*' est plutot un nbr.
Vraiment je suis bloque dans ce merdier!!!
Merci encore.
Je te remerci pour ton interet.En ce qui concerne tes remarques:
3)Ve vois pas comment ma 1 tentative se repéte pour un nbr en dehorde[100,999].J'ai pas ecris ca mais plutot le contraire!!!
do{
printf("\n%i Tentative:\t",i); //la saisie du nbr va se repeter tant que le nbr saisie
scanf("%i",&nbr); n'est pas dans l'intervalle[100,999]
}
while(nbr<100 || nbr>1000);
4)c'est la mon probleme!!!
5)Justement pour que programma ne s'arrete pas a lui seul.
6)Tu as raison
8)Jai utiliser While imbriqué pour des objectifs d'optimisation et pour eviter qq iterations qui ne servent a rien.
Dans le cas ou ca correspandait" if(t2[k]==t1[j] &&k==j)" , j'ai mis "existe=1;".Et comme ca je sort du while imbriqué.
9)Je pense qu il y aura une conversion directement au code Ascii dans ce cas '*' est plutot un nbr.
Vraiment je suis bloque dans ce merdier!!!
Merci encore.
Timon1102
Messages postés
354
Date d'inscription
jeudi 2 juin 2005
Statut
Membre
Dernière intervention
30 décembre 2010
109
22 juin 2005 à 13:35
22 juin 2005 à 13:35
a tu essaye %d au lieu de %i ?
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
mamiemando
Messages postés
33079
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
23 avril 2024
7 749
22 juin 2005 à 20:17
22 juin 2005 à 20:17
do{
printf("\n%i Tentative:\t",i);
scanf("%i",&nbr); n'est pas dans l'intervalle[100,999]
}
while(nbr<100 || nbr>1000);
do -> fait ce qu'il y a derrière, et répète le tant que la condition while n'est pas vérifié. La condition est donc inversée par rapport au while classique. Le do while garantit le passage au moins une fois dans la boucle contrairement au while...
4)c'est la mon probleme!!!
--> cf 7)
5)Justement pour que programma ne s'arrete pas a lui seul.
Ce test est déjà assuré par le while(i<=6 && trouve==0){
8)Jai utiliser While imbriqué pour des objectifs d'optimisation et pour eviter qq iterations qui ne servent a rien.
Dans le cas ou ca correspandait" if(t2[k]==t1[j] &&k==j)" , j'ai mis "existe=1;".Et comme ca je sort du while imbriqué.
La solution que je te propose est aussi optimale en temps cpu mais plus lisible (car le && en C est paresseux)
AU passage taureau s'écrit taureau ;o)
9)Je pense qu il y aura une conversion directement au code Ascii dans ce cas '*' est plutot un nbr.
En fait il y beaucoup plus simple et beaucoup plus court, mais ta méthode te permet d'apprendre les bases en C.
Tu pourras continuer ta formation (petit scarabée ;o)) en travaillant sur des chaines de caractères (#include <string.h>) :
- tu peux aisément convertir une chaine (char [] ou char*) en entier avec la commande atoi
- tu peux aisément convertir un entier en chaine avec la commande sprintf
- tu peux contrôler ce que l'utilisateur saisit avec un mix de scanf("%s",buffer) + sscanf(buffer,"%i",&lenombre) ou encore une fois avec le code de retour de atoi.
Pour comparer la saisie au code à découvrir, tu peux travailler directement avec machaine[i], mais tu as aussi la fonction strcmp pour comparer deux chaines (qui te retournera à partir de où ça diffère si ça diffère)...
%d et %i c'est à peu de chose près la même chose.
Pour débugger mets des printf de tes variables aux endroits stratégique (entrée dans un boucle, sortie d'une boucle...) ou utilise un débugger (gdb..)
printf("\n%i Tentative:\t",i);
scanf("%i",&nbr); n'est pas dans l'intervalle[100,999]
}
while(nbr<100 || nbr>1000);
do -> fait ce qu'il y a derrière, et répète le tant que la condition while n'est pas vérifié. La condition est donc inversée par rapport au while classique. Le do while garantit le passage au moins une fois dans la boucle contrairement au while...
4)c'est la mon probleme!!!
--> cf 7)
5)Justement pour que programma ne s'arrete pas a lui seul.
Ce test est déjà assuré par le while(i<=6 && trouve==0){
8)Jai utiliser While imbriqué pour des objectifs d'optimisation et pour eviter qq iterations qui ne servent a rien.
Dans le cas ou ca correspandait" if(t2[k]==t1[j] &&k==j)" , j'ai mis "existe=1;".Et comme ca je sort du while imbriqué.
La solution que je te propose est aussi optimale en temps cpu mais plus lisible (car le && en C est paresseux)
AU passage taureau s'écrit taureau ;o)
9)Je pense qu il y aura une conversion directement au code Ascii dans ce cas '*' est plutot un nbr.
En fait il y beaucoup plus simple et beaucoup plus court, mais ta méthode te permet d'apprendre les bases en C.
Tu pourras continuer ta formation (petit scarabée ;o)) en travaillant sur des chaines de caractères (#include <string.h>) :
- tu peux aisément convertir une chaine (char [] ou char*) en entier avec la commande atoi
- tu peux aisément convertir un entier en chaine avec la commande sprintf
- tu peux contrôler ce que l'utilisateur saisit avec un mix de scanf("%s",buffer) + sscanf(buffer,"%i",&lenombre) ou encore une fois avec le code de retour de atoi.
Pour comparer la saisie au code à découvrir, tu peux travailler directement avec machaine[i], mais tu as aussi la fonction strcmp pour comparer deux chaines (qui te retournera à partir de où ça diffère si ça diffère)...
%d et %i c'est à peu de chose près la même chose.
Pour débugger mets des printf de tes variables aux endroits stratégique (entrée dans un boucle, sortie d'une boucle...) ou utilise un débugger (gdb..)