Ir para o conteúdo
Zzz

[Resolvido] Ajuda com exercício com apontadores

Mensagens Recomendadas

Zzz

Boas pessoal,

Alguém me pode ajudar neste pequeno problema:

Tenho uma struct com:

typedef struct{
double x;
double y
} coordenadas;

Agora tenho de fazer uma função que recebe duas coordenadas(quer dizer que vai receber dois X e dois Y) e comparar as duas coordenadas se são iguais, se for devolve True senão for devolve False, devo usar apontadores, tenho de compara x1 com x2 e y1 com y2 por exemplo.

Alguém me consegue dar um exemplo como posso fazer isto?

Desde já muito obrigado pela ajuda,

Cumprimentos

Editado por thoga31
GeSHi

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo
typedef struct
{
   double real;
   double imag;
} Complex;

int compare(Complex c1, Complex c2)
{
 // do whatever
}

int main()
{
 Complex comp1, comp2;

 compare(comp1, comp2);

 return 0;
}


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Zzz

typedef struct
{
double real;
double imag;
} Complex;

int compare(Complex c1, Complex c2)
{
 // do whatever
}

int main()
{
 Complex comp1, comp2;

 compare(comp1, comp2);

 return 0;
}

Esta solução é sem utilizar apontadores, certo?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

sim, queres ponteiros ?

typedef struct
{
   double real;
   double imag;
} Complex;

int compare(Complex * c1, Complex * c2)
{
 // do whatever
}

int main()
{
 Complex comp1, comp2;

 compare(&comp1, &comp2);

 return 0;
}


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Zzz

typedef struct{
    double x;
    double y;
}Cordenadas;

int compare(Cordenadas * c1, Cordenadas * c2){
    if((c1->x == c2->x) && (c1->y == c2->y)){
        return 1;
    }

}
int main(int argc, char** argv) {
Cordenadas cc1 , cc2;

compare(&cc1,&cc2);
return 0;
}

Fica aqui o resultado do que fiz, esta correcto?

Editado por thoga31
GeSHi

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Zzz

Boas!

A tua comparação funciona?

e se ponto for diferente não retornas nada

Sim falta retornar se não for igual, esquecimento.

Ainda não testei a comparação...

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pmg

Fica aqui o resultado do que fiz, esta correcto?

Nao é aconselhavel comparar valores de tipo double (ou float, ou long double) para igualdade (ou diferenca). Isto porque valores desse tipo devem ser considerados como aproximacoes ... e verificar se uma aproximacao é igual a outra, muitas vezes, nao é o pretendido.

if (0.33333333312345 != 0.33333333354321) ...

O que deves fazer (dependendo das necessidades) é ver se o quociente dos dois valores se aproxima de 1

if (fabs(0.33333333312345 / 0.33333333354321 - 1) > 1E-6) ...


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Zzz

Nao é aconselhavel comparar valores de tipo double (ou float, ou long double) para igualdade (ou diferenca). Isto porque valores desse tipo devem ser considerados como aproximacoes ... e verificar se uma aproximacao é igual a outra, muitas vezes, nao é o pretendido.

if (0.33333333312345 != 0.33333333354321) ...

O que deves fazer (dependendo das necessidades) é ver se o quociente dos dois valores se aproxima de 1

if (fabs(0.33333333312345 / 0.33333333354321 - 1) > 1E-6) ...

Não ligando a esse caso, podes me mostrar uma resolução possível?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pmg

static int floatequal(double x, double y, double precision) {
 if (y == 0) return (x == 0);
 return (fabs(x / y - 1) < precision);
}

struct coordenada {
 double x;
 double y;
};

int compare(struct coordenada *c1, struct coordenada *c2) {
 return (floatequal(c1.x, c2.x, 1E-9) && floatequal(c1.y, c2.y, 1E-9));
}

memcmp() compara os bits dos valores. Uma diferenca no bit menos significativo nao quer necessariamente dizer que os valores sao diferentes.

Qual destes valores aproximados para raiz de 7 esta errado?

2.645751311064590 ou 2.645751311064591

PS. Sim, eu sei que nenhum deles multiplicado por ele proprio da 7!!

Editado por pmg

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Zzz

static int floatequal(double x, double y, double precision) {
 if (y == 0) return (x == 0);
 return (fabs(x / y - 1) < precision);
}

struct coordenada {
 double x;
 double y;
};

int compare(struct coordenada *c1, struct coordenada *c2) {
 return (floatequal(c1.x, c2.x, 1E-9) && floatequal(c1.y, c2.y, 1E-9));
}

memcmp() compara os bits dos valores. Uma diferenca no bit menos significativo nao quer necessariamente dizer que os valores sao diferentes.

Qual destes valores aproximados para raiz de 7 esta errado?

2.645751311064590 ou 2.645751311064591

PS. Sim, eu sei que nenhum deles multiplicado por ele proprio da 7!!

Obrigado aos dois pela ajuda, mas acho que ja consegui fazer o que queria, penso que estes dois últimos resultados já é algo mais complexo, apenas havia necessidade de fazer uma função, onde recebia as duas coordenadas e depois comparava as duas, e devolvia se eram iguais ou não.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

eu compreendo o problema dos valores menos significativos, no entanto foi pedida uma solução diferente, e foi isso que foi apresentado.

claro que de todas as soluções, advêm implicações, umas boas, outras más ...

no entanto, obrigada por esclarecer no tópico quais eram essas implicações


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Zzz
typedef struct {
   unsigned int x;
   unsigned int y;
} Coordenada;
int verifica_coordenada (Coordenada *c1, Coordenada *c2) {
   return (c1->x == c2->x) && (c1->y == c2->y) ? 1 : 0;
}
int main() {
   Coordenada c1;
   Coordenada c2;
   printf("---- Cordenada 1 ----\n");
   printf("Introduza o x: ");
   scanf("%u", &c1.x);
   printf("Introduza o y: ");
   scanf("%u", &c1.y);

   printf("---- Cordenada 2 ----\n");
   printf("Introduza o x: ");
   scanf("%u", &c2.x);
   printf("Introduza o y: ");
   scanf("%u", &c2.y);
   verifica_coordenada(&c1, &c2) ? printf("Iguais\n") : printf("Diferentes\n"); ;

   return 0;
}

Editado por pmg
Falta LP no GeSHi

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

foo && bar ? 1 : 0

o operador && resulta num valor booleano (1 ou 0) ... teres o operador ternário é completamente desnecessário


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pmg

As duas linhas abaixa sao absolutamente iguais: o resultado dos operadores logicos é sempre 0 ou 1.

Eu gosto mais da segunda (o operador ternario nao adianta nada, antes pelo contrario)

   return (c1->x == c2->x) && (c1->y == c2->y) ? 1 : 0;
   return (c1->x == c2->x) && (c1->y == c2->y);

E ainda ... o uso do operador ternario "em seco" nao é nada comum (é a primeira vez que eu vejo!!!)

Em vez do teu codigo eu teria preferido um simples if. Se fosse para usar o operador ternario entao usava como selector da string a imprimir

   verifica_coordenada(&c1, &c2) ? printf("Iguais\n") : printf("Diferentes\n");
   if (verifica_coordenada(&c1, &c2)) printf("Iguais\n"); else printf("Diferentes\n");
   printf("%s\n", verifica_coordenada(&c1, &c2) ? "Iguais" : "Diferentes");

Editado por pmg

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.