Informática para as Ciências e Engenharias - 2º semestre 2015/2016
2º Teste, 6 de Junho de 2016, 2h – versão A
Nome: Nº Avisos: Sem consulta; a interpretação do enunciado é da responsabilidade do estudante; se necessário explicite na resposta a sua interpretação.Questão 1 – 1+1 valores
Considere cada um dos fragmentos de programa apresentados nas alíneas seguintes. Para cada um deles, desenhe o gráfico produzido, indicando as coordenadas dos pontos marcados. a) b)
Questão 2 – 2 valores
Considere que no URL http://di.fct.unl.pt/ice/t.txt está acessível um ficheiro com o seguinte conteúdo. XYZ/AAA/123 Após a execução de todas as instruções, que vêm a seguir, quais os valores armazenados nas variáveis len, s1 e s2 s = urlread(‘http://di.fct.unl.pt/ice/t.txt’); loc = strfind( s,’/’); len = length(loc); s1 = s(1:loc(1)-1); s2 = s(len+2:end); Resposta: len = 2 s1 = ‘XYZ’ s2 = ‘AAA/123’ x = sqrt(4); y = x – 1; z = [x, y, 3]; w = [x-2,2,y]; plot(z,w,’*’); for i = 1:3 x(i) = i; v(i) = 2*i; end plot( x, v, ‘*’);
Questão 3 – 2,5 valores
Considere a função MATLAB function func( fichIn, fichOut) fr = fopen( fichIn, ‘r’ ); fw = fopen( fichOut, ‘w’); while ~feof(fr) lin = fgetl(fr); vec_pos = findstr( lin, ‘/’ ); fprintf( fw, ‘%s-%s\n’, lin(1:vec_pos(1)-1), lin(vec_pos(2)+1:end)); end fclose(fr); fclose(fw); end Sendo o conteúdo do ficheiro in.txt o seguinte: XYZ/AAA/123 XWW/ABC/456 YYZ/CCC/789 e supondo que se executa no Octave o comando: prompt_do_Octave>> func( ‘in.txt’, ‘out.txt’) qual é o conteúdo do ficheiro out.txt ? Resposta: XYZ-123 XWW-456 YYZ-789Questão 4 – 2,5 valores
A função func1 está implementada parcialmente. Esta função lê para um vetor de estruturas ve o conteúdo de um ficheiro de texto em que cada linha contém, separados por uma vírgula, o nome de um local e a temperatura em graus centígrados medida nesse lugar. Após o carregamento do vetor de registos, a função determina a maior temperatura registada. Escreva as partes em falta do código da função func1. % tMax = func1(nomeFich) % nomeFich e’ o nome de um ficheiro com pelo menos uma linha, em que cada linha tem % uma string com o nome de um local separado por uma virgula do valor da temperatura medida % tMax é a temperatura mais elevada registada function tMax = func1( nomeFich ) f = fopen( nomeFich, ‘r’); idx = 1; while ~feof(f) line = fgetl(f); vecPos = strfind( line, ‘,’); s.local = line(1:vecPos(1)-1); s.temp = str2num(line(vecPos(1)+1:end)); ve(idx) = s; idx = idx+1; end close(f); tMax = s(1).temp; for i = 2: length(ve) if ve(i).temp > tMax
Questão 5 – 1+1+1+1 valores
Suponha que na base de dados xpto.db foram criadas e preenchidas duas tabelas com os seguintes comandos CREATE TABLE T1( id VARCHAR(5), cod VARCHAR(5), p1 REAL, p2 REAL, p3 REAL, PRIMARY KEY(id)); CREATE TABLE T2( cod VARCHAR(5), x1 REAL, x2 REAL, PRIMARY KEY(cod)); INSERT INTO T1 Values( ‘a111’, ‘xxx’, 2.1, 3.0, 45); INSERT INTO T1 Values( ‘a121’, ‘xxx’, 2.2, 3.5, 55); INSERT INTO T1 Values( ‘b111’, ‘yyy’, 2.3, 3.0, 43); INSERT INTO T1 Values( ‘b121’, ‘zzz’, 2.4, 4.0, 22); INSERT INTO T2 Values( ‘xxx’, 5.5, 3.0); INSERT INTO T2 Values( ‘yyy’, 5.7, 2.5); INSERT INTO T2 Values( ‘zzz’, 6.1, 3.0); Indique o resultado devolvido para cada um dos seguintes comandos; a) SELECT id, p1 FROM T1 WHERE p2 >= 3.5; a121|2.2 b121|2.4 b) SELECT DISTINCT cod FROM T1; xxx yyy zzz c) SELECT p1 FROM T1,T2 WHERE x2=2.5 AND T1.cod=T2.cod; 2.3 d) SELECT COUNT(x1) FROM T2 WHERE x2 > 2.5; 2
Questão 6 – 1.75+1.75+1 valores
Considere as tabelas T1 e T2 da pergunta 5 que estão guardadas numa base de dados com o nome ‘teste2.bd’. Pretende-se que escreva o código de duas funções que, em conjunto, permitem escrever num ficheiro o conteúdo dos campos id e p2 dos registos da tabela T1 em que o campo p3 é igual a um valor dado. Para o efeito, decidiu-se dividir a resolução do problema em duas funções obtemRegistos e imprimirRegistos. Nesta pergunta e nas seguintes admita que tem disponíveis as funções: % result = sqlite(sql, db) % Executa a instrucao SQL guardada na string sql na base de dados com o nome db. % Retorna o resultado que o SQLite3 retornar. function result = sqlite( sql, db ) % recs = parseRecords(sqlResult, nameString)
% Retorna no vetor de estruturas recs os registos devolvidos pelo SQLite3, que estao na string sqlResult. % A string nameString tem os nomes dos campos pedidos `a BD, separados por '|'. % Os campos de recs tem esses mesmos nomes. function recs = parseRecords( sqlResult, nameString ) a) Preencha o código da função obtemRegistos % ve = obtemRegistos(nomeBD, valorTeste) % nomeBD é o nome da base de dados; valorTeste é o valor procurado para o parâmetro p3 % ve é um vetor de estruturas que contém os campos id e p2 da tabela T1 function ve = obterRegistos( nomeBD, valorTeste)
sql = sprintf(‘SELECT id, p2 FROM T1 WHERE p3 = %f;’, valorTeste); x = sqlite(sql,nomeBD); ve = parseRecords(x, ‘id|p2’); end b) Preencha o código da função imprimirRegistos % imprimirRegistos(ve_T1, nomeFichResultados) % ve_T1 é um vetor de estruturas do tipo devolvido por obterRegistos % nomeFichResultados é o nome do ficheiro onde serão escritos os resultados function imprimirRegistos(ve_T1, nomeFichResultados) fid = fopen(nomeFichResultados,’w’) for i = 1:length(ve_T1)
fprintf(fid, ‘%s/t%f/n’, ve_T1(i).id, ve_T1(i).p2)); end;
end
c) Supondo que a base de dados teste2.bd já foi criada e preenchida, e que na diretoria corrente existem os ficheiros obterRegistos.m e imprimirRegistos.m quais os comandos a dar no interpretador para obter um ficheiro com o nome xpto.txt que contenha os campos id e p2 de todos os registos da tabela T1 em que o campo p3 é igual a 34. x = obterRegistos( ‘teste2.bd’, 34) imprimirRegistos(x, ‘xpto.txt’)
Questão 7 – 2.5 valores
Considere novamente a base de dados definida na pergunta 5. Pretende-se o código de uma função que recebe como parâmetros o nome de 2 campos da tabela T1 – p1, p2 ou p3 – e que marca num gráfico todos os pontos (x,y) obtidos na base de dados em x é o valor do 1º parâmetro escolhido e y é o valor do 2º parâmetro escolhido % grafico(nomeBaseDados, nomePar1, nomePar2) % nomeBaseDados é o nome da base de dados onde estão as tabelas T1 e T2 % nomepar1 é o nome do parâmetro que aparece nas abcissas % nomepar2 é o nome do parâmetro que aparece nas ordenadas function grafico(nomeBaseDados, nomePar1, nomePar2)sql = sprintf(‘SELECT %s, %s FROM T1’, nomePar1, nomePar2); res = sqlite(sql, nomeBaseDados);
s = parseRecords(res, ‘c1|c2’); n = length(s) x = zeros(1,n); y = zeros(1,n); for i = 1:length(s) x(i) = s(i).c1; y(i) = s(i).c2; end; plot(x,y,’*’); end