Porto Alegre é demais!!!
Descrição
Porto Alegre disponibiliza um conjunto de dados sobre os mais
diversos serviços disponíveis aos cidadãos. Um destes conjuntos de dados trata
sobre o transporte público, reportando por exemplo as linhas de ônibus e
lotação que atendem a população, onde ficam as paradas de ônibus no município e
onde se encontram as estações de bicicleta.
O objetivo deste trabalho é criar um
conjunto de classes que devem relacionar quais ônibus passam em quais paradas,
e quais estações de bicicleta são mais próximas de uma ou outra parada.
O
programa deve apresenta um menu, detalhado no código exemplo a presentado a seguir, no qual o usuário
poderá capturar diferentes informações.
Toda consulta ao menu deve gerar um
arquivo específico para a opção escolhida.
Requisitos da Implementação
A implementação, deverá respeitar os seguintes aspectos:
- O programa deve
rodar com arquivos editados no LINUX;
- A
estrutura que armazena as paradas e os veículos devem ser uma lista de
objetos. Esta lista pode ser implementada de fato como uma lista encadeada ou
apenas como um vetor com referências para os objetos da respectiva classe;
- Não devem ser
usadas variáveis globai
Classes
Obrigatórias
O programa deve
conter obrigatoriamente as classes apresentadas a seguir.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 | #include <iostream> using namespace std;
class Parada; // "Forward Reference" para Paradas // Resolve a questão de referência cruzada // entre as classes Parada e Veiculo
// ************* // Classe que armazena os dados de UM veículo // ************* class Veiculo { int ID; string nome; string linha; char tipo; // L=lotação ou O=ônibus
Parada* listaParadasPorOndePassa[100]; // Vetor com ponteiros para as Paradas por onde // o veículo passa. // Este vetor deve ser organizado a fim de // representar a ordem em que se dá o // deslocamento do veículo
//Veiculo* prox; // Este atributo deve ser usado somente se for implementada // uma lista ENCADEADA de veículos //Parada *listaParadas; // Este atributo deve ser usado somente se for // implementada uma lista ENCADEADA de Paradas public: // Construtores ...... // Sugestão: os construtores devem inicializar a lista de paradas com NULL // sets e gets para todos os atributos
void RegistraParadaNoVeiculo(Parada *p); }; // ************* // Classe que armazena os dados de UMA parada // ************* class Parada { int ID; float latitude; float longitude; //Parada* prox; // Este atributo deve ser usado somente se for implementada // uma lista ENCADEADA de paradas Veiculo* listaVeiculoQuePassamPoAqui[100]; //Vetor com ponteiros para os veículos que passam nesta Parada.
public: // Construtores ...... // sets e gets para todos os atributos
void RegistraVeiculoNaParada(Veiculo *v); };
// ************* // Classe que armazena os dados de UMA estação de icicleta // ************* class EstacaoDeBike { int ID; string nome; float latitude; float longitude; //EstacaoDeBike* prox; // Este atributo deve ser usado somente se for //implementada uma lista ENCADEADA de estações public: // Construtores
// sets e gets para todos os atributos };
// ************* // Classe que armazena o conjunto de Veiculos da cidade // ************* class listaDeVeiculos { Veiculo* transporte; // Vetor com objetos da classe Veículo. Este votor deve // ser alocado dinamicamente. // Este vetor pode ser substituído por uma lista // encadeada. public: // Construtores ...... // sets e gets para todos os atributos void carregaVeiculos (const char *nomeArquivo); void ListaLinhasDeOnibus(); void ListaParadasDaLinha(string linha);
};
// ************* // Classe que armazena o conjunto de Paradas da cidade // ************* class listaDeParadas { Parada* locais;// Vetor com objetos da classe Parada. Este vetor deve // ser alocado dinamicamente. // Este vetor pode ser substituído por uma lista // encadeada. public: // Construtores ......
// métodos para manipulação void carregaParadas(const char *nomeArquivo); void vinculaVeiculos(const char *nomeArquivo); // Apresenta as paradas ordenadas pela quantidade de ônibus void ImprimeUsoDasParadas();
}; // ************* // Classe que armazena o conjunto de Estacoes de Bicicleta da cidade // ************* class listaDeEstacoesDeBike { EstacaoDeBike *locais; // Vetor com objetos da classe EstacaoDeBike. // Este vetor deve ser alocado dinamicamente. // Este vetor pode ser substituído por uma lista // encadeada. public: void InsereEstacao(EstacaoDeBike V); void carregaEstacoes(const char *nomeArquivo); void ListaParadasProximasDaEstacao(string estacao); void ListaEstacoesDeBike(); };
|
Programa Exemplo
O programa principal deve ter, pelo menos, a estrutura apresentada a seguir.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | include "ListaVeiculo.h" #include "ListaParada.h" #include "ListaEstacao.h"
int main() {
listaDeVeiculos transportePublico; // objeto que gerencia a lista de veículos listaDeParadas todasAsParadas; // objeto que gerencia a lista de paradas listaDeEstacoesDeBike bikePoa; // objeto que gerencia a lista de estacoes de bicicleta
// método que deve criar uma lista com todas linhas de veiculos transportePublico.carregaVeiculos("linhas.csv"); // método que deve criar uma lista com todas paradas todasAsParadas.carregaParadas("paradas.csv"); // método que deve vincular às paradas a lista de ônibus que passa na parada todasAsParadas.vinculaVeiculos("paradalinha.csv"); // método que deve criar a lista de estacoes de bicicleta em poa bikePoa.carregaEstacoes("estacoes-bikepoa.csv");
int opcao; do { cout << "Escolha uma opção" << endl; cout << " 1. Listar as linhas de ônibus" << endl; cout << " 2. Listar as paradas de ônibus de uma linha específica" << endl; cout << " 3. Listar as paradas pelas quais circulam mais linhas de ônibus" << endl; cout << " 4. Listar as estações de bicicleta" << endl; cout << " 5. Listar a parada mais próxima de uma dada estação de bicicleta e as linhas de que passam por ali" << endl; cout << " 0. FINALIZAR" << endl;
string linha, estacao; cin >> opcao; switch(opcao) { case 1: // Lista as linhas de ônibus transportePublico.ListaLinhasDeOnibus(); break; case 2: // Lista as paradas de ônibus de uma linha específica cout << "Informe a linha: " << endl; cin >> linha; transportePublico.ListaParadasDaLinha(linha); break; case 3: // Apresenta as paradas ordenadas pelo uso todasAsParadas.ImprimeUsoDasParadas(); break; case 4: // Lista as estações de bicicleta bikePoa.ListaEstacoesDeBike(); break; case 5: cout << "Informe a estacao de bicicleta: " << endl; cin >> estacao; bikePoa.ListaParadasProximasDaEstacao(estacao); break; case 0: return 0; default: cout << "OPÇÃO INVALIDA. ESCOLHA NOVAMENTE" << endl; } return 0; } while(opcao == 0); }
|
Dados
Os arquivos
a serem utilizados estão disponíveis no site do data poa
em:
Caso estes links deixem de
funcionar, consulte o endereço http://datapoa.com.br/dataset?res_format=CSV&organization=eptc
e capture os arquivos nas categorias PoaTransporte e BikePOA.
Todos arquivos possuem um
formato conhecido como CSV (comma separated
values), onde cada dado é separado por um ponto e
vírgula (;).
Todos arquivos listados
acima possuem um cabeçalho detalhando a informação associada a cada campo.
Os dados de latitude e
longitude são informados em ponto flutuante (float).
Latitude negativa representa Sul, enquanto latitude positiva representa norte.
Longitude negativa representa Oeste enquanto longitude positiva representa
Leste.
Para o cálculo da distância
entre duas coordenadas definidas pelos seus pares latitude e longitude, explore
a solução definida em http://www.ehow.com.br/calcular-distancia-entre-pontos-latitude-longitude-como_71372/ .
Entrega e Apresentação
O trabalho,
que poderá ser desenvolvido em duplas, deverá ser entregue na data prevista na
agenda da disciplina para o TP1, durante o horário da aula.
O trabalho será apresentado NA SALA DE AULA.
Todos os trabalhos já devem ter sido enviados pelo Moodle
antes do horário da aula. A entrega no Moodle deverá
ser feita através da submissão de um arquivo .zip (não RAR, nem 7z ou qualquer
outro formato), contendo o projeto completo do programa. O programa deverá ser
nomeado da seguinte forma: nome_sobrenome.cpp. No caso de uma dupla, usar a
forma: nome1sobrenome1_nome2sobrenome2.zip.
O programa deverá ser executado no sistema operacional Linux. Não serão aceitos
trabalhos que não compilem corretamente no g++, sob hipótese nenhuma.
Durante a apresentação, todos os alunos devem estar presentes e aptos a
responder quaisquer perguntas. Respostas insatisfatórias ou a ausência do aluno
acarretarão em anulação da nota final.
Todos
os trabalhos deverão ser entregues até o dia da apresentação, e apresentados na
data marcada - não serão aceitos trabalhos fora do prazo.
Trabalhos copiados resultarão em nota zero para todos os alunos envolvidos.