Distância entre dois pontos

Criar uma função que receba as coordenadas de dois pontos (A e B) e retorna distância entre esses dois pontos. O algoritmo deve ler as coordenadas X e Y de cada um dos pontos e mostrar essa distância.

Solução sem criar uma função

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

int main()
{
    int x1,x2,y1,y2;
    float distancia;
    scanf("%i %i %i %i", &x1, &y1, &x2, &y2);

    distancia = sqrt( pow(x2-x1, 2) + pow(y2-y1, 2) );

    printf("%f", distancia);
    return 0;
}

Solução elaborando uma função

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

float calculaDistancia(int x1, int y1, int x2, int y2) {
    return sqrt( pow(x2-x1,2) + pow(y2-y1, 2) );
}

int main() {
    int x1,y1,x2,y2;
    float distancia;

    printf("Informe as coordenadas para o primeiro ponto: ");
    scanf("%i %i", &x1, &y1);
    printf("Informe as coordenadas para o segundo ponto: ");
    scanf("%i %i", &x2, &y2);

    distancia = calculaDistancia(x1,y1,x2,y2);

    printf("Distancia: %f", distancia);
}

Eu já tinha codificado uma solução semelhante em Python e apresentei em http://www.galirows.com.br/meublog/programacao/exercicios-resolvidos-em-python-2/, Existia uma pequena diferença no exercício e vou aproveitar ela para uma consideração.

A diferença estava em que o enunciado pedia que: se a distância for maior do que zero, deve ser mostrada essa distância, caso contrário deve ser solicitado outras coordenadas. É uma questão simples e o código que propus inicialmente era o seguinte.

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

float calculaDistancia(int x1, int y1, int x2, int y2) {
    return sqrt( pow(x2-x1, 2) + pow(y2-y1, 2) );
}

int main()
{
    int x1,x2,y1,y2;
    float distancia;

    distancia = 0;
    while (distancia == 0) {
        scanf("%i %i %i %i", &x1, &y1, &x2, &y2);
        distancia = calculaDistancia(x1,y1,x2,y2);
    }
    printf("%f", distancia);
    return 0;
}

A solução seria melhor utilizando um bloco do…while. Isso porque eu preciso necessariamente fazer o bloco pelo menos uma vez. Usando simplesmente o while eu tive que forçar passar no teste pela primeira vez, inicializando a variável distancia com zero.

    do {
        scanf("%i %i %i %i", &x1, &y1, &x2, &y2);
        distancia = calculaDistancia(x1,y1,x2,y2);
    } while (distancia == 0);

Mas o que eu queria realmente fazer era uma consideração quanto a eficiência computacional. Na solução apresentada eu calculei a distância entre os pontos para constatar que ela é zero. Para isso todo o cálculo da equação da distância entre os dois pontos foi feita. Mas apenas quando os pontos forem iguais é que a distância será zero e fazer esse teste (verificar se x1 e x2, y1 e y2 são iguais) é mais eficiente computacionalmente e seria melhor para a solução, com o mesmo resultado.

Confira o vídeo em: https://youtu.be/NmL8wtsxmuk

Share

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.