Linguagens e Ambientes de Programação (2017/2018)



Prática 4

Módulos. Input/output. Interação com o utilizador. Exercícios 28 e 29.



  • 28 - Desenvolva em OCaml um módulo chamado BinTree onde sejam representadas e manipuladas árvores binárias de inteiros.

    O nome do tipo exportado deve ser

    A representação interna deve ser a seguinte:

    O módulo deve ser fechado ou seja deve ocultar a representação interna das árvores e das funções auxiliares (se houver). Repare que internamente se poderia usar representações diferentes: por exemplo árvores n-árias em que se guardava em cada nó interno apenas duas sub-árvores.

    Eis a lista de funções públicas pretendidas. Tente fazer as primeiras quatro durante a aula.

    Exemplos:

        make [1;2;3] = Node (1, Nil, Node (2, Nil, Node (3, Nil, Nil)))
        max (make [1;2;3]) = 3
    

    Representação das árvores em ficheiro e no ecrã

    Considere a seguinte árvore:

    A função store escreve no ficheiro, primeiro a raiz, depois a sub-árvore esquerda, depois a sub árvore direita. A árvore vazia é escrita como "-".

    A função show apresenta na consola a árvore da forma abaixo, usando indentação. A informação que resulta da indentação permite omitir a escrita dos dois "-", no caso das folhas.

    Como criar o módulo "BinTree" no Eclipse

    Como criar o módulo "BinTree" usando a consola


  • 29 - Desenvolva um programa interativo e standalone que afixe no ecrã dados obtidos a partir de ficheiros contendo árvores de inteiros. Use o módulo desenvolvido no exercício anterior. Chamamos ficheiro com árvore a um ficheiro de texto que contém uma árvore no formato descrito no exercício anterior.

    Os comandos que o programa deve suportar são os seguintes:

    O que é um programa standalone?

    É um programa OCaml concebido para ser compilado e para funcionar com independência do interpretador ocaml. Depois de compilado, um programa standalone pode ser invocado diretamente a partir do prompt do Unix, tal como outro programa qualquer. Quem usar o programa não sabe se ele foi escrito em OCaml, Java, C, ou C++, etc.

    Um programa standalone define-se como uma sequência de funções terminada pela chamada duma função que se designa por função principal (muitas vezes dá-se o nome de main à função principal). Um programa standalone tem a responsabilidade de gerir todo o seu input e output, pois não tem o interpretador ocaml a ajudar.

    Como gerar o programa standalone "Main" no Eclipse

    Relativamente ao que já se fez antes, fazer adicionalmente:

    Como gerar o programa standalone "Main" na consola

    Ajuda

    A maior parte deste exercício já está feito. Estude-o, para aprender a organizar um programa interativo em ML, e complete-o. Falta só terminar a função exec.

    Note que a função split é um exemplo de aplicação do método indutivo a strings. A chamada recursiva é sobre o argumento xs, que representa a "cauda" da string.


  • 30 -

    a) Escreva uma função indutiva

        countEmpty: string -> int
    
    que, dado o nome dum ficheiro, conte o número de linhas vazias (linhas com zero caracteres) nesse ficheiro.

    b) Escreva uma função indutiva

        clear: string -> string -> int
    
    que, dados os nomes dum ficheiro de entrada e dum ficheiro de saída, copie o primeiro ficheiro para o segundo, mas omitindo as linhas vazias (linhas com zero caracteres). A função deve ainda retornar o número de linhas vazias que forem omitidas durante a cópia.