M.P.I - 1998/99 - FAQs
[ DI/UM ]


Questão 1 ['Bounding boxes' no 2.º Trabalho prático] - Quando temos, por exemplo,

> x = Comp Hb (Unid ((100,200),("Sara",Azul))) (Unid((150,300),("S",Verde)))
é possível a 2.ª caixa ("S") ser maior em termos de altura do que a primeira? Como se define a "bounding box"?

R. É possível qualquer combinação de caixas. No caso dado, se a 2.ª caixa ("S") tem maior altura, então é ela que define a altura da 'bounding box', pois a agregação é na horizontal. De facto, dever-se-á obter, para o exemplo x dado:

> desenho x
> Fig (250,300) [((0,0),((100,200),("Sara",Azul))), ((100,0),((150,300),("S",Verde)))] :: Fig
Repare-se que (250,300) define o canto superior direito da 'bounding box', que é, afinal, o menor rectângulo que contem o desenho produzido.


Questão 2 [Função desComp no 2.º Trabalho prático] - Na definição da função desComp, mais propriamente quando se constrói a lista (em [Obj]), e supondo que essa lista tem apenas 2 elementos, o primeiro aparece com origem em (0,0). E o segundo? Tomam-se em atenção as dimensões da primeira caixa?

R. Quem desenha caixas é desUnid, que deverá colocá-las, de facto, na origem. À medida que as caixas vão sendo coladas umas às outras, desComp vai-as deslocadando na vertical e/ou na horizontal, conforme o tipo de agregação. Por exemplo, o desenho de

> x = Comp Hb (Unid ((100,200),("Sara",Azul))) (Unid((150,300),("S",Verde)))
é
> desenho x
> Fig (250,300) [((0,0),((100,200),("Sara",Azul))), ((100,0),((150,300),("S",Verde)))] :: Fig
Repare-se como a 2.ª caixa ("S") foi deslocada na horizontal tanto quanto a largura da primeira, isto é, exactamente 100 unidades.


Questão 3 [Noção de estado no 3.º Trabalho prático ] - Gostaria que nos dissesse ao certo o que é que o estado deverá fazer neste trabalho. É suposto guardar o valor da ultima operação para depois utilizá-lo como operando noutra operação?

R. O estado deve armazenar informação necessária durante a execução do programa. Mais especificamente, o programa em HASKELL funciona num ciclo de interacção com a interface em que em cada iteração: (a) lê ultima tecla digitada; (b) processa a informação; (c) devolve String a ser visualizada. O problema é que de uma iteração para outra o programa necessita de se «lembrar» de alguma informação - essa informação é mantida no estado - por exemplo, guardar o valor do resultado da ultima operação, como sugere (nas operações binárias). Este é um caso em que se necessita de utilizar o estado. Mas há exemplos mais simples. Só o facto de a interface enviar informação das teclas isoladamente faz com que a introdução de um número com vários digitos tenha de ser feita em várias iterações com a interface.

Um conselho: comecem com um programa análogo ao que é fornecido com o enunciado. Esse programa encarrega-se do comportamento "em ciclo" do servidor de cálculo faltando só definir a função de transição HSCALC e o ESTADO INICIAL. Para atacar o problema de como implementar a função HSCALC, «classifiquem» as teclas oriundas da interface em classes distintas, e.g. Digitos; Operações unárias; Operações binárias; Outras. Para isso é conveniente introduzir um tipo de dados como

>    data Comando = Digit Int | OpUn OpUnaria | OpBin OpBinaria | ....
>    data OpUnaria = ...|...
>    data OpBinaria = ....
>    ....
juntamente com uma função que atribui o significado a cada tecla:
>    sig_tecla :: String -> Comando
>    sig_tecla = ......
Assim a função HSCALC poderá ser definida como
>    hscalc :: (String,Estado) -> (String, Estado)
>    hscalc (s, e) = case (sig_tecla s) of
>                                (Digit i) -> processa_digito (i,e)
>                                (OpUn o) -> processa_opun (o,e)
>                                ....etc....
onde processa_.... se encarrega de uma dada funcionalidade.

Só depois se devem concentrar no problema de introduzir números com vários algarismos (i.e. função processa_digito). Nesse caso basta considerar o estado como uma STRING (ou INT) que denota o número introduzido até aí. A função HSCALC (responsável pela «transição» para a próxima iteração) deve então inserir no final da string do estado o digito da tecla digitada (ou se for o inteiro multiplicar por 10 e somar o inteiro correspondente ao digito introduzido).

Para as operações binárias, poderão concluir que é necessário um tipo de estado mais elaborado (exemplo, um par ou uma lista). A alteração do tipo ESTADO irá obrigar a um pequeno acerto das funções já realizadas, mas este é o problema (conhecido) de definirmos tipos e funções tentativamente. A verificação de tipos do HASKELL é aqui uma preciosa ajuda.


Questão 4 [Funções das teclas no 3.º Trabalho prático] - Qual a função das teclas BkSpc, MEM ou Rcl?

R. Com a tecla BkSpc (de 'back space') deverá conseguir apagar o último digito; MEM (de 'memory') deverá guardar o último resultado calculado na memória; Rcl (de 'recall') deverá ler o valor corrente da memória. Mas não se prendam demasiado às teclas existentes: podem não tratar todas as teclas ou considerar outras à escolha.


Questão 5 [Instalação do pacote WINDOWS desenvolvido no 3.º Trabalho prático] - Não conseguimos instalar este 'software' e precisamos de ajuda.

R. A instalação do software de apoio ao trabalho prático nº 3 contém algumas omissões que faz com que não seja trivial executar os exemplos apresentados. Vamos de seguida acompanhar o processo de instalação «passo a passo» para garantir que todo o 'software' está disponível no sistema.

Requisitos de base

Software do trabalho

O trabalho fará ainda uso de (procurar o software AQUI):

Instalação PASSO A PASSO

  1. Certifique-se que dispõe das versões correctas do Internet Explorer e do Hugs.
  2. Crie uma directoria (e.g. C:\TEMP\HS) e descompacte ai os ficheiros ftp://enigma.di.uminho.pt/hscript1.zip e ftp://enigma.di.uminho.pt/hscript2.zip.
  3. Execute o programa de instalação setup. Depois de instalado o Haskell Script pode remover a directoria criada.
  4. Descompacte o ficheiro ftp://enigma.di.uminho.pt/mpi9899t3_ms.tgz.
  5. Execute o ficheiro wsh.exe.
  6. Copie o restante conteúdo da directoria para um local da sua preferência.
  7. Apague a directoria temporária (onde descompactou os ficheiros).
  8. Altere a linha no início do ficheiro htmlcalc.hs para incluir o "pathname" do ficheiro hscalc.hs.
  9. Abra a página www hscalc.html. Quando o "browser" lhe questionar se deseja activar os objectos ActiveX reponda SIM.

Neste ponto deverá estar a executar o programa de exemplo do enunciado ("echo" das teclas digitadas).

SE TUDO O RESTO FALHAR...

Se não for possível instalar o "Software" de suporte à interface gráfica, execute o trabalho prático com interacção em modo texto (via stdin/stdout). Para isso recomenda-se que utilize uma função do tipo da apresentada no enunciado com ciclo.que invoca a função pretendida: hscalc.


Voltar à página principal de MP-I .


Outras disciplinas leccionadas pelo DIUM

1/8/1999
J.N. Oliveira