Linguagens e Ambientes de Programação (2022/2023)



Teórica 26 (07/jun/2023)

Revisão para o exame. Resolução de problemas de testes/exames antigos.



Exercício de programação imperativa em C

- Neste problema vamos trabalhar com listas de inteiros ordenadas crescentemente, onde podem ocorrer valores repetidos. Para acelerar a remoção de valores, decidiu-se que os nós removidos permanecem na lista, na mesma posição, mas com uma flag a indicar que estão inativos. Para acelerar a insersão de valores, reaproveita-se o nó inativo nos casos em que por sorte esteja um nó inativo ponto de insersão.

Vamos usar o seguinte tipo ANSI-C. Cada nó da lista contém: uma flag que indica se o nó está ativo, o valor do nó (no caso de estar ativo), um apontador para o nó que se segue. O apontador NULL marca o final da lista. A função da direita pode ser usada para criar nós inicializados.

Pode usar a função newNode que se oferece aqui já escrita:

NOTA: Não se esqueça: neste tipo de problemas começa-se por escrever o ciclo (inicialmente de forma tentativa), e só no final se trata da inicialização e da finalização.

  • a) Escreva em C uma função para determinar o comprimento duma lista. Para o comprimento, contam só os nós ativos.
  • b) Escreva em C uma função para remover (ou seja, para inativar) a primeira ocorrência dum dado valor numa lista. A função não deve ter ineficiências desnecessárias: concretamente, como a lista está ordenada, ao ser atingido um valor maior ou igual, não vale a pena continuar a pesquisa.
  • c) Escreva em C uma função para inserir ordenadamente um valor numa lista. De acordo com o que se disse na introdução, só é preciso intercalar um novo nó se na posição de inserção não existir já um nó inativo disponível.


    Exercício sobre a pilha de execução

    - Considere o seguinte programa escrito em GCC, uma variante do C que suporta aninhamento de funções: Mostre qual o estado da pilha de execução no momento em que a execução do programa atinge o ponto marcado com QQQ. Note que o array nodes ocupa 8 posições de memória. Não se esqueça dos registos de ativação das funções start e main.

    Use as convenções habituais das aulas: Para efeitos da criação do registo de activação inicial, imagine que cada programa em GCC está embebido numa função sem argumentos chamada start. Depois trate todas as entidades globais do programa como sendo locais à função imaginária start. Assuma também que a primeira célula da pilha de execução é identificada como posição 0, a segunda célula da pilha de execução é identificada como posição 1, etc.


    Exercício de programação orientada pelos objetos em JavaScript

    - Vida. O objetivo deste problema é definir em JavaScript um sistema de classes adequado à representação de espécies de seres vivos e de relações entre espécies. Esta pergunta é um pouco extensa, mas descobrirá que o problema se resolve escrevendo pouco código.

    Vamos considerar espécies e relações simbióticas.

    Espécies: Uma espécie é um tipo de ser vivo, que pode ser tanto animal como vegetal. Exemplos: humano, lírio, cão, raposa, peixepalhaço, anémona. Cada espécie é implementada usando uma classe com atributos que podem ser bastante variados. Contudo, existem dois atributos que são comuns a todas as espécies: name (o nome da espécie, uma string) e time (o tempo médio de vida dos membros dessa espécie em segundos, um inteiro).

    Relações simbióticas: Existem diversos tipos de relações simbióticas: mutualista quando os dois participantes recolhem benefícios; comensalística quando o primeiro participante beneficia e o segundo nem beneficia nem é prejudicado (geralmente o primeiro alimenta-se dos restos deixado pelo segundo); parasítica quando o primeiro beneficia e o segundo é prejudicado. Há outros tipos de relações simbióticas conhecidas e mais poderão vir a ser descobertos no futuro.

    Cada relação simbiótica envolve duas componentes, que tanto podem ser espécies como podem ser outras relações simbióticas. Por exemplo: a relação [peixepalhaço-anémona] envolve só duas espécies; a relação [humano-cão] também só envolve duas espécies; mas a relação [[humano-cão]-raposa] já envolve uma relação simbiótica (caçador + cão) e uma espécie (raposa). Cada tipo de relação simbiótica é implementado usando uma classe com atributos que podem ser bastante variados. Mas existem dois atributos que são comuns a todas as relações simbióticas: l (o primeiro participante na relação) e r (o segundo participante na relação).

    Problema

    O objetivo deste problema é a definição dum sistema de classes bem fatorizado e extensível, adequado à representação de aspetos da vida. Escreva código compacto, bem fatorizado e extensível. No futuro vamos querer acrescentar novas espécies e novas variedades de relações simbióticas, e o programa tem de estar preparado para isso.

    Programe apenas as classes abstratas do sistema. Se escrever classes concretas para exemplificar, deixe-as ficar vazias. As funções que todos as classes devem suportar são as seguintes quatro:

    Recomendamos que use as seguintes classes, já identificadas. Se preferir, pode ignorar o que se oferece e fazer diferente.


    Vídeo antigo para o 3º exercício (JavaScript)

    OBSERVAÇÕES:

    1. Referi-me ao método winWin como um "método binário". Eu queria dizer "método booleano".

    2. Chamo a atenção que as palavras Species e Symbiosis estão a ser usadas no singular (em inglês, o singular e plural destas palavras escreve-se da mesma maneira). Praticamente sempre, o nome duma classe deve estar no singular.


    30