opérations arithmétiques - Ada - Programmation
Marsh Posté le 30-10-2005 à 20:19:21
Effectivement c'est beaucoup trop long
while s > 500 loop |
Indice : Division, quotient et reste
while s > 500 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.
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;
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 |
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 |
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 ). Pour obtenir le nombre de billets et la somme restante, tu pourrais remplacer tes cinq lignes de code par
N := S / 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é.
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); |
Par contre j'ai essayer d'arranger mon programme grace à tes indications :
with ada.text_io, ada.integer_text_io; |
Est il maintenant correct?
Marsh Posté le 31-10-2005 à 12:43:16
Prenons par exemple
n:=0; |
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
Citation :
|
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; |
Le reste m'a l'air correct
Marsh Posté le 02-11-2005 à 18:02:06
.
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?