Você está na página 1de 6

Informática para as Ciências e Engenharia

2023/2024
Projeto
Prazo de entrega: 10/12/2022

Introdução
O trabalho a realizar neste projeto insere-se na temática do tráfego rodoviário. Em particular,
pretende-se analisar o tráfego rodoviário nas autoestradas e vias rápidas mais importantes
do país.

É de conhecimento público que o aumento do tráfego rodoviário é um dos problemas atuais do


nosso planeta. Está diretamente associado à poluição do ar, pois as emissões de gases de
escape de veículos contribuem para a má qualidade do ar, afetando a saúde pública e o meio
ambiente. Para além da poluição do ar, o tráfego rodoviário pode ter outros impactos ambientais,
como a fragmentação de habitats naturais devido à expansão de estradas e infraestruturas
relacionadas.

Há, portanto, uma crescente conscientização sobre a necessidade de promover formas de


transporte mais sustentáveis. Incentivar o uso de transportes públicos, bicicletas e veículos
elétricos é visto como uma maneira de reduzir a dependência do transporte individual e mitigar
os impactos negativos do tráfego rodoviário.

Trabalho
Pretende-se um programa cuja função principal que se chame main e receba um argumento,
nomeBD: uma string com o nome da base de dados SQLite3, que deve ser criada e
consultada pelo programa.

A função main deve efetuar as seguintes operações (recorrendo eventualmente a outras


funções, seguindo a lógica da decomposição de problemas em subproblemas):

1. criar as tabelas na base de dados nomeBD, caso estas não existam, e carregar os
dados que estão na pasta data.
2. ficar num ciclo, pedindo comandos ao utilizador e realizando as operações pedidas,
até que seja digitado o comando “fim”. Nesse caso, deve fechar a base de dados e
terminar.

Os detalhes da base de dados são descritos de seguida; os referentes aos comandos a


suportar serão descritos mais à frente, na secção “Interpretador de comandos”.

Base de Dados
Uma primeira análise ao problema determinou que a base de dados deve conter as seguintes
tabelas:

Estradas: tabela com informação sobre as autoestradas e vias rápidas de Portugal.


Contém os campos Id, com o identificador da estrada e Nome, com o nome da
estrada, como “A1”.

Sublancos: tabela com os sublanços (troço entre dois acessos) das estradas.
Contém os campos Id, com o identificador do sublanço; Estrada, com o identificador
da estrada; Inicio, com o nome do acesso de início do sublanço e; Fim, com o nome
do acesso de final do sublanço.

Trafego: tabela que contém o volume de tráfego rodoviário para um dado sublanço
para um dado mês de um dado ano. Contém os campos Sublanco, com o identificador
do sublanço; Ano, com o ano da medição; Mes, com o mês da medição e; Trafego,
com o número indicador do volume de tráfego.

Note que os nomes das tabelas e dos campos não têm pontuação em cedilhas.

Ficheiros com os dados iniciais


Os ficheiros com os dados iniciais encontram-se na pasta data. Estes são ficheiros em formato CSV
(Comma Separated Values), em que os valores estão separados por “;”. Por exemplo, o ficheiro
sublanços.csv contém linhas do tipo:

1;1;Sacavém;S. João da Talha

que devem ser interpretadas como: Id = 1, Estrada = 1, Início = Sacavém e Fim = S. João da Talha,
ou seja, o sublanço da autoestrada A1 entre Sacavém e S. João da Talha.

Note que cada ficheiro tem uma linha de cabeçalho que deve ser ignorada.

Plano de Desenvolvimento
Sugerimos que siga o seguinte plano de desenvolvimento e que vá testando as funções
individualmente no Mooshak. Serão disponibilizados testes no Mooshak para cada um dos passos
abaixo (mais detalhes no Piazza).

1. Tabela Estradas
Crie a tabela Estradas e carregue para a mesma os dados contidos no ficheiro estradas.csv. Tem à
sua disponibilidade no CLIP uma base de código, de nome projeto.py. Verá que essa base já contém
o código para a criação da tabela Estradas, faltando, no entanto, a parte do carregamento dos dados.
Note que os ficheiros são ficheiros de texto com a codificação UTF-8. Para garantir o suporte para
tal codificação, deverá abrir o ficheiro com a opção encoding=”utf-8”. Tem um exemplo na base de
código.

Uma vez implementado o carregamento dos dados que constam no ficheiro estradas.csv,
implemente a função
• numeroEstradas(cursor)

