Langage C et algorithme d'arrondi

Fermé
limbergh Messages postés 658 Date d'inscription dimanche 8 juillet 2007 Statut Membre Dernière intervention 29 juin 2010 - 13 janv. 2008 à 14:58
limbergh Messages postés 658 Date d'inscription dimanche 8 juillet 2007 Statut Membre Dernière intervention 29 juin 2010 - 13 janv. 2008 à 17:02
Bonjour tt le monde,
j'ai un problème avec mon script en C.

Le voici


#include <stdio.h>
#include <stdlib.h>
#include<math.h>



long ENTIER(float x)
{
return (long) x;
}

double ABSOLUE (double x)
{
if (x < 0)
return x * -1;
else
return x;
}

int SIGNE (double x)
{
if (x < 0)
return -1;
else
return 1;
}

int main(int argc, char *argv[])

{
int choix, x, nbdec;
float N, S;


do
{
printf("\n-1-saisie du nombre reel");
printf("\n-2-saisie du nombre de decimales ");
printf("\n-3-affichage du nombre saisi");
printf("\n-4-affichage arrondi inferieur");
printf("\n-5-affichage arrondi superieur");
printf("\n-6-affichage arrondi commercial");
printf("\n---------votre choix ?");
scanf("%d", &choix);

switch(choix)

{
case 1 :
{
printf("introduisez un nombre : " );
scanf("%f", &N);
break;

}
case 2 :
{
printf("introduisez le nombre de decimale :");
scanf("%d", &nbdec);
break;
}

case 3 :
{
printf("\n\nle nombre est %5.5f" ,N);
printf("\n\nle nombre de decimale est : %d\n\n", nbdec);
break;
}

case 4 :
{
S = SIGNE(N) * ENTIER (ABSOLUE(N));
printf("le nombre est %5.5f ==> %5.5f\n\n", N, S);
break;
}

case 5 :

{
S =SIGNE(N) * ENTIER (ABSOLUE(N) * pow(10., nbdec)) / pow(10., nbdec);
printf("le nombre est %5.5f ==> %5.5f \n\n", N, S);
break;
}

case 6 :

{
S = SIGNE(N) * ENTIER (ABSOLUE(N)+.5);
printf("\n l'arrondi de %5.5f ==> %5.5f\n\n ", N, S);
break;
}



}

}
while(choix!=0);

system("PAUSE");
return 0;
}


Quand je veux arrondir le nombre entré, en case 4, 5, 6, il ne le fait jamais et je ne vois pas ou j'ai une erreur,
si quelqu'un peut m'aiguiller je suis preneur...

Merci d'avance pour vos interventions

2 réponses

tatou_38 Messages postés 1928 Date d'inscription vendredi 21 avril 2006 Statut Membre Dernière intervention 5 août 2015 121
13 janv. 2008 à 15:56
S = SIGNE(N) * ENTIER (ABSOLUE(N)+.5);

SIGNE() te rend un int, donc un entier
ENTIER() te rend un long, donc un entier

le produit de deux entiers ne donnera jamains qu'un entier

tu mets cet entier, sans cast bien-sûr, dans un flotant que tu affiche en flottant.

Le résultat, même si de type flottant, ne te donnera qu'un nombre entier !!

Donc vois le casting :

float f;
long d;

f = (float)d;

Cela tévitera d'aileurs nombre d'injures de ton compilo !
0
limbergh Messages postés 658 Date d'inscription dimanche 8 juillet 2007 Statut Membre Dernière intervention 29 juin 2010 140
13 janv. 2008 à 17:02
merci pour les explications, j'ai bien compris ma connerie...

Et les injures c'est pareil pour moi que le compilateur
0