elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Entrar al Canal Oficial Telegram de elhacker.net


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  validacion de puntos geograficos, grados, minutos, segundos y comparacion
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: validacion de puntos geograficos, grados, minutos, segundos y comparacion  (Leído 2,974 veces)
Beginner Web


Desconectado Desconectado

Mensajes: 634


youtu.be/0YhflLRE-DA


Ver Perfil
validacion de puntos geograficos, grados, minutos, segundos y comparacion
« en: 13 Diciembre 2018, 04:43 am »

Necesito algo de ayuda con los modulos de validacion de puntos geograficos, latitud, longitud y comparacion de dos puntos geograficos , me parece que algo estoy haciendo mal en el segundo y no quiero colocar todo en un solo if  :(
Código
  1. #include <iostream>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. using namespace std;
  6.  
  7. typedef struct coordenadas{
  8. int grados;
  9. int minutos;
  10. int segundos;
  11. char direccion;
  12. };
  13. typedef struct punto_geografico{
  14. coordenadas latitud;
  15. coordenadas longitud;
  16. };
  17.  
  18. void crear(coordenadas &c, bool latitud);
  19. bool validar(coordenadas p, bool latitud);
  20. bool iguales(punto_geografico p, punto_geografico q);
  21. void determinar_ubicacion(punto_geografico p);
  22.  
  23. int main()
  24. {
  25. punto_geografico p, q;
  26. cout<<"Crear primer punto geografico"<<endl;
  27. cout<<"Latitud"<<endl;
  28. crear(p.latitud,1);
  29. cout<<"Longitud"<<endl;
  30. crear(p.longitud,0);
  31. cout<<"Crear segundo punto geografico"<<endl;
  32. cout<<"Latitud"<<endl;
  33. crear(q.latitud,1);
  34. cout<<"Longitud"<<endl;
  35. crear(q.longitud,0);
  36. if(iguales(p,q)==true)
  37. cout<<"Son iguales"<<endl;
  38. else
  39. cout<<"Son diferentes"<<endl;
  40. determinar_ubicacion(p);
  41. system("pause");
  42. }
  43.  
  44. void crear(coordenadas &c, bool latitud)
  45. {
  46. do{
  47. cout<<"Ingrese grados   : ";
  48. cin>>c.grados;
  49. cout<<"Ingrese minutos  : ";
  50. cin>>c.minutos;
  51. cout<<"Ingrese segundos : ";
  52. cin>>c.segundos;
  53. cout<<"Ingrese direccion: ";
  54. cin>>c.direccion;
  55. }while(validar(c,latitud)==false);
  56. }
  57. //Aqui
  58. bool validar(coordenadas c, bool latitud)
  59. {
  60. if(latitud==true){
  61. if(c.direccion=='N' || c.direccion=='S'){
  62. if(c.grados==90 && c.minutos==0 && c.segundos==0)
  63. return true;
  64. else{
  65. if(c.grados<0 || c.grados>89 || c.minutos<0 || c.minutos>59 || c.segundos<0 || c.segundos>59)
  66. return false;
  67. else
  68. return true;
  69. }
  70. }
  71. else
  72. return false;
  73. }
  74. else{
  75. if(c.direccion=='E' || c.direccion=='O'){
  76. if(c.grados==180 && c.minutos==0 && c.segundos==0)
  77. return true;
  78. else{
  79. if(c.grados<0 || c.grados>179 || c.minutos<0 || c.minutos>59 || c.segundos<0 || c.segundos>59)
  80. return false;
  81. else
  82. return true;
  83. }
  84. }
  85. else
  86. return false;
  87. }
  88. }
  89. //Y aqui
  90. bool iguales(punto_geografico p, punto_geografico q)
  91. {
  92. if(p.latitud.direccion==q.latitud.direccion && p.longitud.direccion==q.longitud.direccion){
  93. if(p.latitud.grados==q.latitud.grados && p.longitud.grados==q.longitud.grados)
  94. if(p.latitud.minutos==q.latitud.minutos && p.longitud.minutos==q.longitud.minutos)
  95. if(p.latitud.segundos==q.latitud.segundos && p.longitud.segundos==q.longitud.segundos)
  96. return true;
  97. }
  98. else
  99. return false;
  100. }
  101.  
  102. void determinar_ubicacion(punto_geografico p)
  103. {
  104. cout<<"El punto geografico se ubica en";
  105. if(p.latitud.direccion=='N')
  106. cout<<" el hemisferio Norte ";
  107. else
  108. cout<<" el hemisferio Sur ";
  109. if(p.longitud.direccion=='E')
  110. cout<<"Oriental"<<endl;
  111. else
  112. cout<<"Occidentel"<<endl;
  113. }


En línea

7w7
MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: validacion de puntos geograficos, grados, minutos, segundos y comparacion
« Respuesta #1 en: 13 Diciembre 2018, 07:16 am »

Dentro de iguales: Quita las llaves del primer if y la palabra else.


En línea

Beginner Web


Desconectado Desconectado

Mensajes: 634


youtu.be/0YhflLRE-DA


Ver Perfil
Re: validacion de puntos geograficos, grados, minutos, segundos y comparacion
« Respuesta #2 en: 13 Diciembre 2018, 11:14 am »

Asi?
Código
  1. bool iguales(punto_geografico p, punto_geografico q)
  2. {
  3. if(p.latitud.direccion==q.latitud.direccion && p.longitud.direccion==q.longitud.direccion)
  4. if(p.latitud.grados==q.latitud.grados && p.longitud.grados==q.longitud.grados)
  5. if(p.latitud.minutos==q.latitud.minutos && p.longitud.minutos==q.longitud.minutos)
  6. if(p.latitud.segundos==q.latitud.segundos && p.longitud.segundos==q.longitud.segundos)
  7. return true;
  8.  
  9. return false;
  10. }
En línea

7w7
MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: validacion de puntos geograficos, grados, minutos, segundos y comparacion
« Respuesta #3 en: 13 Diciembre 2018, 15:50 pm »

Sí, sólo si se cumple la cadena de ifs llegas a return true, en caso contrario acabarás en return false.
En línea

CalgaryCorpus


Desconectado Desconectado

Mensajes: 323


Ver Perfil WWW
Re: validacion de puntos geograficos, grados, minutos, segundos y comparacion
« Respuesta #4 en: 13 Diciembre 2018, 16:28 pm »

Hay mucha redundancia posible de eliminar.
Sugiero hacer una funcion que compare 2 coordenadas

Código
  1. bool iguales(coordenadas c1, coordenadas c2);

y este se use en la comparacion de punto_geografico

Código
  1. bool iguales(punto_geografico p1, punto_geografico p2) {
  2.   return iguales(p1.longitud, p2.longitud) &&
  3.          iguales(p1.latitud, p2.latitud);
  4. }

y dado que los valores de los elementos de una coordenada estan limitados, sugiero hacer una conversion de los numeros antes de compararlos.

Por ejemplo:

Código
  1. long convertir(coordenadas c) {
  2.   return c.grados* 10000 + c.minutos*100 + c.segundos;
  3. }

En el fondo lo que se quiere hacer, si es que la aritmetica no me falla, es convertir 3 numeros sueltos en un solo numero: por ejemplo:  grados 165, minutos 32, segundos 87 se convierte en 1653287.

Con ello se hace 1 sola comparacion numerica y 1 del caracter.
iguales (la version que compara de coordenadas) se transforma en:

Código
  1. bool iguales(coordenadas c1, coordenadas c2) {
  2.    return c1.direccion == c2.direccion &&
  3.           convertir(c1) == convertir(c2);
  4. }
  5.  

En línea

Aqui mi perfil en LinkedIn, invitame un cafe aqui
Beginner Web


Desconectado Desconectado

Mensajes: 634


youtu.be/0YhflLRE-DA


Ver Perfil
Re: validacion de puntos geograficos, grados, minutos, segundos y comparacion
« Respuesta #5 en: 14 Diciembre 2018, 02:12 am »

Primero que nada perdon por el spam y... bueno lo he dejado asi porque es mas estetico para mi no se, de que funciona funciona pero seguro muchos diran que no es buena practica lo se perdon  :-(
Código
  1. bool iguales(punto_geografico p, punto_geografico q)
  2. {
  3. bool igual=true;
  4. if(p.latitud.direccion!=q.latitud.direccion || p.longitud.direccion!=q.longitud.direccion)
  5. igual=false;
  6. if(p.latitud.direccion!=q.latitud.direccion || p.longitud.direccion!=q.longitud.direccion)
  7. igual=false;
  8. if(p.latitud.grados!=q.latitud.grados || p.longitud.grados!=q.longitud.grados)
  9. igual=false;
  10. if(p.latitud.minutos!=q.latitud.minutos || p.longitud.minutos!=q.longitud.minutos)
  11. igual=false;
  12. if(p.latitud.segundos!=q.latitud.segundos || p.longitud.segundos!=q.longitud.segundos)
  13. igual=false;
  14. return igual;
  15. }
Si alguien me sugiere algo mas de buenas tecnicas de programacion o estetica me lo hace saber, mi compañero puso todo en un solo if pero vaya que quedo un chorizo de codigo y a mi no me gusto pero era eficiente igual, se que esto esta mal porque al encontrar la primer condicion que no se cumple ya deberia retornar un false y dejar de verificar las siguientes condiciones :(  :laugh:
« Última modificación: 14 Diciembre 2018, 02:22 am por Beginner Web » En línea

7w7
K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 1.008



Ver Perfil
Re: validacion de puntos geograficos, grados, minutos, segundos y comparacion
« Respuesta #6 en: 14 Diciembre 2018, 03:11 am »

se que esto esta mal porque al encontrar la primer condicion que no se cumple ya deberia retornar un false y dejar de verificar las siguientes condiciones

Para dejar de verificar condiciones lo que se suele hacer es incluir que <igual> sea <true> en cada <if>.
Código
  1. bool iguales(punto_geografico p, punto_geografico q){
  2. bool igual=true;
  3. if(igual && (p.latitud.direccion!=q.latitud.direccion || p.longitud.direccion!=q.longitud.direccion))
  4. igual=false;
  5. if(igual && (p.latitud.direccion!=q.latitud.direccion || p.longitud.direccion!=q.longitud.direccion))
  6. igual=false;
  7. // asi con todos
  8. return igual;
  9. }

Sin embargo esto se hace más cuando en vez de <if> tienes un <while> o un <for>. Para un <if> es mejor usando <else>. Así en cuanto se cumpla un <if> el resto se los va a saltar.
Código
  1. bool iguales(punto_geografico p, punto_geografico q){
  2. bool igual=true;
  3. if(p.latitud.direccion!=q.latitud.direccion || p.longitud.direccion!=q.longitud.direccion)
  4. igual=false;
  5. else if(p.latitud.direccion!=q.latitud.direccion || p.longitud.direccion!=q.longitud.direccion)
  6. igual=false;
  7.        else if(p.latitud.grados!=q.latitud.grados || p.longitud.grados!=q.longitud.grados)
  8.                igual=false;
  9. // asi con todos
  10. return igual;
  11. }

Y otra opcion es asignar cada condición dentro de cada <if> a la propia variable <igual> ya que es booleana. En este caso tendrías que hacerlo negándolas, algo así:
Código
  1. bool iguales(punto_geografico p, punto_geografico q){
  2. bool igual=true;
  3. if(igual)
  4. igual= !(p.latitud.direccion!=q.latitud.direccion || p.longitud.direccion!=q.longitud.direccion)
  5.        if(igual)
  6. igual= !(p.latitud.direccion!=q.latitud.direccion || p.longitud.direccion!=q.longitud.direccion)
  7.        if(igual)
  8.                igual= !(p.latitud.grados!=q.latitud.grados || p.longitud.grados!=q.longitud.grados)
  9. // asi con todos
  10. return igual;
  11. }
Un poco raro pero se puede hacer. Puedes elegir la que mejor veas. :-X
PD: Me acabo de dar cuenta de que los dos primeros condicionales son el mismo. :rolleyes:
« Última modificación: 14 Diciembre 2018, 03:13 am por YreX-DwX » En línea

Código
  1. cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
Beginner Web


Desconectado Desconectado

Mensajes: 634


youtu.be/0YhflLRE-DA


Ver Perfil
Re: validacion de puntos geograficos, grados, minutos, segundos y comparacion
« Respuesta #7 en: 14 Diciembre 2018, 03:18 am »

Para dejar de verificar condiciones lo que se suele hacer es incluir que <igual> sea <true> en cada <if>.
Código
  1. bool iguales(punto_geografico p, punto_geografico q){
  2. bool igual=true;
  3. if(igual && (p.latitud.direccion!=q.latitud.direccion || p.longitud.direccion!=q.longitud.direccion))
  4. igual=false;
  5. if(igual && (p.latitud.direccion!=q.latitud.direccion || p.longitud.direccion!=q.longitud.direccion))
  6. igual=false;
  7. // asi con todos
  8. return igual;
  9. }

Sin embargo esto se hace más cuando en vez de <if> tienes un <while> o un <for>. Para un <if> es mejor usando <else>. Así en cuanto se cumpla un <if> el resto se los va a saltar.
Código
  1. bool iguales(punto_geografico p, punto_geografico q){
  2. bool igual=true;
  3. if(p.latitud.direccion!=q.latitud.direccion || p.longitud.direccion!=q.longitud.direccion)
  4. igual=false;
  5. else if(p.latitud.direccion!=q.latitud.direccion || p.longitud.direccion!=q.longitud.direccion)
  6. igual=false;
  7.        else if(p.latitud.grados!=q.latitud.grados || p.longitud.grados!=q.longitud.grados)
  8.                igual=false;
  9. // asi con todos
  10. return igual;
  11. }

Y otra opcion es asignar cada condición dentro de cada <if> a la propia variable <igual> ya que es booleana. En este caso tendrías que hacerlo negándolas, algo así:
Código
  1. bool iguales(punto_geografico p, punto_geografico q){
  2. bool igual=true;
  3. if(igual)
  4. igual= !(p.latitud.direccion!=q.latitud.direccion || p.longitud.direccion!=q.longitud.direccion)
  5.        if(igual)
  6. igual= !(p.latitud.direccion!=q.latitud.direccion || p.longitud.direccion!=q.longitud.direccion)
  7.        if(igual)
  8.                igual= !(p.latitud.grados!=q.latitud.grados || p.longitud.grados!=q.longitud.grados)
  9. // asi con todos
  10. return igual;
  11. }
Un poco raro pero se puede hacer. Puedes elegir la que mejor veas. :-X
PD: Me acabo de dar cuenta de que los dos primeros condicionales son el mismo. :rolleyes:
Me quede con la segunda opcion, la tercera me gusta pero es algo rara ero si la entiendo
Código
  1. bool iguales(punto_geografico p, punto_geografico q)
  2. {
  3. bool igual=true;
  4. if(p.latitud.direccion!=q.latitud.direccion || p.longitud.direccion!=q.longitud.direccion)
  5. igual=false;
  6. else if(p.latitud.direccion!=q.latitud.direccion || p.longitud.direccion!=q.longitud.direccion)
  7. igual=false;
  8. else if(p.latitud.grados!=q.latitud.grados || p.longitud.grados!=q.longitud.grados)
  9. igual=false;
  10. else if(p.latitud.minutos!=q.latitud.minutos || p.longitud.minutos!=q.longitud.minutos)
  11. igual=false;
  12. else if(p.latitud.segundos!=q.latitud.segundos || p.longitud.segundos!=q.longitud.segundos)
  13. igual=false;
  14. return igual;
  15. }
En línea

7w7
K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 1.008



Ver Perfil
Re: validacion de puntos geograficos, grados, minutos, segundos y comparacion
« Respuesta #8 en: 14 Diciembre 2018, 03:21 am »

Lo único que los dos primeros condicionales son el mismo...   :rolleyes:
Me he dado cuenta después y aunque lo he añadido al mensaje anterior igual lo he puesto demasiado tarde
En línea

Código
  1. cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines