Une fonction qui donne un réel avec un arrondi à n chiffres [Résolu]

Messages postés
7
Date d'inscription
dimanche 7 janvier 2018
Dernière intervention
3 février 2018
- - Dernière réponse : denisbertin
Messages postés
175
Date d'inscription
lundi 22 avril 2013
Dernière intervention
30 octobre 2018
- 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
Afficher la suite 

Votre réponse

6 réponses

Meilleure réponse
Messages postés
15858
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
11 décembre 2018
1
Merci
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);

Merci KX 1

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 101 internautes ce mois-ci

fidra
Messages postés
7
Date d'inscription
dimanche 7 janvier 2018
Dernière intervention
3 février 2018
-
merci :)
Commenter la réponse de KX
Messages postés
423
Date d'inscription
samedi 17 mai 2003
Dernière intervention
4 août 2018
0
Merci
Salut,

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

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


fidra
Messages postés
7
Date d'inscription
dimanche 7 janvier 2018
Dernière intervention
3 février 2018
-
merci @korgis ^^
KX
Messages postés
15858
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
11 décembre 2018
-
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.
korgis
Messages postés
423
Date d'inscription
samedi 17 mai 2003
Dernière intervention
4 août 2018
-
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.
korgis
Messages postés
423
Date d'inscription
samedi 17 mai 2003
Dernière intervention
4 août 2018
-
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.
Commenter la réponse de korgis
Messages postés
692
Date d'inscription
jeudi 17 avril 2008
Dernière intervention
14 septembre 2018
0
Merci
Ta procédure doit pouvoir fonctionner si tu mets juste : arr:=trunc(r)/p;
Commenter la réponse de dubois77
Messages postés
175
Date d'inscription
lundi 22 avril 2013
Dernière intervention
30 octobre 2018
0
Merci
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.
Whismeril
Messages postés
12372
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
12 décembre 2018
-
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.
Whismeril
Messages postés
12372
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
12 décembre 2018
-
Ha au temps pour moi, le demandeur parle d'arrondi et montre le résultat d'une troncature....
Commenter la réponse de denisbertin
Messages postés
7
Date d'inscription
dimanche 7 janvier 2018
Dernière intervention
3 février 2018
0
Merci
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.
Commenter la réponse de fidra
Messages postés
175
Date d'inscription
lundi 22 avril 2013
Dernière intervention
30 octobre 2018
-1
Merci
Il existe une fonction qui se nomme Pow(x,n), a la place de la tienne.
denisbertin
Messages postés
175
Date d'inscription
lundi 22 avril 2013
Dernière intervention
30 octobre 2018
-
function arrondis(x,n:real):real;
begin
arrondis:=round(x*pow(10,n))/pow(10,n);
end;
denisbertin
Messages postés
175
Date d'inscription
lundi 22 avril 2013
Dernière intervention
30 octobre 2018
-
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;
KX
Messages postés
15858
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
11 décembre 2018
> denisbertin
Messages postés
175
Date d'inscription
lundi 22 avril 2013
Dernière intervention
30 octobre 2018
-
@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) !?
denisbertin
Messages postés
175
Date d'inscription
lundi 22 avril 2013
Dernière intervention
30 octobre 2018
> denisbertin
Messages postés
175
Date d'inscription
lundi 22 avril 2013
Dernière intervention
30 octobre 2018
-
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.
denisbertin
Messages postés
175
Date d'inscription
lundi 22 avril 2013
Dernière intervention
30 octobre 2018
-
Et il faudrais aussi faire en forte que Pow(2,0) soit égal à un, ce qui devrais fonctionner.
Commenter la réponse de denisbertin

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.