Ejercicio 02 — Funcion distancia(Punto a, Punto b) que calcula la distancia euclidea…

Dificultad: verde · Módulo 08 (Structs)

Enunciado

Funcion distancia(Punto a, Punto b) que calcula la distancia euclidea entre dos puntos.

Diagrama de flujo

Diagrama de flujo del ejercicio 02

Cómo se resuelve

Este ejercicio amplía el anterior: además del tipo Punto, escribimos una función que trabaja sobre structs.

La función double distancia(Punto a, Punto b) recibe dos structs completos como parámetros. Dentro calcula las diferencias en cada eje y aplica el teorema de Pitágoras:

double dx = a.x - b.x;
double dy = a.y - b.y;
return sqrt(dx * dx + dy * dy);

Los parámetros se pasan por valor: la función recibe una copia de cada punto, así que no puede modificar los originales de main. Para structs pequeños de solo lectura, como aquí, es lo normal y correcto.

sqrt (raíz cuadrada) vive en <math.h>, por eso el #include. En Linux hay que enlazar la librería matemática al compilar añadiendo -lm: gcc -std=c11 -Wall ej02_modelo.c -lm -o ej02. En Dev-C++/Windows no hace falta ese flag.

Trampa habitual: usar %f en el scanf de las coordenadas. Como x e y son double, en la lectura tiene que ser %lf; con %f los valores entran mal y la distancia sale disparatada.

Para practicar — cópialo en Dev-C++

Pega este esqueleto y completa los TODO. Es la mejor forma de aprender: inténtalo antes de mirar la solución.

/*
 * Curso de C — Modulo 08: Structs
 * Ejercicio 02 — PRACTICA (rellena los TODO)
 * Enunciado: Funcion distancia(Punto a, Punto b) que calcula la distancia euclidea entre dos puntos.
 * Dificultad: verde
 * Compilar: gcc -std=c11 -Wall ej02_practica.c -lm -o ej02 && ./ej02
 */
 
#include <stdio.h>
#include <math.h>
 
// TODO 1: Copia o vuelve a definir el typedef struct Punto con campos x e y (double).
 
// TODO 2: Declara la funcion double distancia(Punto a, Punto b).
//         Dentro: calcula dx = a.x - b.x, dy = a.y - b.y, y devuelve sqrt(dx*dx + dy*dy).
 
int main(void) {
    // TODO 3: Declara p1 y p2 de tipo Punto. Leelos con scanf.
 
    // TODO 4: Llama a distancia(p1, p2) e imprime el resultado con dos decimales.
    //         Formato esperado: "Distancia: 5.00\n"
 
    return 0;
}

Solución — cópiala y ejecútala

/*
 * Curso de C — Modulo 08: Structs
 * Ejercicio 02 — MODELO (resuelto)
 * Enunciado: Funcion distancia(Punto a, Punto b) que calcula la distancia euclidea entre dos puntos.
 * Dificultad: verde
 * Compilar: gcc -std=c11 -Wall ej02_modelo.c -lm -o ej02 && ./ej02
 */
 
#include <stdio.h>
#include <math.h>
 
typedef struct {
    double x;
    double y;
} Punto;
 
// Funcion que recibe dos Punto por valor y devuelve la distancia
double distancia(Punto a, Punto b) {
    double dx = a.x - b.x;
    double dy = a.y - b.y;
    return sqrt(dx * dx + dy * dy);
}
 
int main(void) {
    Punto p1, p2;
 
    printf("Introduce punto 1 (x y): ");
    scanf("%lf %lf", &p1.x, &p1.y);
 
    printf("Introduce punto 2 (x y): ");
    scanf("%lf %lf", &p2.x, &p2.y);
 
    printf("Distancia: %.2f\n", distancia(p1, p2));
 
    return 0;
}

Cómo usarlo

Dev-C++ (Windows): Archivo → Nuevo → Código fuente, pega el código y pulsa F11 (compilar y ejecutar). Si ves los acentos raros en la consola, escribe chcp 65001 y vuelve a ejecutar.

Conexiones