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
Bonjour,
J'ai realiser un programme depuis 3 jours mais je suis coincé dans une anomalie d' exècution.
En effet dans mon programme l'ordinateur choisi au hazad un nbr entre 100 et 999 et vous devez le retrouver élement par element .Si votre element est a la bonne position on vous affichera Torraeu tout en indiquant sa position, mais s'il est a la mauvaise position en vous affichera tout simplement Vache,et s'il n existe pas on vous affichera element inexistant.Vous ete limité par 6 tentatives.
Mon probleme est qu'il n ya pas d'incrementation de nombre de tentative Cad que l'ors de l'execution j'aurais tjs: 1 tentative: ... //jécris ma tentative mais elle se rèpete encore
1 tentative: ...
...
...
J'ai tout essyer mais j'ai pas pu trouver le bonne solution je compte sur votre aide .Je vous fourni mon code source.
Merci d'avance.

#include <stdio.h>
#include<stdlib.h>
#include<time.h>
void main()
{
int p,nbr,i=1,trouve=0,k=0,j=0,pm=0,l=0,existe=0,nb,exis;
int t1[3],t2[3];


srand(time(0));
do{
p=(rand()%1001);
}
while (p<100);
t1[1]=p / 100;
t1[2]=(p %100)/ 10;
t1[3]=(p % 100)% 10;

printf("Principe du jeu:\nVous devez choisir un entier entre 100 et 999 egale a celui choisi par l ordinateur");
printf("\n\n\n=================ca commence===================\n");
printf("%i",p);


while(i<=6 && trouve==0){

do{
printf("\n%i Tentative:\t",i);
scanf("%i",&nbr);
}
while(nbr<100 || nbr>1000);

t2[1]=nbr / 100;
t2[2]=(nbr % 100)/ 10;
t2[3]=(nbr % 100)% 10;

if(nbr==p){
trouve=1;
printf("Bravo!!!Vouz l avez eu en %i tentatives",i);

}
else{
for(k=0;k<3;k++){ //a travers cette boucle je cherche s'il existe des entiers
j=0;existe=0; //se trouvant dans la meme position que ceux choisis par l'ordinateur(Cad je cherche les torreaux)
while(j<3 && existe==0){
if(t2[k]==t1[j]){
if(k==j) {printf("\nTorreau:position%i",(k+1));
t1[j]='*';
existe=1;
}
else j++;
}

}
}
for(pm=0;pm<3;pm++){ //A travers cette boucle je cherche s'ils existe des entiers se trouvant
l=0;exis=0; //dans le nombre choisi par l'ordinateur mais pas a la meme position(Cad je cherche les vaches)
while(l<3 && exis==0){
if(t2[pm]==t1[l]){
if(k!=j) {printf("\nVache:position%i",(pm+1));
t1[l]='*';
exis=1;
}
else l++;
}

}
}

}
i++;
if(i==7){ // car 6 est le nombre des tentatives
printf("Vous avez perdu!!!!\n\nLe nombre cherche est bien le : %i",p);
trouve=1;
}
}
scanf("%i",&nb);
}
A voir également:

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
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:
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
0
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
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;)

                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.
0
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.
0
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
a tu essaye %d au lieu de %i ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Oui, j'ai essye mais rien n'a changer!!!!
Que ferais-je alors????
0
bon je prend ton prog je vais voir ce qui vas pas...
0
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
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..)
0