Introdução à Programação para Não Informáticos
2018-04-16 (criac.)

Objectivos:


O objectivo principal desta ficha é familiarizar o aluno com a programação de jogos e problemas simples.

Pretende-se aferir também os conhecimentos adquiridos até ao momento pelo que os alunos deverão resolvê-la em grupo na aula e enviá-la ao docente até ao fim da mesma.

Exercícios:

  1. Conjetura de Collatz
  2. 100 portas
  3. Polyspiral
  4. Números departamentais

by jcr

Exercício Nº1: Conjetura de Collatz


Quantas iterações/repetições são necessárias para atingir o valor 1 com o seguinte algoritmo:
  1. Ler um número n;
  2. Repetir até n=1
    • Se n é par, divide-se o n por 2;
    • Se n é ímpar, multiplica-se por 3 e soma-se 1.


Exercício Nº2: 100 portas


Há 100 portas que estão inicialmente fechadas.

Vais fazer 100 passagens pelas 100 portas.

Na primeira passagem, visitas todas as portas e invertes o seu estado: se está aberta vais fechá-la e se estiver fechada vais abri-la.

Na segunda passagem, vais visitar as portas de 2 em 2 (portas 2, 4, 6, ...) e vais invertê-las.

Na terceira passagem, vais visitar as portas de 3 em 3 (portas 3, 6, 9, ...) e vais invertê-las.

Vais continuar o processo até que na última passagem, a centésima, invertes apenas a última porta.

No fim, responde às questões: Em que estado ficaram as portas? Quais estão abertas e quais estão fechadas?


Exercício Nº3: Polyspiral


Uma Poliespiral é uma espiral composta por múltiplos segmentos de linha, em que cada segmento é mais ou menos comprido que o anterior por um determinado valor. Cada segmento também muda de direção por um determinado valor angular.

Anima uma série de espirais, desenhando uma espiral completa, limpando o monitor após o seu desenho e desenhando a seguinte. A animação poderá terminar quando obtiveres um círculo ou continuar indefinidamente.

Baseia-te no seguinte algoritmo para a tua implementação:
set incr to 0.0 
// animation loop 
WHILE true 
    incr = (incr + 0.05) MOD 360 
    xi = 0 
    yi = 0 
    length = 5 
    angle = incr 
    
    // spiral loop 
    FOR 1 TO 150 
        drawline 
        change direction by angle 
        length = length + 3 
        angle = (angle + incr) MOD 360 
    ENDFOR

Numa segunda versão, adiciona umas teclas de controlo para aumentar/diminuir o incremento do ângulo e do segmento de reta.


Exercício Nº4: Números departamentais


Há uma cidade muito organizada que decidiu atribuir um número a cada um dos seus departamentos:

Cada departamento pode ser um número entre 1 e 7 (inclusive).

O número de cada departamento deve ser único (diferente dos outros) e a soma dos 3 deverá ser 12.

O chefe da polícia não gosta de números ímpares e quer um número par para o seu departamento.

Cria um programa que calcula todas as combinações possíveis de números.