Jump to content
Fórum Script Brasil
  • 0

Ajuda em codigo C de distancia de pontos


luizasilval
 Share

Question

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 to comment
Share on other sites

1 answer to this question

Recommended Posts

  • 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

Edited by vangodp
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share



  • Forum Statistics

    • Total Topics
      149.9k
    • Total Posts
      646.8k
×
×
  • Create New...