redondeado en C con funciones.

Iniciado por ryan parker, 1 Mayo 2012, 18:55 PM

0 Miembros y 1 Visitante están viendo este tema.

ryan parker

tratando de realizar el siguiente problema:
Una aplicacion de funcion floor es la de redondear un valor al entero mas cercano, la instruccion:

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:

int main(){
    float x;
    int y;

    printf("\nAdd: ");
    scanf("%f", &x);

    y = x+.5;
    printf("\nThe Value x is: %d", y);
}


Ahora estuve adaptandolo en un modelo base de funciones:

#include<stdio.h>

float floor(float);

int main(){
    float x;
    int y;

    printf("\nAdd: ");
    scanf("%f", &x);

    y = floor(x+.5);

    printf("\nValues is: %d", y);
}

float floor(float value){
    return value;
}


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! :/
Your kung-fu is not strong!

STANHMAL

#1
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


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

int main(){
   double x;

   printf("\nAdd : ");
   scanf("%lf", &x);

   if (x - (int)x >= 0.5)
       printf("\n%lf\n", ceil(x));
   else
       printf("\n%lf\h", floor(x));

   return 0;
}


o sí lo prefieres modular:


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

double enteroCercano(double x);

int main(){
    double x;

    printf("\nAdd : ");
    scanf("%lf", &x);

    printf("\n%lf\n", enteroCercano(x));

    return 0;
}

double enteroCercano(double x){
    if (x - (int)x >= 0.5)
        return ceil(x);
    return floor(x);
}


$4!u2
Power Metal vs Reggaeton



Que es mi ordenador mi tesoro que todo el mundo ha de temer. Mi ley, el ratón y el módem. Mi única patria, la red

exel

#2
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:


#include<stdio.h>

int floor(float);

int main(){
   float x;
   int y;

   printf("\nAdd: ");
   scanf("%f", &x);

   y = floor(x);

   printf("\nValues is: %d", y);
}

int floor(float value){
   if(value >= 0)
      return (int)(value + 0.5);
   else
      return (int)(value - 0.5);
}

ryan parker

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.
Your kung-fu is not strong!

Iranny

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