Todos os exercícios aqui colocados estão disponíveis no Mooshak no volume "Preparação para Teste 1"
Estão disponíveis em modo "pontuação parcial", ou seja, em cada problema terá uma pontuação de 0 a 100 baseada no casos de teste que o seu programa conseguiu resolver.
Teste Prático Modelo
Para o ajudar a preparar o 1º teste prático (16 de novembro), colocamos disponíveis para submissão os quatro problemas usados no teste prático de 19/20 (a estrutura e objetivos do teste eram semelhantes):
Estão também disponíveis dois problemas com várias subtarefas que foram usados numa submissão para avaliação "em casa" com tempo mais alargado em 19/20 (foi o ano em que chegou a "pandemia" - esta unidade curricular estava então no 2º semestre):
- Ciclos e epidemiologia
Este problema é essencialmente sobre a primeira parte da matéria, de fundamentos de Java. Para o resolver basta no fundo saber usar ciclos.
Basta fazer um simples ciclo onde \(i\) vai tomando à vez todas as posições (exceto a primeira) e em cada passo obter \(valor[i] - valor[i-1]\).
Depois basta guardar o mínimo e máximo de desses incrementos e no final imprimir
Comece por fazer um ciclo como a da flag anterior para calcular a subida percentual em cada dia. Tenha cuidado com a divisão (se dividir dois inteiros vai obter apenas uma divisão inteira: pode fazer um cast para ober um valor com casas decimais, por exemplo)
O problema é resolúvel sem necessitar de variáveis auxiliares, mas se desejar pode por exemplo guardar as subidas num novo array de \(doubles\); chamemos a esse array \(subidas[]\)
Um período de baixa propagação começa numa posição \(i\) se \(subidas[i] \leq 5\%\) e \(subidas[i-1] \gt 5\%\) (ou se \(i=0\), ou seja se \(i\) for a primeira posição do array)
Um período de baixa propagação termina numa posição \(j\) se \(subidas[j] \leq 5\%\) e \(subidas[j+1] \gt 5\%\) (ou se \(j\) for última posição do array)
Se um período de baixa propagação começa na posição \(i\) e termina na posição \(j\), então o seu tamanho é igual a \(j-i+1\)
Cada vez que terminar um período de baixa propagação, incremente uma variável que conta quantos períodos existem e compare com a maior até agora (para que no final tenha o tamanho máximo)
Pode optar por imprimir logo ou criar uma variável (matriz de caracteres) para conter o resultado e só depois imprimir
A altura (nº linhas) do output é igual ao maior valor a dividir por 100
Depois é preciso percorrer todas as linhas e em cada linha percorrer as respetivas colunas (como saber se a j-ésima coluna da i-ésima linha tem um '.' ou um '#'?)
- Gollum e listas ligadas
Este problema implica fazer alguns métodos de listas ligadas simples.
Note que não pode modificar a lista original, ou seja, não pode remover os seus elementos (ou se o fizer tem de voltar a colocá-los na lista, pela mesma ordem)
Existem várias maneiras de inverter, mas a mais fácil passar por ir percorrendo os nós um a um da lista original (do primeiro para o último, usando um simples ciclo) e ir inserindo os valores deles numa nova lista na ordem correcta (para ficar invertido, cada valor deve ser inserido... no início (com que método pode fazer isso?) Assim, o último valor inserido, será o primeiro da nova lista (e por aí adiante...)
Primeiro deve fazer um ciclo pela lista para contar o número de ocorrências, para criar um array com o tamanho respetivo (que será no final devolvido como retorno do método)
Se o número de ocorrências for zero, pode devolver \(null\)
Faça um segundo ciclo pela lista onde mantém também o índice da posição atual e se um valor de um nó for igual ao desejado (comparar com equals), então basta adicionar a posição atual ao array de posições que criou
Existem várias maneiras de fazer e aqui estão descritas duas hipóteses
Hipótese 1) fazer um método para retirar todas as cópias de um valor (é o ED193, se já o fez!); percorrer a lista \(toRemove\) e chamar o método criado anteriormente para cada um deles
Hipótese 2) percorrer a lista original e para cada um dos seus valores verificar se está contido em \(toRemove\) (e nesse caso remover)
Live coding de exercícios de listas ligadas
Nota: aconselhamos a usar este recurso apenas depois de ter tentado fazer estes problemas para que possam na mesma treinar a resolução de forma independente.