Une fonction qui donne un réel avec un arrondi à n chiffres

Résolu
fidra Messages postés 7 Date d'inscription dimanche 7 janvier 2018 Statut Membre Dernière intervention 3 février 2018 - 7 janv. 2018 à 21:58
denisbertin Messages postés 245 Date d'inscription lundi 22 avril 2013 Statut Membre Dernière intervention 13 mai 2023 - 9 janv. 2018 à 20:25
Bonjour,
voici l'énoncé de l'exo:
Ecrire une fonction qui lit un réel R et un entier N et transforme R en un réel avec un arrondi à N chiffres. Exemple 125.359686 2 125.35. Ecrire un programme qui lit un réel X et un entier A et affiche le réel avec un arrondi A.
.
ma solution:
program arrondi;
function arr(var x:real;var n:integer):real;
var r:real;
p,i:integer;
begin
p:=1;
r:=x-trunc(x);
for i:=1 to n do
begin
p:=p*10;
end;
r:=r*p;

arr:=(trunc(r)/p)+trunc(x);
end;
var y:real;
var e:integer;
begin
writeln('entrez un reel');
readln(y);
writeln('entrez un entier');
readln(e);
writeln('le nombre est',arr(y,e));
readln;
end.

//mais le resultat n"est pas comme je veux...... j'ai besoins d'aide s.v.p
merci d'avance
A voir également:

6 réponses

KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 127
7 janv. 2018 à 23:11
Bonjour,

Ton problème c'est juste de l'affichage, par défaut c'est la notation scientifique qui est utilisée.
Tu peux faire comme ceci :
writeln('le nombre est ', arr(y,e):0:9);
1
fidra Messages postés 7 Date d'inscription dimanche 7 janvier 2018 Statut Membre Dernière intervention 3 février 2018
7 janv. 2018 à 23:58
merci :)
0
korgis Messages postés 420 Date d'inscription samedi 17 mai 2003 Statut Membre Dernière intervention 6 mai 2019 17
8 janv. 2018 à 00:18
Salut,

Solution KX "presque" OK, mais c'est mieux comme ça :

writeln('le nombre est ', arr(y,e):0:e);


0
fidra Messages postés 7 Date d'inscription dimanche 7 janvier 2018 Statut Membre Dernière intervention 3 février 2018
8 janv. 2018 à 01:01
merci @korgis ^^
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 127
8 janv. 2018 à 08:34
Attention : en faisant ça on ne peut pas vraiment savoir si la fonction est correcte, l'affichage est limité donc on ne peut pas être sûr que les décimales cachées sont 0 ou autre chose.

Exemple :

function arr(var x:real;var n:integer):real; 
begin 
    result := x;
end;

L'affichage de
arr(y,e):0:e
semblera correct et pourtant
arr(y,e)
serait faux ici.
0
korgis Messages postés 420 Date d'inscription samedi 17 mai 2003 Statut Membre Dernière intervention 6 mai 2019 17
8 janv. 2018 à 11:12
Tout à fait d'accord avec toi, KX.
Mais ici, la fonction arr() est tout à fait correcte, le problème restant un problème d'affichage du résultat en mode console.
0
korgis Messages postés 420 Date d'inscription samedi 17 mai 2003 Statut Membre Dernière intervention 6 mai 2019 17
8 janv. 2018 à 14:00
P-S (en forme de mea culpa) : La fonction n'est d'ailleurs (après vérification plus sérieuse) pas si correcte que ça puisque à partir d'une certaine valeur de N, le résultat sera fantaisiste...
D'où l'intérêt de tenir compte de l'avis de KX dans la mesure où sa mise en forme du résultat est la seule manière de vérifier que le résultat est correct.
0
dubois77 Messages postés 675 Date d'inscription jeudi 17 avril 2008 Statut Membre Dernière intervention 19 février 2019 14
8 janv. 2018 à 08:42
Ta procédure doit pouvoir fonctionner si tu mets juste : arr:=trunc(r)/p;
0
denisbertin Messages postés 245 Date d'inscription lundi 22 avril 2013 Statut Membre Dernière intervention 13 mai 2023 1
8 janv. 2018 à 15:45
Pour obtenir un chiffre arrondi à n décimal, exemple 3 décimals, multiplier ce nombre par mille, dix puissance 3, 10x10X10, puis tronquer ce chiffre à la partie entière avec round ou trunc en langage de programmation pascal par exemple et rediviser ce même nombre par mille avec une notation en réel de tous ces chiffres.
0
Whismeril Messages postés 19019 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 14 avril 2024 655
8 janv. 2018 à 20:39
Bonsoir, ce que tu décris n'arrondit pas ça tronque.
Si je prends 9.87654321, en appliquant ta méthode le résultat sera 9.876.
Or selon la loi mathématique la plus commune en France (5 ou plus arrondi au supérieur) le résultat est 9.877.
C'est donc faux selon cette loi.

