Informática para Ciências e Engenharias - 2º semestre 2016/2017 2º Teste, 5 de Junho de 2016, 1h:45m versão B ICE: ; 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. y a) x = 0:4; for i = 1:length(x); y(i) = 4-(x(i)-2)^2; plot(x,y, * ); 3 1 1 3 b) v 5 v = [5,4.5,4,3.5,3,2.5,2] for i = 1:7 u(i) = 10-2*v(i); plot( u, v); 3 1 1 3 5 u Questão 2 2 valores Considere que no URL http://di.fct.unl.pt/ice/teste.txt está acessível um ficheiro com o seguinte conteúdo. http://xpto.fcsh.unl.pt/ucp/teste.txt Após a execução de todas as instruções, que vêm a seguir, quais os valores de bars(1), A, B e C? str = urlread( http://di.fct.unl.pt/ice/teste.txt ); colons = strfind(str, : ) Resposta bars = strfind(str, / ) bars(1) = 6 A = str(1:colons(1)-1); A = http B = str(bars(2)+1:bars()); B = xpto.fcsh.unl.pt/ucp/ C = str(bars()+1:)); C = teste.txt ICE 2016/17 2º semestre Teste 2 versão B 1
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 = strfind( lin, ; ); fprintf( fw, %s-%s\n, lin(vec_pos(2)+1:), lin(1:vec_pos(1)-1)); fclose(fr); fclose(fw); So o conteúdo do ficheiro in.txt o seguinte: id_1;maria;azul id_2;rui;verde id_3;carlos;vermelho 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? Questão 4 2,5 valores Resposta: 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 um ponto e vírgula, o nome de uma cidade e sua população. Após o carregamento do vetor de registos, a função determina a menor população registada. Escreva as partes em falta do código da função func1. % pmin = 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 uma cidade separado por ponto e virgula do valor da sua populacao % pmin devera ser a menor populacao registada entre as várias cidades function pmin = func1( nomefich ) f = fopen( nomefich, r ); ve = [] while ~feof(f) linha = fgetl(f); pvs = strfind( linha, ; ); s.cidade = linha(1:pvs(1)-1); s.pop = str2num(linha(pvs(1)+1:)); ve = [ve,s]; fclose(f); pmin = ve(1).pop; for i = 2: length(ve) if ve(i).pop < pmin pmin = ve(i).pop; azul-id_1 verde-id_2 vermelho-id_3 ICE 2016/17 2º semestre Teste 2 versão B 2
Questão 5 4 valores Suponha que na base de dados carros.bd foram criadas e preenchidas duas tabelas com os seguintes comandos CREATE TABLE Carros ( matricula TEXT, modelo TEXT, cor TEXT, custo REAL, PRIMARY KEY(matricula)); CREATE TABLE Modelos ( modelo TEXT, marca TEXT, consumo REAL, peso INTEGER, lugares INTEGER, PRIMARY KEY(modelo)); INSERT INTO Carros Values( 15-CD-84, para2, azul, 7000); INSERT INTO Carros Values( 28-EP-45, clip, verde, 10000); INSERT INTO Carros Values( 39-LM-03, para2, cinza, 9000); INSERT INTO Carros Values( 28-PQ-34, safir, azul,15000); INSERT INTO Carros Values( 51-SA-NT, clip, branco,14000); INSERT INTO Carros Values( 08-OD-11, clip, azul,12000); INSERT INTO Modelos Values( clip, reno, 4.5, 1200, 5); INSERT INTO Modelos Values( para2, small, 3.7, 900, 2); INSERT INTO Modelos Values( safir, opal, 4.2, 1500, 7); Indique o resultado devolvido para cada um dos seguintes comandos (alínes a) até d)): a) SELECT marca, modelo FROM Modelos WHERE lugares >= 5; reno clip opal safir b) SELECT DISTINCT modelo FROM Carros; para2 clip safir c) SELECT matricula, custo FROM Modelos, Carros WHERE consumo = 4.5 AND Modelos.modelo=Carros.modelo; 28-EP-45 10000 51-SA-NT 14000 08-OD-11 12000 d) SELECT count (cor) FROM Modelos, Carros WHERE Carros.modelo = Modelos.modelo AND marca = small ; 2 e) Indique que comando SQL daria para obter a matrícula e a cor de todos os carros que consomem menos de 4 (litros/100km) SELECT matricula, cor FROM Modelos, Carros WHERE consumo < 4.0 AND Modelos.modelo=Carros.modelo; ICE 2016/17 2º semestre Teste 2 versão B 3
Questão 6 1.75 + 1.75 + 1 valores Considere as tabelas Carros e Modelos da pergunta 5 que estão guardadas numa base de dados com o nome carros.bd. Prete-se que escreva o código de duas funções que, em conjunto, permitem escrever num ficheiro o conteúdo dos campos matricula e cor dos registos da tabela Carros de todos os carros em que o campo custo é não menor que um valor especificado (parâmetro customin da função obtemregistos). Cada resultado ocupa uma linha, so a matrícula e cor de cada carro separados por dois pontos :, devo a primeira linha indicar o nome dos campos, igualmente separados por dois pontos. 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 % vea = obtemregistos(nomebd, customin) % nomebd é o nome da base de dados; customin é o menor valor aceite para o custo do carro % vea é um vetor de estruturas que contém os campos matricula e cor dos carros seleccionados function vea = obterregistos( nomebd, customin) sql = sprintf( SELECT matricula, cor FROM Carros WHERE custo >= %s ;, customin); x = sqlite(sql,nomebd); vea = parserecords(x, matricula cor); b) Preencha o código da função imprimirregistos % imprimirregistos(veb, nomefichresultados) % veb é um vetor de estruturas do tipo devolvido pela funcao obterregistos % nomefichresultados é o nome do ficheiro onde serão escritos os resultados % Cada resultado ocupa uma linha, so a matricula e a cor separados por dois pontos function imprimirregistos(veb, nomefichresultados) fid = fopen(nomefichresultados, w ) fprintf(fid, matricula:cor ); for i = 1:length(veB) fprintf(fid, %s:%s\n, veb(i).matricula, veb(i).cor); ; fclose(fid) c) Supondo que a base de dados carros.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 carotes.txt que contenha os campos matricula e cor de todos os registos da tabela Carros com custo mínimo de 13000. >> x = obterregistos( carros.bd, 13000 ) >> imprimirregistos(x, caros.txt ) ICE 2016/17 2º semestre Teste 2 versão B 4
Questão 7 2.5 valores Considere novamente a base de dados definida na pergunta 5. Prete-se o código de uma função que recebe como parâmetros o nome de 2 campos da tabela Modelos consumo, peso ou lugares e que marca num gráfico, através de um símbolo + a azul, 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, par1nome, par2nome) % nomebasedados é o nome da base de dados onde estão as tabelas % par1nome é o nome do parâmetro que aparece nas abcissas % par2nome é o nome do parâmetro que aparece nas ordenadas function grafico(nomebasedados, par1nome, par2nome) sql = sprintf( SELECT %s, %s FROM Modelos, par1nome, par2nome); 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) = str2num(s(i).c1); y(i) = str2num(s(i).c2); ; plot(x,y, +b ); // Apice Sintaxe de Comandos SQL utilizados neste teste Comando SQL CREATE TABLE nometabela ( nomecampo tipo, nomecampo tipo,, PRIMARY KEY ( ) ); Notas Alguns tipos são INTEGER, REAL e VARCHAR( ) INSERT INTO nometabela VALUES ( valorcampo1, valorcampo2, ); SELECT qualificativo nomecampo, FROM NomeTabela, WHERE expressão ; A expressão inclui nomes de campos; pode incluir o operador lógicos AND, os operadores relacionais >, <, >=, <= e também o operador LIKE O nome do campo poder substituído por * O qualificativo pode não parecer, mas exemplos de qualificativos são DISTINCT, MAX e COUNT. ICE 2016/17 2º semestre Teste 2 versão B 5