Ir para conteúdo
Fórum Script Brasil
  • 0

Ajuda em codigo C de distancia de pontos


luizasilval

Pergunta

preciso fazer um codigo em C que tem uma variavel estruturada com 3 membros (xi,yi) que são pontos. outra variavel estruturada tem 3 membros que são distancias
escrever uma funcao e os struct para calcular as distancias entre os pontos. Fiz o codigo abaixo mas ta dando erro, to combilando com o code blocks e fazendo o main para testar:

 

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

struct ponto{
int x1,y1;
int x2,y2;
int x3,y3;
};
typedef struct ponto pontos;

struct distancia{
int dist1;
int dist2;
int dist3;
};
typedef struct distancia dist;

dist calc_dist (pontos *p1, pontos *p2, pontos *p3){
float dist1=0, dist2=0, dist3=0;
dist1 = (sqrt(pow(*p1->x1 - *p2->x2,2)) + (pow(*p1->y1 - *p2->y2,2))); //distancia p1 a p2
dist2 = (sqrt(pow(*p2->x2 - *p3->x3,2)) + (pow(*p2->y2 - *p3->y3,2))); //distancia p2 a p3
dist3 = (sqrt(pow(*p1->x1 - *p3->x3,2)) + (pow(*p1->y1 - *p3->y3,2))); //distancia p1 a p3
printf("\nDistancia do p1 ao p2: %f",dist1);
printf("\nDistancia do p2 ao p3: %f",dist2);
printf("\nDistancia do p1 ao p3: %f",dist3);
}

main (){
pontos p1,p2,p3;
dist dist1,dist2,dist3;
printf("\nDigite valor para o p1 (x1,y1):\n");
scanf("%d %d", %x1,&y1);
printf("\nDigite valor para o p2 (x2,y2):\n");
scanf("%d %d", %x2,&y2);
printf("\nDigite valor para o p3 (x3,y3):\n");
scanf("%d %d", %x3,&y3);
printf("\nP1:(%d,%d) , P2:(%d,%d) , P3:(%d,%d)\n", x1,y1,x2,y2,x3,y3);
}

Sem título.png

Link para o comentário
Compartilhar em outros sites

1 resposta a esta questão

Posts Recomendados

  • 0

Nessas linhas de 20 a 22 os ponteiros você esta usando mal. Vou explicar algo sobre os ponteiros, coisa que você deve recordar para toda sua vida de programador.

Para acessar a uma variável através de um ponteiro, normalmente fazemos *ptr = valor; Não? O problema é que quando tentamos acessar membros de uma estrutura nós acessamos através do operador de seleção'.' , exemplo estrutura.membro, mas quando trata-se de um ponteiro, ademas usamos o operador de desreferencia '*' de esta forma *ponteiro.membro, isso produz um erro, primeiro se acessa ao membro, que é um campo que ainda não existe, pois não o ponteiro não esta corretamente situado, o normal é que primeiro se aponte a estrutura correta e depois se acesse o devido campo ou variável membro, e não o contrario. Isso acontece porque o operador de seleção'.' tem prioridade sobre o operador de indireção'*'(indireção e desreferencia é a mesma coisa). Esse problema termina fechando ponteiro entre '(' e ')' ficando tal como (*ponteiro).membro. Isso obriga em primeiro lugar que aponte primeiro e logo depois se acesse ao membro como é devido.

É aí que entra "operador de seleção de campos"( ou elementos) para estruturas referenciadas con ponteiros (->).
O tal operador substitui o operador  '*' e evita ter que fechar o ponteiro entre  '(' e ')'. O que acontece é que trocamos (*ponteiro).membro por estructura->membro, que é exatamente o mesmo, porem mais fácil escrever. =D

Tendo o anterior claro acho que já dá para arrumar as linhas:

dist1 = (sqrt(pow(*p1->x1 - *p2->x2,2)) + (pow(*p1->y1 - *p2->y2,2))); //distancia p1 a p2
dist2 = (sqrt(pow(*p2->x2 - *p3->x3,2)) + (pow(*p2->y2 - *p3->y3,2))); //distancia p2 a p3
dist3 = (sqrt(pow(*p1->x1 - *p3->x3,2)) + (pow(*p1->y1 - *p3->y3,2))); //distancia p1 a p3

 

O erro reside em que por exemplo *p1->x1 é uma "quimera" entre ambos tipos de desreferenciar algo, ou você faz p1->x1 ou você faz (*p1).x1, misturar ambos da um "rebosteio". XD

Em fim... Recorde que p->membro substitui por completo a (*p).membro, isso é o unico que você precisa recordar, e que si usa ->, não deve por o *. ;)

Podemos fazer:

dist1 = ()( sqrt ( pow ( p1->x1 - p2->x2, 2 ) ) + ( pow ( p1->y1 - p2->y2, 2 ) ) );

 Ou:

dist1 = ()( sqrt ( pow ( (p1).x1 - (p2).x2, 2 ) ) + ( pow ( (p1).y1 - (p2).y2, 2 ) ) );

porem nunca:

dist1 = (sqrt(pow(*p1->x1 - *p2->x2,2)) + (pow(*p1->y1 - *p2->y2,2))); //distancia p1 a p2

 

Outro erro é que falta o retorno na dist calc_dist()

Essa linha scanf ( "%d %d", % x1, &y1 ); esta totalmente errada pois não existe x1 si não p1.x1 por exemplo, e troque o % por & adiante de x1. Deveria ficar algo como scanf ( "%d %d", &p1.x1, &p1.y1 );

Em definitiva arrume tudo isso e tome nota sobre a explicação que lhe proporcionei, pois te vai servir para toda a vida ;).

Fui!! Bola de fumaça ninja!!! Si perguntarem essa conversa nunca aconteceu. XD

PD: pode que os nomes dos operadores não sejam o correto, eu programamo em espanhol e aqui os nome é tudo trocado, minha intenção é que você entenda o conceito espero que lhe sirva. Bay

Editado por vangodp
Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...