Jump to content
Zzz

[Resolvido] Ajuda com exercício com apontadores

Recommended Posts

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

Edited by thoga31
GeSHi

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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?

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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?

Edited by thoga31
GeSHi

Share this post


Link to post
Share on other 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...

Share this post


Link to post
Share on other 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!

Share this post


Link to post
Share on other 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?

Share this post


Link to post
Share on other 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!!

Edited by 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!

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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;
}

Edited by pmg
Falta LP no GeSHi

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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");

Edited by 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!

Share this post


Link to post
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
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  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.


×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.