Trabalho Prático Final
Paradigmas da Programação II (PPII2006)
e
Programação Imperativa (PI2006)
Historial:
[2006-02-23 (fase 2)]
[2006-04-11 (fase 3) (rev.)]
[2006-05-08 (rev.)]
Este documento descreve o trabalho prático final das disciplinas em epígrafe.
Como é hábito, este trabalho final será uma evolução do último trabalho em que os requisitos terão fortes implicações nas
soluções adoptadas implicando, em muitas situações, a utilização de novos conceitos e metodologias entretanto leccionados
nas aulas das disciplinas referidas.
|
Índice
- Tema: Vamos desenhar!
- Operações de Gestão
- Operações Gráficas
- Critérios de Avaliação a ser usados
- Sugestões para a implementação
Tema: Vamos desenhar!
O desenho a duas dimensões é um óptimo exercício para a imaginação e para a organização mental do ser humano. Com o advento
das novas tecnologias as pessoas estão cada vez mais adversas ao lápis e papel e mais adeptas do teclado e do rato. Nesta
perspectiva e tentando ir ao encontro das novas necessidades e quereres, foste incumbido de desenvolver uma plicação informática
que permita a criação e visualização de desenhos a duas dimensões no monitor.
Nesta aplicação, o lápis será substituído por comandos fornecidos pelo utilizador (descreve-se mais à frente esta interacção)
e o papel será substituído por uma matriz de pontos que o utilizador poderá dimensionar de início.
A aplicação deverá suportar uma série de operações gráficas de desenho que serão realizadas sobre a matriz de pontos bem como
outras, de gestão, que se descrevem a seguir.
Operações de Gestão
Nesta secção descrevem-se as operações de gestão que a aplicação deverá suportar:
- Dim linhas, colunas
- Este comando permite estabelecer as dimensões da área de desenho. O valor linhas é um inteiro que especifica o número de linhas da matriz e o valor colunas, o inteiro que especifica o número de colunas da matriz. Este comando deverá ser usado uma única vez no início do desenho.
Por omissão, ou seja, caso este comando não seja utilizado pelo utilizador a aplicação deverá assumir os valores 25 e 80 respectivamente para linhas e colunas.
- SetMarker marca
- Este comando permite definir o carácter que será usado no traçado do desenho. O valor marca corresponde ao carácter que se quer usar para traçar as linhas. Este comando pode ser executado em qualquer altura. Se fôr
executado a meio de um desenho permite trocar o carácter que se está a usar para desenhar. Por omissão e no início do programa
a marca está definida como sendo o ó minúsculo.
- Merge desenho
- Este comando permite carregar um desenho previamente gravado num ficheiro para cima do que estiver na tela no momento. Na
prática, faz a fusão do que se desenhou até à altura com o desenho gravado no ficheiro. O valor desenho corresponde ao nome do ficheiro onde está gravado o desenho. O desenho a carregar deverá ter dimensões iguais ou inferiores
às do desenho que está a ser trabalhado.
- Load desenho
- Este comando permite carregar um desenho previamente gravado num ficheiro. O valor desenho corresponde ao nome do ficheiro onde está gravado o desenho. Caso este comando seja utilizado no meio de uma sessão de desenho,
aplicação deverá pedir a confirmação ao utilizador. Em caso afirmativo, o desenho na tela será limpo e o desenho no ficheiro
será carregado para a tela.
- Save desenho
- Este comando permite gravar um desenho num ficheiro. O valor desenho corresponde ao nome do ficheiro onde será gravado o desenho. O desenho será gravado em formato próprio:
- Na primeira linha, grava-se um identificador do formato.
- Na segunda linha, coloca-se um comentário descritivo.
- Na terceira linha, são gravados dois inteiros, o primeiro corresponde ao número de colunas da imagem e o segundo ao número
de linhas.
- As restantes linhas do ficheiro correspondem às linhas do desenho. Cada linha do desenho é gravada numa linha do ficheiro.
Cada ponto do desenho é gravado como um inteiro e é separado do seguinte por um espaço. Cada linha do ficheiro é separada
da seguinte por uma mudança de linha (carácter '\n').
- !comandos
- O comando ! à semelhança das consolas nos sistemas Unix deverá permitir carregar uma sessão previamente gravada num ficheiro. O ficheiro de nome comandos deverá ser um ficheiro de texto em que cada linha contem um comando válido da aplicação de desenho: SetMarker, Merge, Point,
Line, ... A aplicação deverá ler o ficheiro linha a linha e executar cada um dos comandos sobre a tela. No fim, a tela deverá
exibir o desenho resultante da execução da sequência de comandos que estava no ficheiro. Estes ficheiros deverão ter a extensão
MFV - "Meu Formato Vectorial".
- SaveComList ficheiro
- Este comando irá gravar todos os comandos que o utilizador executou para gerar o desenho corrente num ficheiro de texto. Deverá
ser gravado um comando por linha. O ficheiro resultante deverá ter uma extensão MFV. O primeiro comando deverá ser um comando
Dim.
- SaveObj id1, id2, ..., idn, ficheiro
- Este comando irá gravar todos os comandos associados aos identificadores dados num ficheiro de texto. Deverá ser gravado um
comando por linha. O ficheiro resultante deverá ter uma extensão MFV.
Operações Gráficas
Nesta secção descrevem-se as operações gráficas que a aplicação deverá suportar:
- Point x,y
- Este comando marca um ponto nas coordenadas x,y, ou seja, naquela posição da matriz deverá ser colocado o carácter definido como a marca actual.
- Line x1,y1,x2,y2
- Este comando traça uma linha marcando os pontos que se aproximam da linha recta entre as coordenadas x1,y1 e x2,y2.
- Rect x1,y1,x2,y2
- Este comando traça um rectângulo assumindo os pontos x1,y1 e x2,y2 como os limites de uma das suas diagonais.
- PolyLine x1,y1, x2,y2, ..., xn,yn
- Este comando traça uma linha unindo os pontos cujas coordenadas foram fornecidas. Desta forma permite abreviar alguns traçados.
Veja-se um exemplo:
PolyLine x1,y1,x2,y2,x3,y3,x4,y4
é equivalente a:
Line x1,y1,x2,y2
Line x2,y2,x3,y3
Line x3,y3,x4,y4
- Circ x,y,r
- Este comando permite traçar uma circunferência com centro em x,y e de raio r.
- Elip x1,y1,x2,y2,rmin
- Este comando permite traçar uma elipse com focos em x1,y1 e x2,y2 respectivamente e com um raio menor de rmin. Pode adicionar mais parâmetros se achar necessário (há várias estratégias para desenhar uma elipse).
- Text x,y,"texto",ori
- Este comando vai escrever o texto passado como argumento na horizontal (ori=h) ou na vertical (ori=v) a partir da posição definida pelas coordenadas x e y. Cada carácter da string
texto deverá ser colocado numa posição da matriz.
- Erase x1,y1,x2,y2
- Este comando apaga tudo o que estiver dentro do rectângulo definido pelas coordenadas que lhe foram passadas.
- Let id = comando
- Esta operação permite associar um identificador, neste caso designado por id ao objecto gráfico resultante do comando(Point, Line, Circ, ...). Mais tarde este identificador será usado noutras operações de manipulação do objecto gráfico.
- Del id1, id2, ..., idn
- Este comando apaga os objectos que têm os identificadores indicados associados.
- Move id, dx, dy
- Este comando irá mover o objecto com o identificador id. Para isso, todos os pontos que o compõem terão as suas coordenadas alteradas por uma variação em x, dx, e uma variação em y dy. Note que dx e dy podem ser positivos ou negativos.
- Copy id, dx, dy
- Este comando é idêntico ao anterior só que não apaga o objecto inicial. O novo objecto terá um novo identificador resultante
da concatenção do identificador do objecto inicial com a letra "a". Utilize este política para cópias sucessivas. O identificador
será sempre diferente e o número de ás permitirá saber a que cópia nos referimos.
- ListObj
- Este comando escreve no monitor uma tabela com duas colunas. Na primeira apresenta o identificador do objecto e na segunda
o comando que cria o objecto.
- Let id = Group id1, id2, ..., idn
- Esta operação permite associar um identificador, neste caso designado por id a um agrupamento de objectos gráficos associados aos identificadores indicados. Este agrupamento, quando referido pelo respectivo
identificador deverá ser tratado como um objecto único. Todos os objectos dentro de um agrupamento deixam de poder ser referenciados
noutros comandos pelo seu identificador (são locais ao agrupamento e portanto invisíveis para o exterior). Este comando é um extra.
- UnGroup id
- Este comando desfaz o agrupamento associado ao identificador indicado. Este comando é um extra.
Critérios de Avaliação a ser usados
A avaliação do trabalho prático irá ser algo complexa atendendo à dimensão e quantidade do que é pedido. Por isso, estabeleceram-se
os seguintes patamares de avaliação:
- Insatisfaz
- Qualquer trabalho que não cumpra um ou mais dos requisitos enunciados no patamar seguinte.
- Satisfaz
- A aplicação deverá:
- ter sido desenvolvida modularmente e apresentar uma makefile com a qual se cria o executável final;
- implementar todas as funcionalidades pedidas na fase anterior: Load, Save, Export, SetMarker, Point, Line, Rect, PolyLine,
Circ, Elip;
- implementar as novas funcionalidades: Text, !comandos;
- Bom
- Todas as funcionalidades pedidas excepto o Group e Ungroup de objectos.
- MBom - Excelente
- Tudo o que é pedido mais o que a sua imaginação conseguir fazer. Seja capaz de surpreender o avaliador...
Sugestões para a implementação
Depois de apresentados os requisitos funcionais da aplicação e os critérios de avaliação ficam aqui algumas sugestões para a sua implementação.
- No início, o utilizador deverá poder escolher entre criar um desenho novo, abrir um previamente gravado ou simplesmente sair
da aplicação.
- Caso o utilizador tenha optado por criar um desenho novo deverá ser interrogado sobre as dimensões da área de desenho. Deve
haver um limite máximo para as dimensões, tipicamente a resolução em pixeis de um monitor: 800x600 ou 1024x768. De início
tente trabalhar com desenhos pequenos (80x25) pois podem visualizar-se no monitor em formato textual.
- Depois desta fase de arranque a aplicação deverá funcionar em ciclo: em cada iteração o desenho é colocado no monitor (a sua
área deverá ser limitada por caracteres '.', e é oferecido ao utilizador uma linha onde este deverá introduzir o próximo comando.
- Use uma estrutura dinâmica para guardar os comandos.
- Nas primeiras versões tente fazer as coisas o mais simples possível.