Apres tout votre que vous venez de decouvrir, c’est temps libre d’effectuer une simple pause ainsi que mettre en pratique vos nouveaux acquis.

Apres tout votre que vous venez de decouvrir, c’est temps libre d’effectuer une simple pause ainsi que mettre en pratique vos nouveaux acquis.

Pour ce Realiser, rien de tel qu’un exercice 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 est 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, les operandes d’une operation seront entres avant l’operateur, par exemple comme 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 avec un symbole ou une lettre, comme suit :

Le chantier doit s’arreter si la lettre « q » est specifiee tel operation (avec ou sans operande).

Preparation

Precisions 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 d’une fonction scanf() : sa valeur de renvoi. Nous anticipons legerement 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 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, vous pouvez detecter facilement s’il manque ou non un operande pour 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 possi?de avorte, elles ne sont jamais accomplies.

Au 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 pour que le symbole * soit recupere.

Petit bemol tout de meme : des symboles + et – seront consideres comme des debuts de nombre valables (puisque vous pouvez entre autres entrer -2). Des au cours, si vous souhaitez additionner ou soustraire un nombre au rendu de l’operation precedente, vous devez doubler votre symbole. Pour ajouter 5 ceci donnera donc : 5 ++ .

Mes puissances

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

L’utilisation d’la bibliotheque mathematique requiert d’ajouter l’option -lm au cours d’une 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 est 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

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

Par convention, le PGCD de 0 et 0 reste 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 est le plus petit entier strictement positif qui soit multiple de ces deux nombres. Notamment, le PPCD de 2 et 3 reste 6.

Par convention, si l’un des deux entiers (ou les deux) sont nuls, le resultat reste zero.

Exemple 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 est en division entiere, la factorielle, le PGCD et le PPCD. Il 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 toutes les autres operations.

Bien, vous avez a present chacune des cartes en main : au projet !

Correction

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

willow

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

  • res , correspondant au resultat une derniere operation realisee (ou zero s’il n’y en a pas encore eu) ;
  • a et b , qui representent les 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 i  chaque fois 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 une fonction scanf() valant 1 ou zero). Si c’est la situation, 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 est q , alors nous quittons la boucle et par la meme occasion le chantier. Notez que nous n’avons gui?re pu effectuer votre 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 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 utile que concernant le calcul du reste d’la division entiere. Dans les faits, en autres cas (par exemple au cours de l’affectation a la variable res ), ils font des conversions implicites.

Nous avons utilise le type long long au cours des calculs necessitants des nombres entiers pour 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 bon nombre de notions des chapitres precedents. Au chapitre suivant, nous verrons comment decouper nos projets en plusieurs fichiers.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Başa dön