CB100

Notas, resueltos y tps de la materia Algoritmos y Estructuras de Datos
Index Commits Files Refs README
commit c901ad7e46067d3ffc294231765a2ed1b9543ea8
parent 5bc1a0c018e147a75eec105f5cb1d9da0598f39b
Author: Martin Kloeckner <mjkloeckner@gmail.com>
Date:   Fri, 21 Jun 2024 17:09:12 -0300

Merge branch 'main' of github.com:IgnacioCettour/CB100-tp2 into IgnacioCettour-main

Diffstat:
Mbarrio.cpp | 27++++++++++-----------------
Mbarrio.h | 2+-
Mlist.h | 45+++++++++++++++++++++++++++++++++++++++++++++
Mmenu.cpp | 153++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-------
Mmenu.h | 40+++++++++++++++++++++++++++++++++++-----
5 files changed, 232 insertions(+), 35 deletions(-)
diff --git a/barrio.cpp b/barrio.cpp
@@ -1,6 +1,10 @@
 #include "barrio.h"
 #include <cmath>
 
+Barrio::Barrio() {
+    this->paradas = new List<Parada*>; // crea la lista para las paradas
+}
+
 Barrio::Barrio(std::string nombre, int comuna) {
     this->nombre = nombre;
     this->comuna = comuna;
@@ -34,27 +38,21 @@ double Barrio::getDistancia(double x1,double y1,double x2,double y2){ //CONSIGAN
     return std::sqrt(dX*dX + dY*dY);
 }
 
-Parada *Barrio::paradaMasCercana(double coordX, double coordY) { //CONSIGNA 2
+Parada *Barrio::paradaMasCercana(double coordX, double coordY,List<Parada*>* paradasAux) { //CONSIGNA 2
+    paradasAux->startCursor();
     double distancia;
     double distanciaMinima;
     Parada *resultado, *aux;
 
-    resultado = aux = NULL;
-
-    if(this->paradas->getSize() == 0) {
-        return NULL;
-    }
-
-    this->paradas->startCursor();
-    while(this->paradas->forwardCursor()) {
-        aux = this->paradas->getCursorData();
+    while(paradasAux->forwardCursor()){
+        Parada *aux = paradasAux->getCursorData();
 
         if(resultado == NULL) {
             resultado = aux;
             distanciaMinima = getDistancia(coordX, coordY, aux->getCoordX(), aux->getCoordY());
         }
         else {
-            distancia = getDistancia(coordX, coordY, aux->getCoordX(), aux->getCoordY());
+            distancia = getDistancia(coordX,coordY,aux->getCoordX(),aux->getCoordY());
 
             if(distancia < distanciaMinima) {
                 resultado = aux;
@@ -93,12 +91,7 @@ List<Parada*> *Barrio::listaDeParadasPorLinea(int linea) { //CONSIGNA 3
         }
     }
 
-    if(resultado->getSize() == 0) {
-        delete resultado;
-        return NULL;
-    }
-
-    return resultado;
+    return resultado->getSize() == 0 ? NULL : resultado;
 }
 
 unsigned int Barrio::getCantidadDeParadasPorLinea(int linea) { //CONSIGNA 4
diff --git a/barrio.h b/barrio.h
@@ -59,7 +59,7 @@ public:
     /*
      * pos: devuelve la parada mas cercana a una coordenada dada
      */
-    Parada *paradaMasCercana(double coordX, double coordY);
+    Parada *paradaMasCercana(double coordX, double coordY, List<Parada*>* paradasAux);
 
     /*
      * pre: recibe el numero de una Linea
diff --git a/list.h b/list.h
@@ -61,6 +61,19 @@ public:
      * pos: devuelve el dato del nodo en el cual se encuentra el cursor
      */
     Type getCursorData();
+
+    void validarPosicion(unsigned int posicion);
+
+    Node<Type> * obtenerNodo(unsigned int posicion);
+
+    /*
+     *pre : posición pertenece al intervalo: [1, contarElementos()]
+     *pre * post: remueve de la Lista el elemento en la posición indicada.
+     */
+    void remove(unsigned int posicion);
+
+
+
 };
 
 template <typename Type>
@@ -120,4 +133,36 @@ Type List<Type>::getCursorData() {
     return this->cursor->getData();
 }
 
+
+template <typename Type> void List<Type>::validarPosicion(unsigned int posicion) {
+    if ((posicion < 1) ||
+        (posicion > this->size + 1)) {
+        throw "La posicion debe estar entre 1 y tamaño + 1";
+    }
+}
+
+template <typename Type> Node<Type> * List<Type>::obtenerNodo(unsigned int posicion) {
+    //validarPosicion(posicion);
+    Node<Type> * actual = this->first;
+    for(unsigned int i = 1; i < posicion; i++) {
+        actual = actual->getNext();
+    }
+    return actual;
+}
+
+template <typename Type> void List<Type>::remove(unsigned int posicion) {
+    validarPosicion(posicion);
+    Node<Type> * removido;
+    if (posicion == 1) {
+        removido = this->first;
+        this->first = removido->getNext();
+    } else {
+        Node<Type> * anterior = this->obtenerNodo(posicion -1);
+        removido = anterior->getNext();
+        anterior->setNext( removido->getNext());
+    }
+    delete removido;
+    this->size--;
+}
+
 #endif /* LIST_H_ */
diff --git a/menu.cpp b/menu.cpp
@@ -25,11 +25,11 @@ void Menu::paradaMasCercanaPorCoordenada(double coordX,double coordY){
         Barrio *barrioAux = this->barrios->getCursorData();
 
         if(paradaResultado == NULL) {
-            paradaResultado = barrioAux->paradaMasCercana(coordX,coordY);
+            paradaResultado = barrioAux->paradaMasCercana(coordX,coordY,barrioAux->getParadas());
             distanciaMinima = barrioAux->getDistancia(coordX,coordY,paradaResultado->getCoordX(),paradaResultado->getCoordY());
         }
         else {
-            paradaActual= barrioAux->paradaMasCercana(coordX,coordY);
+            paradaActual= barrioAux->paradaMasCercana(coordX,coordY,barrioAux->getParadas());
             distancia = barrioAux->getDistancia(coordX,coordY,paradaActual->getCoordX(),paradaActual->getCoordY());
 
             if(distanciaMinima > distancia) {
@@ -99,29 +99,142 @@ void Menu::paradasPorLinea(int linea){
         agregarElementosDeLista(listaAux, this->paradasPorCadaLinea);
     }
 
-    imprimirParadasPorLinea(this->paradasPorCadaLinea);
 }
 
+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]){
+
+                contador++;
+
+            }
+
+            if(contador == 0){
+                lineas->push_back((*vectorLineasAux)[j]);
+            }
+            contador = 0;
+
+        }
+    }
+}
+
+
+void Menu::lineasPorParada(List<Parada*>* paradas){
+
+    paradas->startCursor();
+    while(paradas->forwardCursor()){
+
+        Parada * paradaAux = paradas->getCursorData();
+
+        std::vector<int>* vectorLineasAux = paradaAux->getLineas();
+
+        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;
+    }
+}
+
+
 void Menu::cantidadDeParadasPorLinea(){
+
+    this->lineas = NULL;
     this->barrios->startCursor();
 
-    while(this->barrios->forwardCursor()) {
-        // TODO: Falta terminar
-        // Barrio * barrioAux = this->barrios->getCursorData();
-        // List<Parada*>* listaParadas = barrioAux->getParadas();
-        break;
+    while(this->barrios->forwardCursor()){
+
+        Barrio * barrioAux = this->barrios->getCursorData();
+
+        lineasPorParada(barrioAux->getParadas());
+
     }
+
 }
 
+void Menu::removerParadaMasCercana(List<Parada*>*listaAux,Parada * paradaCercana){
+
+    listaAux->startCursor();
+    unsigned int posicion = 0;
+
+    while(listaAux->forwardCursor()){
+
+        posicion ++;
+        Parada * paradaAux = listaAux->getCursorData();
+
+        if(paradaAux == paradaCercana){
+
+            listaAux->remove(posicion);
+
+     }
+    }
+}
+
+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);
+
+    }
+
+}
+
+
+void Menu::paradasMasCercanasPorBarrio(std::string barrio,int linea,double coordX,double coordY){
+
+    this->barrios->startCursor();
+    List<Parada*>* listaAux = NULL;
+
+    while(this->barrios->forwardCursor()){
+
+        Barrio * barrioAux = this->barrios->getCursorData();
+
+        if(barrio == barrioAux->getNombre())
+
+            listaAux = barrioAux->listaDeParadasPorLinea(linea);
+
+            listaOrdenadaPorDistancia(listaAux,coordX,coordY, barrioAux);
+
+    }
+
+}
+
+
 Menu::Menu(int opcion) {
     this->opcion = opcion;
-    this->barrios = new List<Barrio*>();
+    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
-              << "5) Dado un barrio y linea de colectivo, imprimir las paradas ordenadas por distancia"<<std::endl;
+              << "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:
@@ -140,12 +253,28 @@ Menu::Menu(int opcion) {
         std::cin >> this->linea;
 
         paradasPorLinea(this->linea);
+        imprimirParadasPorLinea(this->paradasPorCadaLinea);
+
         break;
     case 4:
         cantidadDeParadasPorLinea();
+        imprimirCantidadParadasPorLinea(this->lineas);
         break;
     case 5:
-        //completar
+
+        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";
diff --git a/menu.h b/menu.h
@@ -1,6 +1,7 @@
 #ifndef MENU_H_
 #define MENU_H_
 
+#include <vector>
 #include "list.h"
 #include "barrio.h"
 #include "parada.h"
@@ -10,8 +11,9 @@ private:
     int opcion, linea;
     List<Barrio*> *barrios;
     double coordX, coordY;
-    List<Parada*> *paradasPorCadaLinea;
-    List<Parada*> *cantidadDeParadasPorCadaLinea;
+    List<Parada*> *paradasPorCadaLinea, *cantidadDeParadasPorCadaLinea, *listaDeParadasCercanas;
+    std::vector<int> *lineas;
+    std::string barrio;
 
 public:
     Menu(int opcion);
@@ -50,12 +52,40 @@ public:
      */
     void agregarElementosDeLista(List<Parada*>* listaAux,List<Parada*>* listaResultado);
     /*
-     * pre: Recibe como parametro el numero de la linea
-     * pos: Imprime por pantalla un listado de cantidad de paradas por donde pasa la linea
+     * pos: Imprime por pantalla un listado de cantidad de paradas por donde pasan todas las lineas
      */
     void cantidadDeParadasPorLinea(); //CONSIGNA 4
 
-    // HACER EL 5 (PREGUNTAR COMO HACERLO)
+    /*
+     * pos: Agrega lineas sin repetir al vector lineas
+     */
+    void agregarElementoSinRepetir(std::vector<int>* lineas, std::vector<int>* vectorLineasAux);
+
+    /*
+     * pos: Recorre una lista de paradas y accede a todas las lineas de las paradas dadas
+     */
+    void lineasPorParada(List<Parada*>* paradas);
+
+    /*
+     * pos: Imprime por pantalla la linea y la cantidad de paradas por las que pasa
+     */
+    void imprimirCantidadParadasPorLinea(std::vector<int>* lineas);
+
+    /*
+     * pre: Recibe el nombre del Barrio, la linea, y una coordenada
+     * pos: Agrega las paradas ordenadas por distancia de un barrio con respecto a una coord a la lista de paradas cercanas
+     */
+    void paradasMasCercanasPorBarrio(std::string barrio,int linea,double coordX,double coordY);
+
+    /*
+     *
+     */
+    void listaOrdenadaPorDistancia(List<Parada*>* listaAux,double coordX,double coordY, Barrio * barrioAux);
+
+    /*
+     *
+     */
+    void removerParadaMasCercana(List<Parada*>*listaAux,Parada * paradaCercana);
 };
 
 #endif