1o¯ Trabalho Prático de Programação Imperativa 2001/2002
Propostas de trabalho
21 de Novembro de 2001
1
Cartões mágicos
Considerando os cartões abaixo é possı́vel adivinhar um número de 1 a 63. Para tal basta pedir
a alguém que pense num número de 1 a 63 e indique em quais os cartões esse número aparece.
Sabendo os cartões é possı́vel saber o número imediatamente.
2o¯
1o¯
1
3
5
7
9 11 13 15
2
3
6
7 10 11 14 15
17 19 21 23 25 27 29 31
18 19 22 23 26 27 30 31
33 35 37 39 41 43 45 47
34 35 38 39 42 43 46 47
49 51 53 55 57 59 61 63
50 51 54 55 58 59 62 63
4o¯
3o¯
4
20
36
52
5
21
37
53
6
22
38
54
7
23
39
55
12
28
44
60
13
29
45
61
14
30
46
62
8
24
40
56
15
31
47
63
9
25
41
57
10
26
42
58
11
27
43
59
5o¯
16
24
48
56
17
25
49
57
18
26
50
58
19
27
51
59
12
28
44
60
13
29
45
61
14
30
46
62
15
31
47
63
36
44
52
60
37
45
53
61
38
46
54
62
39
47
55
63
6o¯
20
28
52
60
21
29
53
61
22
30
54
62
32
40
48
56
23
31
55
63
33
41
49
57
34
42
50
58
35
43
51
59
Como? O segredo consiste em adicionar os primeiros números em cada cartão dado. A soma é
o número escolhido.
Porquê? Esses números são as potências base 2 que na representação base 2 do número escolhido
correspondem a dı́gitos 1.
Por exemplo, se o número for 44, ele aparece nos cartões 3o¯ , 4o¯ , e 6o¯ e portanto
4 + 8 + 32 = 22 + 23 + 25 = 25 × 1 + 24 × 0 + 23 × 1 + 22 × 1 + 21 × 0 + 20 × 0 = (101100)2 = 44
Como são construı́dos os cartões? O 1o¯ cartão contém os números que na representação
em base 2 têm um 1 na posição correspondente a 20 . O 2o¯ cartão contém os números que na
representação em base 2 têm um 1 na posição correspondente a 21 , etc. O 6o¯ cartão contém os
números que na representação em base 2 têm um 1 na posição correspondente a 25 .
Assim basta considerar os números de 1 a 63 em binário para saber que números devem estar
em cada cartão. Por exemplo o número 7 terá de estar nos três primeiros cartões.
1
N. decimal
0
1
2
3
4
5
6
7
8
9
10
..
.
1.1
25
0
0
0
0
0
0
0
0
0
0
0
24
0
0
0
0
0
0
0
0
0
0
0
23
0
0
0
0
0
0
0
0
1
1
1
22
0
0
0
0
1
1
1
1
0
0
0
21
0
0
1
1
0
0
1
1
0
0
1
20
0
1
0
1
0
1
0
1
0
1
0
N. decimal
50
51
52
53
54
55
56
57
58
59
60
61
62
63
25
1
1
1
1
1
1
1
1
1
1
1
1
1
1
24
1
1
1
1
1
1
1
1
1
1
1
1
1
1
23
0
0
0
0
0
0
1
1
1
1
1
1
1
1
22
0
0
0
1
1
1
0
0
0
0
1
1
1
1
21
1
1
1
0
1
1
0
0
1
1
0
0
1
1
20
0
1
0
1
0
1
0
1
0
1
0
1
0
1
Objectivo
Pretende-se um programa que implemente este jogo permitindo que:
• O computador adivinhe um número pensado pelo utilizador. O programa deve gerar e
mostrar os cartões um a um. Para cada cartão pedir ao utilizador para indicar se o número
que pensou está ou não nesse cartão (por exemplo, consoante o utilizador introduza o valor
1 ou 0). Com essa informação pode calcular o número e indicar ao utilizador.
Nota: Os cartões têm de ser calculados pelo programa e não pré-definidos (p.e num ficheiro).
A melhor maneira, inspirada na tabela acima, é gerar para o 1o¯ cartão todos os números
que têm a parcela 20 , para o 2o¯ todos os números que têm a parcela 21 , etc. Usa uma
instrução switch()...
• O utilizador adivinhe um número que o computador ”pense”: o computador deve gerar
um número entre 1 e 63 e indicar ao utilizador em que cartões ele se encontra (neste caso
devem ser escritos todos os cartões ao mesmo tempo). Neste modo, será pedido ao utilizador
para adivinhar o número que depois poderá ser confirmado, por comparação com o número
gerado.
• ambos os modos do jogo possam ser jogados várias vezes
• inicialmente deve aparacer um menu que permita escolher qual o modo em que o jogo é
jogado ou se se deseja terminar.
Nota que este jogo pode ser generalizado para números maiores que 63 e outras bases. Pensa
como fazê-lo! E se quisseres apresenta o programa para outros valores...
2
2
Quando é a Páscoa?
O domingo de Páscoa é o primeiro domingo depois da primeira lua cheia depois do equinócio da
Primavera.
Apenas com esta definição não é fácil construir um algoritmo...
Na realidade o seu cálculo é bastante mais complicado e está ligado ao calendário (lunar)
hebraico.
No mundo cristão, a Páscoa celebra a morte de Jesus Crito. Jesus Cristo foi crucificado,
imediatamente antes da data em que os judeus celebram o Êxodus de Moisés do Egipto, que
começa no 14-ésimo ou 15-ésimo dia do mês de Nisan (primavera). Os meses judaicos começam na
lua nova, portanto será imediatamente depois duma lua cheia. Assim, decidiu-se que o domingo
de Páscoa seria o primeiro domingo depois da lua cheia depois do equinócio da Primavera.
O equinócio da Primavera é a 21 de Março.
A lua cheia que precede a Páscoa chama-se Paschal. Para a calcular são necessárias duas
quantidades: o número de ouro e o Epact.
Número de ouro A relação entre as fases da lua e os dias do ano repete-se todos os 19 anos.
Assim pode-se associar um número entre 1 e 19 a cada ano. Esse número é o Número de Ouro,
NO:
N O = (ano%19) + 1
onde % é o resto da divisão inteira.
Nos anos com o mesmo número de ouro, a lua nova ocorre aproximadamente no mesmo dia.
Epact Cada ano é associado com um Epact. O Epact é uma medida da idade da lua (i.e do
número de dias desde a lua nova) numa dada data.
Esse valor é
(11 × (N O − 1))%30
acrescido de correções associadas aos anos bissextos, resultando
((11 × (N O − 1))%30 − (3 × seculo)/4 + (8 × seculo + 5)/25 + 8)
onde as divisões são divisões inteiras.
Ao qual se tem ainda que somar ou subtrair 30 para garantir que fica um valor entre 1 e 30.
O valor obtido é o Epact.
Lua cheia Paschal Se 1 ≤ Epact ≤ 23 então é 23 − Epact dias depois de 21 de Março. Se
Epact = 24 é o dia 18 de Abril (28 dias depois de 21 de Março). Se Epact = 25 e se N O > 11 é
17 de Abril (27 dias depois de 21 de Março), senão é 18 de Abril. Se 26 ≤ Epact ≤ 30, então é
53 − Epact dias depois de 21 de Março.
Domingo de Páscoa Primeiro domingo a seguir à lua cheia Paschall. Se a lua cheia for num
domingo, o domingo de Páscoa é no domingo seguinte.
2.1
Objectivo
Pretende-se um programa que:
• defina uma função que dado um ano determine e imprima a data do domingo de Páscoa
(dia do mês, mês e ano). O formato de escrita deverá ser "%d de Março de %d\n" ou
"%d de Abril de %d\n", como em:
15 de Abril de 2001
31 de Março de 2002
3
Para essa tarefa será ainda conveniente definir funções para as seguintes sub-tarefas:
– dado um ano retorne o Epact.
– dado o Epact e o Número de Ouro (NO) retorne a distância em dias do Paschal a 21 de
Março.
– dado um ano A (≥ 1582), mês M (1 a 12) e dia D (1 a 31), retorne qual o dia da
semana. Para tal, poderá ser usado o seguinte algoritmo:
Se o mês for Janeiro ou Fevereiro,
f actor = 365 × A + 31 × (M − 1) + D + (A − 1)/100 + 1
senão
f actor = 365×A+31×(M −1)+D −int(0.4×M +2.3)+A/4−int(0.75×(A/100+ 1))
O dia da semana é dado por
S = f actor%7
, sendo 0=sábado, 1=domingo, 2=segunda, etc.
Esta última função deverá ser usada para determinar o dia da semana da lua cheia Paschal,
depois de determinado qual o seu mês e dia do mês. Depois só é necessário determinar a
data (mês e dia do mês) do domingo seguinte!
Para testar se a tua função da Páscoa está correcta, poderás comparar os valores produzidos
pelo teu programa com os do ficheiro pascoas.txt que tem uma listagem de todas as Páscoas
entre 1582 e 10000.
• O programa deve no inı́cio apresentar um menu que permita o utilizador:
1. introduzir um ano (superior a 1582) e para esse ano ser impressa a data do domingo de
Páscoa.
2. introduzir dois anos (sendo o segundo superior e ambos superiores a 1582) e serem
impressas todas as Páscoas entre esses dois anos.
3. Sair do programa
Nas duas primeiras hipóteses, depois de executada a tarefa o programa deve voltar a apresentar o menu.
4
3
Coelhos e Raposas
Este trabalho tem como objectivo a realização de um simulador que ilustre a evolução de duas
populações de predadores e de presas. Neste caso particular temos uma população raposas que
são os predadores naturais de uma população de coelhos: Para a simulação vamos assumir que:
• o nascimento de coelhos tem uma taxa fixa (não depende de outros factores ambientais).
• a morte de coelhos é apenas provocada pelos actos predadores das raposas.
• a morte das raposas deve-se apenas a causas naturais.
• o nascimento de raposas é função da quantidade de comida disponı́vel (num. de coelhos).
Baseando-nos nestes pressupostos, a interacção entre estas duas espécies num ecossistema isolado,
pode ser descrita por um modelo constituı́do por duas equações diferencias que traduzem a forma como estas populações evoluem. Considerando PC (t) e PR (t) respectivamente como sendo o
número de coelhos e de raposas, num instante t, temos:
PC0 (t) = a × PC (t) − b × PC (t) × PR (t)
PR0 (t) = e × b × PR (t) × PC (t) − c × PR (t)
Onde:
• a é a taxa de crescimento dos coelhos (na ausência de actos predatórios).
• c é a taxa de mortalidade das raposas na ausência de comida (coelhos).
• b é a taxa de mortalidade de coelhos (devida a actos predatórios).
• e é a eficiência com que os actos predatórios das raposas se traduzem no crescimento da sua
população.
Como simplificação para facilitar a nossa simulação e considerando que
PC (t + D) − PC (t)
D→0
D
PC0 (t) = lim
vamos transformar as equações anteriores nas sucessões:
PCn+1 = PCn + (a × PCn − b × PCn × PRn ) × D
PRn+1 = PRn + (e × b × PRn × PCn − c × PRn ) × D
Em que:
• PCn o número de coelhos na iteração n
• PRn o número de raposas na iteração n
• D é o intervalo de tempo entre duas iterações
e sendo PC0 e PR0 os valores iniciais das populações.
5
3.1
Objectivo
Pretende-se um programa que, baseado nas equações anteriormente descritas, e nos dados introduzidos pelo utilizador, faça uma simulação da evolução das populações de coelhos e de raposas.
O resultado deverá ser uma tabulação por dia, do número de coelhos e de raposas. O programa
deverá conter funções para:
1. a leitura dos dados da simulação. Os dados de entrada serão as populações iniciais de
coelhos PC0 e de raposas PR0, os parâmetros a, b, c e e, que caracterizam a evolução das
populações e a interacção entre elas, o intervalo de tempo D entre duas interações e o número
de dias durante o qual se pretende analisar a evolução das populações. Nota: para efeitos
de simulação considere que as raposas e os coelhos podem assumir valores fraccionários.
2. realização da simulação
3. cálculo do novo número de coelhos (baseado nas equações definidas anteriormente). Na
eventualidade de o valor calculado ser menor que zero, considere-o igual a zero.
4. cálculo do novo número de raposas (baseado nas equações definidas anteriormente). Na
eventualidade de o valor calculado ser menor que zero, considere-o igual a zero.
5. impressão do dia, correspondente número de coelhos e de raposas. O formato de escrita
deverá ser "%d\t%6.4f\t6.4f\n"
O programa deve no inı́cio apresentar um menu que permita ao utilizador:
1. introduzir os dados da simulação.
2. realizar a simulação.
3. sair do programa.
Como exemplo, teste o programa com os seguintes parâmetros:
• PC0 = 4
• PR0 = 3
• a = 0.1
• c = 0.1
• b = 0.1
• e = 0.1
• D =0.01
• dias = 1000
Poderá comparar os resultado, para estes dados, s como os do ficheiro output.txt
Referências
6
Download

1o ¯ Trabalho Prático de Programaç˜ao Imperativa 2001/2002