Apres tout votre que vous venez de decouvrir, c’est moment d’effectuer une simple pause et de mettre en pratique vos nouveaux acquis.
Pour votre faire, rien de tel qu’un travaux recapitulatif : confectionner une calculatrice basique.
Objectif
Votre objectif sera de realiser une calculatrice basique pouvant calculer une somme, une soustraction, une multiplication, une division, le reste 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 dit, nos operandes d’une operation seront entres avant l’operateur, par exemple tel ceci Afin de la somme de quatre et 5 : 4 5 + .
Elle doit egalement retenir le resultat de l’operation precedente et deduire l’utilisation de celui-ci en cas d’omission d’un operande. Plus precisement, si l’utilisateur entre pourquoi pas 5 + , vous devrez deduire que le premier operande de la somme reste le rendu de l’operation precedente (ou zero s’il n’y en a pas encore eu).
Chaque operation va i?tre identifiee par un symbole ou une lettre, comme suit :
Le chantier devra s’arreter si votre lettre « q » reste specifiee comme operation (avec ou sans operande).
Preparation
Explications 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 une fonction scanf() : sa valeur de retour. Nous anticipons quelque peu i propos des chapitres suivants, mais sachez que la fonction scanf() retourne une valeur entiere correspondant au nombre de conversions reussies. Une conversion reste reussie si votre qu’entre l’utilisateur correspond a l’indicateur de conversion.
Ainsi, si nous souhaitons recuperer 1 entier a l’aide de l’indicateur d , la conversion est reussie si l’utilisateur entre un nombre (entre autres 2) alors qu’elle echouera s’il entre une lettre ou un signe de ponctuation.
Grace a i§a, chacun pourra detecter facilement s’il manque ou non 1 operande Afin de une operation.
Lorsqu’une conversion echoue, la fonction scanf() arrete le execution. Aussi, s’il y avait d’autres conversions a effectuer apres celle qui a avorte, elles ne sont jamais accomplies.
Dans le code ci-dessus, si l’utilisateur entre 7 * , la fonction scanf() retournera 1 et n’aura lu que le nombre 7. Cela sera necessaire de l’appeler une
seconde fois afin que le symbole * soit recupere.
Petit bemol tout de meme : les symboles + et – paraissent consideres tel des debuts de nombre valables (puisque vous pourrez comme entrer -2). Des au cours, si vous souhaitez additionner ou soustraire 1 nombre au rendu de l’operation precedente, vous devrez doubler votre symbole. Pour ajouter cinq ceci donnera donc : 5 ++ .
Mes puissances
Cette derniere prend deux arguments : la base et l’exposant.
L’utilisation en bibliotheque mathematique requiert d’ajouter l’option -lm au cours d’la compilation, comme ceci : zcc main.c -lm (faites bien en fai§on de placer -lm apres le ou nos fichiers sources).
Notre factorielle
Notre factorielle d’un nombre reste egale au bien des nombres entiers positifs et non nuls inferieurs ou egaux a ce nombre. La factorielle de quatre equivaut donc a 1 * 2 * 3 * 4 , donc vingt-quatre. Cette fonction n’est gui?re fournie par la bibliotheque standard, il vous faudra donc la programmer (pareil concernant le PGCD et le PPCD).
Par convention, la factorielle de zero est egale a un.
Notre PGCD
Le plus grand commun diviseur de deux entiers (abrege PGCD) est, parmi les diviseurs communs a ces entiers, le plus grand d’entre eux. Notamment, le PGCD de 60 et 18 est 6.
Par convention, le PGCD de 0 et 0 est 0 et le PGCD d’un entier non nul et de zero est votre entier non nul.
Notre 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 des deux nombres. Pourquoi pas, le PPCD de 2 et 3 reste 6.
Par convention, si l’un des deux entiers (ou les deux) paraissent nuls, le resultat reste zero.
Exemple d’utilisation
Derniers recommandations
Nous vous conseillons de recuperer les nombres sous forme de double . Cependant, gardez bien a l’esprit que quelques operations ne vont pas pouvoir s’appliquer qu’a des entiers : le demeure une division entiere, la factorielle, le PGCD et le PPCD. Cela 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 l’integralite des autres operations.
Bien, vous avez a present toutes les cartes en main : au article !
Correction
Alors ? Manque trop secoue ? Bien, voyons a present la correction.
Commencons par la fonction main() . Nous definissons plusieurs variables :
- res , correspondant au resultat d’une derniere operation realisee (ou zero s’il n’y en a pas encore eu) ;
- a et b , qui representent des eventuels operandes fournis ;
- op , qui retient l’operation demandee ; et
- n , qui est utilisee pour retenir le retour en fonction scanf() .
Ensuite, nous entrons dans une boucle infinie (la condition dit i chaque fois vraie puisque valant un) 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 aucun (ce qui se deduit, respectivement, d’un retour de la fonction scanf() valant un ou zero). Si c’est le cas, nous appelons une seconde fois scanf() pour recuperer l’operateur. Puis, la valeur de a est attribuee a b et la valeur de res a a .
Si l’operateur utilise est q , alors nous quittons la boucle et par la meme occasion le chantier. Notez que nous n’avons pas pu effectuer une telle verification au corps de l’instruction switch qui suit puisque l’instruction break nous aurait fait quitter celui-ci et non la boucle.
Enfin, nous realisons l’operation demandee au sein de l’instruction switch , nous stockons le service dans la variable res et l’affichons. Remarquez que l’utilisation de conversions explicites n’a ete utile que pour le calcul du reste en division entiere. Dans les faits, en autres cas (comme 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 pour disposer de la plus grande capacite possible. Par ailleurs, nous avons employe le type unsigned long long pour la fonction factorielle puisque celle-ci n’opere que sur des nombres strictement positifs.
Ce chapitre nous aura permis de revoir bon nombre de notions des chapitres precedents. Dans le chapitre suivant, nous verrons comment decouper nos projets en plusieurs fichiers.
