Comment faire une chaîne d'opérations

Fermé
GgManasse - Modifié le 7 nov. 2022 à 17:43
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 - 10 nov. 2022 à 13:17

Bonjour,

Bonjour Tout le monde, ma préoccupation est de Comment faire une chaîne d'opérations svp merci

Android / Chrome 106.0.0.0

21 réponses

yg_be Messages postés 22698 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 avril 2024 1 471
5 nov. 2022 à 21:17

bonjour,

peut-être en enchainant les opérations?

0

Je fais une calculatrice, mais elle n'est capable que d'additionner soustraire multi etc Que deux (2) valeur, par chaîne d'opérations j'entends par là que la calculatrice serais capable de faire tout ça mais avec plusieurs valeurs : Faire une addition puis utilisez le résultat de cette pour une autre addition ou soustraction ou multiplication ou div..

Donc t'a réponse ne m'aide vraiment pas

0
yg_be Messages postés 22698 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 avril 2024 1 471
7 nov. 2022 à 17:52

Montre-nous ton code C, et le mode d'emploi de la calculatrice.

0
PierrotLeFou
7 nov. 2022 à 17:40

Tu n'avais pas précisé ceci dans ton premier post.
Les calculatrices ont en général une "mémoire" où tu peux sauver un résultart et le rappeler plus tard
Tu as en général 4 fonction:
M rappeler le contenu de la mémoire.
MC effacer la mémoire
M+ ajouter à la mémoire
M- soustraire de la mémoire

0

Ouai!!! Merci j teste ça et j t'envoie le code d la calculatrice 

0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
7 nov. 2022 à 19:24

Dans une calculatrice simple la "mémoire" dont parle Pierrot n'est pas nécessairement utilisée pour enchaîner les opérations. Plus simplement, le résultat de la dernière opération est affiché et permet de continuer à appliquer des calculs si on presse une touche correspondant à un opérateur.

On pourrait simuler quelque chose qui y ressemble en C avec une interaction comme suit avec l'utilisateur pour calculer 12 + 34 / 2 et remettre à zéro la calculatrice, puis quitter le programme :
 

