Forum de discussion

Problème dans une fonction saisie

#1

Bonjour

J’ai un problème dans une fonction saisie en C.
Voici le problème:
Je pars d’un tableau 5x5 cases remplis par des +,- et =.
Il y a donc en tout 9 variables que j’appelle (A,B,C,D,E,F,G,H,I). Le joueur au moment de la saisie doit entrer 3 valeurs les autres qui sont inconnues sont mises a -1.
La fonction saisie fonctionne mais j’aurais voulue l’améliorer par exemple si le joueur entre plus de 3 chiffres ou moins de 3 chiffres sa se remet au début .

Voici ce que j’ai fait:
int saisie_tableau (intA, intB, intC, intD, intE, intF, intG, intH, int*I){
int x=0,y=0,z=0,w=0,l=0,t=0,v=0,k=0,s=0;
printf("[A] [+] [B] [=] [C]\n");
printf("[-] [¤] [+] [¤] [-]\n");
printf("[D] [+] [E] [=] [F]\n");
printf("[=] [¤] [=] [¤] [=]\n");
printf("[G] [-] [H] [=] [I]\n");
printf(“Pour jouer il suffit de compléter le tableau avec 3 chiffres différents lorsque le chiffre est inconnu tapez -1\n”);
printf(“Entrez la valeur de A\n”);
scanf("%i", A);
printf(“Entrez la valeur de B\n”);
scanf("%i", B);
printf(“Entrez la valeur de C\n”);
scanf("%i", C);
printf(“Entrez la valeur de D\n”);
scanf("%i", D);
printf(“Entrez la valeur de E\n”);
scanf("%i", E);
printf(“Entrez la valeur de F\n”);
scanf("%i", F);
printf(“Entrez la valeur de G\n”);
scanf("%i", G);
printf(“Entrez la valeur de H\n”);
scanf("%i", H);
printf(“Entrez la valeur de I\n”);
scanf("%i", I);
if(A>=0){ x=x+1; printf(“x %i”,x); }else{ x=0; printf(“a %i”,x);}
if(B>=0){ y=x+1; printf(“y %i”,y);}else{ y=x;}
if(C>=0){ z=y+1; printf(“z %i”,z);}else{ z=y;}
if(D>=0){ w=z+1; printf(“w %i”,w);}else{ w=z;}
if(E>=0){ t=w+1; printf(“t %i”,t);}else{ t=w;}
if(F>=0){ s=t+1; printf(“s %i”,s);}else{ s=t;}
if(G>=0){ v=s+1; printf(“v %i”,v);}else{ v=s;}
if(H>=0){ k=v+1; printf(“k %i”,k);}else{ k=v;}
if(I>=0){ l=k+1; printf(“l %i”,l);}else{ l=k;}
if(l!=3){ printf(“Error System\n”);}
saisie_tableau(&A,&B,&C,&D,&E,&F,&G,&H,&I);
system(“clear”);
}

Le problème c’est que le if n’est pas respecter et donc l’incrémentation ce fait tout le temps et j’avoue ne pas comprendre pourquoi. les printf servent a voir si l’incrémentation se fait correctement.
Ensuite j’aurais voulu empêcher le joueur d’entrer des lettres j’avais essayer avec des boucles while mais sa ne fonctionne pas
voici ce que j’avais fait: while(A!=0||A!=1||A!=2||A!=3||A!=4||A!=5||A!=6||A!=7||A!=8||A!=9||A!=-1){
printf(“Entrez la valeur de A\n”);
scanf("%i", A);
};

si vous avez des idées ou des suggestions n’hésitez pas à me le dire.

Merci

0 Likes

#2

