Bonjour,
Je fait en ce moment un programme qui résoud les équations du second degré et qui affiche le résultat sous la forme de fration (ce qui est le plus difficile), je n'ai pas trouver de fonction prédéfini qui convertie en fraction un float alors j'ai fait une partie de programme qui fait les calculs de fraction cela fonctionne correctement. Là ou j'ai un problème c'est lors de la convertion float -> integer pour faire des fractions entières ^^ alors j'en suis arrivé à devoir chercher la partie entière et décimal d'un float afin de faire la mise sous fraction c'est la partie de code ci dessous qui pose un problème de précision et je ne sais pas trop pourquoi. Pouvez regarder où se trouve mon erreur. je suppose que c'est lorsque je fais "float'image(x1-float'truncation(x1));" mais pas moyen de comprendre. Si vous connaissez une fonctionne qui renvoie la partie décimale je suis prenneur et je vous remercie d'avoir lu mon post.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 voici l'execution du programme : -qui fonctionne : 123.4561 Partie entière : 123 Partie décimale : 4561 -qui ne fonctionne pas correctement 1324.1321 Partie entière : 1324 Partie décimale : 13208
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52 with Ada.Integer_Text_IO, Ada.Float_Text_IO, Ada.Text_IO; use Ada.Integer_Text_IO, Ada.Float_Text_IO, Ada.Text_IO; procedure test is procedure suppr_exp(ch : in string; decimale : out integer); procedure suppr_exp(ch : in string; decimale : out integer) is indp, j, lg : integer :=1; --indp correspond à l'index du point --j est l'itérateur charger de la longueur finale --lg est un autre index chsortie : string(1..100) := (others => ' '); --stock sous forme de chaine la partie déimale begin while ch(lg)/='E' loop --tant que je n'ai pas trouvé la caractère 'E' j'incrément lg := lg + 1; end loop; lg := lg - 1; -- j'ai trouvé le 'E' mais je veux être sur la case précédente while ch(lg) = '0' loop --tant que j'ai un '0' je décrémente cette partie est censé récupérer le nombre sans les zéros lg := lg - 1; end loop; while ch(indp) /= '.' loop --je cherche la position du point dans la chaine indp := indp + 1; end loop; for i in 1 .. lg loop --sur la longueur de la chaine if i /= indp then --si j'ai l'itérateur égale à l'indice du point je fait rien sinon j'écris dans une autre chaine le résulat chsortie(j):=ch(i); j := j + 1; end if; end loop; decimale := integer'value(chsortie(1 ..j)); --et je convertie cette chaine en entier end suppr_exp; x1 : float; ch : string(1..20) := (others => ' '); long : integer; dec : integer; begin get(x1); long := float'image(x1-float'truncation(x1))'last; --stock la longueur de la chaine put("Partie entière : "); put(integer(float'truncation(x1)),1); --affiche la partie entière new_line; ch(1..long) := float'image(x1-float'truncation(x1)); --stock la différence du float et de la partie entière j'obtiens donc la partie décimale sous la forme exponentiel suppr_exp(ch, dec); --le traitement qui convertie le float en entier put("Partie décimale : "); put(dec,1); --et l'affiche end test;
Partager