commit ef065ff0ff5c5b09a7b70736ba67619481ebb4be
parent 5954e32990ab00bcfe072b8ba0ee5a413c9372ee
Author: Martin Kloeckner <mjkloeckner@gmail.com>
Date: Fri, 21 Jun 2024 21:42:40 -0300
move functions to class `Menu`
Diffstat:
| M | main.cpp | | | 281 | +++++++++---------------------------------------------------------------------- |
| M | menu.cpp | | | 569 | ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------------- |
| M | menu.h | | | 41 | ++++++++++++++++++++++++++++++++++++----- |
3 files changed, 543 insertions(+), 348 deletions(-)
diff --git a/main.cpp b/main.cpp
@@ -6,59 +6,9 @@
#include <vector>
#include "barrio.h"
+#include "menu.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) {
@@ -144,220 +94,49 @@ List<Parada*> *buscarParadas(List<Barrio*> *barrios, int linea) {
return resultado;
}
+*/
+
int main (void) {
- std::ifstream inputFile;
- std::string token, line;
- std::vector<std::string> tokens;
- Barrio *barrio;
- List<Barrio*> *barrios;
+ Menu *menu = new Menu(1);
+ menu->cargarDatos();
- int comuna, alturaPlano, fields;
- double coordX, coordY;
- std::string barrioNombre, calle, direccion;
- std::vector<int> lineasEnParada;
+ menu->mostrarMenu();
- const char *inputFilePath = "paradas-de-colectivo.csv";
+ // std::cout << "Total barrios creados: " << barrios->getSize() << std::endl;
- inputFile.open(inputFilePath);
- if(!inputFile.is_open()) {
- std::cout << "No se pudo abrir el archivo `" << inputFilePath << "`\n";
- return 1;
+ /*
+ barrios->startCursor();
+ while(barrios->forwardCursor()) {
+ // std::cout << "Eliminando barrio `" << barrios->getCursorData()->getNombre() << "`\n";
+ delete barrios->getCursorData();
}
- comuna = alturaPlano = 0;
- coordX = coordY = 0.0f;
- barrios = new List<Barrio*>;
-
- std::getline(inputFile, line); // saltea la primer linea
+ delete barrios;
+ */
- while(std::getline(inputFile, line)) {
- tokens.clear();
- lineasEnParada.clear();
- fields = getTokens(line, tokens);
+ /*
+ List<int> *lista;
- 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;
- }
- }
+ lista = new List<int>;
- 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);
- }
+ for(size_t i = 0; i < 10; i++) {
+ lista->insert(i);
}
- 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;
- }
+ lista->startCursor();
+ for(size_t i = 0; lista->forwardCursor(); i++) {
+ std::cout << lista->getCursorData() << ((i == 8) ? "\n" : " -> ");
}
- // std::cout << "Total barrios creados: " << barrios->getSize() << std::endl;
+ lista->remove(2);
+ lista->remove(3);
- barrios->startCursor();
- while(barrios->forwardCursor()) {
- // std::cout << "Eliminando barrio `" << barrios->getCursorData()->getNombre() << "`\n";
- delete barrios->getCursorData();
+ lista->startCursor();
+ for(size_t i = 0; lista->forwardCursor(); i++) {
+ std::cout << lista->getCursorData() << ((i == 8) ? "\n" : " -> ");
}
+ */
- 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,145 +100,189 @@ 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();
-
- for(size_t i=0; i<lineaTope;i++){
-
- for(size_t j=0; j<vectorLineasAux->size();j++){
-
- if((*vectorLineasAux)[j] == (*lineas)[i]){
+ size_t lineaTope = vectorLineasAux->size();
- 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){
-
- for(size_t i=0;i<lineas->size();i++){
-
- paradasPorLinea((*lineas)[i]);
- std::cout<<(*lineas)[i]
- <<" : "
- <<this->paradasPorCadaLinea->getSize()
- <<std::endl;
+ // 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;
}
}
+void Menu::cantidadDeParadasPorLinea() {
+ Barrio *barrioAux;
-void Menu::cantidadDeParadasPorLinea(){
-
- this->lineas = NULL;
+ this->lineas->clear();
this->barrios->startCursor();
while(this->barrios->forwardCursor()){
-
- Barrio * barrioAux = this->barrios->getCursorData();
+ barrioAux = this->barrios->getCursorData();
+ // std::cout << barrioAux->getNombre() << std::endl;
lineasPorParada(barrioAux->getParadas());
-
}
-
}
-void Menu::removerParadaMasCercana(List<Parada*>*listaAux,Parada * paradaCercana){
-
- listaAux->startCursor();
+// 9 -> 8 -> 7 -> 6 -> 5 -> 4 -> 3 -> 2 -> 1
+void Menu::removerParadaMasCercana(List<Parada*> *listaAux, Parada *paradaCercana){
+ Parada *paradaAux;
unsigned int posicion = 0;
- while(listaAux->forwardCursor()){
-
- posicion ++;
- Parada * paradaAux = listaAux->getCursorData();
-
- if(paradaAux == paradaCercana){
+ listaAux->startCursor();
+ while(listaAux->forwardCursor()) {
+ posicion++;
+ paradaAux = listaAux->getCursorData();
+ if(paradaAux == paradaCercana) {
listaAux->remove(posicion);
-
- }
+ std::cout << "Removiendo: `" << paradaAux->getDireccion() << "`\n";
+ }
}
}
-void Menu::listaOrdenadaPorDistancia(List<Parada*>* listaAux,double coordX,double coordY, Barrio * barrioAux){
-
- List<Parada*>* listaDeParadasCercanas = NULL;
- size_t tamanioListaAux = listaAux->getSize();
-
- for(size_t i=0;i<tamanioListaAux;i++){ //probar cuantas iteraciones hacer
-
- Parada * paradaCercana = barrioAux->paradaMasCercana(coordX,coordY,listaAux);
- listaDeParadasCercanas->insert(paradaCercana);
- removerParadaMasCercana(listaAux, paradaCercana);
-
+// 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) {
-void Menu::paradasMasCercanasPorBarrio(std::string barrio,int linea,double coordX,double coordY){
+ List<Parada*>* listaAux;
+ listaAux = new List<Parada*>;
this->barrios->startCursor();
- List<Parada*>* listaAux = NULL;
-
- while(this->barrios->forwardCursor()){
-
+ while(this->barrios->forwardCursor()) {
Barrio * barrioAux = this->barrios->getCursorData();
- if(barrio == barrioAux->getNombre())
+ // 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);
-
+ listaOrdenadaPorDistancia(listaAux, coordX, coordY, barrioAux);
+ }
}
-
}
@@ -229,8 +290,15 @@ Menu::Menu(int opcion) {
this->opcion = opcion;
this->barrios = new List<Barrio*>;
this->lineas = new std::vector<int>;
- //inicializar las demas listas!!!!!!!!
+ this->paradasPorCadaLinea = new List<Parada*>;
+ this->cantidadDeParadasPorCadaLinea = new List<Parada*>;
+ this->listaDeParadasCercanasOrdenadas = new List<Parada*>;
+ std::vector<int> *lineas = new std::vector<int>;
+
+ this->opcion = this->linea = 0;
+ this->coordX = this->coordY = 0.0f;
+ /*
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!!!!!!!!!!
@@ -274,13 +342,330 @@ Menu::Menu(int opcion) {
paradasMasCercanasPorBarrio(this->barrio,this->linea,this->coordX,this->coordY);
- imprimirParadasPorLinea(this->listaDeParadasCercanas);
+ imprimirParadasPorLinea(this->listaDeParadasCercanasOrdenadas);
break;
default:
std::cerr << "Opcion invalida\n";
break;
}
+La parada esta en: 414 ROMERO
+en la coordenada X: -58.4153
+en la coordenada Y:-34.6522
+ */
+}
+
+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;
+}
+
+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;
+}
+
+
+// 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;
+}
+
+
+void Menu::cargarDatos() {
+ std::ifstream inputFile;
+ std::string token, line;
+ std::vector<std::string> tokens;
+ std::vector<int> lineasEnParada;
+ Barrio *barrio;
+
+ 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);
+ }
+ }
+
+ 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,14 +6,38 @@
#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;
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);
@@ -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