# une calculette en language C



## J£$µ$ (2 Janvier 2005)

boujour ,
je programme une calculette en C et je n'arrive pa a fair le choi de l'operateur 
je sai juste faire le choi des chiffre 
et si je replace le signe pa une lettre et ke g declaree a et b comme des chiffre , c comme un operateur et ac comme le resultat par exemple et ke note : 

ac=acb

logikement il me demande de declaree ossi acb ....

merci de me dire comment faire.


----------



## Ptit-beignet (2 Janvier 2005)

euh ... j'ai lu deux fois , j'ai toujours pas compris.
Soit je suis encore un peu creve par le jour de l'an soit c pas tres tres clair
Si tu peux coller ton code je pense que je pourrai plus facilement t'aider.
A+
Vincent


----------



## Didier Guillion (2 Janvier 2005)

Bonsoir,

Je ne comprends pas non plus...

Essaie de soigner un mimimum ton orthographe, le langage SMS, on n'aimes pas trop ici.
Rien ne motive plus une réponse, qu'une question claire et propre : on se dit, le gars a passé plus de 30 secondes à poser la question, passons un quart d'heure à lui répondre...

Cordialement


----------



## molgow (2 Janvier 2005)

Didier Guillion a dit:
			
		

> Essaie de soigner un mimimum ton orthographe, le langage SMS, on n'aimes pas trop ici d'ailleurs.


 Non en effet, on n'aime pas ici comme sur les autres forums d'ailleurs. Donc essaie de t'exprimer de manière compréhensible, c'est dans ton intérêt si tu veux obtenir des réponses. Merci.


    PS pour Didier: on dit "on n'aime" sans "s" il me semble ?!


----------



## J£$µ$ (2 Janvier 2005)

ok je v aisseyer de soigner mon ecriture.
voici mon programme:

#include <stdio.h>
int main(void)
{
       float A,B,R;
       puts ("valeur de A:");
       scanf("%f",&A);
       puts ("valeur de B:");
       scanf("%f",&B);
       R=A*B;
       printf("R=%f\n",R);
}		

voila je voudrai savoir comment avoir le choix de l'operateur. merci.


----------



## Didier Guillion (3 Janvier 2005)

J£$µ$ a dit:
			
		

> ok je v aisseyer de soigner mon ecriture.
> voici mon programme:
> 
> #include <stdio.h>
> ...



De la meme maniere que tu saisis une valeur de type float avec %f, tu peut saisir une chaine de caractere, via %s. Tu comparera ensuite
 ta chaine aux differents operateurs (+,-,*,/)

Par exemple,

char chaine[255];

puts("Donnez l'operateur");
scanf("%s",chaine);
if(!strcmp(chaine,"+")) ...
else if(!strcmp(chaine,"-")) ...
else printf("Je ne connnais pas cet operateur");

Mais pour une interface plus ergonomique, le mieux serait d'integrer ton code à du Cocoa.

Cordialement


----------



## GrandGibus (3 Janvier 2005)

Autre solution: *la saisie en notation polonaise inverse* !!! (un bon exemple).

c'est un grand classique de la programmation


----------



## ntx (3 Janvier 2005)

Et peut être la façon la plus élégante d'implémenter ce type d'application  A méditer pour ceux qui se demandent depuis 20 ans pourquoi HP s'était aventuré la-dedans pour ces calculatrices :O


----------



## BeNBiBiFoKe (5 Janvier 2005)

ntx a dit:
			
		

> Et peut être la façon la plus élégante d'implémenter ce type d'application  A méditer pour ceux qui se demandent depuis 20 ans pourquoi HP s'était aventuré la-dedans pour ces calculatrices :O



Personelement, je préfère cette manière, y a pas 50 parenthèses   


Sinon pour le programme c'est plus beau avec un switch plutôt que des elseif non ?   

Voici un exemple de code d'une calculatrice "complète" mode console 
Ca le code d'un de mes cours de l'année passée, on commentait en anglais désolé si tu es anglophobe !!!


