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

  1. Tema: Vamos desenhar!
    1. Operações de Gestão
      1. Operações Gráficas
        1. Critérios de Avaliação a ser usados
          1. Sugestões para a implementação

          Tema: Vamos desenhar!

          [Voltar ao índice]

          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

          [Voltar ao índice]

          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:
          !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

          [Voltar ao índice]

          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

          [Voltar ao índice]

          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á:
          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

          [Voltar ao índice]

          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.