CB100

Notas, resueltos y tps de la materia Algoritmos y Estructuras de Datos
Index Commits Files Refs README
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:
Mmain.cpp | 281+++++++++----------------------------------------------------------------------
Mmenu.cpp | 569++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-------------
Mmenu.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