Probleme de boucle en language C

Résolu/Fermé
strixdev Messages postés 17 Date d'inscription mercredi 3 novembre 2010 Statut Membre Dernière intervention 15 août 2012 - 3 nov. 2010 à 21:08
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 3 nov. 2010 à 23:35
Bonjour,
j'ai un problème en langage C, j'ai fais une condition pour que la boucle s'exécute, mais quand la condition est vrai, la boucle ne s'exécute pas même si le programme se compile bien.
bon le but du programme c'est de donner deux nombre et ensuite on affiche des choix de somme et produit ...., et ensuite on demande a l'utilisateur de choisir un seul choix, quand le résultat s'affiche, on demande a l'utilisateur de taper [o] pour reprendre le programme, si non il tape n'importe quelle touche.
Voila le code source:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
float nombre1 = 0, nombre2 = 0, somme = 0, produit = 0, min = 0, max = 0, division = 0, moyenne = 0;
int choix = 0;
char reponse = 'o';
while (reponse == 'o')
{
printf("Taper le 1er nombre : ");
scanf("%f", &nombre1);
printf("Taper le 2eme nombre : ");
scanf("%f", &nombre2);
printf("\n\n");
printf("** Pour la somme taper 1 **\n");
printf("** Pour le produit taper 2 **\n");
printf("** Pour la moyenne taper 3 **\n");
printf("** Pour la division taper 4 **\n");
printf("** Pour le minimum taper 5 **\n");
printf("** Pour le maximum taper 6 **\n\n");
printf("Entrer votre choix : ");
scanf("%d", &choix);
if (choix == 1)
{
somme = nombre1 + nombre2;
printf("La somme est: ");
printf("%f + %f = %f\n", nombre1, nombre2, somme);
}
else if (choix == 2)
{
produit = nombre1 * nombre2;
printf("Le produit est: ");
printf("%f * %f = %f\n", nombre1, nombre2, produit);
}
else if (choix == 3)
{
moyenne = (nombre1 + nombre2) / 2;
printf("La moyenne est: ");
printf("%f + %f = %f\n", nombre1, nombre2, moyenne);
}
else if (choix == 4)
{
division = nombre1 / nombre2;
printf("La division est: ");
printf("%f / %f = %f\n", nombre1, nombre2, division);
}
else if (choix == 5)
{
if (nombre1 > nombre2)
{
printf("Le minimum est: ");
printf("%f\n", nombre2);
}
else if (nombre1 < nombre2)
{
printf("Le minimum est: ");
printf("%f\n", nombre1);
}
}
else if (choix == 6)
{
if (nombre1 > nombre2)
{
printf("Le maximum est: ");
printf("%f\n", nombre1);
}
else if (nombre1 < nombre2)
{
printf("Le maximum est: ");
printf("%f", nombre2);
}
}
printf("Pour continuer taper [o] sinon taper n'importe quelle touche: ");
scanf("%c", &reponse);
printf("%c", reponse);
getchar();
}






system("PAUSE");
return 0;
}

Merci d'avance

2 réponses

oli_a42 Messages postés 11 Date d'inscription dimanche 6 juin 2010 Statut Membre Dernière intervention 10 août 2012 1
3 nov. 2010 à 22:15
Salut!

Il faut vider le flux d'entrée avant de refaire scanf ("%c", &reponse);
Tu met dans reponse : \n !!!! et pas 'o'

getchar();
printf("Pour continuer taper [o] sinon taper n'importe quelle touche: ");
scanf("%c", &reponse);

Ça devrait marcher.

Nota tes accolades me semblent déséquilibres dans ton code
1
strixdev Messages postés 17 Date d'inscription mercredi 3 novembre 2010 Statut Membre Dernière intervention 15 août 2012
3 nov. 2010 à 22:20
Merci c totalement correct. Merci bcp
0
Blashyrk Messages postés 19 Date d'inscription lundi 4 octobre 2010 Statut Membre Dernière intervention 26 octobre 2011 5
Modifié par Blashyrk le 3/11/2010 à 22:35
J'ai une question à propos du "vidage" du flux d'entrée :
ne vaut-il mieux pas mettre fflush(stdin); ?
Ma prof de C nous a toujours dit d'utiliser cette méthode, elle ne nous a jamais parlé du getchar(); comme méthode équivalente à fflush(stdin); .
Lequel est le plus correct et le plus professionnel ?
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 842
Modifié par fiddy le 5/11/2010 à 09:19
@Blashyrk
ne vaut-il mieux pas mettre fflush(stdin); ?
Non. Et pour la simple raison que fflush() a un comportement indéfini sur les flux d'entrée comme stdin. fflush(stdin) ne doit jamais apparaître dans un programme.

Ma prof de C nous a toujours dit d'utiliser cette méthode
Beh elle se trompe...
Lequel est le plus correct et le plus professionnel ?
La version officielle est la boucle suivante :
int c; 
while( (c=getchar()) != '\n' && c != EOF ); 


Je te conseille d'en faire une petite fonction statique que tu pourras utiliser à ta guise.

Cdlt,
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 842
3 nov. 2010 à 22:21
Bonjour,

Avant ton scanf("%c", &reponse); mets un getchar();
Cela enlèvera le résidu de caractère trainant dans le buffer clavier et qui fait échouer la boucle.

Sinon deux conseils : utilise plutôt double et au lieu de scan("%c",&reponse) utilise reponse=getchar();

Je n'ai pas regardé le code en détail car il est illisible. Merci d'utiliser les balises codes (à droite du bouton souligné).

Cdlt,
0