opérations arithmétiques

opérations arithmétiques - Ada - Programmation

Marsh Posté le 30-10-2005 à 20:04:31    

Il me faut écrire un programme qui calcule le nbr minimum de billets et de pièces de monnaye nécessaires pour décomposer une somme d'argent donnée par l'utilisateur du programme.
 
Voilà ce que j'ai fait mais ça me parait un peu trop long :
 
with ada.text_io, ada.integer_text_io;
s,n : integer;
ada.text_io.put("Qu'elle est le prix?" ); ada.integer_text_io.get(s);
-- Calcul du nombre de billets de 500
n:=0;
while s > 500 loop
   s:=s-500;
   n:=n+1;
end loop;
ada.text_io.new_line;
ada.text_io.put("Nombre de billets de 500 =" );ada.integer_text_io.put(n);
-- Calcul du nombre de billets de 200
n:=0;
while s > 200 loop
   s:=s-200;
   n:=n+1;
end loop;
ada.text_io.new_line;
ada.text_io.put("Nombre de billets de 200 =" );ada.integer_text_io.put(n);
-- Calcul du nombre de billets de 100
n:=0;
while s > 100 loop
   s:=s-100;
   n:=n+1;
end loop;
ada.text_io.new_line;
ada.text_io.put("Nombre de billet de 100 =" );ada.integer_text_io.put(n);
-- Calcul du nombre de billets de 50
n:=0;
while s > 50 loop
   s:=s-50;
   n:=n+1;
end loop;
ada.text_io.new_line;
ada.text_io.put("Nombre de billet de 50 =" );ada.integer_text_io.put(n);
-- Calcul du nombre de billets de 20
n:=0;
while s > 20 loop
   s:=s-20;
   n:=n+1;
end loop;
ada.text_io.new_line;
ada.text_io.put("Nombre de billets de 20 =" );ada.integer_text_io.put(n);
-- Calcul du nombre de pièces de 10
n:=0;
while s > 10 loop
   s:=s-10;
   n:=n+1;
end loop;
ada.text_io.new_line;
ada.text_io.put("Nombre de pièce de 10 =" );ada.integer_text_io.put(n);
-- Calcul du nombre de pièces de 5
n:=0;
while s > 5 loop
   s:=s-5;
   n:=n+1;
end loop;
ada.text_io.new_line;
ada.text_io.put("Nombre de pièce de 5 =" );ada.integer_text_io.put(n);
-- Calcul du nombre de pièces de 2
n:=0;
while s > 2 loop
   s:=s-2;
   n:=n+1;
end loop;
ada.text_io.new_line;
ada.text_io.put("Nombre de pièces de 2 =" );ada.integer_text_io.put(n);
-- Calcul du nombre de pièces de 1
n:=0;
while s > 1 loop
   s:=s-1;
   n:=n+1;
end loop;
ada.text_io.new_line;
ada.text_io.put("Nombre de pièce de 1 =" );ada.integer_text_io.put(n);
 
 
Qu'en pensez vous?

Reply

Marsh Posté le 30-10-2005 à 20:04:31   

Reply

Marsh Posté le 30-10-2005 à 20:19:21    

Effectivement c'est beaucoup trop long [:petrus75]  
 

while s > 500 loop
   s:=s-500;
   n:=n+1;
end loop;

Indice : Division, quotient et reste :o  
 

while s > 500 loop
...
while s > 200 loop
...
while s > 100 loop

Tu fais plusieurs fois la même chose avec juste une valeur qui change : utilise une boucle.
 
Il te faut stocker les différentes valeurs dans un tableau :

Valeur : array (0..8) of integer := (500, 200, 100 ...etc...);

Puis le parcourir avec une boucle for.

Reply

Marsh Posté le 30-10-2005 à 21:53:53    

Bon j'ai revu mon programme. Je ne suis pas très sure de mon tableau mais je pense que c'est déjà mieux, enfin surtout plus court.
 
with ada.text_io, ada.integer_text_io;
s,n : integer;
valeur : integer;
ada.text_io.put("Quel est le prix?" ); ada.integer_text_io.get(s);
valeur : array(0..8) of integer:=(500,200,100,50,20,10,5,2,1);
for valeur in valeur'first..valeur'last loop
   n:=0;
   while s>valeur loop
      s:=s-valeur;
      n:=n+1;
   end loop;
   ada.text_io.put("nombre de billets de" );
   ada.integer_text_io.put(valeur); ada.text_io.put("=" );
   ada.integer_text_io.put(n);
   ada.text_io.new_line;
end loop;

Reply

Marsh Posté le 30-10-2005 à 23:43:50    

0) En ADA, on sépare les déclarations et le code. Par exemple :

procedure truc is
  Une_variable : Integer;
  Une_autre_Variable : Natural;
 
begin
   Une_Variable := 1;
 
   Put ("coucou" );
end;

On ne mélange pas les deux.
 
1) Tu as deux variables qui s'appelle "valeur". Ça ne peut pas marcher. Par exemple, renomme l'indice de boucle en "i".
 
