Trabalho Prático para Melhoria
Paradigmas de Programação II (PPII2006)
e
Programação Imperativa (PI2006)
Historial:
[Ano lectivo: 2004/2005 (rev.)]
[2006-03-14]
Este documento descreve o único tema disponível para a realização do trabalho prático que os alunos a fazer melhoria às disciplinas
em epígrafe poderão realizar como forma de obter uma avaliação global à disciplina.
Os assuntos referentes à organização do trabalho e à realização, entrega e avaliação do projecto, são descritos em documento próprio.
|
Índice
- Objectivos de formação e resultados de aprendizagem
- Tema: Processamento de Texto e Imagem
- Formato de Imagem PNM
- PBM: Portable BitMap Format
- PGM: Portable GrayMap Format
- PPM: Portable PixMap Format
- Leitura e Escrita de imagens PNM
- Processamento de Texto e Imagem
- Pautas musicais
- Músicas populares
Objectivos de formação e resultados de aprendizagem
Este projecto tem como objectivos principais a formação genérica e específica de estudantes em fundamentos de computação na
área da programação imperativa.
Os objectivos de formação genérica incluem: (i) a pesquisa, análise e selecção de informação, (ii) o treino na resolução de
problemas, (iii) o desenvolvimento da capacidade de análise, e (iv) o desenvolvimento da capacidade de comunicação escrita
e oral.
Os objectivos de formação específica incluem: (i) a análise da especificação e do problema, (ii) o desenvolvimento de algoritmos
e consequente programação numa linguagem imperativa, (iii) a execução e realização de testes de conformidade.
A avaliação dos resultados esperados de aprendizagem irão verificar se as/os estudantes conseguem demonstrar ter adquirido
o seguinte conjunto de competências genéricas e específicas:
- competências genéricas
- a capacidade de comunicação escrita e oral na apresentação e discussão dos processos usados e resultados obtidos;
- a capacidade de utilização de utilitários genéricos de informática em ambiente Linux e de elaboração de documentos anotados
- competências específicas de Programação Imperativa
- a capacidade de desenvolver algoritmos para resolver problemas, de forma criativa, criteriosa e crítica, e inserida/o num
grupo de trabalho
- o conhecimento e a capacidade de codificar algoritmos e estruturas de dados segundo os princípios da programação estruturada
- a capacidade e aptidões práticas para gerar, executar e testar programas codificados em C, usando um conjunto adequado de
utilitários (GNU)
- o conhecimento e as aptidões de desenvolver e aplicar testes de conformidade e de analisar situações de fronteira na execução
de programas
- capacidade e aptidões na produção de documentação adequada à manutenção por terceiros dos programas desenvolvidos
Tema: Processamento de Texto e Imagem
O tema escolhido para este projecto foi o processamento de texto e imagem.
No contexto deste projecto, a aplicação irá gerar imagens no formato PNM (Portable aNyMap) que se descreve na secção seguinte.
Formato de Imagem PNM
O PNM é um formato de imagem muito simples, fácil de ler a partir de um ficheiro e também fácil de escrever para um ficheiro.
Actualmente uma imagem PNM pode pertencer a uma de três famílias, abaixo explicadas: PBM, PGM e PPM. Cada família tem duas
representações: uma textual e uma compactada.
Embora não seja um requisito da especificação PNM, existe a convenção de que a imagem deve ser armazenada de cima para baixo
e da esquerda para a direita. Cada pixel da imagem é armazenado num byte, valor 0 = preto, valor 255 = branco. Os componentes
de cor são armazenados na ordem habitual RGB ("red", "green" and "blue"), um valor para o nível de vermelho, um valor para
o nível de verde e um valor para o nível de azul.
PBM: Portable BitMap Format
Esta família corresponde a imagens contendo apenas duas cores, branco (1) e preto (0), normalmente designadas por bitmaps.
A sua forma textual pode ser descrita da seguinte maneira:
- qualquer linha iniciada pelo carácter # é um comentário; os comentários só poem aparecer nas linhas do cabeçalho, ou seja,
antes dos valores dos pontos da imagem.
- a primeira linha contem o identificador do tipo da imagem: P1
- a segunda linha contem um par de valores que definem respectivamente o decimal correspondente ao número de colunas (largura
da imagem em pixeis), por exemplo: 9, e o decimal correspondente ao número de linhas (altura da imagem em pixeis), por exemplo:
7
- as linhas restantes contêm uma lista de valores decimais, em que cada valor corresponde a um pixel da imagem e estão organizadas
de acordo com os valores definidos nas linhas anteriores. Com os exemplos dados nos itens anteriores teríamos 7 linhas cada
uma com 9 valores separados por espaço (cada valor corresponde a um byte, 0-255, que no caso das imagens do tipo P1 apenas
assume valores no intervalo [0,1])
Um exemplo de uma imagem neste formato poderia ser:
P1
# PBM example
9 7
0 0 0 0 0 0 0 0 0
0 1 1 1 1 0 0 1 0
0 1 0 0 1 0 0 1 0
0 1 1 1 1 0 0 1 0
0 1 0 0 0 0 0 1 0
0 1 0 0 0 0 0 1 0
0 0 0 0 0 0 0 0 0
Se analisar um pouco a imagem que esta representa um banner com fundo preto e letras a branco. Neste caso, a imagem contem
a string "PI". Note também que, para este caso do banner, a primeira linha, a última linha, a primeira e última colunas são
pretas e que entre duas letras há duas colunas pretas de separação.
A sua forma compactada resulta da constatação de que um byte é uma sequência de 8 0's e 1's. Assim, um byte pode guardar 8
pixeis da imagem. A única alteração ao formato é o identificador que passa a: P4.
A seguir apresenta-se o exemplo anterior agora compactado:
P4
# PBM example
9 7
0 0
121 0
73 0
121 0
65 0
65 0
0 0
Note que, apenas para efeitos de visualização, introduziram-se espaços entre os valores da forma compactada. Nas formas compactadas
PNM, não há espaços de separação entre os valores. A informação é guardada em ficheiro em bytes sequenciais.
PGM: Portable GrayMap Format
Esta família corresponde a imagens definidas com vários níveis de cinzento.
A sua forma textual pode ser descrita da seguinte maneira:
- qualquer linha iniciada pelo carácter # corresponde a um comentário e deverá ser ignorada.
- a primeira linha contem o identificador do tipo da imagem: P2
- a segunda linha contem um par de valores que definem respectivamente o decimal correspondente ao número de colunas (largura
da imagem em pixeis), por exemplo: 9, e o decimal correspondente ao número de linhas (altura da imagem em pixeis), por exemplo:
7
- a terceira linha contem o maior valor decimal que é possível encontrar para a definição de um pixel: [0,65536] (2 elevado
a 16), vamos designá-lo por MAX. Normalmente, tenta-se que o intervalo seja [0,255] pois apenas nesta situação se pode falar
em compactação e no formato P5. Se MAX estiver no intervalo [0,255] é utilizado apenas um byte por cada pixel da imagem. Caso contrário, MAX esteja no intervalo [256,65535], são utilizados dois bytes por cada pixel da imagem; o byte mais significativo aparece primeiro.
- as linhas restantes contêm uma lista de valores decimais, em que cada valor corresponde a um pixel da imagem e estão organizadas
de acordo com os valores definidos nas linhas anteriores. Com os exemplos dados nos itens anteriores teríamos 7 linhas cada
uma com 9 valores separados por espaço (cada valor corresponde a um pixel: 0-MAX).
- cada linha não deverá ter mais de 70 valores.
- o valor 0 corresponde à cor preta e o valor MAX corresponde à cor branca.
Um exemplo de uma imagem neste formato poderia ser:
P2
# PBM example
9 7
15
0 0 0 0 0 0 0 0 0
0 15 15 15 15 0 0 12 0
0 15 0 0 15 0 0 12 0
0 15 15 15 15 0 0 12 0
0 15 0 0 0 0 0 12 0
0 15 0 0 0 0 0 12 0
0 0 0 0 0 0 0 0 0
Se analisar um pouco a imagem que esta representa um banner com fundo preto e letras a branco. Neste caso, a imagem contém a string "PI". Note também que, para este caso do banner, a primeira linha, a última linha, a primeira e última colunas são pretas e que entre duas letras há duas colunas pretas
de separação.
A sua forma compactada resulta da eliminação dos espaços nas linhas da imagem e apenas para o caso em que MAX está no intervalo
[0,255]. A única alteração ao formato é o identificador que passa a: P5.
PPM: Portable PixMap Format
Esta secção ficará em branco. Espera-se que os alunos "investiguem" e que a preencham um pouco à semelhança das outras.
Nas secções seguintes descrevem-se as componentes do projecto e referem-se os requisitos que deverão ser implementados.
Leitura e Escrita de imagens PNM
Nesta fase, pretende-se que as/os estudantes executem as seguintes tarefas:
- desenvolver um conjunto de algoritmos elementares para ler e escrever imagens PNM; mais concretamente, seguindo a descrição
feita na secção anterior pretende-se ler imagens do tipo P1, P2, P3, P4, P5 e P6 e escrever a imagem lida em qualquer um dos
6 formatos;
- codificar os algoritmos propostos, documentando-os adequadamente;
- preparar um conjunto de ficheiros de entrada para teste, que permita validar, além de outras, as de condições limite;
- integrar e testar o produto final (da Fase 1) usando comandos da shell para (i) leitura de um ficheiro JPEG ou GIF e sua conversão
para PNM, (ii) leitura de um ficheiro PNM (P2, P3, P5 ou P6) e sua conversão para noutro ficheiro PNM (P1 ou P4) e (iii) visualização
da imagem usando ImageMagick ;
- refinar o interface com o utilizador, construindo um menu de operações e permitindo mais que uma operação em cada sessão;
- apresentar os resultados destas tarefas num relatório redigido em LaTeX; a sua estrutura deverá conter, para além do título
e lista de autores, um resumo (máx. 600 caracteres), uma introdução com caracterização do problema a resolver, uma breve exposição/relato
dos aspectos relevantes de cada uma das fases/tarefas, as conclusões, uma lista da bibliografia pertinente para a resolução
do trabalho, e, em anexo, uma listagem do código.
Processamento de Texto e Imagem
Pautas musicais
Desenvolve uma aplicação para a geração automática de pautas musicais coloridas. O programa deverá aceitar um ficheiro de
texto com a descrição textual de uma música e deverá gerar uma imagem P3 ou P6 com a respectiva pauta musical (deverás dar
a hipótese do utilizador gerar um dos outros 4 tipos de imagem só que nesse caso a pauta será a preto e branco).
Os requisitos para a aplicação são os seguintes:
- O desenho da pauta fica ao teu critério: espessura das linhas, dimensões das notas (investiga um pouco sobre os tipos de notas
e de pausas musicais), ...
- Uma pauta é constituída por cinco linhas horizontais espaçadas uniformemente. As notas colocam-se sobre as linhas ou nos espaços
entre elas.
- Uma música é constituída por uma lista de compassos. Cada compasso deverá ser separado do seguinte por uma linha vertical
de espessura ligeiramente inferior à das linhas da pauta.
- A cor das notas não é livre e deverá seguir o seguinte esquema:
Nota Musical |
Descrição |
Côr RGB em Hex |
C |
Dó |
FF0000 |
C# ou Db |
Dó sustenido ou Ré bemol |
FF3300 |
D |
Ré |
FF6600 |
D# ou Eb |
Ré sustenido ou Mi bemol |
FFCC00 |
E |
Mi |
FFFF33 |
F |
Fá |
00FF00 |
F# ou Gb |
Fá sustenido ou Sol bemol |
00AA00 |
G |
Sol |
004400 |
G# ou Ab |
Sol sustenido ou Lá bemol |
0000FF |
A |
Lá |
330033 |
A# ou Bb |
Lá sustenido ou Si bemol |
990066 |
B |
Si |
FF0066 |
CM |
Dó maior |
FF0000 |
- O ficheiro de entrada, onde é descrita a música em forma textual, tem a seguinte estrutura:
- Na primeira linha tem o título da música.
- Cada linha das que se seguem à primeira contem um compasso da música.
- Numa linha de compasso cada nota é separada da que se lhe segue por um espaço.
- Além de notas podem aparecer pausas e sinais de repetição (o tratmento destes é opcional).
- A título de exemplo, apresenta-se a seguir a descrição de uma música popular portuguesa bem conhecida:
O Chapéu de 3 bicos
G
CM G
G F E
F D
D E
F F G
A G
E
Pausa
G CM G G
F E F D
D E F
G A G C
Repete
- O resultado esperado para o exemplo anterior pode ser visualizado em: O Chapéu de 3 bicos.
A seguir apresentam-se mais músicas para teste da aplicação final.
Músicas populares
- O lencinho
O lencinho
G A
G E
C G A
G E
C C C
D D C D
E E D E
F F E F
G G A
G E
C G A
G E
C C C
D D C D
E F G A
G F E D
C C
E F
G
Pausa E F
G
Pausa A Bb
CM
Pausa A Bb
CM
Pausa C C
C C Bb A
G G G A
G F E D
C C
Repete
- Dança das Horas: nesta música existem acordes (notas que devem ser tocadas ao mesmo tempo); um acorde tem parentesis curvos
a limitar as suas notas; as notas de um acorde devem ser desenhadas alinhadas verticalmente, ou seja, o centro do círculo
de cada nota deve estar sobre a mesma linha vertical.
Dança das Horas
A
F G
C
C
G A
F
F A
G F
C
C C
G A
F
F Pausa
(F A)
(F A)
(F A)
Pausa C
F
- O balão do João
O balão do João
G E E
F D D
C D E F
G G G
G E E
F D D
C E G G
(G C E)
Repete
D D D D
D E F
E E E E
E F G
G E E
F D D
C E G G
(G C E)
Repete
- Lagarto Pintado
Lagarto Pintado
C
G CM G
E C
A A A
A G
G CM G
E C
F E D
C
Repete
- Se tiveres tempo, altera o formato textual para poder permitir adicionar uma duração a cada nota. A nota deixaria de ser um
elemento atómico e passaria a ser um par (nota, duração). Considera que os valores para a duração de uma nota podem ser de
4 tempos, 2, 1, 1/2, 1/4 e 1/8. A duração da nota implica que esta tenha uma representação diferente, investiga este assunto
ou dirige-te ao docente para tirar dúvidas. Esta opção será avaliada como um extra e destina-se a alunos que queiram obter
um nível de MuitoBom ou Excelente.