Apres bien ce que vous venez de decouvrir, il va i?tre temps de faire une bri?ve pause et de mettre en pratique vos nouveaux acquis.

Pour votre Realiser, rien de tel qu’un exercice recapitulatif : realiser une calculatrice basique.

Objectif

Votre objectif sera de realiser une calculatrice basique pouvant calculer une somme, une soustraction, une multiplication, une division, le demeure d’une division entiere, une puissance, une factorielle, le PGCD et le PPCD.

Celle-ci attendra une entree formatee suivant la notation polonaise inverse. Autrement evoque, nos operandes d’une operation vont i?tre entres avant l’operateur, notamment comme ceci pour la somme de quatre et 5 : 4 5 + .

Elle va devoir egalement retenir le service de l’operation precedente et deduire l’utilisation de celui-ci en cas d’omission d’un operande. Plus precisement, si l’utilisateur entre entre autres 5 + , vous devrez deduire que le premier operande une somme est le rendu de l’operation precedente (ou zero s’il n’y en a pas encore eu).

Chaque operation sera identifiee par un symbole ou une lettre, comme suit :

Le chantier doit s’arreter Quand ma lettre « q » est specifiee comme operation (avec ou sans operande).

Preparation

Precisions concernant scanf

Pourquoi utiliser Notre notation polonaise inverse et non l’ecriture habituelle ?

Parce qu’elle va vous permettre de beneficier d’une caracteristique interessante en fonction scanf() : sa valeur de retour. Nous anticipons un tantinet i  propos des chapitres suivants, mais sachez que la fonction scanf() retourne une valeur entiere correspondant au nombre de conversions reussies. Une conversion est reussie si ce qu’entre l’utilisateur correspond a l’indicateur de conversion.

Ainsi, si nous souhaitons recuperer un entier a l’aide de l’indicateur d , la conversion sera reussie si l’utilisateur entre un nombre (par exemple 2) alors qu’elle echouera s’il entre une lettre ou un signe de ponctuation.

Grace a ce qui, chacun pourra detecter rapidement s’il manque ou non un operande pour une operation.

Lorsqu’une conversion echoue, la fonction scanf() arrete son execution. Aussi, s’il y avait d’autres conversions a effectuer apres celle qui a avorte, elles ne vont i?tre pas realisees.

Au code ci-dessus, si l’utilisateur entre 7 * , la fonction scanf() retournera 1 et n’aura lu que le nombre 7. Il sera necessaire de l’appeler une seconde fois afin que le symbole * soit recupere.

Petit bemol bien de meme : les symboles + et – paraissent consideres comme des debuts de nombre valables (puisque vous pourrez notamment entrer -2). Des lors, si vous souhaitez additionner ou soustraire un nombre au service de l’operation precedente, vous devez doubler ce symbole. Pour ajouter cinq ceci donnera donc : 5 ++ .

Les puissances

Cette derniere prend deux arguments : la base et l’exposant.

L’utilisation une bibliotheque mathematique requiert d’ajouter l’option -lm lors d’la compilation, comme ceci : zcc main.c -lm (faites bien en sorte de placer -lm apres le ou nos fichiers sources).

La factorielle

J’ai factorielle d’un nombre reste egale au bien des nombres entiers positifs et non nuls inferieurs ou egaux a votre nombre. Notre factorielle de quatre equivaut donc a 1 * 2 * 3 * 4 , donc vingt-quatre. Cette fonction n’est pas fournie par la bibliotheque standard, il vous faudra donc la programmer (pareil pour le PGCD et le PPCD).

Par convention, la factorielle de zero est egale a un.

Notre PGCD

Notre plus grand commun diviseur de 2 entiers (abrege PGCD) est, parmi nos diviseurs communs a ces entiers, le plus grand d’entre eux. Par exemple, le PGCD de 60 et 18 est 6.

Par convention, le PGCD de 0 et 0 reste 0 et le PGCD d’un entier non nul et de zero est cet entier non nul.

Le PPCD

Notre plus petit commun denominateur (ou le plus petit commun multiple), abrege PPCD, de deux entiers est le plus petit entier strictement positif qui soit multiple de ces deux nombres. Notamment, le PPCD de 2 et 3 est 6.

Par convention, si l’un des deux entiers (ou les deux) seront nuls, le service est zero.

Modi?le d’utilisation
Derniers recommandations

Nous vous conseillons de denicher les nombres sous forme de double . Cependant, gardez beaucoup a l’esprit que quelques operations ne vont pas pouvoir s’appliquer qu’a des entiers : le reste d’une division entiere, la factorielle, le PGCD et le PPCD. Il vous sera donc important d’effectuer des conversions.

Egalement, notez bien que la factorielle ne s’applique qu’a un seul operande a l’inverse de chacune des autres operations.

Bien, vous avez a present toutes les cartes en main : au projet !

Correction

Aussi ? Pas trop secoue ? Bien, voyons a present la correction.

Commencons par la fonction main() . Nous definissons plusieurs variables :

  • res , qui correspond au resultat d’une derniere operation realisee (ou zero s’il n’y en a toujours pas eu) ;
  • a et b , qui representent des eventuels operandes fournis ;
  • op , qui retient l’operation demandee ; et
  • n , qui est utilisee Afin de retenir le retour d’une fonction scanf() .

Ensuite, nous entrons dans une boucle infinie (la condition dit forcement vraie puisque valant 1) ou nous demandons a l’utilisateur d’entrer l’operation a realiser et les eventuels operandes. Nous verifions ensuite si un seul operande est fourni ou pas de (ce qui se deduit, respectivement, d’un retour d’la fonction scanf() valant 1 ou zero). Si c’est l’eventualite, nous appelons une seconde fois scanf() Afin de recuperer l’operateur. Puis, la valeur de a est attribuee a b et la valeur de res a a .

Si l’operateur utilise reste q , envie de rencontres Г©changistes alors nous quittons la boucle et par la meme occasion le programme. Notez que nous n’avons pas pu effectuer cette verification au corps de l’instruction switch qui suit puisque l’instruction break nous aurait fera quitter celui-ci et non la boucle.

Enfin, nous realisons l’operation demandee au sein de l’instruction switch , nous stockons le resultat dans la variable res et l’affichons. Remarquez que l’utilisation de conversions explicites n’a ete necessaire que concernant le calcul du reste une division entiere. En effet, au sein des autres cas (notamment lors de l’affectation a la variable res ), ils font des conversions implicites.

Nous avons utilise le type long long lors des calculs necessitants des nombres entiers afin de disposer en plus grande capacite possible. Par ailleurs, nous avons employe le type unsigned long long Afin de la fonction factorielle puisque celle-ci n’opere que sur des nombres strictement positifs.

Ce chapitre nous aura permis de revoir la plupart des notions des chapitres precedents. Au chapitre suivant, nous verrons De quelle fai§on decouper nos projets en plusieurs fichiers.