2 o Teste de ICE-B, 8 de Junho de 2019 (Versão B) Três páginas com 7 perguntas+tp2, três folhas de resposta. Duração total: 2 horas Atenção: Preencha cuidadosamente cada folha de resposta, escrevendo o seu nome e o número de aluno no canto superior direito e pintando os círculos correspondentes a cada dígito do número. Por baixo do seu nome, pinte também os círculos correspondentes ao número de filas de alunos à sua frente e ao número de lugares para alunos à sua direita, na sua fila. Cada pergunta tem um número único; responda apenas dentro da caixa respectiva. Pode usar o enunciado como folha de rascunho mas não escreva fora das caixas nem no verso das folhas de resposta. Pergunta 1 [2 valores] Considere cada um dos fragmentos de programa apresentados nas aĺıneas seguintes. Para cada um deles, desenhe na folha de resposta o gráfico produzido indicando também os valores nos eixos. Gráfico A Gráfico B import matplotlib.pyplot as plt y = [4,2,1,5] x = [] for val in range(4): x.append(val) plt.plot(x,y, o ) import matplotlib.pyplot as plt a = [1,2,3,4] b = [] for v in a: if v<3: b.append(4-v) else: b.append(v) plt.plot(a,b) Pergunta 2 [2 valores] Considere que na sua área de trabalho está presente um ficheiro de nome camoes.txt contendo estas linhas à esquerda. Indique os valores das variáveis a, b e c após a execução destas instruções à direita. Amor é fogo que arde sem se ver; É ferida que dói e n~ao se sente; É um contentamento descontente; É dor que desatina sem doer; lines = open("camoes.txt","r").readlines() line = lines[2] parts = line.split( ) a = parts[0] b = parts[:2] c = parts[0]+parts[-1] Pergunta 3 [2,5 valores] Considere que tem a função func criada e o ficheiro in.txt na sua pasta de trabalho: def func(leitura, escrita): "documentacao omitida..." lines = open(leitura).readlines() ofil = open(escrita, w ) Ficheiro in.txt (com 3 linhas) for line in lines: Cam~oes=1580 clean = line.strip() Bocage=1805 ps = clean.split( = ) Pessoa=1935 time = 2019-int(ps[-1]) if time>200: ofil.write( {0}-{1}\n.format(time,ps[0])) ofil.close() Supondo que se executa o comando func( in.txt, out.txt ), escreva na folha de resposta o conteúdo do ficheiro out.txt
2 Pergunta 4 [2,5 valores] A função massa total está implementada parcialmente. Esta função lê para uma lista de dicionários os dados num ficheiro de texto no qual cada linha tem o elemento, o número de átomos e a massa atómica, separados pelo carácter : (dois pontos). Após carregar os registos, a função usa a lista de dicionários para calcular a massa total, somando o produto de cada massa atómica pelo número de átomos. Preencha o código em falta na função (assinalado pelas linhas tracejadas). Pergunta 5 [4 valores] Preocupado com o vício com o Heroes of the Storm, o João criou a base de dados jogo.bd desta forma para monitorizar a sua actividade: CREATE TABLE Herois (nome TEXT, tipo TEXT, origem Text INTEGER, PRIMARY KEY(nome)); CREATE TABLE Jogos (data TEXT, nome TEXT, horas REAL, ganhos INT, perdidos INT); INSERT INTO Herois VALUES ("Nova","Ranged Assassin","Starcraft"); INSERT INTO Herois VALUES ("Valeera","Melee Assassin","Warcraft"); INSERT INTO Herois VALUES ("Malfurion","Healer","Warcraft"); INSERT INTO Herois VALUES ("D.Va","Bruiser","Overwatch"); INSERT INTO Herois VALUES ("Valla","Ranged Assassin","Diablo"); INSERT INTO Herois VALUES ("Probius","Ranged Assassin","Starcraft"); INSERT INTO Herois VALUES ("Lt. Morales","Healer","Starcraft"); INSERT INTO Herois VALUES ("Rehgar","Healer","Warcraft"); INSERT INTO Herois VALUES ("Genji","Ranged Assassin","Overwatch"); INSERT INTO Herois VALUES ("Zagara","Ranged Assassin","Starcraft"); INSERT INTO Jogos VALUES ("2019-05-12","Nova",3.5,2,1); INSERT INTO Jogos VALUES ("2019-05-12","Valeera",6.2,1,4); INSERT INTO Jogos VALUES ("2019-05-13","Malfurion",2.6,1,2); INSERT INTO Jogos VALUES ("2019-05-13","Nova",9.8,3,2); INSERT INTO Jogos VALUES ("2019-05-14","Malfurion",10.2,1,8); INSERT INTO Jogos VALUES ("2019-05-15","D.Va",8.6,3,0); Indique o resultado de cada um dos seguintes comandos SQL (aĺıneas a, b, c, d). Tenha atenção à posição das caixas na folha de resposta 5.a) SELECT DISTINCT data FROM Jogos ORDER BY data; 5.b) SELECT horas FROM Jogos WHERE data = "2019-05-13"; 5.c) SELECT Herois.nome, horas FROM Herois,Jogos WHERE Herois.Nome = Jogos.nome AND horas > 5; 5.d) SELECT max(horas) FROM Jogos,Herois WHERE Herois.Nome = Jogos.nome; Atenção: a próxima aĺınea tem caixa de resposta na segunda folha 5.e) Indique que comando SQL daria para obter todos os tipos de herói, sem repetições, com os quais o João jogou mas só contando heróis cuja origem é o jogo Warcraft. Pergunta 6 [4,5 valores] Considere as tabelas Herois e Jogos da pergunta 5, na base de dados jogo.bd. Pretende-se que escreva o código de duas funções que, em conjunto, permitam escrever num ficheiro o conteúdo dos campos nome e tipo dos registos da tabela Herois de todos os heróis de uma dada origem (parâmetro origem da função select records). Cada registo ocupa uma linha do ficheiro, sendo o nome e o tipo de cada herói separados por ponto e vírgula (carácter ;). Adicionalmente, a primeira linha deve indicar o nome dos campos (nome e tipo), igualmente separados por ponto e vírgula. Para o efeito, decidiu-se dividir a resolução do problema em duas funções: select records, que devolve uma lista de dicionários com os registos seleccionados, e write records que escreve uma lista de dicionários com os registos para o ficheiro indicado. Nesta pergunta e nas seguintes admita que tem disponível a função query db dada nas aulas teóricas e que já foi importado o módulo sqlite3:
3 import sqlite3 def query_db(db_name,query): """devolve uma lista de dicionários com o resultado de um comando SELECT cada dicionário na lista tem como chaves os nomes das colunas seleccionadas db_name é o nome da base de dados; query é o comando SQL do SELECT"""... 6.a) Preencha o código da função select records que recebe como argumentos nome bd com o nome da base de dados e origem com a origem e devolve devolve uma lista de dicionários com o nome e tipo de todos os heróis dessa origem nessa base de dados. 6.b) Preencha o código da função write records(records, out file) que recebe como argumentos records, que é uma lista de dicionários, cada um com chaves nome e tipo, e out file com o nome do ficheiro onde serão escritos os resultados. Cada resultado ocupa uma linha com nome e tipo separados por ; e o ficheiro deve ter uma linha de cabeçalho indicando os nomes dos campos, com o mesmo separador. 6.c) Supondo que a base de dados alunos.bd já foi criada e preenchida, e que as funções referidas anteriormente estão implementadas, indique os comandos a dar no interpretador para gerar o ficheiro com o nome diablo.txt contendo os nomes e tipos dos heróis nessa base de dados cuja origem é o jogo Diablo. Pergunta 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 da base de dados e o nomes de dois campos numéricos da tabela Jogos, que poderão ser horas, ganhos ou perdidos, e que marca num gráfico, com o símbolo x a verde, todos os pontos obtidos na base de dados em que o valor de x será o do primeiro campo escolhido e o valor de y o do segundo. Defesa do Trabalho 2 TP2 a) Para carregar cada um dos ficheiros de compostos era preciso inserir informação nas tabelas Compostos e Atributos. Foi preciso usar ciclos? Se sim, para quê? TP2 b) No comando LISTA era preciso encontrar os compostos que correspondiam à fórmula empírica e que tinham um atributo indicado opcionalmente. Explique como é que seleccionou os compostos que tinham esse atributo, no caso de estar especificado. TP2 c) Também no comando LISTA era preciso comparar a fórmula química com a fórmula empírica. Explique resumidamente como determinou se estas correspondiam. TP2 d) Os comandos REPORT e BASE DADOS especificavam, respectivamente, o nome do ficheiro de relatório para as listas de compostos e o nome do ficheiro da base de dados. Explique resumidamente como resolveu no seu programa o problema de guardar estes nomes e usá-los onde necessário. TP2 e) Se o ficheiro de ordens tiver um comando BASE DADOS especificando o nome de uma base de dados, depois comandos para operar sobre essa base de dados, depois um comando BASE DADOS especificando o nome de uma base de dados diferente e mais operações, o seu programa consegue executar cada operação na base de dados correcta? Explique como garante isso. CREATE TABLE nometabela ( nomecampo tipo, nomecampo tipo,..., PRIMARY KEY ( ) ); Alguns tipos são INTEGER, REAL e VARCHAR(... ) INSERT INTO nometabela VALUES ( valorcampo1, valorcampo2,...); SELECT qualificativo nomecampo,... FROM NomeTabela,... WHERE express~ao ; A expressão pode incluir AND e OR e operadores relacionais (>, <, >=, <=) e LIKE. O nome do campo poder substituído por *. O qualificativo pode não aparecer ou ser um como, por exemplo, DISTINCT, MAX e COUNT.
1) Gráfico A 1) Gráfico B 2) a= b= c= 3) 4) def massa_total(nome_fich): """nome_fich e o nome de um ficheiro nao vazio no qual cada linha tem o elemento, o número de átomos e a massa atómica Devolve a massa total de todos os átomos no ficheiro""" lines = open(nome_fich) atoms = [] for line in lines: ps = reg = {} reg[ num ] = int(ps[1]) reg[ mass ] = atoms.append(reg) for d in atoms: return massa 5a) 5b) 5c) 5d)
5 e) 6 a) def select records(nome bd, origem): "Devolve lista de dicionários com nome e tipo de heróis da origem" 6 b) def write records(records, out file): "Escreve para out file os nomes e tipos dos heróis em records" 6 c) 7) def grafico(nome bd, val1, val2): "desenha o grafico dos valores indicados da tabela Jogos"
TP2 a) TP2 b) TP2 c) TP2 d) TP2 e)