que recebe apenas o cursor para o acesso à base de dados e retorna o número de estradas na
tabela Estradas usando, para tal, uma query SQL. Para o ficheiro estradas.csv dado, o resultado
será 45, mas nós poderemos testar com outros ficheiros.

Testar localmente
Fazendo uso da base de código, para testar a função na consola deve, inicialmente, utilizar a
seguinte sequência de instruções:

conn = setupDB(“teste.db”)
cursor = conn.cursor()
numeroEstradas(cursor)

Se não alterar a implementação da função setupDB (nem fechar a consola), os testes subsequentes
podem ser realizados executando apenas a instrução:

numeroEstradas(cursor)

Testar no Mooshak
Quando achar que a sua solução está correta, pode submeter no Mooshak para obter o resultado
dos testes lá efetuados.
Será comunicado no Piazza quais são os exercícios Mooshak correspondentes a cada função. Para
todos os testes deverá submeter o ficheiro project.py com a sua solução.

2. Tabela Sublanços
Complete a implementação das funções que criam a tabela Sublancos e carregam para a mesma os
dados contidos no ficheiro sublancos.csv. Depois disso implemente e teste no Mooshak as seguintes
funções:

• numeroSublancosDaEstrada(cursor, estrada)

que recebe como argumento o cursor para acesso à base de dados e o nome da estrada sobre a
qual se quer obter a informação, e retorna o número de acessos existentes nessa estrada. Por
exemplo, com os ficheiros dados, o resultado da chamada numeroSublancosDaEstrada (cursor,
“A1”) será 34.

• estradasDeAcesso(cursor, acesso)

que recebe como argumento o cursor para acesso à base de dados e o nome de um acesso a uma
estrada, e retornam o nome das estradas que podem ser acedidas a partir desse acesso. Por
exemplo, com os ficheiros dados, o resultado da chamada estradasDeAcesso (cursor, “Carvalhos”)
deverá ser [‘A1’, ‘A20’].
3. Tabela Tráfego
Complete a implementação das funções que criam a tabela Trafego e carregue os dados contidos
nos ficheiros trafego2022.csv. Note que, ao contrário do que aconteceu nos ficheiros anteriores,
estes ficheiros não seguem a estrutura da tabela. Cada linha é da forma:

Sublanco;Valor para Mes1;Valor para Mes2;Valor para Mes3; …

em que os meses não têm de começar em janeiro e terminar em dezembro. Por exemplo, no ficheiro
trafego2022.csv temos valores de abril (representado pelo número 4) a dezembro (representado pelo
número 12) e no ficheiro trafego2023.csv, de janeiro a junho. Focando nas três primeiras linhas do
ficheiro trafego2022.csv, temos o conteúdo:

Sublanco;4;5;6;7;8;9;10;11;12
1;96533;99751;97402;101044;100361;101690;97658;96961;96114
2;88788;91561;89627;93189;93275;93510;89592;88772;88287

que requer a inserção de vários registos na tabela Trafego, nomeadamente:

(1, 2022, 4, 96533) (2, 2022, 4, 88788)


(1, 2022, 5, 99751) (2, 2022, 5, 91561)
(1, 2022, 6, 97402) (2, 2022, 6, 89627)
(1, 2022, 7, 101044) (2, 2022, 7, 93189)
(1, 2022, 8, 100361) (2, 2022, 8, 93275)
(1, 2022, 9, 101690) (2, 2022, 9, 93510)
(1, 2022, 10, 97658) (2, 2022, 10, 89592)
(1, 2022, 11, 96961) (2, 2022, 11, 88772)
(1, 2022, 12, 96114) (2, 2022, 12, 88287)

Note que pode haver meses para os quais não há registo de volume para um dado sublanço. O valor
definido no ficheiro para esses casos é 0. Assim sendo, se na segunda linha do ficheiro
trafego2022.csv tivéssemos os dados:

1;96533;99751;97402;101044;100361;101690;97658;0;0

Os registos para os meses novembro e dezembro não deveriam ser inseridos na base de dados.

Naturalmente, a sua solução deve funcionar para ficheiros diferentes. Para além do ficheiro
trafego2022.csv, poderá testar com o ficheiro trafego2023.csv.

Uma vez concluído o processo de carregamento, deverá implementar as seguintes funções:

• trafegoAcesso(cursor, nome_acesso, ano, mês)

que retorna o tráfego rodoviário para todos os sublanços que têm início ou fim no dado acesso, num
dado mês de um dado ano. Exemplo: trafegoAcesso (“Carvalhos”, 2022, 4) deveré retornar
[('Feiteira', 'Carvalhos', 71165), ('Carvalhos', 'Jaca', 42700), ('A1/IC2', 'Carvalhos', 36151),
('Carvalhos', 'A20/A32', 36151)]

