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 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, les operandes d’une operation seront entres avant l’operateur, pourquoi pas tel ceci Afin de la somme de quatre et 5 : 4 5 + .
Elle doit 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 par exemple 5 + , vous devez deduire que le premier operande en somme reste le resultat 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 devra s’arreter lorsque votre lettre « q » reste specifiee comme operation (avec ou sans operande).
Preparation
Explications concernant scanf
Pourquoi utiliser J’ai 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 renvoi. 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 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 est reussie si l’utilisateur entre un nombre (pourquoi pas 2) alors qu’elle echouera s’il entre une lettre ou un signe de ponctuation.
Grace a ceci, chacun pourra detecter rapidement s’il manque ou non votre operande pour une operation.
Lorsqu’une conversion comment s’inscrire sur blackchristianpeoplemeet echoue, la fonction scanf() arrete le execution. Aussi, s’il y avait d’autres conversions a effectuer apres celle qui possi?de avorte, elles ne sont nullement 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 tout ainsi : nos symboles + et – paraissent consideres comme des debuts de nombre valables (puisque vous pouvez par exemple entrer -2). Des lors, si vous souhaitez additionner ou soustraire un nombre au rendu de l’operation precedente, vous devrez doubler votre symbole. Pour ajouter cinq ceci donnera donc : 5 ++ .
Les puissances
Cette derniere prend deux arguments : la base et l’exposant.
L’utilisation d’une bibliotheque mathematique requiert d’ajouter l’option -lm au cours en compilation, comme ceci : zcc main.c -lm (faites beaucoup en fai§on de placer -lm apres le ou les fichiers sources).
J’ai factorielle
J’ai factorielle d’un nombre est 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 nullement 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
Notre plus grand commun diviseur de 2 entiers (abrege PGCD) est, parmi des 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 est 0 et le PGCD d’un entier non nul ainsi que zero est cet entier non nul.
Le PPCD
Notre plus petit commun denominateur (ou le plus petit commun multiple), abrege PPCD, de deux entiers reste le plus petit entier strictement positif qui soit multiple de ces deux nombres. Pourquoi pas, le PPCD de 2 et 3 est 6.
Par convention, si l’un des deux entiers (ou les deux) sont nuls, le service reste zero.
Modi?le d’utilisation
Derniers conseils
Nous vous conseillons de denicher les nombres sous forme de double . Cependant, gardez bien a l’esprit que certaines operations ne vont pas pouvoir s’appliquer qu’a des entiers : le est de la division entiere, la factorielle, le PGCD et le PPCD. Cela vous sera donc necessaire d’effectuer des conversions.
Egalement, notez bien que la factorielle ne s’applique qu’a un seul operande a l’inverse de l’ensemble des autres operations.
Bien, vous avez a present toutes les cartes en main : au bricolage !
Correction
Alors ? Manque trop secoue ? Bien, voyons a present la correction.
Commencons par la fonction main() . Nous definissons plusieurs variables :
- res , correspondant au resultat de la 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 reste utilisee pour retenir le retour en fonction scanf() .
Ensuite, nous entrons dans une boucle infinie (la condition dit i chaque fois vraie puisque valant votre) 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 d’une fonction scanf() valant 1 ou zero). Si c’est la situation, 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 , aussi nous quittons la boucle et par la meme occasion le programme. Notez que nous n’avons gui?re pu effectuer votre verification dans le 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 dans l’instruction switch , nous stockons le resultat dans la variable res et l’affichons. Remarquez que l’utilisation de conversions explicites n’a ete important que concernant le calcul du reste d’la division entiere. En effet, au sein des autres cas (notamment au cours de l’affectation a J’ai variable res ), ils font des conversions implicites.
Nous avons utilise le type long long au cours des calculs necessitants des nombres entiers Dans l’optique de disposer d’la 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 dans 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 des projets en diverses fichiers.