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
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 .