• trafegoMaxEstrada(nome_estrada)
que retorna um tuplo com os acessos de início e fim do sublanço com mais tráfego, o volume de
tráfego e o mês o e ano em tal tráfego aconteceu. Exemplo: trafegoMaxEstrada(“A2”) deve retornar
('Ponte 25 de Abril', 'Ponte 25 de Abril', 158697, 7, 2022)

• trafegoTotalEstrada(nome_estrada, ano, mês)

que retorna o tráfego rodoviário total anual para uma dada estrada, definida pelo seu nome, um dado
ano. Exemplo: trafegoTotalEstrada(cursor, "A2", 2022) deve retornar 4700218

• trafegoMedioSublanco(nome_acesso_inicio, nome_acesso_fim, ano)

que retorna o tráfego médio rodoviário anual (arredondado às unidades) para um dado sublanço,
definido pelos acessos de início e fim, e um dado ano. Exemplo: trafegoMedioSublanco(“Sacavém”,
“S. João da Talha”, 2022) deve retornar 98613. Será valorizado o suporte para a comutatividade dos
nomes dos acessos, ou seja: trafegoMedioSublanco(“S. João da Talha”, “Sacavém”, 2022) também
deverá retornar 98613.

Interpretador de comandos
Para terminar, deve completar a implementação de um pequeno interpretador de comandos. A base
de código exemplifica o procedimento com o tratamento do comando acesso. Para uma melhore
compreensão dos conceitos, o tópico também será abordado nas aulas teóricas.

Para além do comando fim referido no início deste documento, o programa deve reconhecer a
seguinte lista de comandos:

• acesso nome_acesso ano mês: que deverá chamar a função trafegoAcesso passando o
cursor para a base de dados e os valores digitados. A interpretação deste comando está
implementada na base de código.

• est max nome_estrada: que deverá chamar a função trafegoMaxEstrada passando o cursor
para a base de dados e os valores digitados.

• est total nome_estrada ano mês: que deverá chamar a função trafegoTotalEstrada
passando o cursor para a base de dados e os valores digitados.

• sub med nome nome_acesso_inicio, nome_acesso_fim, ano: que deverá chamar a função
trafegoMedioEstrada passando o cursor para a base de dados e os valores digitados.

Entrega do Trabalho
Garanta que no início do programa (o ficheiro .py que entrega) tem num comentário os
números e nomes dos alunos do grupo.
O trabalho tem de ser entregue até às 23h59 do dia 10 de dezembro de 2023 (no site
http://miup-pub.pub.di.fct.unl.pt/~mooshak (como o mini-projecto); instruções seguirão em
breve.

5 Critérios de Avaliação
De acordo com o Regulamento de Avaliação de Conhecimentos da FCT/UNL, os estudantes
diretamente envolvidos numa fraude são liminarmente reprovados na disciplina. Em ICE,
considera-se que um aluno que dá ou que recebe código num trabalho comete fraude.
Igualmente, sendo o trabalho para realizarem grupos de um ou de dois alunos, considera-
se que as situações em que os alunos realizam o trabalho em grupos maiores, partilhando
o código, são situações de fraude equivalentes a dar e receber o código entre os vários
grupos. Os alunos que cometerem fraude num trabalho não obterão frequência.

Os trabalhos serão avaliados de acordo com os seguintes critérios.

● Utilização correta dos elementos básicos da linguagem Python e regras de boa


programação dadas nas aulas. Não utilizar módulos que não foram dados nas
aulas.
● Decomposição adequada do problema em subproblemas.
● Código legível (nomes, indentação, etc.) e comentado.
● Obtenção dos resultados corretos.
● Implementação genérica. O programa deve ser capaz de processar diferentes
ficheiros de dados (por exemplo de outras cidades) e sequências de comandos
variadas.
● Para as funções pedidas no enunciado, deve respeitar os nomes e argumentos para
que possam ser chamadas (utilizadas) pelo docente tal e qual como indicadas nos
exemplos.

A nota do trabalho será um número entre zero e vinte. Portanto, se o programa for
decomposto em funções, a incorreção de uma função não deve impedir a programação das
outras. Também, mesmo que não consiga implementar todos os comandos, é preferível ser
capaz de efetuar alguns corretamente do que tentar fazer todos, mas nenhum funcionar.

Você também pode gostar