2) En ADA, il n'est pas nécessaire de déclarer les indices de boucles. C'est à dire que tu n'es pas obligé d'écrire le "i: Integer;" dans :

procedure machin is
  i : Integer;
begin
  for i in 1..10 loop
    Put ("foo" );
  end loop;
end machin;


 
3) Les attributs first et last d'un tableau sont, respectivement, l'indice de début et l'indice de fin du tableau. Dans le cas de ton programme, c'est respectivement 0 et 8. Donc i (l'indice de boucle) prendra successivement les valeurs 0, 1, 2, 3, 4, 5, 6, 7 et 8. Ce qui t'intéresse c'est le ième élément du tableau valeur :

Valeur (i)


 
4) Le test de ta boucle while est incorrect : regarde ce qu'il se passe si s est égal à 1... Il faudrait tester si s est plus grand ou égal au ième élément de Valeur.
 
5) La boucle while en elle même est peu naturelle (la preuve, tu as fait une faute :D ). Pour obtenir le nombre de billets et la somme restante, tu pourrais remplacer tes cinq lignes de code par

N := S / Valeur (V);
S := S rem Valeur(V);


 
6) Détail, on ne fait pas de billets de 1 euro ;)  
Il suffit d'écrire soit "billets", soit "pièces" en fonction du montant testé.
 
 

Reply

Marsh Posté le 31-10-2005 à 10:44:37    

Je n'arrive pas à comprendre comment marcherai mon programme sans boucle while cad on faisant comme tu m'a dit :

N := S / Valeur (V);
S := S rem Valeur(V);


 
Par contre j'ai essayer d'arranger mon programme grace à tes indications :
 

with ada.text_io, ada.integer_text_io;
s,n,i,valeur : integer;
begin
   ada.text_io.put("Quel est le prix?" ); ada.integer_text_io.get(s);
   valeur : array(0..8) of integer:=(500,200,100,50,20,10,5,2,1);
   for i in 0..8 loop
      n:=0;
      while s>=valeur(i) loop
         s:=s-valeur(i);
         n:=n+1;
      end loop;
      if valeur(i)>=5 then
         ada.text_io.put("nombre de billets de" );
      else
         ada.text_io.put("nombre de pièces de" );
      end if;
      ada.integer_text_io.put(valeur(i)); ada.text_io.put("=" );
      ada.integer_text_io.put(n);
      ada.text_io.new_line;
   end loop;
end;


 
Est il maintenant correct?

Reply

Marsh Posté le 31-10-2005 à 12:43:16    

Prenons par exemple

    n:=0;
      while s>=20 loop
         s:=s-20;
         n:=n+1;
      end loop;

Avec s := 45.
Que se passe-t-il lorsqu'on execute ce code ?
n est mis à 0.
45 est plus grand que 20, on exécute le code de la boucle.
On met 45-20=25 dans s.
On met n à 1.
On boucle.
25 est plus grand que 20, on exécute le code de la boucle.
On met 25-20=5 dans s.
On met n à 2.
On boucle.
5 est plus petit que 20, on s'arrête là.
 
On a s = 5 et n =2.
 
Qu'est ce que la boucle a fait ? Elle a donné le nombre de fois qu'il y a 20 dans 45 (=2) et ce qu'il reste (=5). n est le résultat de la division entière de 45 par 20 et s est le reste de la division de 45 par 20 [:spamafote]  
 

Citation :


Par contre j'ai essayer d'arranger mon programme grace à tes indications :
 

with ada.text_io, ada.integer_text_io;
s,n,i,valeur : integer;
begin
   ada.text_io.put("Quel est le prix?" ); ada.integer_text_io.get(s);
   valeur : array(0..8) of integer:=(500,200,100,50,20,10,5,2,1);
   for i in 0..8 loop
      n:=0;
      while s>=valeur(i) loop
         s:=s-valeur(i);
         n:=n+1;
      end loop;
      if valeur(i)>=5 then
         ada.text_io.put("nombre de billets de" );
      else
         ada.text_io.put("nombre de pièces de" );
      end if;
      ada.integer_text_io.put(valeur(i)); ada.text_io.put("=" );
      ada.integer_text_io.put(n);
      ada.text_io.new_line;
   end loop;
end;


 
Est il maintenant correct?

Il y a toujours le problème des unités de compilation et des déclarations. Tu as aussi oublié d'enlever valeur des déclarations ;) . Et la déclaration de i est inutile (le compilateur te donnera probablement un warning). Donc le début du code devrait être :

with ada.text_io, ada.integer_text_io;
 
procedure compte_monnaie is
   s,n : integer;
   valeur : array(0..8) of integer:=(500,200,100,50,20,10,5,2,1);
 
begin
   ada.text_io.put("Quel est le prix?" ); ada.integer_text_io.get(s);
   for i in 0..8 loop


Le reste m'a l'air correct :jap:


Message édité par Pillow le 31-10-2005 à 15:15:05
Reply

Marsh Posté le 31-10-2005 à 14:13:21    

Merci bcp :)

Reply

Marsh Posté le 02-11-2005 à 18:02:06    

.


Message édité par Profil supprimé le 03-11-2005 à 20:28:30
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed