Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1390 connectés 

  FORUM HardWare.fr
  Programmation
  Ada

  opérations arithmétiques

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

opérations arithmétiques

n°1234597
Profil sup​primé
Posté le 30-10-2005 à 20:04:31  answer
 

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?

mood
Publicité
Posté le 30-10-2005 à 20:04:31  profilanswer
 

n°1234602
Pillow
'cos the trees won't talk
Posté le 30-10-2005 à 20:19:21  profilanswer
 

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.

n°1234630
Profil sup​primé
Posté le 30-10-2005 à 21:53:53  answer
 

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;

n°1234666
Pillow
'cos the trees won't talk
Posté le 30-10-2005 à 23:43:50  profilanswer
 

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é.
 
 

n°1234811
Profil sup​primé
Posté le 31-10-2005 à 10:44:37  answer
 

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?

n°1234939
Pillow
'cos the trees won't talk
Posté le 31-10-2005 à 12:43:16  profilanswer
 

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
n°1234985
Profil sup​primé
Posté le 31-10-2005 à 14:13:21  answer
 

Merci bcp :)

n°1236718
Profil sup​primé
Posté le 02-11-2005 à 18:02:06  answer
 

.


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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Ada

  opérations arithmétiques

 

Sujets relatifs
operations binaire sur un float[unix] surveiller les opérations effectuées dans un dossier
[Access] Opérations sur requête analyse croiséeopérations sur des alias SQL
Problèmes avec un chiffre à virgule [résolu]operations en sql
Types Abstraits de Données(defs des operations de base pour les listesOperations sous Dos
Analyse syntaxique d'opérations mathématiques[MYSQL] Opérations sur PhpMyAdmin
Plus de sujets relatifs à : opérations arithmétiques


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR