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.