Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: ryan parker en 1 Mayo 2012, 18:55 pm



Título: redondeado en C con funciones.
Publicado por: ryan parker en 1 Mayo 2012, 18:55 pm
tratando de realizar el siguiente problema:
Una aplicacion de funcion floor es la de redondear un valor al entero mas cercano, la instruccion:

Código
  1. y = floor(x + .5);

redondea el numero x al entero mas cercano, y asigna el resultado a y. Escriba un programa que lea varios numeros al entero mas cercano, Por cada uno de los numeros procesados, imprima el numero original y el numero redondeado.

estoy tratando de escribir un modelo base:

Código
  1. int main(){
  2.    float x;
  3.    int y;
  4.  
  5.    printf("\nAdd: ");
  6.    scanf("%f", &x);
  7.  
  8.    y = x+.5;
  9.    printf("\nThe Value x is: %d", y);
  10. }

Ahora estuve adaptandolo en un modelo base de funciones:

Código
  1. #include<stdio.h>
  2.  
  3. float floor(float);
  4.  
  5. int main(){
  6.    float x;
  7.    int y;
  8.  
  9.    printf("\nAdd: ");
  10.    scanf("%f", &x);
  11.  
  12.    y = floor(x+.5);
  13.  
  14.    printf("\nValues is: %d", y);
  15. }
  16.  
  17. float floor(float value){
  18.    return value;
  19. }

Código:
si x=3.5 entonces resulta y=4
si x=2.3 entonces resulta y=2

no se si esto este bien, por que espera la suma del .5, por ejemplo del 2.3 + 0.5 -> 2.8 entonces y deberia tener -> 3

alguna explicacion o necesito revisar la teoria de la aritmetica ?

Claro que si corren en un compilador ansi este vota warning! :/


Título: Re: redondeado en C con funciones.
Publicado por: STANHMAL en 1 Mayo 2012, 20:31 pm
Hola que tal,

Bueno la función que tienes no esta haciendo nada, puesto que le entra un float, y retorna el mismo float.

para lo que quieres hacer necesitas la utilización de la función ceil, en conjunto de floor, ambas en math.h

Código
  1. #include <stdio.h>
  2. #include <math.h>
  3.  
  4. int main(){
  5.    double x;
  6.  
  7.    printf("\nAdd : ");
  8.    scanf("%lf", &x);
  9.  
  10.    if (x - (int)x >= 0.5)
  11.        printf("\n%lf\n", ceil(x));
  12.    else
  13.        printf("\n%lf\h", floor(x));
  14.  
  15.    return 0;
  16. }
  17.  

o sí lo prefieres modular:

Código
  1. #include <stdio.h>
  2. #include <math.h>
  3.  
  4. double enteroCercano(double x);
  5.  
  6. int main(){
  7.    double x;
  8.  
  9.    printf("\nAdd : ");
  10.    scanf("%lf", &x);
  11.  
  12.    printf("\n%lf\n", enteroCercano(x));
  13.  
  14.    return 0;
  15. }
  16.  
  17. double enteroCercano(double x){
  18.    if (x - (int)x >= 0.5)
  19.        return ceil(x);
  20.    return floor(x);
  21. }
  22.  

$4!u2


Título: Re: redondeado en C con funciones.
Publicado por: exel en 1 Mayo 2012, 21:10 pm
Hola

 El Warning que muestra el compilador es una advertencia; esto sucede porque la variable y es un entero mientras que lo que devuelve tu funcion floor es un valor de punto flotante, entonces el compilador se ve obligado a truncar el valor que devuelve tu funcion para asignarlo a y.

 Existen muchas maneras de resolver la situacion. Yo propongo la siguiente solucion:

Código
  1. #include<stdio.h>
  2.  
  3. int floor(float);
  4.  
  5. int main(){
  6.    float x;
  7.    int y;
  8.  
  9.    printf("\nAdd: ");
  10.    scanf("%f", &x);
  11.  
  12.    y = floor(x);
  13.  
  14.    printf("\nValues is: %d", y);
  15. }
  16.  
  17. int floor(float value){
  18.    if(value >= 0)
  19.       return (int)(value + 0.5);
  20.    else
  21.       return (int)(value - 0.5);
  22. }
  23.  


Título: Re: redondeado en C con funciones.
Publicado por: ryan parker en 2 Mayo 2012, 00:17 am
Gracias a ambos por sus propuestas no habia pensado en hacer la resta del entero y realizar las comparaciones. :)

Y ni enterado que existia el floor en las librerias  :o

Excelente por ambos, tengo mucho por aprender.


Título: Re: redondeado en C con funciones.
Publicado por: Iranny en 4 Diciembre 2013, 21:46 pm
Disculpen la molestia pero para redondear un número a entero por ejemplo
si es 2678 que me lo redondee a 2700
el código mencionado aquí seria parecido para hacer este redondeo o se tendría que utilizar algunas otras funciones y cuestiones para hacer este.

Si me podrían ayudar con ese condigo les agradecería mucho
es para un examen 


Saludos