commit 45762e7d9f0df686480136b13a8dcb7a251b5fda
parent 5954e32990ab00bcfe072b8ba0ee5a413c9372ee
Author: CamiAni <129856337+CamiAni@users.noreply.github.com>
Date: Sat, 22 Jun 2024 13:31:47 -0300
Merge pull request #12 from mjkloeckner/move-main-to-menu
move functions to class `Menu`
Diffstat:
| M | main.cpp | | | 362 | ++----------------------------------------------------------------------------- |
| M | menu.cpp | | | 596 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------------------ |
| M | menu.h | | | 45 | ++++++++++++++++++++++++++++++++++++++------- |
3 files changed, 505 insertions(+), 498 deletions(-)
diff --git a/main.cpp b/main.cpp
@@ -1,363 +1,11 @@
-#include <iostream>
-#include <fstream>
-#include <string>
-#include <sstream>
-#include <cstdlib>
-#include <vector>
-
-#include "barrio.h"
-
-#define CSV_DELIM ','
-
-enum {
- CALLE = 0,
- ALT_PLANO,
- DIRECCION,
- COORD_X,
- COORD_Y,
- COMUNA,
- BARRIO,
- LINEA_1,
- LINEA_1_SENTIDO,
- LINEA_2,
- LINEA_2_SENTIDO,
- LINEA_3,
- LINEA_3_SENTIDO,
- LINEA_4,
- LINEA_4_SENTIDO,
- LINEA_5,
- LINEA_5_SENTIDO,
- LINEA_6,
- LINEA_6_SENTIDO
-};
-
-void delSurroundingChar(std::string &str, char c) {
- str.erase(0, 1);
- str[str.size() - 1] = '\0';
-}
-
-size_t getTokens(std::string line, std::vector<std::string> &tokens) {
- std::string token;
- std::stringstream lineStream;
- size_t field;
-
- lineStream.clear();
- lineStream.str(line);
-
- for(field = CALLE; std::getline(lineStream, token, CSV_DELIM); ++field) {
- // solucion a `token` es una cadena que contiene CSV_DELIM
- while((token[0] == '"') && (token[token.size() - 1] != '"')) {
- std::string nextToken;
- std::getline(lineStream, nextToken, CSV_DELIM);
- token += CSV_DELIM + nextToken;
- }
- if(token[0] == '"' && token[token.size() - 1] == '"') {
- delSurroundingChar(token, '"');
- }
- tokens.push_back(token);
- }
-
- return field;
-}
-
-// busca el barrio en la lista de barrios, si no lo encuentra devuelve NULL
-Barrio *getBarrioPorNombre(std::string nombre, List<Barrio*> *barrios) {
- if(barrios == NULL) {
- return NULL;
- }
-
- Barrio *res = NULL;
-
- barrios->startCursor();
- while(barrios->forwardCursor()) {
- if(barrios->getCursorData()->getNombre() == nombre) {
- res = barrios->getCursorData();
- }
- }
-
- return res;
-}
-
-Parada *paradaMasCercanaPorCoordenada(List<Barrio*> *barrios, double x, double y) {
- double distancia;
- double distanciaMinima;
- Parada *resultado, *paradaActual;
-
- distancia = distanciaMinima = 0.0f;
- resultado = paradaActual = NULL;
-
- barrios->startCursor();
- while(barrios->forwardCursor()) {
- Barrio *barrioAux = barrios->getCursorData();
-
- if(resultado == NULL) {
- resultado = barrioAux->paradaMasCercana(x, y);
- if(resultado == NULL) {
- return NULL;
- }
- distanciaMinima = barrioAux->getDistancia(x, y, resultado->getCoordX(), resultado->getCoordY());
- continue;
- }
- paradaActual = barrioAux->paradaMasCercana(x, y);
- if(paradaActual == NULL) {
- continue;
- }
- distancia = barrioAux->getDistancia(x, y, paradaActual->getCoordX(), paradaActual->getCoordY());
- if(distanciaMinima > distancia) {
- distanciaMinima = distancia;
- resultado = paradaActual;
- }
- }
-
- std::cout << "distancia: " << distancia << std::endl;
- return resultado;
-}
-
-List<Parada*> *buscarParadas(List<Barrio*> *barrios, int linea) {
- List<Parada*> *resultado, *paradasPorBarrio;
- Barrio *barrio;
-
- resultado = new List<Parada*>;
-
- barrios->startCursor();
- while(barrios->forwardCursor()) {
- barrio = barrios->getCursorData();
- paradasPorBarrio = barrio->listaDeParadasPorLinea(linea);
- if(paradasPorBarrio == NULL) {
- // no hay paradas de la linea
- continue;
- }
-
- paradasPorBarrio->startCursor();
- while(paradasPorBarrio->forwardCursor()) {
- resultado->insert(paradasPorBarrio->getCursorData());
- }
-
- delete paradasPorBarrio;
- }
-
- if(resultado->getSize() == 0) {
- delete resultado;
- return NULL;
- }
-
- return resultado;
-}
+#include "menu.h"
int main (void) {
- std::ifstream inputFile;
- std::string token, line;
- std::vector<std::string> tokens;
- Barrio *barrio;
- List<Barrio*> *barrios;
-
- int comuna, alturaPlano, fields;
- double coordX, coordY;
- std::string barrioNombre, calle, direccion;
- std::vector<int> lineasEnParada;
-
- const char *inputFilePath = "paradas-de-colectivo.csv";
-
- inputFile.open(inputFilePath);
- if(!inputFile.is_open()) {
- std::cout << "No se pudo abrir el archivo `" << inputFilePath << "`\n";
- return 1;
- }
-
- comuna = alturaPlano = 0;
- coordX = coordY = 0.0f;
- barrios = new List<Barrio*>;
-
- std::getline(inputFile, line); // saltea la primer linea
-
- while(std::getline(inputFile, line)) {
- tokens.clear();
- lineasEnParada.clear();
- fields = getTokens(line, tokens);
-
- for(int field = CALLE; field <= fields; ++field) {
- token = tokens[field];
- switch(field) {
- case CALLE:
- calle = token;
- break;
- case ALT_PLANO:
- delSurroundingChar(token, '"');
- alturaPlano = std::atoi(token.c_str());
- break;
- case DIRECCION:
- if(token == "") {
- break;
- }
- direccion = token;
- break;
- case COORD_X:
- coordX = std::atof(token.c_str());
- break;
- case COORD_Y:
- coordY = std::atof(token.c_str());
- break;
- case COMUNA:
- delSurroundingChar(token, '"');
- comuna = std::atoi(token.c_str());
- break;
- case BARRIO:
- barrioNombre = token;
- if(barrioNombre == "") {
- barrioNombre = "NOMBRE SIN DEFINIR";
- }
- break;
- case LINEA_1:
- case LINEA_2:
- case LINEA_3:
- case LINEA_4:
- case LINEA_5:
- case LINEA_6:
- if(token == "") {
- break;
- }
- int linea;
- linea = std::atoi(token.c_str());
- lineasEnParada.push_back(linea);
- break;
- case LINEA_1_SENTIDO:
- case LINEA_2_SENTIDO:
- case LINEA_3_SENTIDO:
- case LINEA_4_SENTIDO:
- case LINEA_5_SENTIDO:
- case LINEA_6_SENTIDO:
- break;
- default:
- break;
- }
- }
-
- barrio = getBarrioPorNombre(barrioNombre, barrios);
- if(barrio == NULL) {
- // std::cout << "Creando nuevo barrio `" << barrioNombre << "`\n";
- barrio = new Barrio(barrioNombre, comuna);
- barrio->addParada(calle, alturaPlano, direccion, coordX, coordY, lineasEnParada);
- barrios->insert(barrio);
- } else {
- // barrio ya existe
- barrio->addParada(calle, alturaPlano, direccion, coordX, coordY, lineasEnParada);
- }
- }
-
- inputFile.close();
-
- bool terminarPrograma = false;
- std::string opcion;
- int linea;
-
- while(!terminarPrograma) {
- std::cout << "`1` Cantidad de paradas por barrio\n";
- std::cout << "`2` Parada mas cercana a una coordenada\n";
- std::cout << "`3` Listado de paradas de una linea de colectivo\n";
- std::cout << "`4` Listado de cantidad de paradas por linea de colectivo\n";
- std::cout << "`5` Listado de paradas de una linea mas cercano a una coordenada\n";
- std::cout << "`b` Imprimir barrios\n";
- std::cout << "`q` Salir\n";
- std::cout << "opcion> ";
-
- opcion.clear();
- std::cin >> opcion;
-
- if(opcion[0] == '\n') {
- continue;
- }
- switch(opcion[0]) {
- case 'b':
- barrios->startCursor();
- while(barrios->forwardCursor()) {
- std::cout << "`" << barrios->getCursorData()->getNombre() << "`\n";
- }
- std::cout << std::endl;
- break;
- case '1':
- barrios->startCursor();
- while(barrios->forwardCursor()) {
- barrio = barrios->getCursorData();
- std::cout << "`" << barrio->getNombre() << "`: "
- << barrio->getSizeListaDeParadas() << "\n";
- }
- std::cout << std::endl;
- break;
- case '2':
- double x, y;
-
- std::cout << "latitud> ";
- opcion.clear();
- std::cin >> opcion;
- y = std::atof(opcion.c_str());
-
- std::cout << "longitud> ";
- opcion.clear();
- std::cin >> opcion;
- x = std::atof(opcion.c_str());
-
- std::cout << "latitud: " << y << "; longitud: " << x << std::endl;
-
- Parada *parada;
- parada = paradaMasCercanaPorCoordenada(barrios, x, y);
- if(parada == NULL) {
- std::cout << "NULL POINTER";
- break;
- }
- std::cout << parada->getDireccion()
- << " (" << parada->getCoordX() << ", " << parada->getCoordY() << ")\n";
- break;
- case '3':
- List<Parada*> *paradas;
-
- std::cout << "linea> ";
- opcion.clear();
- std::cin >> linea;
- paradas = buscarParadas(barrios, linea);
- if(paradas == NULL) {
- std::cout << "no hay paradas de la linea indicada\n";
- break;
- }
- std::cout << "se encontraron `" << paradas->getSize() << "` paradas de la linea indicada\n";
-
- paradas->startCursor();
- while(paradas->forwardCursor()) {
- std::cout << "* `" << paradas->getCursorData()->getDireccion() << "`\n";
- }
- break;
-
- case '4':
- break;
- case '5':
- std::cout << "linea> ";
- opcion.clear();
- std::cin >> linea;
-
- paradas = buscarParadas(barrios, linea);
- if(paradas == NULL) {
- std::cout << "no hay paradas de la linea indicada\n";
- break;
- }
- std::cout << "existen `" << paradas->getSize() << "` paradas de la linea indicada\n";
-
- break;
- case 'q':
- terminarPrograma = true;
- break;
- default:
- std::cout << "opcion `" << opcion[0] << "` no definida\n";
- break;
- }
- }
-
- // std::cout << "Total barrios creados: " << barrios->getSize() << std::endl;
+ Menu *menu = new Menu();
- barrios->startCursor();
- while(barrios->forwardCursor()) {
- // std::cout << "Eliminando barrio `" << barrios->getCursorData()->getNombre() << "`\n";
- delete barrios->getCursorData();
- }
+ menu->cargarDatos();
+ menu->mostrarMenu();
- delete barrios;
+ delete menu;
return 0;
}
diff --git a/menu.cpp b/menu.cpp
@@ -1,12 +1,20 @@
#include "menu.h"
+#include <iostream>
+#include <fstream>
+#include <string>
+#include <sstream>
+#include <cstdlib>
+#include <vector>
+
+
void Menu::cantidadDeParadasPorBarrio() {
this->barrios->startCursor();
while(this->barrios->forwardCursor()) {
Barrio * barrioAux = this->barrios->getCursorData();
std::cout << "La cantidad de paradas que hay en el barrio "
- << &barrioAux
+ << barrioAux->getNombre()
<< " es: "
<< barrioAux->getSizeListaDeParadas()
<< std::endl;
@@ -14,7 +22,7 @@ void Menu::cantidadDeParadasPorBarrio() {
}
-void Menu::paradaMasCercanaPorCoordenada(double coordX,double coordY){
+Parada *Menu::paradaMasCercanaPorCoordenada(double coordX, double coordY) {
double distanciaMinima;
double distancia;
@@ -26,12 +34,20 @@ void Menu::paradaMasCercanaPorCoordenada(double coordX,double coordY){
Barrio *barrioAux = this->barrios->getCursorData();
if(paradaResultado == NULL) {
- paradaResultado = barrioAux->paradaMasCercana(coordX,coordY,barrioAux->getParadas());
- distanciaMinima = barrioAux->getDistancia(coordX,coordY,paradaResultado->getCoordX(),paradaResultado->getCoordY());
+ paradaResultado = barrioAux->paradaMasCercana(
+ coordX, coordY, barrioAux->getParadas());
+
+ distanciaMinima = barrioAux->getDistancia(
+ coordX, coordY,
+ paradaResultado->getCoordX(),paradaResultado->getCoordY());
}
else {
- paradaActual= barrioAux->paradaMasCercana(coordX,coordY,barrioAux->getParadas());
- distancia = barrioAux->getDistancia(coordX,coordY,paradaActual->getCoordX(),paradaActual->getCoordY());
+ paradaActual= barrioAux->paradaMasCercana(
+ coordX, coordY, barrioAux->getParadas());
+
+ distancia = barrioAux->getDistancia(
+ coordX, coordY,
+ paradaActual->getCoordX(), paradaActual->getCoordY());
if(distanciaMinima > distancia) {
distanciaMinima = distancia;
@@ -49,11 +65,12 @@ void Menu::paradaMasCercanaPorCoordenada(double coordX,double coordY){
<< "en la coordenada Y:"
<< paradaResultado->getCoordY()
<< std::endl;
+
+ return paradaResultado;
}
-void Menu::agregarElementosDeLista(List<Parada*>* listaAux,List<Parada*>* listaResultado) {
+void Menu::agregarElementosDeLista(List<Parada*>* listaAux, List<Parada*>* listaResultado) {
listaAux->startCursor();
-
while(listaAux->forwardCursor()) {
Parada *paradaAux = listaAux->getCursorData();
@@ -61,8 +78,8 @@ void Menu::agregarElementosDeLista(List<Parada*>* listaAux,List<Parada*>* listaR
}
}
-void Menu::imprimirParadasPorLinea(List<Parada*>* listaDeParadas) {
- if(listaDeParadas->getSize() == 0){
+void Menu::imprimirParadasPorLinea(List<Parada*> *listaDeParadas) {
+ if(listaDeParadas->getSize() == 0) {
std::cout<<"No se econtro ninguna parada para esta linea";
throw "No se econtro ninguna parada para esta linea";
}
@@ -83,204 +100,515 @@ void Menu::imprimirParadasPorLinea(List<Parada*>* listaDeParadas) {
}
}
-void Menu::paradasPorLinea(int linea){
- if(linea >= 0){
- std::cout<<"La linea no existe, no puede ser menor o igual a cero";
- throw "La linea no existe, no puede ser menor o igual a cero";
- }
-
- this->paradasPorCadaLinea = NULL;
- List<Parada*> *listaAux = new List<Parada*>();
+List<Parada*> *Menu::paradasPorLinea(int linea) {
+ // this->paradasPorCadaLinea = NULL;
+ List<Parada*> *listaAux = new List<Parada*>;
+ List<Parada*> *resultado = new List<Parada*>;
this->barrios->startCursor();
while(this->barrios->forwardCursor()){
Barrio *barrioAux = this->barrios->getCursorData();
listaAux = barrioAux->listaDeParadasPorLinea(linea);
- agregarElementosDeLista(listaAux, this->paradasPorCadaLinea);
+
+ std::cout << "listaAux->getSize(): " << listaAux->getSize() << "\n";
+ // agregarElementosDeLista(listaAux, resultado);
}
+ if(resultado->getSize() == 0) {
+ delete resultado;
+ return NULL;
+ }
+ return resultado;
}
-void Menu::agregarElementoSinRepetir(std::vector<int>* lineas, std::vector<int>* vectorLineasAux){
-
+void Menu::agregarElementoSinRepetir(std::vector<int> *lineas, std::vector<int> *vectorLineasAux) {
unsigned int contador = 0;
- size_t lineaTope = lineas->size();
+ size_t lineaTope = vectorLineasAux->size();
- for(size_t i=0; i<lineaTope;i++){
-
- for(size_t j=0; j<vectorLineasAux->size();j++){
-
- if((*vectorLineasAux)[j] == (*lineas)[i]){
-
- contador++;
-
- }
-
- if(contador == 0){
- lineas->push_back((*vectorLineasAux)[j]);
+ bool seRepite = false;
+ for(size_t i = 0; i < lineaTope; i++) {
+ for(size_t j = 0; j < lineas->size(); j++) {
+ if((*vectorLineasAux)[i] == (*lineas)[j]) {
+ seRepite = true;
}
- contador = 0;
-
+ }
+ if(seRepite == false) {
+ lineas->push_back((*vectorLineasAux)[i]);
}
}
+
+ return;
}
+void Menu::lineasPorParada(List<Parada*> *paradas) {
+ Parada *paradaAux;
+ std::vector<int> *vectorLineasAux = new std::vector<int>;
-void Menu::lineasPorParada(List<Parada*>* paradas){
+ // vectorLineasAux->push_back(10);
+ // vectorLineasAux->push_back(20);
+ // vectorLineasAux->push_back(30);
paradas->startCursor();
while(paradas->forwardCursor()){
+ paradaAux = paradas->getCursorData();
- Parada * paradaAux = paradas->getCursorData();
+ // std::cout << "direccion: " << paradaAux->getDireccion() << std::endl;
- std::vector<int>* vectorLineasAux = paradaAux->getLineas();
-
- agregarElementoSinRepetir(this->lineas, vectorLineasAux);
+ vectorLineasAux = paradaAux->getLineas();
+ // for(size_t i = 0; i < vectorLineasAux->size(); ++i) {
+ // std::cout << (*vectorLineasAux)[i] << std::endl;
+ // }
+ agregarElementoSinRepetir(this->lineas, vectorLineasAux);
}
-
}
void Menu::imprimirCantidadParadasPorLinea(std::vector<int>* lineas){
+ // std::cout << "lineas->size(): " << lineas->size() << std::endl;
+ List<Parada*> *paradas;
+
+ for(size_t i=0; i < lineas->size(); i++) {
+ paradas = paradasPorLinea((*lineas)[i]);
+ if(paradas == NULL) {
+ std::cout << "no hay paradas de la liena especificada\n";
+ continue;
+ }
+ std::cout << (*lineas)[i] <<" : " << paradas->getSize() <<std::endl;
+ delete paradas;
+ }
+}
- for(size_t i=0;i<lineas->size();i++){
+void Menu::cantidadDeParadasPorLinea() {
+ Barrio *barrioAux;
- paradasPorLinea((*lineas)[i]);
- std::cout<<(*lineas)[i]
- <<" : "
- <<this->paradasPorCadaLinea->getSize()
- <<std::endl;
+ this->lineas->clear();
+ this->barrios->startCursor();
+
+ while(this->barrios->forwardCursor()){
+ barrioAux = this->barrios->getCursorData();
+ // std::cout << barrioAux->getNombre() << std::endl;
+
+ lineasPorParada(barrioAux->getParadas());
}
}
+// 9 -> 8 -> 7 -> 6 -> 5 -> 4 -> 3 -> 2 -> 1
+void Menu::removerParadaMasCercana(List<Parada*> *listaAux, Parada *paradaCercana){
+ Parada *paradaAux;
+ unsigned int posicion = 0;
-void Menu::cantidadDeParadasPorLinea(){
+ listaAux->startCursor();
+ while(listaAux->forwardCursor()) {
+ posicion++;
+ paradaAux = listaAux->getCursorData();
- this->lineas = NULL;
- this->barrios->startCursor();
+ if(paradaAux == paradaCercana) {
+ listaAux->remove(posicion);
+ std::cout << "Removiendo: `" << paradaAux->getDireccion() << "`\n";
+ }
+ }
+}
- while(this->barrios->forwardCursor()){
+// 9 -> 8 -> 7 -> 6 -> 5 -> 4 -> 3 -> 2 -> 1
+void Menu::listaOrdenadaPorDistancia(List<Parada*> *listaDeParadasDeLinea,
+ double coordX, double coordY, Barrio *barrioAux) {
+
+ // listaDeParadasDeLinea -> lista de paradas por linea
+ List<Parada*>* listaDeParadasCercanas;
+ Parada *paradaAux;
+
+ listaDeParadasCercanas = new List<Parada*>;
+ size_t cantidadDeParadas = listaDeParadasDeLinea->getSize();
+
+ // listaDeParadasDeLinea->remove(1);
+ // listaDeParadasDeLinea->startCursor();
+ // while(listaDeParadasDeLinea->forwardCursor()) {
+ // std::cout << listaDeParadasDeLinea->getCursorData()->getDireccion() << std::endl;
+ // }
+
+ return;
+ for(size_t i = 1; i < cantidadDeParadas + 1; i++) {
+ // probar cuantas iteraciones hacer
+ Parada *paradaCercana = barrioAux->paradaMasCercana(coordX, coordY, listaDeParadasDeLinea);
+ // std::cout << paradaCercana->getDireccion() << std::endl;
+ listaDeParadasDeLinea->remove(i);
+ // removerParadaMasCercana(listaAux, paradaCercana);
+ imprimirParadasPorLinea(listaDeParadasDeLinea);
+
+ // listaDeParadasDeLinea->startCursor();
+ // while(listaDeParadasDeLinea->forwardCursor()) {
+ // std::cout << listaDeParadasDeLinea->getCursorData()->getDireccion() << std::endl;
+ // }
+
+
+ // listaDeParadasCercanas->startCursor();
+ // while(listaDeParadasCercanas->forwardCursor()) {
+ // std::cout << listaDeParadasCercanas->getCursorData()->getDireccion() << std::endl;
+ // }
+
+ /*
+ unsigned int posicion = 0;
+
+ listaAux->startCursor();
+ while(listaAux->forwardCursor()) {
+ posicion++;
+ paradaAux = listaAux->getCursorData();
+
+ if(paradaAux == paradaCercana) {
+ listaAux->remove(posicion);
+ std::cout << "Removiendo: `" << paradaAux->getDireccion() << "`\n";
+ }
+ }
+ */
+ }
+}
+
+void Menu::paradasMasCercanasPorBarrio(std::string barrio,
+ int linea, double coordX, double coordY) {
+
+ List<Parada*>* listaAux;
+ listaAux = new List<Parada*>;
+ this->barrios->startCursor();
+ while(this->barrios->forwardCursor()) {
Barrio * barrioAux = this->barrios->getCursorData();
- lineasPorParada(barrioAux->getParadas());
+ // std::cout << "analizando: `" << barrioAux->getNombre() << "`\n";
+ if(barrio == barrioAux->getNombre()) {
+ std::cout << "se encontro barrio con el mismo nombre\n";
+ listaAux = barrioAux->listaDeParadasPorLinea(linea);
+ listaOrdenadaPorDistancia(listaAux, coordX, coordY, barrioAux);
+ }
}
-
}
-void Menu::removerParadaMasCercana(List<Parada*>*listaAux,Parada * paradaCercana){
- listaAux->startCursor();
- unsigned int posicion = 0;
+Menu::Menu() {
+ this->barrios = new List<Barrio*>;
+ this->lineas = new std::vector<int>;
+ this->paradasPorCadaLinea = new List<Parada*>;
+ this->cantidadDeParadasPorCadaLinea = new List<Parada*>;
+ this->listaDeParadasCercanasOrdenadas = new List<Parada*>;
+ std::vector<int> *lineas = new std::vector<int>;
- while(listaAux->forwardCursor()){
+ this->linea = 0;
+ this->coordX = this->coordY = 0.0f;
+}
- posicion ++;
- Parada * paradaAux = listaAux->getCursorData();
+void delSurroundingChar(std::string &str, char c) {
+ str.erase(0, 1);
+ str[str.size() - 1] = '\0';
+}
- if(paradaAux == paradaCercana){
+size_t getTokens(std::string line, std::vector<std::string> &tokens) {
+ std::string token;
+ std::stringstream lineStream;
+ size_t field;
- listaAux->remove(posicion);
+ lineStream.clear();
+ lineStream.str(line);
- }
+ for(field = CALLE; std::getline(lineStream, token, CSV_DELIM); ++field) {
+ // solucion a `token` es una cadena que contiene CSV_DELIM
+ while((token[0] == '"') && (token[token.size() - 1] != '"')) {
+ std::string nextToken;
+ std::getline(lineStream, nextToken, CSV_DELIM);
+ token += CSV_DELIM + nextToken;
+ }
+ if(token[0] == '"' && token[token.size() - 1] == '"') {
+ delSurroundingChar(token, '"');
+ }
+ tokens.push_back(token);
}
+
+ return field;
}
-void Menu::listaOrdenadaPorDistancia(List<Parada*>* listaAux,double coordX,double coordY, Barrio * barrioAux){
+List<Parada*> *buscarParadas(List<Barrio*> *barrios, int linea) {
+ List<Parada*> *resultado, *paradasPorBarrio;
+ Barrio *barrio;
- List<Parada*>* listaDeParadasCercanas = NULL;
- size_t tamanioListaAux = listaAux->getSize();
+ resultado = new List<Parada*>;
- for(size_t i=0;i<tamanioListaAux;i++){ //probar cuantas iteraciones hacer
+ barrios->startCursor();
+ while(barrios->forwardCursor()) {
+ barrio = barrios->getCursorData();
+ paradasPorBarrio = barrio->listaDeParadasPorLinea(linea);
+ if(paradasPorBarrio == NULL) {
+ // no hay paradas de la linea
+ continue;
+ }
+
+ paradasPorBarrio->startCursor();
+ while(paradasPorBarrio->forwardCursor()) {
+ resultado->insert(paradasPorBarrio->getCursorData());
+ }
- Parada * paradaCercana = barrioAux->paradaMasCercana(coordX,coordY,listaAux);
- listaDeParadasCercanas->insert(paradaCercana);
- removerParadaMasCercana(listaAux, paradaCercana);
+ delete paradasPorBarrio;
+ }
+ if(resultado->getSize() == 0) {
+ delete resultado;
+ return NULL;
}
+ return resultado;
}
-void Menu::paradasMasCercanasPorBarrio(std::string barrio,int linea,double coordX,double coordY){
+// busca el barrio en la lista de barrios, si no lo encuentra devuelve NULL
+Barrio *getBarrioPorNombre(std::string nombre, List<Barrio*> *barrios) {
+ if(barrios == NULL) {
+ return NULL;
+ }
- this->barrios->startCursor();
- List<Parada*>* listaAux = NULL;
+ Barrio *res = NULL;
- while(this->barrios->forwardCursor()){
+ barrios->startCursor();
+ while(barrios->forwardCursor()) {
+ if(barrios->getCursorData()->getNombre() == nombre) {
+ res = barrios->getCursorData();
+ }
+ }
- Barrio * barrioAux = this->barrios->getCursorData();
+ return res;
+}
- if(barrio == barrioAux->getNombre())
- listaAux = barrioAux->listaDeParadasPorLinea(linea);
+void Menu::cargarDatos() {
+ std::ifstream inputFile;
+ std::string token, line;
+ std::vector<std::string> tokens;
+ std::vector<int> lineasEnParada;
+ Barrio *barrio;
- listaOrdenadaPorDistancia(listaAux,coordX,coordY, barrioAux);
+ const char *inputFilePath = "paradas-de-colectivo.csv";
+ int alturaPlano, fields;
+ std::string barrioNombre, calle, direccion;
+
+ inputFile.open(inputFilePath);
+ if(!inputFile.is_open()) {
+ std::cout << "No se pudo abrir el archivo `" << inputFilePath << "`\n";
+ // throw 1;
}
-}
+ std::getline(inputFile, line); // saltea la primer linea
+
+ while(std::getline(inputFile, line)) {
+ tokens.clear();
+ lineasEnParada.clear();
+ fields = getTokens(line, tokens);
+
+ for(int field = CALLE; field <= fields; ++field) {
+ token = tokens[field];
+ switch(field) {
+ case CALLE:
+ calle = token;
+ break;
+ case ALT_PLANO:
+ delSurroundingChar(token, '"');
+ alturaPlano = std::atoi(token.c_str());
+ break;
+ case DIRECCION:
+ if(token == "") {
+ break;
+ }
+ direccion = token;
+ break;
+ case COORD_X:
+ coordX = std::atof(token.c_str());
+ break;
+ case COORD_Y:
+ coordY = std::atof(token.c_str());
+ break;
+ case COMUNA:
+ break;
+ case BARRIO:
+ barrioNombre = token;
+ if(barrioNombre == "") {
+ barrioNombre = "NOMBRE SIN DEFINIR";
+ }
+ break;
+ case LINEA_1:
+ case LINEA_2:
+ case LINEA_3:
+ case LINEA_4:
+ case LINEA_5:
+ case LINEA_6:
+ if(token == "") {
+ break;
+ }
+ int linea;
+ linea = std::atoi(token.c_str());
+ lineasEnParada.push_back(linea);
+ break;
+ case LINEA_1_SENTIDO:
+ case LINEA_2_SENTIDO:
+ case LINEA_3_SENTIDO:
+ case LINEA_4_SENTIDO:
+ case LINEA_5_SENTIDO:
+ case LINEA_6_SENTIDO:
+ break;
+ default:
+ break;
+ }
+ }
+ barrio = getBarrioPorNombre(barrioNombre, barrios);
+ if(barrio == NULL) {
+ // std::cout << "Creando nuevo barrio `" << barrioNombre << "`\n";
+ barrio = new Barrio(barrioNombre);
+ barrio->addParada(calle, alturaPlano, direccion, coordX, coordY, lineasEnParada);
+ barrios->insert(barrio);
+ } else {
+ // barrio ya existe
+ barrio->addParada(calle, alturaPlano, direccion, coordX, coordY, lineasEnParada);
+ }
+ }
-Menu::Menu(int opcion) {
- this->opcion = opcion;
- this->barrios = new List<Barrio*>;
- this->lineas = new std::vector<int>;
- //inicializar las demas listas!!!!!!!!
-
- std::cout << "1) Listado de cantidad de paradas por Barrio"<<std::endl //HECHO!!!!!!!!!!
- << "2) Parada mas cercana a una coordenada ingresada por teclado"<<std::endl //HECHO!!!!!!!!!!
- << "3) Listado de paradas de una linea de colectivo"<<std::endl //HECHO!!!!!!!!!!
- << "4) Listado de cantidad de paradas por linea de colectivo"<<std::endl //HECHO!!!!!!!!!!
- << "5) Dado un barrio, linea de colectivo y una coord, imprimir las paradas ordenadas por distancia"<<std::endl;
-
- switch(opcion) {
- case 1:
- cantidadDeParadasPorBarrio();
- break;
- case 2:
- std::cout<<"Indique la coordenada en X: ";
- std::cin >> this->coordX;
- std::cout<<"Indique la coordenada en Y: ";
- std::cin >> this->coordY;
-
- paradaMasCercanaPorCoordenada(this->coordX, this->coordY);
- break;
- case 3:
- std::cout<<"Indique la Linea: ";
- std::cin >> this->linea;
-
- paradasPorLinea(this->linea);
- imprimirParadasPorLinea(this->paradasPorCadaLinea);
-
- break;
- case 4:
- cantidadDeParadasPorLinea();
- imprimirCantidadParadasPorLinea(this->lineas);
- break;
- case 5:
-
- std::cout<<"Indique el Barrio: ";
- std::cin >> this->barrio;
- std::cout<<"Indique la Linea: ";
- std::cin >> this->linea;
- std::cout<<"Indique la coordenada en X: ";
- std::cin >> this->coordX;
- std::cout<<"Indique la coordenada en Y: ";
- std::cin >> this->coordY;
-
- paradasMasCercanasPorBarrio(this->barrio,this->linea,this->coordX,this->coordY);
-
- imprimirParadasPorLinea(this->listaDeParadasCercanas);
-
- break;
- default:
- std::cerr << "Opcion invalida\n";
- break;
+ inputFile.close();
+}
+
+void Menu::mostrarMenu() {
+ bool terminarPrograma = false;
+ std::string opcion;
+ int linea;
+ Barrio *barrioActual;
+ std::string barrio;
+
+ while(!terminarPrograma) {
+ std::cout << "`1` Cantidad de paradas por barrio\n";
+ std::cout << "`2` Parada mas cercana a una coordenada\n";
+ std::cout << "`3` Listado de paradas de una linea de colectivo\n";
+ std::cout << "`4` Listado de cantidad de paradas por linea de colectivo\n";
+ std::cout << "`5` Listado de paradas de una linea mas cercano a una coordenada\n";
+ std::cout << "`b` Imprimir barrios\n";
+ std::cout << "`q` Salir\n";
+ std::cout << "opcion> ";
+
+ opcion.clear();
+ std::cin >> opcion;
+
+ if(opcion[0] == '\n') {
+ continue;
+ }
+ switch(opcion[0]) {
+ case 'b':
+ this->barrios->startCursor();
+ while(this->barrios->forwardCursor()) {
+ std::cout << "`" << this->barrios->getCursorData()->getNombre() << "`\n";
+ }
+ std::cout << std::endl;
+ break;
+ case '1':
+ cantidadDeParadasPorBarrio();
+ break;
+ case '2':
+ /*
+ double x, y;
+
+ std::cout << "latitud> ";
+ opcion.clear();
+ std::cin >> opcion;
+ y = std::atof(opcion.c_str());
+
+ std::cout << "longitud> ";
+ opcion.clear();
+ std::cin >> opcion;
+ x = std::atof(opcion.c_str());
+
+ std::cout << "latitud: " << y << "; longitud: " << x << std::endl;
+
+ Parada *parada;
+ parada = paradaMasCercanaPorCoordenada(x, y);
+ if(parada == NULL) {
+ std::cout << "NULL POINTER";
+ break;
+ }
+ std::cout << parada->getDireccion()
+ << " (" << parada->getCoordX() << ", " << parada->getCoordY() << ")\n";
+ */
+ std::cout<<"Indique la coordenada en X: ";
+ std::cin >> this->coordX;
+ std::cout<<"Indique la coordenada en Y: ";
+ std::cin >> this->coordY;
+
+ paradaMasCercanaPorCoordenada(this->coordX, this->coordY);
+ break;
+ case '3':
+ // std::cout<<"Indique la Linea: ";
+ // std::cin >> this->linea;
+
+ // paradasPorLinea(this->linea);
+ // imprimirParadasPorLinea(this->paradasPorCadaLinea);
+
+ List<Parada*> *paradas;
+
+ std::cout << "linea> ";
+ opcion.clear();
+ std::cin >> linea;
+ paradas = buscarParadas(barrios, linea);
+ if(paradas == NULL) {
+ std::cout << "no hay paradas de la linea indicada\n";
+ break;
+ }
+ std::cout << "se encontraron `" << paradas->getSize() << "` paradas de la linea indicada\n";
+
+ paradas->startCursor();
+ while(paradas->forwardCursor()) {
+ std::cout << "* `" << paradas->getCursorData()->getDireccion() << "`\n";
+ }
+ break;
+ case '4':
+ cantidadDeParadasPorLinea();
+
+ // List<Parada*> *paradas;
+ for(size_t i = 0; i < this->lineas->size(); ++i) {
+ paradas = buscarParadas(barrios, (*this->lineas)[i]);
+ if(paradas == NULL) {
+ std::cout << "no hay paradas de la linea indicada\n";
+ break;
+ }
+ std::cout << "se encontraron `" << paradas->getSize()
+ << "` paradas de la linea `" << (*this->lineas)[i] << " ` \n";
+ }
+
+ // imprimirCantidadParadasPorLinea(this->lineas);
+ break;
+ case '5':
+ // std::cout << "Indique el Barrio: ";
+ // std::cin.ignore(1);
+ // std::getline(std::cin, barrio, '\n');
+ barrio = "CONSTITUCION";
+
+ // std::cout<<"Indique la Linea: ";
+ // std::cin >> this->linea;
+ this->linea = 154;
+
+ // std::cout<<"Indique la coordenada en X: ";
+ // std::cin >> this->coordX;
+ this->coordX = 0.0f;
+
+ // std::cout<<"Indique la coordenada en Y: ";
+ // std::cin >> this->coordY;
+ this->coordY = 0.0f;
+
+ paradasMasCercanasPorBarrio(barrio,this->linea,this->coordX,this->coordY);
+ // imprimirParadasPorLinea(this->listaDeParadasCercanasOrdenadas);
+ break;
+ case 'q':
+ terminarPrograma = true;
+ break;
+ default:
+ std::cout << "opcion `" << opcion[0] << "` no definida\n";
+ break;
+ }
}
+
}
Menu::~Menu() { }
diff --git a/menu.h b/menu.h
@@ -6,17 +6,41 @@
#include "barrio.h"
#include "parada.h"
+#define CSV_DELIM ','
+
+enum {
+ CALLE = 0,
+ ALT_PLANO,
+ DIRECCION,
+ COORD_X,
+ COORD_Y,
+ COMUNA,
+ BARRIO,
+ LINEA_1,
+ LINEA_1_SENTIDO,
+ LINEA_2,
+ LINEA_2_SENTIDO,
+ LINEA_3,
+ LINEA_3_SENTIDO,
+ LINEA_4,
+ LINEA_4_SENTIDO,
+ LINEA_5,
+ LINEA_5_SENTIDO,
+ LINEA_6,
+ LINEA_6_SENTIDO
+};
+
+
class Menu {
private:
- int opcion, linea;
+ int linea;
List<Barrio*> *barrios;
double coordX, coordY;
- List<Parada*> *paradasPorCadaLinea, *cantidadDeParadasPorCadaLinea, *listaDeParadasCercanas;
+ List<Parada*> *paradasPorCadaLinea, *cantidadDeParadasPorCadaLinea, *listaDeParadasCercanasOrdenadas;
std::vector<int> *lineas;
- std::string barrio;
public:
- Menu(int opcion);
+ Menu();
/*
* pos: Libera la memoria
@@ -32,13 +56,14 @@ public:
* pre: Recibe como parametro las coordenadas en X e Y
* pos: Imprime por pantalla la parada mas cercana a la coordenada dada
*/
- void paradaMasCercanaPorCoordenada(double coordX,double coordY); //CONSIGNA 2 si imprime
+ Parada *paradaMasCercanaPorCoordenada(double coordX,double coordY); //CONSIGNA 2 si imprime
/*
* pre: Recibe como parametro el numero de la linea
- * pos: Imprime por pantalla un listado de paradas por donde pasa la linea
+ * pos: devuelve una lista de paradas que incluyen la linea
*/
- void paradasPorLinea(int linea); //CONSIGNA 3
+ // void paradasPorLinea(int linea); //CONSIGNA 3
+ List<Parada*> *paradasPorLinea(int linea);
/*
* pre: Recibe una lista de tipo parada
@@ -86,6 +111,12 @@ public:
*
*/
void removerParadaMasCercana(List<Parada*>*listaAux,Parada * paradaCercana);
+
+ void cargarDatos();
+
+ void mostrarMenu();
+
+ // List<Parada*> *buscarParadas(int linea);
};
#endif