[C] Obtener valores decimales en un programa de distancia entre dos puntos

Iniciado por pinecore, 10 Diciembre 2016, 06:14 AM

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

pinecore

Un saludo a quien lea esto.

Soy principiante en "C" y escribí un intento de programa para obtener la distancia entre dos puntos de un plano cartesiano a manera de ejercicio.
El programa funciona perfectamente, excepto por un detalle: Me gustaría poder obtener las distancias en decimales y no sólo en enteros.
No sé que hacer, estuve experimentando pero no tuve éxito. Espero que me puedan ayudar.

Estoy en Windows y utilizo el compilador GNU CC compiler (creo, eso dice mi IDE).

Muchas gracias.
/** Programa para encontrar la distancia entre dos puntos **/

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

main() {
    //Primer punto
    int x1 = 0; //P1(x1,0)
    int y1 = 0; //P1(0,y1)

    //Segundo punto
    int x2 = 0; //P2(x2,0)
    int y2 = 0; //P2(0,y2)

    //Diferencias de X e Y.
    int difx;
    int dify;

    //Resultado
    int distancia;


    //Obtención de los valores para el primer punto.
    //x1
    printf("Introduce el valor \"X\" del primer punto:\n");
    scanf("%d", &x1); //Valor de equis en el primer punto.
    //y1
    printf("Introduce el valor \"Y\" del primer punto:\n");
    scanf("%d", &y1); //Valor de ye en el primer punto.

    //Obtención de los valores para el segundo punto.
    //x2
    printf("Introduce el valor \"X\" del segundo punto:\n");
    scanf("%d", &x2); //Valor de equis en el primer punto.
    //y2
    printf("Introduce el valor \"Y\" del segundo punto:\n");
    scanf("%d", &y2);

    if(x1 > x2){
        difx = x1 - x2;
    }else{
        difx = x2 - x1;
    }
    /**Función para obtener la diferencia de X, identificando quien es el mayor.**/

    if(y1 > y2){
        dify = y1 - y2; //Si Y1 es mayor, entonces se le resta y2 para evitar negativos.
    }else{
        dify = y2 - y1;
    }
    /**Función para obtener la diferencia de Y, identificando quien es el mayor.**/

    distancia = sqrt((1.0 + pow(difx,2)) + (1.0 + pow(dify,2)));
    printf("%d", distancia);
return 0;
}

engel lex

int distancia

mientras que distancia sea de tipo int (entero) solo dará resultados enteros... necesitas que sea tipo float o double (según tus necesidades)

aquí mucho de lo que necesitas saber sobre las unidades de coma flotante (decimales)

https://es.wikipedia.org/wiki/Coma_flotante

El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

pinecore


engel lex

2 cosas...

-primero tienes un error en tu formula

sqrt((1.0 + pow(difx,2)) + (1.0 + pow(dify,2)));

[latex]\sqrt{(1+x^{2})+(1+y^{2})}[/latex]

y debe ser (pitagoras)

[latex]\sqrt{x^{2}+y^{2}}[/latex]

-segundo cuidado con el uso de printf...

https://www.tutorialspoint.com/c_standard_library/c_function_printf.htm

%d es para digitos enteros en formato decimal (igual que %i)

para digitos de coma flotante usas %f
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

pinecore

La fórmula está bien, tuve que usar los +1 porque el resultado del pow() me daba siempre, por ejemplo: si era 25, me daba 24, con el +1 arreglé eso.

Pero creo que debe de ser lo del printf, lo intentaré. Muchísimas gracias por darle seguimiento.

Edición:
Ya lo probé, era el printf, ya está todo perfecto.

Muchas gracias por la ayuda.

engel lex

excelente! igual lee los links para evitar dudas más adelante... y algo que te puede causar dolor de cabeza más adelante si no sabes es la promoción de tipos así que aprovecho para dejartelo de estudio...

lee la primera parte de este articulo "conversión de tipos"
http://c.conclase.net/curso/?cap=009

basicamente es el porqué esto da un resultado "incorrecto"... si te da 0 está bien... es debido a lo hablado en el articulo int/int = int

#include<stdio.h>

int main() {
    float a = 3/4;
    printf("%f", a);
return 0;
}
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

pinecore

Muchas gracias por resolver mi problema y también por darme todos esos links, los voy a revisar todos.

Gracias por tu tiempo y la molestia.