C'est aussi faux selon la loi financière (au pair plus proche), et sans doute à quelques autres lois.

Bref, il y a bien longtemps que tu n'avais pas fait d'intervention, et ça ne nous manquait pas spécialement.
0
Whismeril Messages postés 19019 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 14 avril 2024 655
8 janv. 2018 à 20:42
Ha au temps pour moi, le demandeur parle d'arrondi et montre le résultat d'une troncature....
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
fidra Messages postés 7 Date d'inscription dimanche 7 janvier 2018 Statut Membre Dernière intervention 3 février 2018
8 janv. 2018 à 21:35
merci mes amis pour vos commentaires vous avez m'aidé ... voici le programme final ^^ que pensez-vous





program project1;
function puis(a:integer):integer;
var i,p:integer;

begin
p:=1;
for i:=1 to a do
begin
p:=p*10;
end;
puis:=p;
end;
function arr(n:real;a:integer):real;
var r,pe,pd:real;
begin
r:=n*puis(a-1);
pe:=trunc(r);
pd:=r-pe;
if pd >=0.5 then
pe:=(pe+1)/puis(a-1);
if pd <0.5 then pe:=pe/puis(a-1);
arr:=pe;
end;
var num:real;ar:integer;
begin
readln(num);
readln(ar);
writeln(arr(num,ar));
readln
end.
0
denisbertin Messages postés 245 Date d'inscription lundi 22 avril 2013 Statut Membre Dernière intervention 13 mai 2023 1
8 janv. 2018 à 22:38
Il existe une fonction qui se nomme Pow(x,n), a la place de la tienne.
-1
denisbertin Messages postés 245 Date d'inscription lundi 22 avril 2013 Statut Membre Dernière intervention 13 mai 2023 1
8 janv. 2018 à 22:50
function arrondis(x,n:real):real;
begin
arrondis:=round(x*pow(10,n))/pow(10,n);
end;
0
denisbertin Messages postés 245 Date d'inscription lundi 22 avril 2013 Statut Membre Dernière intervention 13 mai 2023 1
Modifié le 9 janv. 2018 à 00:53
Fonction Pow(x:real; n:integer):real;
var i:integer;
var a:real;
begin
a:=x;
for i=1 to n do a=a*x;
pow:=a;
end;
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 127 > denisbertin Messages postés 245 Date d'inscription lundi 22 avril 2013 Statut Membre Dernière intervention 13 mai 2023
9 janv. 2018 à 08:45
@denisbertin
Quel intérêt de critiquer la fonction
puis
de fidra pour proposer en remplacement une fonction
pow
que tu as codé de la même manière (mais en y introduisant des erreurs) !?
0
denisbertin Messages postés 245 Date d'inscription lundi 22 avril 2013 Statut Membre Dernière intervention 13 mai 2023 1 > denisbertin Messages postés 245 Date d'inscription lundi 22 avril 2013 Statut Membre Dernière intervention 13 mai 2023
Modifié le 9 janv. 2018 à 20:23
Oui c'est exact et je vais reformuler cette fonction Pow issue du langage de programmation C comme ceci:

Fonction Pow(x:real; n:integer):real;
var i:integer;
var a:real;

begin
a:=1;
for i=1 to n do a=a*x;
pow:=a;
end;

L'intérré consiste à effectuer une seul ligne de calcul pour obtenir un arrondis.
0
denisbertin Messages postés 245 Date d'inscription lundi 22 avril 2013 Statut Membre Dernière intervention 13 mai 2023 1
Modifié le 9 janv. 2018 à 20:30
Et il faudrais aussi faire en forte que Pow(2,0) soit égal à un, ce qui devrais fonctionner.
0
Rejoignez-nous