Download ex3.adb


with Ada.Text_Io, Ada.Integer_Text_Io, Ada.Float_Text_Io;
use Ada.Text_Io, Ada.Integer_Text_Io, Ada.Float_Text_Io;

-- Début exercice 3
procedure Ex3 is
   -- Les valeurs suivantes stockent des montants monétaire, le type
   -- de ces valeurs est Float.
   Montant_Total : Float := 0.0;
   Montant_Moyen : Float;
   Depot : Float := 0.0-- Montant saisi par l'utilisateur
   -- Le nombre d'enveloppes est un entier (naturel qui plus est).
   Nb_Enveloppes : Natural := 0;
begin

   -- On peut utiliser deux types de boucles: générale (loop) et
   -- tant que (while). Ces deux types de boucles permettent de
   -- faire des itérations sans savoir à l'avance le nombre de tour
   -- que l'on doit faire. La boucle pour (for) n'est pas dans
   -- ce cas et elle est donc à proscrire.

   -- Nous allons dans la suite utiliser la boucle générale (loop)
   -- pour tirer avantage du fait que l'on peut sortir quand on le
   -- souhaite (exit when) de la boucle.

   loop
      
-- On rentre obligatoirement dans la boucle, il n'y a pas de
      -- conditions qui nous en empêche.

      Put("Saisir le montant du dépot (<=0 pour quitter) ?");
      Get( Depot );

      -- On quitte la boucle si l'utilisateur saisit un montant
      -- négatif ou nul. Le programme peut donc bien s'arrêter.
      -- Il faudra faire cependant attention au cas où l'utilisateur
      -- saisit comme premier montant un nombre négatif ou nul.
      -- (voir plus bas)
      exit when Depot <= 0.0;

      -- Calcul du montant total saisi
      Montant_Total := Montant_Total + Depot;
      -- Ajout d'une enveloppe saisie
      Nb_Enveloppes := Nb_Enveloppes + 1;

      -- On n'a plus rien à faire. Calculer la moyenne est inutile,
      -- nous n'en avons besoin qu'à la fin du programme. On peut
      -- donc boucler pour demander à l'utilisateur de saisir
      -- l'enveloppe suivante.
   end loop;

   -- Test si une enveloppe au moins a été saisie pour éviter la
   -- division par 0.
   if ( Nb_Enveloppes = 0 ) then
      Put("Aucun dépot effectué, rien à afficher.");
   else
      -- Calcul du montant moyen
      Montant_Moyen := Montant_Total / Float( Nb_Enveloppes);
      -- On convertit ici Nb_Enveloppes en Float pour faire le calul
      -- de la division du montant moyen.

      -- Erreur très fréquente:
      -- Il faut faire attention surtout si l'on utilise un while à
      -- ce que le montant total soit juste (que l'on n'est pas
      -- compté la dernière valeur de dépôt négative par exemple)
      -- et également que le nombre d'enveloppes soit correct (que
      -- l'on ait pas compté la dernière enveloppe correspondante à
      -- la fin du programme).

      -- Affichage des valeurs demandées:
      Put("Le montant moyen est:");
      Put( Montant_Moyen ); New_Line;
      Put("Le montant total est:");
      Put( Montant_Total ); New_Line;
      Put("Le nombre d'enveloppes est:");
      Put( Nb_Enveloppes ); New_Line;
   end if;

end Ex3;
-- Fin exercice 3