Pour ce faire, rien de tel qu’un travaux recapitulatif : composer 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 devoile, des operandes d’une operation sont entres avant l’operateur, Prenons un exemple tel ceci Afin de la somme de quatre et 5 : 4 5 + .
Elle va devoir egalement retenir le rendu de l’operation precedente et deduire l’utilisation de celui-ci en cas d’omission d’un operande. Plus precisement, si l’utilisateur entre notamment 5 + , vous devez deduire que le premier operande de la somme est le rendu de l’operation precedente (ou zero s’il n’y en a toujours pas eu).
Chaque operation va i?tre identifiee par un symbole ou une lettre, comme suit :
Le chantier devra s’arreter Quand sa lettre « q » reste specifiee tel operation (avec ou sans operande).
Preparation
Explications pour scanf
Pourquoi utiliser la notation polonaise inverse et non l’ecriture habituelle ?
Parce qu’elle va vous permettre de beneficier d’une caracteristique interessante d’la fonction scanf() : sa valeur de retour. Nous anticipons un brin 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 va etre 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 ce qui, vous pouvez detecter rapidement s’il manque ou non 1 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 seront nullement realisees.
Dans le 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 de meme : les symboles + et – paraissent consideres comme des debuts de nombre valables (puisque vous pouvez Prenons un exemple entrer -2). Des au cours, si vous souhaitez additionner ou soustraire un nombre au service de l’operation precedente, vous devrez doubler votre symbole. Pour ajouter cinq ce qui donnera donc : 5 ++ .
Mes puissances
Cette derniere prend deux arguments : la base et l’exposant.
L’utilisation de la bibliotheque mathematique requiert d’ajouter l’option -lm lors une compilation, comme ceci : zcc main.c -lm (faites beaucoup en fai§on de placer -lm apres le ou les fichiers sources).
Notre factorielle
Notre factorielle d’un nombre est egale au service des nombres entiers positifs et non nuls inferieurs ou egaux a ce nombre. Notre 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.
Le PGCD
Notre plus grand commun diviseur de 2 entiers (abrege PGCD) reste, parmi des diviseurs communs a ces entiers, le plus grand d’entre eux. Entre autres, le PGCD de 60 et 18 reste 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.
Notre PPCD
Le 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. Notamment, le PPCD de 2 et 3 est 6.
Par convention, si l’un des deux entiers (ou les deux) paraissent nuls, le service reste zero.
Modi?le d’utilisation
Derniers conseils
Nous vous conseillons de recuperer les nombres sous forme de double . Cependant, gardez beaucoup a l’esprit que certaines operations ne vont pas pouvoir s’appliquer qu’a des entiers : le reste 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’ensemble des autres operations.
Correctement, vous avez a present l’ensemble des cartes pose i ci?te : au projet !
Correction
Aussi ? Manque trop secoue ? Correctement, voyons a present la correction.
Commencons par la fonction main() . Nous definissons plusieurs variables :
- res , qui correspond au resultat de la derniere operation realisee (ou zero s’il n’y en a toujours pas eu) ;
- a et b , qui representent nos eventuels operandes fournis ;
- op , qui retient l’operation demandee ; et
- n , qui reste utilisee pour retenir le retour d’une fonction scanf() .
Ensuite, nous entrons dans une boucle infinie (la condition etant forcement 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 clover dating connexion seul operande est fourni ou aucun (ce qui se deduit, respectivement, d’un retour en fonction scanf() valant 1 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 reste q , aussi nous quittons la boucle et par la meme occasion le programme. Notez que nous n’avons jamais pu effectuer votre verification dans le 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 dans l’instruction switch , nous stockons le rendu dans la variable res et l’affichons. Remarquez que l’utilisation de conversions explicites n’a ete utile que pour le calcul du reste d’la division entiere. En effet, en autres cas (comme au cours de l’affectation a Notre 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 pour la fonction factorielle puisque celle-ci n’opere que via des nombres strictement positifs.
Ce chapitre nous aura permis de revoir la plupart des notions des chapitres precedents. Dans le chapitre suivant, nous verrons comment decouper les projets en plusieurs fichiers.