Zzz Posted February 19, 2013 at 05:07 PM Report #496180 Posted February 19, 2013 at 05:07 PM (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 February 19, 2013 at 05:58 PM by thoga31 GeSHi
HappyHippyHippo Posted February 19, 2013 at 05:19 PM Report #496183 Posted February 19, 2013 at 05:19 PM 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 Portugol Plus
Zzz Posted February 19, 2013 at 05:30 PM Author Report #496185 Posted February 19, 2013 at 05:30 PM 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?
HappyHippyHippo Posted February 19, 2013 at 05:31 PM Report #496187 Posted February 19, 2013 at 05:31 PM 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 Portugol Plus
Zzz Posted February 19, 2013 at 05:37 PM Author Report #496191 Posted February 19, 2013 at 05:37 PM (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 February 19, 2013 at 05:58 PM by thoga31 GeSHi
AJBM Posted February 19, 2013 at 05:40 PM Report #496192 Posted February 19, 2013 at 05:40 PM Boas! A tua comparação funciona? e se ponto for diferente não retornas nada
Zzz Posted February 19, 2013 at 05:45 PM Author Report #496196 Posted February 19, 2013 at 05:45 PM 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...
pmg Posted February 19, 2013 at 07:03 PM Report #496203 Posted February 19, 2013 at 07:03 PM 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!
Zzz Posted February 19, 2013 at 08:44 PM Author Report #496214 Posted February 19, 2013 at 08:44 PM 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?
HappyHippyHippo Posted February 19, 2013 at 08:54 PM Report #496218 Posted February 19, 2013 at 08:54 PM #include <string.h> int compare(Complex * c1, Complex * c2) { return memcmp(c1, c2, sizeof(Complex)); } se não percebeste : http://www.cplusplus.com/reference/cstring/memcmp/ IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
pmg Posted February 19, 2013 at 09:07 PM Report #496220 Posted February 19, 2013 at 09:07 PM (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)); } http://www.cplusplus.com/reference/cstring/memcmp/ 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 February 19, 2013 at 09:10 PM 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!
Zzz Posted February 19, 2013 at 09:33 PM Author Report #496227 Posted February 19, 2013 at 09:33 PM 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.
HappyHippyHippo Posted February 19, 2013 at 09:34 PM Report #496228 Posted February 19, 2013 at 09:34 PM 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 Portugol Plus
Zzz Posted February 19, 2013 at 10:54 PM Author Report #496247 Posted February 19, 2013 at 10:54 PM (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 February 19, 2013 at 11:05 PM by pmg Falta LP no GeSHi
HappyHippyHippo Posted February 19, 2013 at 11:14 PM Report #496250 Posted February 19, 2013 at 11:14 PM 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 Portugol Plus
pmg Posted February 19, 2013 at 11:14 PM Report #496251 Posted February 19, 2013 at 11:14 PM (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 February 19, 2013 at 11:15 PM 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!
Zzz Posted February 23, 2013 at 05:56 PM Author Report #496757 Posted February 23, 2013 at 05:56 PM pessoal obrigado pelas dicas, deu para me ajudar e tirar algumas duvidas 😄
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now