Tapez un nombre (ou Q pour quitter) :
>> 12
Tapez un opérateur (+, -, * ou / ou C pour remettre à zéro ou Q pour quitter)
>> +
Tapez un nombre (ou C pour remettre à zéro ou Q pour quitter) :
>> 34
Résultat actuel = 46
Tapez un opérateur (+, -, * ou / ou C pour remettre à zéro ou Q pour quitter)
>> /
Tapez un nombre (ou C pour remettre à zéro ou Q pour quitter) :
>> 2
Résultat actuel = 23
Tapez un opérateur (+, -, * ou / ou C pour remettre à zéro ou Q pour quitter)
>> C
Résultat actuel = 0
Tapez un opérateur (+, -, * ou / ou C pour remettre à zéro ou Q pour quitter)
>> Q
Le programme est terminé.
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083 > [Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024
7 nov. 2022 à 19:37

aussi, quand un résultat est affiché si on tape un autre nombre au lieu de taper un opérateur, ce genre de calculatrice substitue le nombre tapé au résultat précédent. Ce comportement pourrait aussi être reproduit.

0

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

Posez votre question

Excusez-moi c'est ma première fois sur un forum, donc comment je  fais pour vous envoyer le code source ?....

Grâce aux fonctions J'ai réussi à utiliser le résultat d'en calculé que je fais moi même pour l'utiliser dans une autre mais je rencontre un problème maintenant. Le nouveau calcul que je fais s'opère très bien mais il s'affiche mal en me donnant également des calculs que je n'ai pas fais, c'est calculs proviennent des conditions (if) que j'ai mis pour pouvoir faire mes autres calcul , mais les instructions (calcul ) de tous ces if s'affiche mm s'il ne sont pas remplies.

Je vous enverrai le code source et le mode d'emploi de la calculatrice des que vous m'aurez dis comment les envoyer 

printf("merci");

0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
Modifié le 8 nov. 2022 à 17:08

Pour poster ton code sur le forum, tu :

  • cliques sur l'icône "Insérer un extrait de code" 
  • tu choisis le langage C++ dans la liste déroulante
  • tu colles ton code et tu valides en cliquant OK
  • ton code sera intégré au texte de ton message
  • si tu es satisfait de ton message, tu le postes (éventuellement, tu peux le prévisualiser avant pour vérifier de quoi il aura l'air un fois posté, ou pour te relire avant de le poster)


0
#include<stdio.h>
#include<math.h>


float somme(float a, float b)
{
	float s;
	s= a+b;
	return(s);
}

float soustr(float a, float b)
{
	float s;
	s= a-b;
	return(s);
}

float multi(float a, float b)
{
	float s;
	s= a*b;
	return(s);
}

float division(float a, float b)
{
	float s;
	if(b!=0)
	s= a/b;
	return(s);
}












int main()
{
	char reponse, decis;
	int choix,n;
	float x, y,a,b,c, delta, z, x1, x2, e,f,g,h,resul,d,i;
	
	
	Acceuil:
	printf("\n----CALCULATRIX.001-------------------------------------------------------------------------------------\n\n");
	printf("1.Calcul de normal\n");
	printf("2.Equation second degr : aX+bx-c = x\n");
	printf("3.Programme (A + B x C - D)\n--------------------------------------------------------------------------------------------------------");

scanf("%d",&choix);
	system("cls");
	switch(choix)
	{
		case 1 :
			goto CALCUL;
			break;
		case 2 :
			goto EQUATION;
			break;
		case 3 :
			goto PROGRAM;
			break;		
	}
	

	
	
	CALCUL :
	do{
	    printf("-----Calcule Normal----\n\n");
       printf("\nSaisiser un nombre :");
	    scanf("%f",&x);
     	printf("Saisiser un nombre :");
	    scanf("%f",&y);
    	printf("\nEntrer(1) pour Addition +\n");
	    printf("Entrer(2) pour Soustraction -\n");
	    printf("Entrer(3) pour Multiplication *\n");
    	printf("Entrer(4) pour Division /\n");
	    printf("Entrer(5) pour la puissance\n");
	    scanf("%d", &n);
	    
	    switch(n)
		{
			case 1 :
				{
					printf("La somme de %.f + %.f = %.f ", x,y,somme(x,y));
					printf("\n\n\n------------");
					break;
				}
			case 2 :
{
				    printf("La soustraction de %.f - %.f  = %.f ", x,y,soustr(x,y));
				    printf("\n\n\n------------");
					break;	
				}
			case 3 :
				{
					printf("La multiplication de %.f x %.f  = %.f ", x,y,multi(x,y));
					printf("\n\n\n------------");
					break;
				}
			case 4 :
				{
					if(y!=0)
					printf("La division de %.f/%.f  = %f. \n\n\n---------------", x,y,division(x,y));
					else
					printf("La division par 0 est Implossible!");
break;
				}
			case 5 :
				{
					printf("la puissance est = %.2f ", pow(x,y));
					printf("\n\n\n------------");
					break;
				}
			default : printf("Erreur d'operation");
			break;
		}
		printf("\nContinuer le cacul_(x)");
		printf("\nFaire un autre calcule_(O/N)?\n");
		printf("Retour a l'acceuil_(A)\n");
		scanf(" %c",&reponse);
		switch(reponse)
	    {
		    case 'A' :
			    goto Acceuil;
			    break;
        case 'x' :
			    goto suivant;
			    break;
		}		      
	}while(reponse !='N');
	
	
	
	suivant :
    getc(stdin);
	printf("Operateur : ");
    scanf("%c",&decis);
    printf("Saisir une valeur : ");
    scanf("%f", &d);
	   
	switch(decis)
	{
		case '+' : 
		if(i = ( somme(x,y)))
		    printf("\n---%.f + %.f = %.f---\n", i,d,i + d);
		if(i = (soustr(x,y)))
		    printf("\n---%.f + %.f = %.f---\n", i,d,i + d);
    if(i = (multi(x,y)))
		    printf("\n---%.f + %.f = %.f---\n", i,d,i + d);
		if(i = (division(x,y))) 
		    printf("\n---%.f + %.f = %.f---\n", i,d,i + d);
		break;
		
		case '-' :
		if(i = (soustr(x,y)))
		printf("\n%.f - %.f = %.f", i,d,i - d);
		break;
		
		case '*' :
		i = (multi(x,y));
		printf("%.f x %.f = %.f", i,d,i * d);
		break;
		
		case '/' :
		i = (division(x,y));
		    if(d !=0)
		        printf("%.f / %.f = %.4f", i,d,i / d);
		    else
printf("Calcul Error : Impossible de diviser par 0\n");
		break;
		
		default : printf("OPERATEUR INCONNUE\n");	
		break;
	}
	printf("\nContinuer le cacul_(x)");
	printf("\nFaire un autre calcule_(O/N)?\n");
	printf("Retour a l'acceuil_(A)\n");
	scanf(" %c",&reponse);
	switch(reponse)
	{
		case 'A' :
		    goto Acceuil;
			break;
	}


         return 0;
}	
0
yg_be Messages postés 22698 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 avril 2024 1 471
8 nov. 2022 à 20:05

et le mode d'emploi?

0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
Modifié le 8 nov. 2022 à 20:43

Salut GgManasse,

Sans regarder ton code, en compilant celui-ci avec le compilateur gcc et les Warnings, le compilateur signale des choses qui devraient attirer ton attention :

$ gcc -Wall -Wextra 37724790.c
37724790.c: In function ‘main’:
37724790.c:59:2: warning: implicit declaration of function ‘system’ [-Wimplicit-function-declaration]
  system("cls");
  ^~~~~~
37724790.c:154:6: warning: suggest parentheses around assignment used as truth value [-Wparentheses]
   if(i = ( somme(x,y)))
      ^
37724790.c:156:6: warning: suggest parentheses around assignment used as truth value [-Wparentheses]
   if(i = (soustr(x,y)))
      ^
37724790.c:158:8: warning: suggest parentheses around assignment used as truth value [-Wparentheses]
     if(i = (multi(x,y)))
        ^
37724790.c:160:6: warning: suggest parentheses around assignment used as truth value [-Wparentheses]
   if(i = (division(x,y)))
      ^
37724790.c:165:6: warning: suggest parentheses around assignment used as truth value [-Wparentheses]
   if(i = (soustr(x,y)))
      ^
37724790.c:69:4: error: label ‘PROGRAM’ used but not defined
    goto PROGRAM;
    ^~~~
37724790.c:66:4: error: label ‘EQUATION’ used but not defined
    goto EQUATION;
    ^~~~
37724790.c:49:46: warning: unused variable ‘resul’ [-Wunused-variable]
  float x, y,a,b,c, delta, z, x1, x2, e,f,g,h,resul,d,i;
                                              ^~~~~
37724790.c:49:44: warning: unused variable ‘h’ [-Wunused-variable]
  float x, y,a,b,c, delta, z, x1, x2, e,f,g,h,resul,d,i;
                                            ^
37724790.c:49:42: warning: unused variable ‘g’ [-Wunused-variable]
  float x, y,a,b,c, delta, z, x1, x2, e,f,g,h,resul,d,i;
                                          ^
37724790.c:49:40: warning: unused variable ‘f’ [-Wunused-variable]
  float x, y,a,b,c, delta, z, x1, x2, e,f,g,h,resul,d,i;
                                        ^
37724790.c:49:38: warning: unused variable ‘e’ [-Wunused-variable]
  float x, y,a,b,c, delta, z, x1, x2, e,f,g,h,resul,d,i;
                                      ^
37724790.c:49:34: warning: unused variable ‘x2’ [-Wunused-variable]
  float x, y,a,b,c, delta, z, x1, x2, e,f,g,h,resul,d,i;
                                  ^~
37724790.c:49:30: warning: unused variable ‘x1’ [-Wunused-variable]
  float x, y,a,b,c, delta, z, x1, x2, e,f,g,h,resul,d,i;
                              ^~
37724790.c:49:27: warning: unused variable ‘z’ [-Wunused-variable]
  float x, y,a,b,c, delta, z, x1, x2, e,f,g,h,resul,d,i;
                           ^
37724790.c:49:20: warning: unused variable ‘delta’ [-Wunused-variable]
  float x, y,a,b,c, delta, z, x1, x2, e,f,g,h,resul,d,i;
                    ^~~~~
37724790.c:49:17: warning: unused variable ‘c’ [-Wunused-variable]
  float x, y,a,b,c, delta, z, x1, x2, e,f,g,h,resul,d,i;
                 ^
37724790.c:49:15: warning: unused variable ‘b’ [-Wunused-variable]
  float x, y,a,b,c, delta, z, x1, x2, e,f,g,h,resul,d,i;
               ^
37724790.c:49:13: warning: unused variable ‘a’ [-Wunused-variable]
  float x, y,a,b,c, delta, z, x1, x2, e,f,g,h,resul,d,i;

Parmi tous les avertissements il y a en a du type de celui-ci en ligne 154 "warning: suggest parentheses around assignment used as truth value [-Wparentheses]
   if(i = ( somme(x,y)))"

Est-ce exprès que tu utilises l'opérateur d'affectation = dans ta condition if ?

L'opérateur d'égalité en C est ==

Si tu veux tester l'égalité, tu dois corriger ton code.

Dans les deux cas le code a peu de sens pour moi et je ne comprends pas ce que tu fais.

Ton code ne compile pas non plus chez moi avec gcc, car il comporte ces erreurs là :

37724790.c:69:4: error: label ‘PROGRAM’ used but not defined
    goto PROGRAM;
    ^~~~
37724790.c:66:4: error: label ‘EQUATION’ used but not defined
    goto EQUATION;
    ^~~~

Ton code est très désorganisé et les goto ne facilitent pas sa compréhension (code "spaghetti").

Je ne ferais pas du tout comme cela.

Comme tu postes 200 lignes de code et que tu indiques juste :

Le nouveau calcul que je fais s'opère très bien mais il s'affiche mal en me donnant également des calculs que je n'ai pas fais, c'est calculs proviennent des conditions (if) que j'ai mis pour pouvoir faire mes autres calcul , mais les instructions (calcul ) de tous ces if s'affiche mm s'il ne sont pas remplies

ce que je comprends qu'il ne fonctionne pas comme tu l'attends, mais tu ne dis pas réellement ce qui arrive, mais ce que tu penses qu'il arrive.

Au lieu d'écrire ce que tu supposes, tu devrais juste indiquer très précisément ce que tu fais lorsque tu l'exécutes avec un exemple précis qui illustre ton problème et que l'on puisse reproduire, qui :

  • indique les données que tu fournis en entrée au programme (ici, ce que tu tapes dans les différentes parties de l'exécution du programme)
  • le comportement ou données que tu obtiens en sortie et qui ne te convient pas (le résultat faux)
  • ce que devrait faire le programme à la place pour te satisfaire (le bon résultat)
1
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083 > [Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024
Modifié le 8 nov. 2022 à 22:01

Dans ton code il y a ces lignes (qui contiennent d'ailleurs les affectations dans le if) :

    printf("Operateur : ");
    scanf("%c",&decis);
    printf("Saisir une valeur : ");
    scanf("%f", &d);

        switch(decis)
        {
                case '+' :
                if(i = ( somme(x,y)))
                    printf("\n---%.f + %.f = %.f---\n", i,d,i + d);
                if(i = (soustr(x,y)))
                    printf("\n---%.f + %.f = %.f---\n", i,d,i + d);
    if(i = (multi(x,y)))
                    printf("\n---%.f + %.f = %.f---\n", i,d,i + d);
                if(i = (division(x,y)))
                    printf("\n---%.f + %.f = %.f---\n", i,d,i + d);
                break;

dans cette partie de code, si l'opérateur + est choisi, tu exécutes les fonctions somme(), soustr(), multi() et division() les unes à la suite des autres en affectant le résultat à la variable i.

Tu le fais, d'ailleurs, sans utiliser d qui est la nouvelle opérante, ni utiliser le résultat de la précédente opération qui n'est stocké nulle part (il est juste affiché, par exemple ligne 94 si la première opération est une somme).

d n'est utilisé que dans les nouveaux printf() ci-dessus pour l'affichage, et le résultat de cette nouvelle opération n'est pas non plus stocké, juste affiché. Comme il est utilisé avec le résultat i des fonctions somme(), soustr(), multi() et division()  avec les arguments x et y, tu obtiens ces affichages si on tente de faire 12 + 34 + 4.

(x contient 12 - y contient 34 - d contient 4) :

----CALCULATRIX.001-------------------------------------------------------------------------------------

1.Calcul de normal
2.Equation second degr : aX+bx-c = x
3.Programme (A + B x C - D)
--------------------------------------------------------------------------------------------------------1
sh: 1: cls: not found
-----Calcule Normal----


Saisiser un nombre :12
Saisiser un nombre :34

Entrer(1) pour Addition +
Entrer(2) pour Soustraction -
Entrer(3) pour Multiplication *
Entrer(4) pour Division /
Entrer(5) pour la puissance
1
La somme de 12 + 34 = 46 


------------
Continuer le cacul_(x)
Faire un autre calcule_(O/N)?
Retour a l'acceuil_(A)
x
Operateur : +
Saisir une valeur : 4

---46 + 4 = 50---

----22 + 4 = -18---

---408 + 4 = 412---

---0 + 4 = 4---

Continuer le cacul_(x)
Faire un autre calcule_(O/N)?
Retour a l'acceuil_(A)

Il y a aussi un problème pour l'utilisateur, un coup il doit taper 1 pour faire une addition, un coup il doit taper +...

0

Merci à vous d'avoir réagi si , de mon côté à cause de l'orage ma connections étai mauvais et avant d'avoir fini il à été envoyé incomplet et le sans mode d'emploi désolé voilà le code que j viens de terminé : 

#include <stdio.h>
#include <math.h>

float somme(float a, float b) {
    float s;
    s= a + b;
    return(s);
}

float soustr(float a, float b) {
    float s;
    s= a - b;
    return(s);
}

float multi(float a, float b) {
    float s;
    s= a*b;
    return(s);
}

float division(float a, float b) {
    float s;
    if(b != 0)
        s = a/b;
    return(s);
}

int main() {
    char reponse, decis;
    int choix,n;
    float x, y,a,b,c, delta, z, x1, x2, e,f,g,h,resul,d,i;
Acceuil:
    printf("\n---CALCULATRIX.001\n\n");
    printf("1.Calcul de normal\n");
    printf("2.Equation second degr : aX+bx-c = x\n");
    printf("3.Programme (A + B x C -
        D)\n----------------------------------------------------------------------------
            ----------------------------");
    scanf("%d",&choix);
    system("cls");
    switch(choix)
    {
        case 1 :
            goto CALCUL;
            break;
        case 2 :
            goto EQUATION;
            break;
        case 3 :
            goto PROGRAM;
            break;
    }
CALCUL :
    do {
        printf("-----Calcule Normal----\n\n");
        printf("\nSaisiser un nombre :");
        scanf("%f",&x);
        printf("Saisiser un nombre :");
        scanf("%f",&y);
        printf("\nEntrer(1) pour Addition +\n");
        printf("Entrer(2) pour Soustraction -\n");
        printf("Entrer(3) pour Multiplication *\n");
        printf("Entrer(4) pour Division /\n");
        printf("Entrer(5) pour la puissance\n");
        scanf("%d", &n);

        switch(n)
        {
            case 1 :
                {
                    printf("La somme de %.f + %.f = %.f ",
                            x,y,somme(x,y));
                    printf("\n\n\n------------");
                    break;
                }
            case 2 :
                {
                    printf("La soustraction de %.f - %.f = %.f
                            ", x,y,soustr(x,y));
                    printf("\n\n\n------------");
                    break;
                }
            case 3 :
                {
                    printf("La multiplication de %.f x %.f
                            = %.f ", x,y,multi(x,y));
                    printf("\n\n\n------------");
                    break;
                }
            case 4 :
                {
                    if(y!=0)
                        printf("La division de %.f/%.f = %f.
                                \n\n\n---------------", x, y, division(x, y));
                    else
                        printf("La division par 0 est
                                Implossible!");
                    break;
                }
            case 5 :
                {
                    printf("la puissance est = %.2f ", pow(x, y));
                    printf("\n\n\n------------");
                    break;
                }
            default : printf("Erreur d'operation");
                      break;
        }
        printf("\nContinuer le cacul_(x)");
        printf("\nFaire un autre calcule_(O/N)?\n");
        printf("Retour a l'acceuil_(A)\n");
        scanf(" %c", &reponse);
        switch(reponse)
        {
            case 'A' :
                goto Acceuil;
                break;
            case 'x' :
                goto suivant;
                break;
        }
    } while(reponse != 'N');
suivant :
    getc(stdin);
    printf("Operateur : ");
    scanf("%c",&decis);
    printf("Saisir une valeur : ");
    scanf("%f", &d);
    switch(decis)
    {
        case '+' :
            if (i = (somme(x,y)))
                printf("\n---%.f + %.f = %.f---\n", i,d,i + d);
            if (i = (soustr(x,y)))
                printf("\n---%.f + %.f = %.f---\n", i,d,i + d);
            if (i = (multi(x,y)))
                printf("\n---%.f + %.f = %.f---\n", i,d,i + d);
            if (i = (division(x,y)))
                printf("\n---%.f + %.f = %.f---\n", i,d,i + d);
            break;

        case '-' :
            if(i = (soustr(x,y)))
                printf("\n%.f - %.f = %.f", i,d,i - d);
            break;

        case '*' :
            i = (multi(x,y));
            printf("%.f x %.f = %.f", i,d,i * d);
            break;

        case '/' :
            i = (division(x,y));
            if(d !=0)
                printf("%.f / %.f = %.4f", i,d,i / d);
            else
                printf("Calcul Error : Impossible de diviser par 0\n");
            break;

        default :
            printf("OPERATEUR INCONNUE\n");
            break;
    }
    printf("\nContinuer le cacul_(x)");
    printf("\nFaire un autre calcule_(O/N)?\n");
    printf("Retour a l'acceuil_(A)\n");
    scanf(" %c",&reponse);
    switch(reponse) {
        case 'A' :
            goto Acceuil;
            break;
    }

EQUATION :
    do {
        printf("------Equation du 2nd degre-----\n");
        printf("------(aX + bx - c)------\n\n");
        printf("Saisissez les valeurs de a, b et c : \n");
        scanf("%f%f%f", &a, &b, &c);
        delta= pow(b, 2) - (4 * a * c);
        if (delta < 0)
            printf("\nD = %.f^2 - 4(%.f x %.f )< 0 \nPas de solution
                    réelles delta étant inférieur à 0\n\n\n", b, a, c);
        else if (delta == 0) {
            z = (-b) / (2 * a);
            printf("\nD = -%.f/2 x %.f = 0 \nDelta étant égal à 0,
                    la solution de x est : %.2f\n\n\n", b, a, z);
        } else {
            x1 = (-b - sqrt(delta)) / (2 * a);
            x2 = (-b + sqrt(delta)) / (2 * a);
            printf("\n -%.f - V(%.f)\nx1 = -------------\n
                    2 x %.f\n", b, delta, a);
            printf("\n -%.f + V(%.f)\nx2 = -------------\n
                    2 x %.f\n", b, delta, a);
            printf("les solutions sont : x1= %.2f\n", x1);
            printf(" x2= %.2f\n\n", x2);
            printf("\n_____________\n");
        }
        printf("\nVeux-tu faire un autre calcule_(O/N)?\n");
        printf("retour a l'acceuil_(A)\n");
        scanf(" %c", &reponse);
        switch(reponse) {
            case 'A' :
                goto Acceuil;
                break;
        }
    }while (reponse !='N');

PROGRAM:
    do
    {
        printf("Calcul (A + B x C - D)\n\n");
        printf("donner les valeurs de A, de B, de C et de D : \n");
        scanf("%f%f%f%f", &e, &f, &g, &h);
        resul = (f * g + e - h);
        if(resul>=0)
        {
            printf("[ %.f + %.f x %.f - %.f ] = %.f\n",
                    e,f,g,h,resul);
            printf("\n---------------\n");
        }
        printf("\nVeux-tu faire un autre calcul (O/N)?\n");
        printf("Retour à l'acceuil (A)\n");
        scanf(" %c", &reponse);
        switch(reponse)
        {
            case 'A':
                goto Acceuil;
                break;
        }
    } while(reponse != 'N');
    return 0;
}

Mode d'emploi :

Il y a trois options le problème dans mon programme se trouve au niveau de l'Option 1 ( Calcul normal) lors que l'on veut "continuer le Calcul" en entrant ('x') toute les autres conditions s'affiche comme j l'ais dit

0

Ensuite par rapport à la remarque sur les parenthèses lorsque j compile dans mon ordi sa me signale rien bizarrement,

Et lorsque que j'utilise (==) dans le if(i==somme(x,y)) j remarques que le if ne fonctionne pas , j'attends vos constats sur le code source, teste le aux gré de vos modifications et faite moi part de vos remarques.

0

Ha oui [Dal] ,j n'ais terminé mon code Source en mettant d'autres if dans les autres "CASE" parce les if du premier "CASE'+' : ne fonctionnait pas correctement, ça aurait été inutile d'occasionner plus d'erreurs 

0

C'est du C ou de l'assembleur genre  spaguetti? Même si les goto sont valides en C, ça donne du code horrible.
Tu devrais utiliser plus de fonctions pour afficher tes menus et faire les différentes actions.
Ça serait plus facile à lire et mettre au point.

Ton main ne devrait contenir qu'un seul switch sans renvoi à un autre ...

0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
9 nov. 2022 à 02:05

Salut GgManasse,

Tu devrais lire avec attention mes précédents messages qui contiennent mes "constats" sur ton code source. Si tu ne tiens pas compte de ces observations pour améliorer ton propre code, c'est un peu dommage.

Reste que, comme je l'ai dit, je ne ferais pas du tout comme cela et je ne crois pas que partir de ton code soit une bonne idée. Il y a des nombreuses incohérences dans ton code et j'en ai mentionné une partie. En ce qui me concerne, je ferais table rase et réfléchirais à une bonne architecture et aux données dont on a besoin.

Tout d'abord, tes fonctions somme(), soustr(), etc. ne sont pas très utiles. Il te suffit de faire ceci.

double make_calculation(double op1, char operator, double op2) {
        double res;

        switch (operator) {
        case '+': res = op1 + op2; break;
        case '-': res = op1 - op2; break;
        case '*': res = op1 * op2; break;
        case '/': res = op1 / op2; break;
        };

        return res;
}

Tu dois aussi comprendre que la calculatrice que tu dois faire est une machine à états finis. Elle démarre à un état, et passe d'un état à un autre selon ce qui est tapé sur la calculatrice, celle-ci devant garder la trace :

  • du stade auquel elle se trouve
  • du résultat actuel
  • de l'opérateur précédemment saisi

Ce genre d'informations peut être avantageusement regroupé dans une struct, comme celle-ci, au lieu d'être éparpillées dans le code :

struct calc {
        enum calc_state state;
        double res;
        char operator;
};

qui peut être passée à des fonctions qui traitent les fonctions d'affichage et qui traitent la saisie de l'utilisateur en faisant varier l'état.

avec un enum répertoriant les états possibles, par exemple :

enum calc_state { STATE_C, STATE_OPERATOR, STATE_RESULT };

Sur la base de ces exemples, on peut faire un code qui initialise les données de départ descriptives de l'état de la calculatrice void calc_init(struct calc * c) et une fonction void calc_enter(struct calc * c, char * s) qui prend en entrée les données descriptives de l'état de la calculatrice et la saisie de l'utilisateur et fait varier les données descriptives de l'état de la calculatrice selon ce qui est tapé.

Voilà ce que cela donne comme conception, avec ces fonctions à implémenter, ainsi que leurs fonctions auxiliaires :

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

enum calc_state { STATE_C, STATE_OPERATOR, STATE_RESULT };
char * calc_instructions[] = {
        [STATE_C]        = "Tapez un nombre (ou Q pour quitter)",
        [STATE_RESULT]   = "Tapez un opérateur (+, -, * ou / ou C pour remettre à zéro ou Q pour quitter)",
        [STATE_OPERATOR] = "Tapez un nombre (ou Q pour quitter)"
};
enum calc_entry_type { TYPE_OPERAND, TYPE_OPERATOR, TYPE_COMMAND, TYPE_UNKNOWN };

char valid_operators[]  = "+-*/";
char valid_commands[]   = "CQ";

struct calc {
        enum calc_state state;
        double res;
        char operator;
};

void calc_init(struct calc * c) {
        c->state = STATE_C;
        c->res = 0.0;
        c->operator = ' ';
}

void calc_display(struct calc * c) {
        if (c->state == STATE_RESULT)
                printf("= %f\n", c->res);
        printf("%s\n", calc_instructions[c->state]);
}

int is_valid_double(double * d, char * s) {
        /* TODO */
}

int is_valid_operator(char * c, char * s) {
        /* TODO */
}

double make_calculation(double op1, char operator, double op2) {
        double res;

        switch (operator) {
        case '+': res = op1 + op2; break;
        case '-': res = op1 - op2; break;
        case '*': res = op1 * op2; break;
        case '/': res = op1 / op2; break;
        };

        return res;
}

void calc_enter(struct calc * c, char * s){
        /* TODO */
}

int main(void) {
        {
        struct calc c;
        calc_init(&c);                                 calc_display(&c);
        assert(c.state ==  STATE_C);

        printf(">> %s\n", "12"); calc_enter(&c, "12"); calc_display(&c);
        assert(c.res == 12);
        assert(c.state ==  STATE_RESULT);

        printf(">> %s\n", "+");  calc_enter(&c, "+");  calc_display(&c);
        assert(c.operator == '+');
        assert(c.state ==  STATE_OPERATOR);

        printf(">> %s\n", "34"); calc_enter(&c, "34"); calc_display(&c);
        assert(c.res == 46);
        assert(c.state ==  STATE_RESULT);

        printf(">> %s\n", "/");  calc_enter(&c, "/");  calc_display(&c);
        printf(">> %s\n", "2");  calc_enter(&c, "2");  calc_display(&c);
        assert(c.res == 23);
        assert(c.state ==  STATE_RESULT);

        printf(">> %s\n", "*");  calc_enter(&c, "*");  calc_display(&c);
        printf(">> %s\n", "3");  calc_enter(&c, "3");  calc_display(&c);
        assert(c.res == 69);
        assert(c.state ==  STATE_RESULT);
        }

        return 0;
}

Les fonctions calc_enter() et les deux fonctions auxiliaires is_valid_double() et is_valid_operator() sont à implémenter.

is_valid_double() et is_valid_operator() permettent de vérifier qu'une chaîne de caractère saisie est un double (cela se fait en 5 lignes) ou que c'est un des opérateurs supportés par ta calculatrice (9 lignes).

Une fois cela fait, la fonction calc_enter() qui prend la saisie de l'utilisateur et fait varier les données descriptives de l'état de la calculatrice selon ce qui est tapé prend une 20aine de lignes chez moi pour faire passer les tests.

Les tests assert() qui sont dans main() passent alors.

Ils simulent une interaction avec l'utilisateur qui calcule 12 + 34, applique / 2 sur le résultat, et applique * 3 sur le résultat et testent que les les données descriptives de l'état de la calculatrice évoluent de la façon attendue :

Tapez un nombre (ou Q pour quitter)
>> 12
= 12.000000
Tapez un opérateur (+, -, * ou / ou C pour remettre à zéro ou Q pour quitter)
>> +
Tapez un nombre (ou Q pour quitter)
>> 34
= 46.000000
Tapez un opérateur (+, -, * ou / ou C pour remettre à zéro ou Q pour quitter)
>> /
Tapez un nombre (ou Q pour quitter)
>> 2
= 23.000000
Tapez un opérateur (+, -, * ou / ou C pour remettre à zéro ou Q pour quitter)
>> *
Tapez un nombre (ou Q pour quitter)
>> 3
= 69.000000
Tapez un opérateur (+, -, * ou / ou C pour remettre à zéro ou Q pour quitter)

Pour rendre le résultat des tests plus parlant, j'ai mis des appels à calc_display(&c); et j'ai mis un printf(">> %s\n", s); dans les tests qui affichent les choses (ces affichages ne sont pas réellement nécessaires).

Quand tu seras arrivé là, il suffirait d'ajouter une fonction traitant les commandes C ou Q pour mettre tout cela dans une boucle interactive gérant un vrai utilisateur humain.

Fais cela en dernier, lorsque tes fonctions seront au point.

Tu peux aussi ignorer cette façon de faire et tenter de déboguer ton code. Pour cela, tu devrais suivre les indications que j'ai déjà données et poster un code modifié.

0
PierrotLeFou
9 nov. 2022 à 02:55

Pour tes  if  qui fonc des affectations, essaies x=0 et y=0 ...
Si le résultat de l'opération vaut 0, alors le résultat du if est false (faux)
@[dal]: on peut simuler un "cls" qui marche sur tous les systèmes en affichant plusieurs lignes vides.

0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
Modifié le 9 nov. 2022 à 10:22

Pour tes  if  qui fonc des affectations, essaies x=0 et y=0 ...
Si le résultat de l'opération vaut 0, alors le résultat du if est false (faux)

Oui. Les if ne servent donc à rien et sont même dangereux.

Ce qui est à l'intérieur des parenthèses du if et qui effectue une affectation à i en appelant de nouveau les fonctions qui effectuent les opérations sur la base des opérandes précédentes "x" et "y" n'a pas de sens non plus. Il faut juste que GgManasse sauvegarde le résultat précédent quelque part (et non pas qu'il refasse l'opération) et effectue la bonne nouvelle opération à partir du résultat précédent et de la nouvelle opérande "d" (sans oublier de sauvegarder le nouveau résultat, qui pourra servir à la prochaine opération.

En fait, GgManasse a juste oublié de prendre un papier et un crayon et de réfléchir à son algorithme avant d'écrire 200 lignes de code confus pollué par ses efforts d'interaction avec l'utilisateur (menus, saisies, boucles maladroites, etc.) qui sont secondaires, et en oubliant l'essentiel.

L'algorithme de base n'est pourtant pas très difficile.

       ┌───────────┐
       │  Res = 0  │
       └─────┬─────┘
             │
     ┌───────▼────────┐
     │Obtient Opérande│
     └───────┬────────┘
             │
      ┌──────▼────────┐
      │ Res = Opérande│
      └──────┬────────┘
             │
       ┌─────▼───────┐
       │ Affiche Res ◄───────────┐
       └─────┬───────┘           │
             │                   │
     ┌───────▼─────────┐         │
     │Obtient Opérateur│         │
     └───────┬─────────┘         │
             │                   │
      ┌──────▼─────────┐         │
      │Obtient Opérande│         │
      └──────┬─────────┘         │
             │                   │
 ┌───────────▼────────────────┐  │
 │          Calcule           ├──┘
 │Res = Res Opérateur Opérande│
 └────────────────────────────┘
0
#include <stdio.h>
#include <math.h>

float somme(float a, float b) {
    float s;
    s = a + b;
    return(s);
}

float soustr(float a, float b)
{
    float s;
    s = a - b;
    return(s);
}

float multi(float a, float b) {
    float s;
    s = a * b;
    return(s);
}

float division(float a, float b) {
    float s;
    if(b != 0)
        s = a / b;
    return(s);
}

int main() {
    char reponse, decis;
    int choix,n;
    float x, y, a, b, c, delta, z, x1, x2, e, f, g, h, resul, d, i;
Accueil:
    printf("\n----CALCULATRIX.001--------------------------\n\n");
    printf("1.Calcul de normal\n");
    printf("2.Equation second degr : aX+bx-c = x\n");
    printf("3.Programme (A + B x C -
        D)\n----------------------------------------------------------------------------
            ----------------------------\n");
    scanf("%d",&choix);
    system("cls");
    switch(choix)
    {
        case 1 :
            goto CALCUL;
            break;
        case 2 :
            goto EQUATION;
            break;
        case 3 :
            goto PROGRAM;
            break;
    }
CALCUL :
    do {
        printf("-----Calcule Normal----\n\n");
        printf("\nSaisiser un nombre :");
        scanf("%f",&x);
        printf("Saisiser un nombre :");
        scanf("%f",&y);
        printf("\nEntrer(1) pour Addition +\n");
        printf("Entrer(2) pour Soustraction -\n");
        printf("Entrer(3) pour Multiplication *\n");
        printf("Entrer(4) pour Division /\n");
        printf("Entrer(5) pour la puissance : ");
        scanf("%d", &n);

        switch(n)
        {
            case 1 :
                {
                    printf("La somme de %.f + %.f = %.f ", x,y,somme(x,y));
                    printf("\n\n\n------------");
                    i=somme(x,y);
                    break;
                }
            case 2 :
                {
                    printf("La soustraction de %.f - %.f = %.f", x,y,soustr(x,y));
                    printf("\n\n\n------------");
                    i=soustr(x, y);
                    break;
                }
            case 3 :
                {
                    printf("La multiplication de %.f x %.f = %.f ", x, y, multi(x, y));
                    printf("\n\n\n------------");
                    i = multi(x, y);
                    break;
                }
            case 4 :
                {
                    if(y != 0)
                        printf("La division de %.f/%.f = %.f\n\n\n---------------", x, y, division(x, y));
                    else
                        printf("La division par 0 est implossible!");
                    i = division(x, y);
                    break;
                }
            case 5 :
                {
                    printf("la puissance est = %.2f ", pow(x, y));
                    printf("\n\n\n------------");
                    break;
                }
            default : printf("Erreur d'operation");
                      break;
        }

        printf("\nContinuer le cacul_(x)");
        printf("\nFaire un autre calcule_(O/N)?\n");
        printf("Retour a l'accueil_(A)\n");
        scanf(" %c", &reponse);
        switch (reponse)
        {
            case 'A' :
                goto Accueil;
                break;
            case 'x' :
                goto suivant;
                break;
        }
    }while (reponse !='N');

suivant :
    getc(stdin);
    printf("Operateur : ");
    scanf("%c",&decis);
    printf("Saisir une valeur : ");
    scanf("%f", &d);
    switch(decis)
    {
        case '+' :
            if (i == somme(x, y))
                printf("\n---%.f + %.f = %.4f---\n", i, d, i + d);
            else if (i == soustr(x, y))
                printf("\n---%.f + %.f = %.f---\n", i, d, i + d);
            else if (i == multi(x, y))
                printf("\n---%.f + %.f = %.f---\n", i, d, i + d);
            else(i == division(x, y)) ;
            printf("\n---%.f + %.f = %.f---\n", i,d,i + d);
            break;

        case '-' :
            if(i = (soustr(x,y)))
                printf("\n%.f - %.f = %.f", i, d, i - d);
            break;

        case '*' :
            i = (multi(x,y));
            printf("%.f x %.f = %.f", i, d, i * d);
            break;

        case '/' :
            i = (division(x,y));
            if(d !=0)
                printf("%.f / %.f = %.4f", i, d, i / d);
            else
                printf("Calcul Error : Impossible de diviser par 0\n");
            break;

        default : printf("OPERATEUR INCONNUE\n");
                  break;
    }
    printf("\nContinuer le calcul (x)");
    printf("\nFaire un autre calcul (O/N)?\n");
    printf("Retour à l'accueil (A)\n");
    scanf(" %c", &reponse);
    switch(reponse)
    {
        case 'A' :
            goto Accueil;
            break;
    }


EQUATION :
    do {
        printf("------Equation du 2nd degre-----\n");
        printf("------(aX + bx - c)------\n\n");
        printf("Saisiser les valeurs de a,b et c : \n");
        scanf("%f%f%f", &a, &b, &c);
        delta = pow(b, 2) - (4 * a * c);
        if (delta < 0)
            printf("\nD = %.f^2 - 4(%.f x %.f )< 0 \nPas de solution
                    réelles delta étant inférieur à 0\n\n\n", b, a, c);
        else if (delta == 0) {
            z = (-b) / (2 * a);
            printf("\nD = -%.f/2 x %.f = 0 \nDelta étant egal à 0,
                    la solution de x est :%.2f\n\n\n", b, a, z);
        } else {
            x1 = (-b - sqrt(delta)) / (2 * a);
            x2 = (-b + sqrt(delta)) / (2 * a);
            printf("\n -%.f - V(%.f)\nx1 = -------------\n
                    2 x %.f\n", b, delta, a);
            printf("\n -%.f + V(%.f)\nx2 = -------------\n
                    2 x %.f\n", b, delta, a);
            printf("les solutions sont : x1= %.2f\n", x1);
            printf(" x2= %.2f\n\n", x2);
            printf("\n_____________\n");
        }
        printf("\nVeux-tu faire un autre calcul (O/N)?\n");
        printf("Retour à l'accueil (A)\n");
        scanf(" %c", &reponse);
        switch (reponse) {
            case 'A':
                goto Accueil;
                break;
        }
    } while (reponse !='N');
PROGRAM:
    do {
        printf("Calcul (A + B x C - D)\n\n");
        printf("Donner les valeurs de A, de B, de C et de D : \n");
        scanf("%f%f%f%f", &e, &f, &g, &h);
        resul = (f * g + e - h);
        if (resul >= 0) {
            printf("[ %.f + %.f x %.f - %.f ] = %.f\n", e, f, g, h, resul);
            printf("\n---------------\n");
        }
        printf("\nVeux-tu faire un autre calcul (O/N)?\n");
        printf("Retour à l'accueil (A)\n");
        scanf(" %c", &reponse);
        switch (reponse) {
            case 'A':
                goto Accueil;
                break;
        }
    }while(reponse !='N');
    return 0;
}
0

J'ai corrigé les erreurs cette nuit et donc le problème ( utiliser le résultat d'un calcul pour un autre quelconque Calcul) dans 1.Calcul normal fonction enfin il suffit de faire x après un calcul, j'ai surtout beaucoup réfléchi sur la manière dont mes conditions étaient écrie après que Dal mais fait remarquer que je n'avais pas effectué de variable i pour récupérer les résultats de mes calculs, ha! et encore merci je viens de voir les exemples de code que t'a envoyé.

0
PierrotLeFou
9 nov. 2022 à 18:57

Il ne suffit pas de faire des "patch" sur ton code pour que ça marche.
Il faut repenser ton code au complet comme le suggère[dal]

0

Ok, j'y compte bien, mais es ce que le dernier code que j'ai envoyé fonction chez vous?

0
PierrotLeFou
10 nov. 2022 à 00:55

S'il ne fonctionne pas chez toi, il ne fonctionnera pas chez nous ...

0

Mais ça fonctionne chez moi

0
yg_be Messages postés 22698 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 avril 2024 1 471
10 nov. 2022 à 09:19

Tout va bien, alors.  La discussion peut-elle être marquée comme résolue?

0