IMPORTANT : pour compiler avec gcc, si tu ne stipules pas que c 'est du C99 (qui a certains avantages du c++), gcc va t'envoyer bouler  !!!

Pour compiler : gcc  --std=c99 --pedantic lefichier.c 

**********************
#include <stdio.h>
#include <stdbool.h>
#include <ctype.h>

static int fastExponentiation(int base, int exponent);


static int fastExponentiation(int base, int exponent)
{
  int a = 1;
  int b = base;
  int c = exponent;

  // Loop invariant : a*(b^c) = base^exponent.
  while (c) {
    if (c % 2)
      a = a * b;

    b = b * b;
    c = c / 2;
  }

  // Postcondition : c == 0, thus base^exponent = a.
  return a;
}

/**
 *   Main function.
 **/

int main()
{
  int currentValue;

  // Read the first operand
  printf("Entrez la valeur initiale : ");

  int readArguments;
  readArguments = scanf("%d", &currentValue);

  if (readArguments != 1) {
    printf("Vous n'avez pas entrÈ un nombre !");
    return -1;
  }

  // Loop forever
  while (true) {
    // Display the current value
    printf("Valeur actuelle : %d\n", currentValue);
    printf("Entrez un opÈrateur et une opÈrande : ");

    // Read the new operator
    int operator;
    do {
      operator = getchar();       // Try reading a new character
    } while (operator != EOF &&   // Stop when reaching the end of the input
	     isspace(operator));  // Loop until reaching a non-blank char.

    if (operator == EOF) {        // The end of the input has been reached
      printf("Vous avez mal formattÈ votre opÈrateur !\n");
      return -1;
    }

    if (operator == 'q')          // The user wants to stop the calculation
      break;

    // Read the new operand
    int operand;
    readArguments = scanf("%d", &operand);

    if (readArguments != 1) {
      printf("Vous avez mal formattÈ votre opÈrande !\n");
      return -1;
    }

    // Operator handling
    switch (operator) {
    case '+' : currentValue += operand; break;  // Addition case
    case '-' : currentValue -= operand; break;  // Substraction case
    case '*' : currentValue *= operand; break;  // Multiplication case

    case '/' :                                  // Division case
      if (!operand) {                           // Division by zero handling
	printf("Tentative de division par zÈro !\n");
	return -1;
      }

      currentValue /= operand;
      break;

    case '^' :                                  // Integer power case
      if (operand < 0) {                        // Negative power handling
	printf("Elevation ? une puissance nÈgative !\n");
	return -1;
      }

      currentValue = fastExponentiation(currentValue, operand);
      break;

    default :                                   // Default case : error
      printf("OpÈrateur inconnu !\n");
      return -1;
    }
  }

  return 0;
}


----------



## GrandGibus (5 Janvier 2005)

BeNBiBiFoKe a dit:
			
		

> Ca le code d'un de mes cours de l'année passée, on commentait en anglais désolé si tu es anglophobe !!!



C'est bien d'apprendre aux élèves à commenter en anglais... car il serait très présomptueux de deviner l'avenir du code que l'on écrit... 

D'expérience, ça m'est déjà arrivé de partager du code avec des hollandais, chinois et américains...  fait par des français au départ... et s'il n'y avait pas eu les commentaires en anglais dès le début.... je vous laisse imaginer la suite !

Ca ça mérite un coup de boule


----------



## BeNBiBiFoKe (5 Janvier 2005)

GrandGibus a dit:
			
		

> C'est bien d'apprendre aux élèves à commenter en anglais... car il serait très présomptueux de deviner l'avenir du code que l'on écrit...



Je suis tout à fait d'accord avec toi 

Certains pro-fr m'ont déjà accusé de poster un code qui n'est pas à moi sous prétexte que c'était commenté en anglais (et que c'était complètement débile en plus)


----------

