UNIVERSIDADE NOVA DE LISBOA
Faculdade de Ciências e Tecnologia
Departamento de Informática
Exame de Época de Recurso – ICP/PCE – 1º Semestre 04/05
Nome: __________________________________________________________________________
Nº: ___________
Curso: ____________
N.B. Duração: 2h 00m
SEM CONSULTA e não é permitida a utilização de máquinas de calcular. Para cada alínea seleccione no máximo uma opção. Numa escala de 0 a
20: se a opção escolhida estiver correcta vale 1 valor; se estiver errada desconta 0.25 valores.
Parte I - Octave
1ª Questão
Para cada uma das alíneas seguintes, indique o valor de x após ser executada a respectiva instrução.
a) x=sum([1:4].^2)
x=14
x=20
x=30
x=36
x=100
b) x=prod([2:3])^3
c) x=5+3.*[1:2:8]
x=15
x=18
x=35
x=125
x=216
x=[8
x=[8
x=[8
x=[8
x=68
14
11
32
14
6566]
29]
248 2192]
20 26]
2ª Questão
Considere a matriz M definida pela instrução Octave:
M=[3,4,1,4;5,0,3,4;0,4,1,2;4,3,3,3];
a) Qual o valor de S obtido pela instrução: S=M([1 3],3:4)
⎡1 4⎤
⎡3 4⎤
⎡1 4⎤
⎡1 2⎤
S= ⎢
S= ⎢
S= ⎢
S= ⎢
⎥
⎥
⎥
⎥
⎣3 4⎦
⎣1 4⎦
⎣1 2⎦
⎣1 4⎦
⎡1 2⎤
S= ⎢
⎥
⎣3 3⎦
b) Indique qual das seguintes opções é uma instrução Octave cujo resultado não dá erro.
A=[M,M;M];
A=[M+M;M^2];
A=[M:M;M];
A=M(1:3,1:2)^2;
A=M(0,3);
3ª Questão
Seja s uma cadeia de caracteres definida pela seguinte instrução Octave:
s="Rui da Costa Pina";
a) Qual o valor obtido pela instrução: size(split(s," "))(2)
5
4
20
[5 4]
[4 5]
b) Que instrução Octave poderia usar para obter uma cadeia de caracteres idêntica a s mas sem o
primeiro e último nome, ou seja, a cadeia de caracteres "da Costa".
strcat(deblank(split(s," ")(1,:))," ",deblank(split(s," ")(4,:)))
strcat(deblank(split(s," ")(2,:))," ",deblank(split(s," ")(3,:)))
split(s," ")([2 3],:)
strcat(split(s," ")([2 3],:))
deblank(strcat(split(s," ")([2 3],:)))
4ª Questão
Seja f uma função definida por:
function y = f(x)
x = 2^x;
y = 2*x;
endfunction;
Para cada um dos casos das alíneas seguintes indique os valores de x e z apresentados no ecrã pela
sequência de instruções:
x = 3; z = f(x); x, z
a) No caso em que o parâmetro da função é passado por valor (como no Octave):
x=3 z=16
x=8 z=16
x=16 z=16
x=3 z=y
x=8 z=y
b) No caso em que o parâmetro da função é passado por referência:
x=3 z=16
x=8 z=16
x=16 z=16
x=3 z=y
x=8 z=y
5ª Questão
Seja g uma função definida em Octave por:
function z = g(x,y)
if x==y z=y;
else z=g(min([y-x,x]),max([y-x,x])) ;
endif;
endfunction;
a) Qual o valor obtido pela instrução: g(36,48)
2
3
12
16
144
b) Sejam x>y>z inteiros positivos. O resultado da instrução g(z,g(y,x)) é:
uma mensagem de erro
o maior divisor comum de x, y, z
o menor divisor comum de x, y, z
o maior múltiplo comum de x, y, z
o menor múltiplo comum de x, y, z
6ª Questão
Qual das seguintes definições para a função fib escolheria de modo a que, para qualquer valor de
n inteiro positivo (n∈{1,2,3,…}), fib(n) calcule o valor do n-ésimo elemento da sequência de
Fibonacci (1,1,2,3,5,8,13,21,…)?
function f = fib(n)
f=fib(n-1)+fib(n-2);
endfunction;
function f = fib(n)
if n<=2 f=1;
else f=fib(n-1)+fib(n);
endif;
endfunction;
function f = fib(n)
f=1;
for i=3:n
f=f1+f2;f1=f2;f2=f;
endfor;
endfunction;
function f = fib(n)
if n<=2 f=1;
else f1=1;f=1;
for i=3:n
f1=f;f=f1+f;
endfor;
endif;
endfunction;
function f = fib(n)
F=ones(n);
for i=3:n
F(i)=F(i-2)+F(i-1);
endfor;
f=F(n);
endfunction;
7ª Questão
Considere um ficheiro de texto, alunos.txt, em que para cada aluno que já realizou a cadeira de ICP
existe um registo com os seguintes campos separados por tabs (todos os espaços entre os nomes
próprios e o apelido do aluno são “non breaking spaces”):
<Número do aluno> <Nome do aluno> <Nota a ICP> <Ano da aprovação>
No final de cada ano o ficheiro é actualizado, sendo acrescentados no fim do ficheiro os registos
correspondentes aos alunos que concluíram a cadeira durante esse ano.
a) A leitura, para uma lista, dos registos dos alunos que obtiveram uma nota superior a 15 valores é
feita pela seguinte função:
function [tab,n] = ler()
[f,msg]=fopen("alunos.txt","r");
tab=list(); n=0; S="%i%s%i%i";
[a.numero,a.nome,a.nota,a.ano,c]=fscanf(f,S,"C");
while !feof(f)
<acrescenta registo>
[a.numero,a.nome,a.nota,a.ano,c]=fscanf(f,S,"C");
endwhile; fclose(f);
endfunction;
Diga qual o código Octave que deve ser colocado em <acrescenta registo>:
n=n+1; tab=append(tab,a);
n=n+1; tab=append(tab,if(a.nota>15,a,0));
n=n+1; tab=if(a.nota>15,append(tab,a),tab);
if (a.nota>15) n=n+1; tab=append(tab,a); endif;
if (a.nota>15) n=n+1; tab=insert(tab,a); endif;
b) A função seguinte selecciona de um vector de índices apenas os que correspondem a alunos que
realizaram a cadeira no ano mais recente:
function L = seleccionar(tab,L0)
n=length(L0); ultimo=0;
for i=1:n
<ano da aprovação>
if ano > ultimo
L=[L0(i)]; j=1; ultimo=ano;
elseif ano == ultimo
j=j+1; L(j)=L0(i);
endif;
endfor;
endfunction;
Diga qual o código Octave que deve ser colocado em <ano da aprovação>:
ano=nth(tab,i).ano;
ano=nth(tab,L0(ano)).i;
ano=nth(tab,L0(i)).ano;
ano=tab(L0,i).ano;
ano=L0(i).ano;
c) A função seguinte ordena um vector de índices por ordem decrescente da nota obtida pelo aluno
e, tendo a mesma nota, por ordem crescente do número do aluno:
function L = ordenar(tab,L0)
L=L0; n=length(L0);
for k=n-1:-1:1
for i=1:k
nota1=nth(tab,L(i)).nota; nota2=nth(tab,L(i+1)).nota;
num1=nth(tab,L(i)).numero; num2=nth(tab,L(i+1)).numero;
if <condição>
temp=L(i); L(i)=L(i+1); L(i+1)=temp;
endif;
endfor;
endfor;
endfunction;
Diga qual o código Octave que deve ser colocado em <condição>:
((nota1<nota2) || (nota1==nota2 && num2<num1))
((nota1==nota2) || (nota1<nota2 && num2<num1))
((nota1<nota2) || (nota1==nota2 && num1<num2))
((nota1<nota2) && (nota1==nota2 || num2<num1))
((nota1==nota2) && (nota1<nota2 || num2<num1))
d) Considere as funções apresentadas nas alíneas anteriores e a seguinte função:
function mostrar(tab,L)
n=length(L); ano=nth(tab,L(1)).ano;
printf("O último ano em que se obteve uma nota a ICP ");
printf("superior a 15 valores foi em %i\n",ano);
nota_anterior=0;
for i=1:n
nota=nth(tab,L(i)).nota;
numero=nth(tab,L(i)).numero;
nome=nth(tab,L(i)).nome;
if nota <> nota_anterior
nota_anterior=nota;
printf("%i valores obtida pelos alunos:\n",nota);
endif;
printf("%i %s\n",numero,nome);
endfor;
endfunction;
Indique a sequência de instruções que escolheria para apresentar no ecrã: O último ano em que se
obteve uma nota superior a 15 valores a ICP; as notas superiores a 15 obtidas nesse ano (por ordem
decrescente) e, para cada nota, o número e nome dos alunos que a obtiveram (por ordem crescente
do número do aluno).
L=ler();L1=seleccionar(t,L);L2=ordenar(t,L1);mostrar(t,L2);
L=ler();mostrar(t,ordenar(t,seleccionar(t,L)));
[t,n]=ler();mostrar(t,ordenar(t,seleccionar(t,[1:n])));
[t,n]=ler();seleccionar(t,ordenar(t,mostrar(t,[1:n])));
mostrar(t,ordenar(t,seleccionar(t,ler())));
Parte II - Excel
8ª Questão
Uma bola de Bowling é lançada com uma velocidade inicial de v0 ms-1 numa pista de 18.2 m de
comprimento. Pretende-se usar o Excel para simular a trajectória da bola.
Para calcular a posição, a velocidade e a aceleração da bola no instante t+dt, sabendo o seu valor
aproximado no instante t, a simulação baseia-se nas seguintes aproximações:
x(t+dt) ≈ x(t) + v(t)×dt
v(t+dt) ≈ v(t) + a(t)×dt
a(t+dt) ≈ −k×v(t+dt)
Em que k é o coeficiente de atrito associado à bola.
Considere que nas células A1, B1, C1, D1, E1, F1 e G1 estão respectivamente o tempo inicial (0), a
posição inicial (0), a velocidade inicial (v0), a aceleração inicial (0), o intervalo de tempo entre cada
passo da simulação (dt), o coeficiente de atrito (k) e o comprimento da pista (18.2). Assuma que em
200×dt segundos, ou a bola pára ou atinge o fim da pista (e nunca sai para fora da pista).
a) Indique o conteúdo das células A2, B2, C2 e D2 de modo a que ao copiar abaixo (até à linha 200)
estas três células seja simulada a trajectória da bola.
A2=A1+E$1,
B2=B1+C1*E$1,
C2=C1+D1*E$1,
D2=-F1*C1
A2=A1+E$1,
B2=B1+C1*E$1,
C2=C1+D1*E$1,
D2=-F$1*C$1
A2=A1+E$1,
B2=B1+C1*E1,
C2=C1+D1*E1,
D2=-F1*C2
A2=A1+E$1,
B2=B1+C1*E$1,
C2=C1+D1*E$1,
D2=-F$1*C2
A2=A1+E$1,
B2=B1+C$1*E$1,
C2=C1+D$1*E$1,
D2=-F$1*C$2
b) De acordo com a simulação da alínea a) qual deve ser o conteúdo da célula H1 de modo a obter
uma aproximação da distância percorrida pela bola?
H1=G1
H1=MAX(B200,G1)
H1=MIN(B200,G1)
H1=MAX(B1:B200)
H1=MIN(B1:B200)
c) Suponha que além das células A2, B2, C2 e D2, também seria copiada abaixo (até à linha 200) a
célula E2 com o seguinte conteúdo:
E2=IF(B1>G$1,E1,A1)
Qual deve ser o conteúdo da célula I1 de modo a obter uma aproximação do tempo (em segundos)
que a bola demorou a atingir o fim da pista?
I1=IF(B200>G1,"Não atingiu o fim da pista ",E200)
I1=IF(B200>G1,E200,"Não atingiu o fim da pista")
I1=IF(E200>G1,"Não atingiu o fim da pista ",B200)
I1=IF(E200>G1,B200,"Não atingiu o fim da pista ")
I1=IF(I1<G1,I1,"Não atingiu o fim da pista ")
d) Que estratégia utilizaria para obter uma velocidade inicial para a qual o tempo demorado pela
bola a atingir o fim da pista fosse aproximadamente 5 segundos (assuma que 5<200×dt)?
Escreveria o valor 5 na célula I1 e obteria a respectiva velocidade inicial em C2.
Experimentaria diferentes valores em C2 até que I1 fique com o valor 5: se I1 for inferior a 5
aumento C2; caso contrário, se I1 ainda não for 5, diminuo C2.
Experimentaria diferentes valores em C2 até que I1 fique com o valor 5: se I1 for inferior a 5
diminuo C2; caso contrário, se I1 ainda não for 5, aumento C2.
Experimentaria diferentes valores em I1 até que C2 fique com o valor 5: se C2 for inferior a 5
aumento I1; caso contrário, se C2 ainda não for 5, diminuo I1.
Experimentaria diferentes valores em I1 até que C2 fique com o valor 5: se C2 for inferior a 5
diminuo I1; caso contrário, se C2 ainda não for 5, aumento I1.
Download

Enunciado - Universidade Nova de Lisboa