CB100

Notas, resueltos y tps de la materia Algoritmos y Estructuras de Datos
Index Commits Files Refs README
commit 7af99bd0df302a2add00e1f368e370c46dd2ebc0
parent 320970e6b4d47683c189b7d176e4e9418613caac
Author: Ignacio Cettour <129465157+IgnacioCettour@users.noreply.github.com>
Date:   Thu, 20 Jun 2024 20:01:32 -0300

agregamos cambios berracos

terminamos el 4 y 5 creo falta poco
Diffstat:
Mbarrio.cpp | 76++++++++++++++++++++++++++++++----------------------------------------------
Mbarrio.h | 57++++++++++++++++++++++++++++++++-------------------------
Mlist.h | 50++++++++++++++++++++++++++++++++++++++++++++++++--
Amenu.cpp | 286+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amenu.h | 94+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
5 files changed, 490 insertions(+), 73 deletions(-)
diff --git a/barrio.cpp b/barrio.cpp
@@ -1,10 +1,14 @@
 #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;
-    this->paradas = new List<Parada*>(); // crea la lista para las paradas
+    this->paradas = new List<Parada*>; // crea la lista para las paradas
 }
 
 int Barrio::getComuna() {
@@ -27,101 +31,81 @@ void Barrio::addParada(std::string calle,
     this->paradas->insert(new Parada(calle, alturaPlano, direccion, coordX, coordY));
 }
 
-int Barrio::getSizeListaDeParadas(){  // CONSIGNA 1
-
+int Barrio::getSizeListaDeParadas() {  // CONSIGNA 1
     return this->paradas->getSize();
 }
 
 double Barrio::getDistancia(double x1,double y1,double x2,double y2){ //CONSIGAN 2
-
     double dX = (x2 - x1);
     double dY = (y2 - y1);
 
     return std::sqrt(dX*dX + dY*dY);
-
 }
 
+Parada *Barrio::paradaMasCercana(double coordX, double coordY,List<Parada*>* paradasAux) { //CONSIGNA 2
 
-Parada * Barrio::paradaMasCercana(double coordX, double coordY){ //CONSIGNA 2
-
-    this->paradas->startCursor();
+    paradasAux->startCursor();
     Parada * resultado = NULL;
     double distancia;
     double distanciaMinima;
 
-    while(this->paradas->forwardCursor()){
+    while(paradasAux->forwardCursor()){
+        Parada *aux = paradasAux->getCursorData();
 
-        Parada * aux = this->paradas->getCursorData();
-
-        if(resultado == NULL){
+        if(resultado == NULL) {
             resultado = aux;
             distanciaMinima = getDistancia(coordX,coordY,aux->getCoordX(),aux->getCoordY());
         }
         else {
-
             distancia = getDistancia(coordX,coordY,aux->getCoordX(),aux->getCoordY());
 
-            if(distancia < distanciaMinima){
-
+            if(distancia < distanciaMinima) {
                 resultado = aux;
                 distanciaMinima = distancia;
             }
-
         }
-
     }
-    return resultado;
 
+    return resultado;
 }
 
-bool Barrio::lineaEnParada(int linea,List<Linea*>* listaDeLineas ){ //CONSIGNA 3
-
-    listaDeLineas->startCursor();
-
-    while(listaDeLineas->forwardCursor()){
-
-        Linea * lineaActual = listaDeLineas->getCursorData();
-
-        if(lineaActual->getNumero() == linea){
+bool Barrio::lineaEnParada(int linea, std::vector<int> *listaDeLineas ) { //CONSIGNA 3
+    for(size_t i = 0; i < listaDeLineas->size(); ++i) {
+        if((*listaDeLineas)[i] == linea) {
             return true;
         }
     }
+
     return false;
 }
 
-List<Parada*>* Barrio::listaDeParadasPorLinea(int linea){ //CONSIGNA 3
+List<Parada*> *Barrio::listaDeParadasPorLinea(int linea) { //CONSIGNA 3
+    Parada *paradaActual;
+    List<Parada*> *resultado;
+    std::vector<int> *listaDeLineas;
 
-    List<Parada*>* resultado = NULL;
+    resultado = new List<Parada*>;
 
     this->paradas->startCursor();
-
     while(this->paradas->forwardCursor()){
+        paradaActual = this->paradas->getCursorData();
 
-        Parada * paradaActual = this->paradas->getCursorData();
-
-        List<Linea*>* listaDeLineas = paradaActual->getLineas();
-
-        if(lineaEnParada(linea, listaDeLineas)){
+        listaDeLineas = paradaActual->getLineas();
 
+        if(lineaEnParada(linea, listaDeLineas)) {
             resultado->insert(paradaActual);
         }
-
-
     }
 
-    return resultado;
+    return resultado->getSize() == 0 ? NULL : resultado;
 }
 
-unsigned int Barrio::getCantidadDeParadasPorLinea(int linea){ //CONSIGNA 4
+unsigned int Barrio::getCantidadDeParadasPorLinea(int linea) { //CONSIGNA 4
+    List<Parada*> *resultado = listaDeParadasPorLinea(linea);
 
-    List<Parada*>* auxiliar = listaDeParadasPorLinea(linea);
-    return auxiliar->getSize();
+    return resultado == NULL ? 0 : resultado->getSize();
 }
 
-
-
-
 Barrio::~Barrio() {
-    delete paradas;
+    delete this->paradas;
 }
-
diff --git a/barrio.h b/barrio.h
@@ -2,6 +2,7 @@
 #define BARRIO_H_
 
 #include <string>
+#include <vector>
 
 #include "list.h"
 #include "parada.h"
@@ -12,70 +13,76 @@ private:
     int comuna;
     List<Parada*> *paradas;
 
-
 public:
-
-        /*
-     * pos: Devuelve la distancia entre la coordenadas dadas
-     */
-    double getDistancia(double x1,double y1,double x2,double y2);
     /*
-     * pos: Devuelve True si la linea se encuentra en listaDeLineas, sino devuelve False
+     *pos: deja creado la clase con los parametros dados
      */
-    bool lineaEnParada(int linea,List<Linea*>* listaDeLineas );
+    Barrio();
 
     /*
-     *pos: Deja creado la clase con los parametros dados
+     *pos: deja creado la clase con los parametros dados
      */
     Barrio(std::string nombre, int comuna);
 
     /*
-     * pos: Vacia y elimina el Barrio
+     * pos: libera la memoria
      */
     virtual ~Barrio();
+
     /*
-     * pos: Devuelve el numero de comuna del Barrio
+     * pos: devuelve la distancia entre la coordenadas dadas
+     */
+    double getDistancia(double x1, double y1, double x2, double y2);
+
+    /*
+     * pre: `listaDeLineas` es un vector no nulo
+     * pos: devuelve `true` si la linea se encuentra en listaDeLineas, sino devuelve False
+     */
+    bool lineaEnParada(int linea, std::vector<int> *listaDeLineas);
+
+    /*
+     * pos: devuelve el numero de comuna del Barrio
      */
     int getComuna();
 
     /*
-     * pos: Devuelve el nombre del Barrio
+     * pos: devuelve el nombre del Barrio
      */
     std::string getNombre();
 
     /*
-     * pos: Devuelve una lista con todos las paradas de ese Barrio
+     * pos: devuelve una lista con todos las paradas de ese Barrio
      */
     List<Parada*> *getParadas();
 
     /*
-     * pos: Agrega una para nueva
+     * pos: agrega una para nueva
      */
-    void addParada(std::string calle, int alturaPlano, std::string direccion, double coordX, double coordY);
+    void addParada(std::string calle, int alturaPlano, std::string direccion,
+            double coordX, double coordY);
 
     /*
-     * pos: Devuelve el numero total de paradas que hay en el barrio
+     * pos: devuelve el numero total de paradas que hay en el barrio
      */
     int getSizeListaDeParadas(); //CONSIGNA 1
 
     /*
-     * pre:
-     * pos: Devuelve la parada mas cercana a una coordenada dada
+     * 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
-     * pos: Devuelve una lista con todas las paradas del numero dado
+     * pre: recibe el numero de una Linea
+     * pos: devuelve una lista con todas las paradas del numero dado en caso de
+     *      que la linea no posea paradas devuelve NULL
      */
-    List<Parada*>* listaDeParadasPorLinea(int linea);
+    List<Parada*> *listaDeParadasPorLinea(int linea);
 
     /*
-     * pre: Recibe el numero de una linea
-     * pos:    Devuelve la cantidad de paradas por linea
+     * pre: recibe el numero de una linea
+     * pos: devuelve la cantidad de paradas por linea
      */
     unsigned int getCantidadDeParadasPorLinea(int linea);
-
 };
 
 #endif /* BARRIO_H_ */
diff --git a/list.h b/list.h
@@ -42,8 +42,9 @@ public:
     void startCursor();
 
     /* pre: el cursor ha sido inicializado
-     * pos: avanza el cursor al siguiente elemento de la lista, devuelviendo 
-     *       falso si no quedan nodos por recorrer
+     * pos: avanza el cursor al siguiente elemento de la lista, devuelviendo
+     *      falso si no quedan nodos por recorrer
+     *      recorre la lista en desde el ultimo ingresado al primero
      */
     bool forwardCursor();
 
@@ -60,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>
@@ -118,4 +132,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
@@ -0,0 +1,286 @@
+#include "menu.h"
+
+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
+                  << " es: "
+                  << barrioAux->getSizeListaDeParadas()
+                  << std::endl;
+        }
+    }
+
+void Menu::paradaMasCercanaPorCoordenada(double coordX,double coordY){
+    double distanciaMinima;
+    double distancia;
+
+    Parada *paradaResultado = NULL;
+    Parada *paradaActual = NULL;
+
+    this->barrios->startCursor();
+    while(this->barrios->forwardCursor()) {
+        Barrio *barrioAux = this->barrios->getCursorData();
+
+        if(paradaResultado == NULL) {
+            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());
+
+            if(distanciaMinima > distancia) {
+                distanciaMinima = distancia;
+                paradaResultado = paradaActual;
+            }
+        }
+    }
+
+    std::cout<< "La parada mas cercana esta en: "
+             << paradaResultado->getDireccion()
+             << std::endl
+             << "en la coordenada X: "
+             << paradaResultado->getCoordX()
+             << std::endl
+             << "en la coordenada Y:"
+             << paradaResultado->getCoordY()
+             << std::endl;
+}
+
+void Menu::agregarElementosDeLista(List<Parada*>* listaAux,List<Parada*>* listaResultado) {
+    listaAux->startCursor();
+
+    while(listaAux->forwardCursor()) {
+        Parada *paradaAux = listaAux->getCursorData();
+
+        listaResultado->insert(paradaAux);
+    }
+}
+
+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";
+    }
+
+    listaDeParadas->startCursor();
+        while(listaDeParadas->forwardCursor()){
+            Parada *paradaAux = listaDeParadas->getCursorData();
+
+            std::cout << "La parada esta en: "
+                      << paradaAux->getDireccion()
+                      << std::endl
+                      << "en la coordenada X: "
+                      << paradaAux->getCoordX()
+                      << std::endl
+                      << "en la coordenada Y:"
+                      << paradaAux->getCoordY()
+                      << std::endl;
+        }
+}
+
+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*>();
+
+    this->barrios->startCursor();
+    while(this->barrios->forwardCursor()){
+        Barrio *barrioAux = this->barrios->getCursorData();
+
+        listaAux = barrioAux->listaDeParadasPorLinea(linea);
+        agregarElementosDeLista(listaAux, 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()){
+
+        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->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;
+    }
+}
+
+Menu::~Menu() { }
diff --git a/menu.h b/menu.h
@@ -0,0 +1,94 @@
+#ifndef MENU_H_
+#define MENU_H_
+
+#include <vector>
+#include "list.h"
+#include "barrio.h"
+#include "parada.h"
+
+class Menu {
+private:
+    int opcion, linea;
+    List<Barrio*> *barrios;
+    double coordX, coordY;
+    List<Parada*> *paradasPorCadaLinea, *cantidadDeParadasPorCadaLinea, *listaDeParadasCercanas;
+    std::vector<int> *lineas;
+    std::string barrio;
+
+
+
+public:
+    Menu(int opcion);
+
+    /*
+     * pos: Libera la memoria
+     */
+    virtual ~Menu();
+
+    /*
+     * pos: Recorre la lista de barrios e imprime la cantidad de paradas de cada barrio
+     */
+    void cantidadDeParadasPorBarrio(); // CONSIGA 1
+
+    /*
+     * 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
+
+    /*
+     * pre: Recibe como parametro el numero de la linea
+     * pos: Imprime por pantalla un listado de paradas por donde pasa la linea
+     */
+    void paradasPorLinea(int linea); //CONSIGNA 3
+
+    /*
+     * pre: Recibe una lista de tipo parada
+     * pos: Imprime por pantalla la parada con su direcion y sus coordenadas en X e Y
+     */
+    void imprimirParadasPorLinea(List<Parada*>* listaDeParadas);
+
+    /*
+     * pre: Recibe como parametros dos listas
+     * pos: Agrega los elementos de la lista aux a la lista resultado
+     */
+    void agregarElementosDeLista(List<Parada*>* listaAux,List<Parada*>* listaResultado);
+    /*
+     * pos: Imprime por pantalla un listado de cantidad de paradas por donde pasan todas las lineas
+     */
+    void cantidadDeParadasPorLinea(); //CONSIGNA 4
+
+    /*
+     * 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