Bonjour.
Je veux écrire un programme qui affiche le menu suivant:
1- Résolution d'un polynôme de 1er degré
2- Résolution d’un polynôme de 2nd degré
3- Quitter
Après avoir fait un de ces traitement, le programme doit interroger l'utilisateur s’il veut continuer ou non. Si oui, il le renvoi au menu principal sinon il met fin à l’exécution.
J’ai fait un premier essai mais mon programme ne fait pas ça : dans un premier temps, il fait correctement le traitement d’un choix parmi les 3 mais juste ensuite il ne communique pas comme voulu avec l’utilisateur pour le renvoyer au menu ou quitter.
SVP Aidez-moi!!
Voila mon code :
#include<stdio.h>
#include <math.h>
void affichagemenu()
{
printf("Tapez le nombre correspondant pour choisir l'opération à effectuer:\n 1 pour résoudre un polynome de premier degré\n 2 pour résoudre un polynome de second degré\n 3 pour quitter le programme\n");
}
int lirechoix()
{
int Indice=0;
affichagemenu();
scanf("%d",&Indice);
return(Indice);
}
float premier()
{
int a=0, b=0;
float x=0;
printf("Votre polynome s'écrit sous la forme: ax+b=0\n\n");
printf("Que vaut 'a' ? ");
scanf("%d", &a);
printf("\n\n");
printf("Que vaut 'b' ? ");
scanf("%d", &b);
printf("\n\n");
if (a!=0)
{
x=-((float)b)/a;
printf("La solution de l'equation est : x = %f\n\n\n", x);
}
else
{
if(b == 0)
printf("Tout réel a strictement different de zero est une solution !\n\n\n"); // la solution est 0 divisé par a avec a non nul
else
printf("Pas de solution réelle\n\n\n");
return (x);
}
}
float second()
{
/* Calcul des solutions réelles d'une équation du second degré */
int A, B, C;
float f;
double D; /* Discriminant Delta*/
printf("Votre polynome s'écrit sous la forme: ax^2 + bx + c = 0 \n\n");
printf("Que vaut a, b et c? Introduisez les en ordre: a, b, puis c :\n");
scanf("%i %i %i", &A, &B, &C);
D = pow(B,2) - 4.0*A*C; /* Calcul du discriminant b^2-4ac */
/* Distinction des différents cas */
if (A==0 && B==0 && C==0) /* 0x = 0 */
printf("Tout réel est une solution de cette équation.\n");
else if (A==0 && B==0) /* Contradiction: c # 0 et c = 0 */
printf("Cette équation ne possède pas de solutions.\n");
else if (A==0) /* bx + c = 0 */
{
printf("La solution de cette équation est :\n");
f=((double)C/B);
printf(" x = %.4f\n", f);
}
else if (D<0) /* b^2-4ac < 0 */
printf("Cette équation n'a pas de solutions réelles.\n");
else if (D==0) /* b^2-4ac = 0 */
{
printf("Cette équation a une seule solution réelle :\n");
f=((double)-B/(2*A));
printf(" x = %.4f\n", f);
}
else /* b^2-4ac > 0 */
{
printf("Les solutions réelles de cette équation sont :\n");
f=((-B+sqrt(D))/(2*A)); //sqrt est la fonction dans le langage C pour le racine carré
printf(" x1 = %.4f\n", f);
f=((-B-sqrt(D))/(2*A));
printf(" x2 = %.4f\n", f);
return (f);
}
}
float main()
{
int l,o ;
float s;
printf("************************************************\n**** Solveur de polynome ****\n************************************************\n\n");
l=lirechoix();
while (l!=3)
{
if (l==1)
{
s=premier();
scanf("%f",&s);
}
else if (l==2)
{
s=second();
scanf("%f",&s);
}
}
printf("Tapez 1 pour continuer vers une autre opération\nTapez une touche quelconque pour quitter\n");
/*j'ai choisi d'ajouter cette étape pour ne pas encombrer les affichages et mettre l'utilisateur à l'aise au
lieu de lui afficher le menu à chaque fois */
scanf("%d",&o);
while (o!=1)
{
return 0; // si l'utilisateur ne veut pas continuer
}
l= lirechoix(); // pour renvoyer le menu s'il veut continuer
}
# boucle infinie
Posté par gUI (Mastodon) . Évalué à 2. Dernière modification le 19 novembre 2020 à 08:34.
si l'utilisateur tape 1, tu rentres dans une boucle infinie (la condition est sur 'o' et aucun traitement ne modifie 'o').
je pense qu'il te faut simplement un
if
à la place duwhile
.cela dit, le mieux est de le laisser dans la gestion du menu général, et pas de rajouter encore un
printf
/scanf
.En théorie, la théorie et la pratique c'est pareil. En pratique c'est pas vrai.
# Boucle infinie
Posté par Axone . Évalué à 2.
Ton problème se situe dans ta logique du premier while (celui qui vérifie si le choix de l'utilisateur est différent de 3).
En gros, si l'utilisateur choisit n'importe quelle autre chose que 3, la boucle while va s'exécuter indéfiniment.
Je te laisse méditer dessus.
# [Bb]oucle infinie
Posté par _kaos_ . Évalué à 2. Dernière modification le 19 novembre 2020 à 09:14.
En fait, ton problème, c'est que tu as une boucle infinie.
Une fois le choix fait tu rentre dans in
while
File bien vite
Matricule 23415
# kreu mignon !
Posté par ninis666 . Évalué à 1. Dernière modification le 19 novembre 2020 à 10:42.
Bien que ça ne soit pas très élégant, ça devrait marcher, c'est juste un problème d'indentation qui fait que tu as une accolade fermante de trop :)
[^] # Re: kreu mignon !
Posté par ninis666 . Évalué à 2. Dernière modification le 19 novembre 2020 à 09:52.
Rha, mauvaise manip, peut pas éditer mon commentaire !
Bref, c'est naïf, mais ça peut marcher ; un problème d'indentation qui t'as conduit à ça : faudrait juste déplacer ton '}' du premier while à la fin et vérifier la confirmation à ce moment :
# Perdu :(
Posté par InToX86 . Évalué à 1.
Pareil avec le déplacement de l'accolade ça affiche un premier résultat puis ne renvoie pas le menu.
C'est vrai je pense qu'il y a une boucle infinie mais je n'ai pas pu déterminer l'emplacement exacte :(
[^] # Re: Perdu :(
Posté par Mackenzie . Évalué à 1.
Si tu regardes bien, tu remarqueras qu'une fois entré dans la boucle,
l
n'est plus jamais assignée et du coup, ça boucle indéfiniment.# Un autre essai
Posté par InToX86 . Évalué à 1. Dernière modification le 20 novembre 2020 à 07:53.
Voilà,
J'ai essayé de simplifier le code en éliminant l'interrogation de l'utilisateur pour continuer ou non (pour revenir directement au menu).
En répondant à votre remarque, j'ai mis toute les instructions dans une boucle do white mais je trouve toujours le même problème .
Voilà un autre essai (fonction main):
je suis encore perdu :(
[^] # Re: Un autre essai
Posté par gUI (Mastodon) . Évalué à 2. Dernière modification le 20 novembre 2020 à 14:11.
Pour afficher le résultat de tes calculs de polynômes, ce n'est pas
scanf("%f",&s);
maisprintf("%f",&s);printf("%f\n",s);
qu'il faut faire.Et ce n'est à faire que pour le choix 1 et 2, pas pour le choix 3 (donc il faut les laisser dans chaque
if()
.En théorie, la théorie et la pratique c'est pareil. En pratique c'est pas vrai.
[^] # Re: Un autre essai
Posté par ninis666 . Évalué à 2.
je dirais même plus printf("%f\n", s) !
[^] # Re: Un autre essai
Posté par gUI (Mastodon) . Évalué à 2.
bien sûr !
En théorie, la théorie et la pratique c'est pareil. En pratique c'est pas vrai.
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.