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

fidra 7 Messages postés dimanche 7 janvier 2018Date d'inscription 3 février 2018 Dernière intervention - 7 janv. 2018 à 21:58 - Dernière réponse : denisbertin 163 Messages postés lundi 22 avril 2013Date d'inscription 6 avril 2018 Dernière intervention
- 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 

18 réponses

Répondre au sujet
KX 15369 Messages postés samedi 31 mai 2008Date d'inscriptionModérateurStatut 22 avril 2018 Dernière intervention - 7 janv. 2018 à 23:11
+1
Utile
1
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);
Cette réponse vous a-t-elle aidé ?  
fidra 7 Messages postés dimanche 7 janvier 2018Date d'inscription 3 février 2018 Dernière intervention - 7 janv. 2018 à 23:58
merci :)
Commenter la réponse de KX
korgis 411 Messages postés samedi 17 mai 2003Date d'inscription 16 mars 2018 Dernière intervention - 8 janv. 2018 à 00:18
0
Utile
4
Salut,

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

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


fidra 7 Messages postés dimanche 7 janvier 2018Date d'inscription 3 février 2018 Dernière intervention - 8 janv. 2018 à 01:01
merci @korgis ^^
KX 15369 Messages postés samedi 31 mai 2008Date d'inscriptionModérateurStatut 22 avril 2018 Dernière intervention - 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.
korgis 411 Messages postés samedi 17 mai 2003Date d'inscription 16 mars 2018 Dernière intervention - 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.
korgis 411 Messages postés samedi 17 mai 2003Date d'inscription 16 mars 2018 Dernière intervention - 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.
Commenter la réponse de korgis
dubois77 689 Messages postés jeudi 17 avril 2008Date d'inscription 9 mars 2018 Dernière intervention - 8 janv. 2018 à 08:42
0
Utile
Ta procédure doit pouvoir fonctionner si tu mets juste : arr:=trunc(r)/p;
Commenter la réponse de dubois77
denisbertin 163 Messages postés lundi 22 avril 2013Date d'inscription 6 avril 2018 Dernière intervention - 8 janv. 2018 à 15:45
0
Utile
2
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 11411 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 22 avril 2018 Dernière intervention - 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.
Whismeril 11411 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 22 avril 2018 Dernière intervention - 8 janv. 2018 à 20:42
Ha au temps pour moi, le demandeur parle d'arrondi et montre le résultat d'une troncature....
Commenter la réponse de denisbertin
fidra 7 Messages postés dimanche 7 janvier 2018Date d'inscription 3 février 2018 Dernière intervention - 8 janv. 2018 à 21:35
0
Utile
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
denisbertin 163 Messages postés lundi 22 avril 2013Date d'inscription 6 avril 2018 Dernière intervention - 8 janv. 2018 à 22:38
-1
Utile
5
Il existe une fonction qui se nomme Pow(x,n), a la place de la tienne.
denisbertin 163 Messages postés lundi 22 avril 2013Date d'inscription 6 avril 2018 Dernière intervention - 8 janv. 2018 à 22:50
function arrondis(x,n:real):real;
begin
arrondis:=round(x*pow(10,n))/pow(10,n);
end;
denisbertin 163 Messages postés lundi 22 avril 2013Date d'inscription 6 avril 2018 Dernière intervention - 9 janv. 2018 à 00:52
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 15369 Messages postés samedi 31 mai 2008Date d'inscriptionModérateurStatut 22 avril 2018 Dernière intervention > denisbertin 163 Messages postés lundi 22 avril 2013Date d'inscription 6 avril 2018 Dernière intervention - 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) !?
denisbertin 163 Messages postés lundi 22 avril 2013Date d'inscription 6 avril 2018 Dernière intervention > denisbertin 163 Messages postés lundi 22 avril 2013Date d'inscription 6 avril 2018 Dernière intervention - 9 janv. 2018 à 20:21
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 163 Messages postés lundi 22 avril 2013Date d'inscription 6 avril 2018 Dernière intervention - 9 janv. 2018 à 20:25
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.