Pour empêcher des lettres, tu ne pourras pas réellement. Tu pourras vérifier qu’aucune n’a été entrée, mais pas l’empêcher (faut voir plus du côté des IHM (gtk, qt, etc).

Ce que tu dois faire dans ce cas (crée toi une fonction ça te fera un bon exo) :


while (scanf("%d", A) != 1) {
   printf("\nVeuillez entrer un nombre!\n");
   while (getc() != '\n') continue;
}

Pour ton problème:

if(A>=0){ x=x+1; printf("x %i",x); }else{ x=0; printf("a %i",x);}
if(B>=0){ y=x+1; printf("y %i",y);}else{ y=x;}
if(C>=0){ z=y+1; printf("z %i",z);}else{ z=y;}
if(D>=0){ w=z+1; printf("w %i",w);}else{ w=z;}
if(E>=0){ t=w+1; printf("t %i",t);}else{ t=w;}
if(F>=0){ s=t+1; printf("s %i",s);}else{ s=t;}
if(G>=0){ v=s+1; printf("v %i",v);}else{ v=s;}
if(H>=0){ k=v+1; printf("k %i",k);}else{ k=v;}
if(I>=0){ l=k+1; printf("l %i",l);}else{ l=k;}

A = adresse de A = toujours positif ou éventuellement nul.
*A = valeur de A = ce que tu veux.

Idem pour le reste (en gros, tu confond pointeur et valeur pointée)

0 Likes

#3

Bonjour,

Merci de ton aide.

J’ai essayé avec les pointeurs mais un autre problème est apparu. Quand il y a plus ou moins de 3 valeurs entrées, le programme indique bien que ce n’est pas bon et redemande la saisie du tableau. Si après le joueur entre bien trois valeurs le tableau s’affiche mais avec les valeurs érronées du début.

Est-ce un problème avec la fonction affichage que voici:
int affiche_tableau_facile(intA, intB, intC, intD, intE, intF, intG, intH, int*I){
printf(“voici votre tableau :\n”);
if (A<0) printf("[ ]"); else{ printf("[%i]",*A);}
printf(" [+]");
if (B<0) printf(" [ ]"); else{ printf(" [%i]",*B);}
printf(" [=]");
if (C<0) printf(" [ ]\n"); else{ printf(" [%i]\n",*C);}
printf("[-] [¤] [+] [¤] [-]\n");
if (D<0) printf("[ ]"); else{ printf("[%i]",*D);}
printf(" [+]");
if (E<0) printf(" [ ]"); else{ printf(" [%i]",*E);}
printf(" [=]");
if (F<0) printf(" [ ]\n"); else{ printf(" [%i]\n",*F);}
printf("[=] [¤] [=] [¤] [=]\n");
if (G<0) printf("[ ]"); else{ printf("[%i]",*G);}
printf(" [-]");
if (H<0) printf(" [ ]"); else{ printf(" [%i]",*H);}
printf(" [=]");
if (I<0) printf(" [ ]\n"); else{ printf(" [%i]\n",*I);}
}

les if servent à ne pas afficher la valeur -1 entrée par le joueur.

Merci

0 Likes

#4

Ai un peu de réflexion hein :slight_smile: je t’ai dis que A = pointeur sur une valeur et que *A = valeur. De la même façon ton test plus haut est complètement erroné.

0 Likes

#5

Merci grâce à toi j’ai résolu un de mes problèmes:)
par contre pour les lettres j’ai essayé mais je ne comprend pas ce que tu veux dire par: while (getc() != ‘\n’) continue;

sinon je dois également faire une fonction calcul pour l’instant j’ai fait cela:
int calculA (int A, int B, int C, int D, int E, int F, int G, int H, int I){ // Calcul de A
if (A!=-1){ calculB (A,B,C,D,E,F,G,H,I);}
else { A=0;
while (A < 10) { A++;
calculB (A,B,C,D,E,F,G,H,I);} }


int calculfin(int A, int B, int C, int D, int E, int F, int G, int H, int I){
int trouve;
if((C==A+B) && (G==A-D) && (H==B+E) && (F==D+E) && (I==C-F) && (I==G-H) )
{ trouve=1; printf("%i,%i,%i,%i,%i,%i,%i,%i,%i\n",A,B,C,D,E,F,G,H,I);}
else{ printf(“No solution\n”); }}

mais il va toujours dans " No solution" si je met des pointeurs il m’indique une erreur mais je ne comprend pas pourquoi vu que sans pointeur il ne va pas se souvenir des valeurs?

merci de ton aide

0 Likes

#6

Hum, je ne vais pas tout expliquer non plus, bref.

scanf("%d", &x) ça lit ou ça essaye de lire depuis l’entrée standard ce qui semble être un nombre entier, ie: 23, 54, etc. Ca renvoie le nombre d’arguments lu avec succès, soit 1 dans ce cas, ou 0 si erreur.

La lecture faites par scanf est assez conne:

je lis un octet, si c’est un “digit”, je calcule le chiffre associé, multiplie par 10 le nombre courant, et ajoute le chiffre.
sinon, j’ai une erreur, et j’arrête laissant dans le buffer (ce que tu as tapé au clavier) des données incohérentes.

Ce qui fait que :

while (x > 0) {
  scanf("%d", &x);
}

Provoque une boucle infinie si jamais l’utilisateur rentre autre chose qu’un nombre (l’utilisateur est con, à la polio, ou les deux).

Pour éviter ça, il faut nettoyer le buffer si jamais la fonction scanf (ou ses consoeurs fscanf) n’a pas pu lire ce qu’elle devait lire, ie:

while (x > 0) {
  if (scanf("%d", &x) != 1) {
    while (getc() != '\n') continue;
  }
}

Qui finalement ne va faire que lire dans le buffer - soit l’entrée standard - jusqu’à ce qu’un saut de ligne soit trouvée. Tu peux aussi utiliser la fonction isspace() (ctype.h) tel que for (int n = 0; (n = getc()) != EOF && !isspace((char)c); ) ; (version courte, et qui vérifie si on a pas lu la fin de fichier, au passage). Le second code (for…) a l’avantage de s’arrêter au premier caractère blanc (espace, etc).

Pour le reste, je ne t’ai en rien dit d’enlever les pointeurs surtout s’ils correspondent à la logique de ton code. Ce que je t’ai dis, c’est que tu confondais pointeur et valeur pointée, ce qui a beaucoup de sens dans ton cas.

Ensuite, ce n’est pas “%i” pour afficher un entier, mais %d. %i c’est assez inhabituel mais bref.

Par contre, si tu as une erreur, affiche là. Je sais qu’il y en a qui ne savent pas lire les erreurs, ou les comprendre, mais on peut t’aider à les résoudre.

Et si possible, utilise la balise code (entre crochets []) ça permet de mettre en police à taille fixe ton code, ce qui en améliore la lisibilité.

0 Likes

#7

Ce message a été signalé par la communauté et temporairement masqué.

0 Likes