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:
| M | barrio.cpp | | | 76 | ++++++++++++++++++++++++++++++---------------------------------------------- |
| M | barrio.h | | | 57 | ++++++++++++++++++++++++++++++++------------------------- |
| M | list.h | | | 50 | ++++++++++++++++++++++++++++++++++++++++++++++++-- |
| A | menu.cpp | | | 286 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| A | menu.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