Jump to content

[Resolvido] Ajuda com exercício com apontadores


Recommended Posts

Posted (edited)

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
Posted

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?

Posted (edited)
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
Posted

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...

Posted

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!

Posted

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?

Posted (edited)
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!

Posted

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.

Posted

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
Posted (edited)
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
Posted (edited)

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!

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • 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.