4646T-2 - Programação de Baixo Nível
Prof. Márcio Sarroglia Pinho

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:



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.