Autor
|
Tema: validacion de puntos geograficos, grados, minutos, segundos y comparacion (Leído 3,038 veces)
|
Beginner Web
Desconectado
Mensajes: 634
youtu.be/0YhflLRE-DA
|
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 #include <iostream> #include <stdlib.h> #include <string.h> using namespace std; typedef struct coordenadas{ int grados; int minutos; int segundos; char direccion; }; typedef struct punto_geografico{ coordenadas latitud; coordenadas longitud; }; void crear(coordenadas &c, bool latitud); bool validar(coordenadas p, bool latitud); bool iguales(punto_geografico p, punto_geografico q); void determinar_ubicacion(punto_geografico p); int main() { punto_geografico p, q; cout<<"Crear primer punto geografico"<<endl; cout<<"Latitud"<<endl; crear(p.latitud,1); cout<<"Longitud"<<endl; crear(p.longitud,0); cout<<"Crear segundo punto geografico"<<endl; cout<<"Latitud"<<endl; crear(q.latitud,1); cout<<"Longitud"<<endl; crear(q.longitud,0); if(iguales(p,q)==true) cout<<"Son iguales"<<endl; else cout<<"Son diferentes"<<endl; determinar_ubicacion(p); system("pause"); } void crear(coordenadas &c, bool latitud) { do{ cout<<"Ingrese grados : "; cin>>c.grados; cout<<"Ingrese minutos : "; cin>>c.minutos; cout<<"Ingrese segundos : "; cin>>c.segundos; cout<<"Ingrese direccion: "; cin>>c.direccion; }while(validar(c,latitud)==false); } //Aqui bool validar(coordenadas c, bool latitud) { if(latitud==true){ if(c.direccion=='N' || c.direccion=='S'){ if(c.grados==90 && c.minutos==0 && c.segundos==0) return true; else{ if(c.grados<0 || c.grados>89 || c.minutos<0 || c.minutos>59 || c.segundos<0 || c.segundos>59) return false; else return true; } } else return false; } else{ if(c.direccion=='E' || c.direccion=='O'){ if(c.grados==180 && c.minutos==0 && c.segundos==0) return true; else{ if(c.grados<0 || c.grados>179 || c.minutos<0 || c.minutos>59 || c.segundos<0 || c.segundos>59) return false; else return true; } } else return false; } } //Y aqui bool iguales(punto_geografico p, punto_geografico q) { if(p.latitud.direccion==q.latitud.direccion && p.longitud.direccion==q.longitud.direccion){ if(p.latitud.grados==q.latitud.grados && p.longitud.grados==q.longitud.grados) if(p.latitud.minutos==q.latitud.minutos && p.longitud.minutos==q.longitud.minutos) if(p.latitud.segundos==q.latitud.segundos && p.longitud.segundos==q.longitud.segundos) return true; } else return false; } void determinar_ubicacion(punto_geografico p) { cout<<"El punto geografico se ubica en"; if(p.latitud.direccion=='N') cout<<" el hemisferio Norte "; else cout<<" el hemisferio Sur "; if(p.longitud.direccion=='E') cout<<"Oriental"<<endl; else cout<<"Occidentel"<<endl; }
|
|
|
En línea
|
7w7
|
|
|
MAFUS
Desconectado
Mensajes: 1.603
|
Dentro de iguales: Quita las llaves del primer if y la palabra else.
|
|
|
En línea
|
|
|
|
Beginner Web
Desconectado
Mensajes: 634
youtu.be/0YhflLRE-DA
|
Asi? bool iguales(punto_geografico p, punto_geografico q) { if(p.latitud.direccion==q.latitud.direccion && p.longitud.direccion==q.longitud.direccion) if(p.latitud.grados==q.latitud.grados && p.longitud.grados==q.longitud.grados) if(p.latitud.minutos==q.latitud.minutos && p.longitud.minutos==q.longitud.minutos) if(p.latitud.segundos==q.latitud.segundos && p.longitud.segundos==q.longitud.segundos) return true; return false; }
|
|
|
En línea
|
7w7
|
|
|
MAFUS
Desconectado
Mensajes: 1.603
|
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
|
Hay mucha redundancia posible de eliminar. Sugiero hacer una funcion que compare 2 coordenadas bool iguales(coordenadas c1, coordenadas c2);
y este se use en la comparacion de punto_geograficobool iguales(punto_geografico p1, punto_geografico p2) { return iguales(p1.longitud, p2.longitud) && iguales(p1.latitud, p2.latitud); }
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: long convertir(coordenadas c) { return c.grados* 10000 + c.minutos*100 + c.segundos; }
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: bool iguales(coordenadas c1, coordenadas c2) { return c1.direccion == c2.direccion && convertir(c1) == convertir(c2); }
|
|
|
En línea
|
|
|
|
Beginner Web
Desconectado
Mensajes: 634
youtu.be/0YhflLRE-DA
|
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 bool iguales(punto_geografico p, punto_geografico q) { bool igual=true; if(p.latitud.direccion!=q.latitud.direccion || p.longitud.direccion!=q.longitud.direccion) igual=false; if(p.latitud.direccion!=q.latitud.direccion || p.longitud.direccion!=q.longitud.direccion) igual=false; if(p.latitud.grados!=q.latitud.grados || p.longitud.grados!=q.longitud.grados) igual=false; if(p.latitud.minutos!=q.latitud.minutos || p.longitud.minutos!=q.longitud.minutos) igual=false; if(p.latitud.segundos!=q.latitud.segundos || p.longitud.segundos!=q.longitud.segundos) igual=false; return igual; }
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
|
|
« Última modificación: 14 Diciembre 2018, 02:22 am por Beginner Web »
|
En línea
|
7w7
|
|
|
K-YreX
|
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>. bool iguales(punto_geografico p, punto_geografico q){ bool igual=true; if(igual && (p.latitud.direccion!=q.latitud.direccion || p.longitud.direccion!=q.longitud.direccion)) igual=false; if(igual && (p.latitud.direccion!=q.latitud.direccion || p.longitud.direccion!=q.longitud.direccion)) igual=false; // asi con todos return igual; }
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. bool iguales(punto_geografico p, punto_geografico q){ bool igual=true; if(p.latitud.direccion!=q.latitud.direccion || p.longitud.direccion!=q.longitud.direccion) igual=false; else if(p.latitud.direccion!=q.latitud.direccion || p.longitud.direccion!=q.longitud.direccion) igual=false; else if(p.latitud.grados!=q.latitud.grados || p.longitud.grados!=q.longitud.grados) igual=false; // asi con todos return igual; }
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í: bool iguales(punto_geografico p, punto_geografico q){ bool igual=true; if(igual) igual= !(p.latitud.direccion!=q.latitud.direccion || p.longitud.direccion!=q.longitud.direccion) if(igual) igual= !(p.latitud.direccion!=q.latitud.direccion || p.longitud.direccion!=q.longitud.direccion) if(igual) igual= !(p.latitud.grados!=q.latitud.grados || p.longitud.grados!=q.longitud.grados) // asi con todos return igual; }
Un poco raro pero se puede hacer. Puedes elegir la que mejor veas. PD: Me acabo de dar cuenta de que los dos primeros condicionales son el mismo.
|
|
« Última modificación: 14 Diciembre 2018, 03:13 am por YreX-DwX »
|
En línea
|
cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
|
|
|
Beginner Web
Desconectado
Mensajes: 634
youtu.be/0YhflLRE-DA
|
Para dejar de verificar condiciones lo que se suele hacer es incluir que <igual> sea <true> en cada <if>. bool iguales(punto_geografico p, punto_geografico q){ bool igual=true; if(igual && (p.latitud.direccion!=q.latitud.direccion || p.longitud.direccion!=q.longitud.direccion)) igual=false; if(igual && (p.latitud.direccion!=q.latitud.direccion || p.longitud.direccion!=q.longitud.direccion)) igual=false; // asi con todos return igual; }
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. bool iguales(punto_geografico p, punto_geografico q){ bool igual=true; if(p.latitud.direccion!=q.latitud.direccion || p.longitud.direccion!=q.longitud.direccion) igual=false; else if(p.latitud.direccion!=q.latitud.direccion || p.longitud.direccion!=q.longitud.direccion) igual=false; else if(p.latitud.grados!=q.latitud.grados || p.longitud.grados!=q.longitud.grados) igual=false; // asi con todos return igual; }
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í: bool iguales(punto_geografico p, punto_geografico q){ bool igual=true; if(igual) igual= !(p.latitud.direccion!=q.latitud.direccion || p.longitud.direccion!=q.longitud.direccion) if(igual) igual= !(p.latitud.direccion!=q.latitud.direccion || p.longitud.direccion!=q.longitud.direccion) if(igual) igual= !(p.latitud.grados!=q.latitud.grados || p.longitud.grados!=q.longitud.grados) // asi con todos return igual; }
Un poco raro pero se puede hacer. Puedes elegir la que mejor veas. PD: Me acabo de dar cuenta de que los dos primeros condicionales son el mismo. Me quede con la segunda opcion, la tercera me gusta pero es algo rara ero si la entiendo bool iguales(punto_geografico p, punto_geografico q) { bool igual=true; if(p.latitud.direccion!=q.latitud.direccion || p.longitud.direccion!=q.longitud.direccion) igual=false; else if(p.latitud.direccion!=q.latitud.direccion || p.longitud.direccion!=q.longitud.direccion) igual=false; else if(p.latitud.grados!=q.latitud.grados || p.longitud.grados!=q.longitud.grados) igual=false; else if(p.latitud.minutos!=q.latitud.minutos || p.longitud.minutos!=q.longitud.minutos) igual=false; else if(p.latitud.segundos!=q.latitud.segundos || p.longitud.segundos!=q.longitud.segundos) igual=false; return igual; }
|
|
|
En línea
|
7w7
|
|
|
K-YreX
|
Lo único que los dos primeros condicionales son el mismo... Me he dado cuenta después y aunque lo he añadido al mensaje anterior igual lo he puesto demasiado tarde
|
|
|
En línea
|
cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Sumar Hs ; Minutos ; Segundos . Milisegundos
Programación Visual Basic
|
e500
|
4
|
16,914
|
30 Marzo 2009, 01:31 am
por e500
|
|
|
[Solucionado]Problemas para crear función Decimal a Grados Minutos Segundos
Programación Visual Basic
|
LeandroA
|
3
|
5,749
|
5 Marzo 2013, 20:54 pm
por Danyfirex
|
|
|
Ayuda con un codigo Java respecto a horas/minutos/segundos y sumas con ellas
Java
|
Unrealjose
|
4
|
8,250
|
6 Abril 2017, 20:45 pm
por Unrealjose
|
|
|
Un nuevo material permitiría cargar el coche en minutos o el móvil en segundos
Noticias
|
wolfbcn
|
0
|
1,470
|
8 Marzo 2018, 21:35 pm
por wolfbcn
|
|
|
Validacion de comas y puntos VB6
Programación Visual Basic
|
RiasChan
|
2
|
2,949
|
12 Marzo 2018, 18:51 pm
por RiasChan
|
|