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:
| M | barrio.cpp | | | 27 | ++++++++++----------------- |
| M | barrio.h | | | 2 | +- |
| M | list.h | | | 45 | +++++++++++++++++++++++++++++++++++++++++++++ |
| M | menu.cpp | | | 153 | ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------- |
| M | menu.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