(2010/2011 - 1º semestre) - técnico lisboa - autenticação · 2º exame: 12.2.2011 duraÇÃo: 2...
TRANSCRIPT
1/14 Número:________ Primeiro e Último Nome:______________________________________________
MEMec - LEAN
Computação e Programação (2010/2011 - 1º Semestre)
2º Exame: 12.2.2011
DURAÇÃO: 2 horas
Leia com atenção os pontos que se seguem:
Identifique todas as folhas deste enunciado. Comece por escrever o seu nome completo e
número de aluno nesta folha. Nas folhas seguintes escreva apenas o primeiro e último
nome, e o número de aluno.
Não desagrafe as folhas.
Leia todo o enunciado antes de começar a responder às perguntas.
Responda primeiro às perguntas que considerar mais acessíveis.
A prova é sem consulta.
Escreva as suas respostas nos espaços indicados.
Pode utilizar as páginas em branco como rascunho.
Inicie a prova apenas quando o docente der indicação.
Não se tiram dúvidas durante a realização da prova.
Nome
Número
3/14 Número:________ Primeiro e Último Nome:______________________________________________
P1 Análise e depuração de código em MATLAB (7 valores)
NOTA: utilize o símbolo para indicar mudança de linha e o símbolo para indicar tabulação
horizontal.
1.a) Apresente o(s) resultado(s) enviado(s) para o ecrã em cada um dos seguintes casos?
Vectores + Formatação Entrada/Saída
vector = [2.44 5.28 1.33];
fprintf('\t %3.1f \n', vector);
RESPOSTA: [0,5 val]
Repetição + Selecção
vec = [2 -3 -1 -2 0 -2 1];
for k = 1:2:length(vec)
if vec(k) > 0
fprintf('x = %d \n', vec(k)*2);
elseif vec(k) < 0
fprintf('x = %d \n', -vec(k)*2);
else
fprintf('x é zero \n');
end
end
RESPOSTA: [0,5 val]
Manipulação de strings
frase = 'Secreta';
chave = 1;
codigo = frase + chave;
fprintf('Palavra: %s \n', frase)
fprintf('Código: %s \n', char(codigo))
RESPOSTA: [0,5 val]
2.4
5.3
1.3
x = 4
x = 2
x é zero
x = 2
Palavra: Secreta
Código: Tfdsfub
4/14
Manipulação de Arrays de Estruturas
cromos(5) = struct('dataInicio', 19181214,...
'dataFim', 19191005,...
'nome', ' João do Canto e Castro',...
'notas', 'Partido Nacional Republicano');
cromos(1) = struct('dataInicio', 19110824,...
'dataFim', 19150525,...
'nome',' Manuel José de Arriaga',...
'notas', 'Partido Republicano Português');
for k = 1:4:5
fprintf('Nome: %s\n', cromos(k).nome)
end
RESPOSTA: [0,5 val]
Funções + Passagem de argumentos + Cell Arrays
a = myFun1(2, 1, 5)
b = myFun1(2, 2, 1, 3)
c = a * b
RESPOSTA: [0,5 val]
myFun1.m
function res = myFun1(varargin)
res = 1;
for i = 1:nargin,
res = res * varargin{i};
end
Tópicos Avançados
fprintf('res = %d \n',myFun2(4))
RESPOSTA: [0,5 val]
myFun2.m
function res = myFun2(n)
if (n < 0 || round(n)~=n)
error('n deve ser inteiro >=0.');
elseif (n == 0)
res = 1;
else
res = n * myFun2(n-1);
end
Nome: Manuel José de Arriaga
Nome: João do Canto e Castro
a =
10
b =
12
c =
120
res = 24
5/14 Número:________ Primeiro e Último Nome:______________________________________________
1.b) Pretende-se pesquisar por palavra-chave num array de estruturas denominado por cromos. O conteúdo
deste array de estruturas é a informação lida a partir de 18 ficheiros com dados dos presidentes da República
Portuguesa. Cada estrutura contém a seguinte informação relativa a um presidente:
Nome;
Data(s) de início de mandato(s);
Data(s) de fim de mandato(s);
Notas gerais.
Os ficheiros são identificados com o nome cromoK.dat, onde K representa o índice do ficheiro entre 1 e
18. A Figura 1 exibe o caso de um Presidente que cumpriu dois mandatos: o primeiro entre 06 de Agosto de
1915 e 02 de Dezembro de 1917 e o segundo entre 11 de Dezembro de 1925 e 31 de Maio de 1926.
Figura 1: exemplo do ficheiro cromo3.dat.
Cada um dos seguintes programas tem cinco situações de erro e cinco de omissão de comentários. Em cada
caso complete os comentários em falta, bem como corrija as situações de erro detectadas.
EXEMPLO DE RESPOSTA PARA 3 ERROS (Na sua resposta deve apenas assinalar situações para as quais
o código está incorrecto, ou faltam comentários, devendo identificar a linha e a respectiva alteração.)
1:
2:
3:
4:
5:
6:
7:
8:
letra = input('Resposta(S/N): ',s);
%
if letra == 's' || letra == 'S'
disp('Continuar')
elseif letra == 'n' | letra == 'N'
disp('Parar')
else
disp('Erro')
end
RESPOSTAS
1: letra = input('Resposta(S/N): ','s');
2: % Estrutura de selecção que apresenta mensagem mediante carácter introduzido
4: elseif letra == 'n' || letra == 'N'
NOTA: o primeiro comentário da função serve para descrever o que esta faz em termos genéricos. Os
comentários seguintes explicam as instruções, ou blocos de código, que lhes seguem.
6/14
função selecciona.m
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
function indice = selecciona(varargin)
%
if nargin = 1
%
if isempty(varargin{1})
error(O argumento de entrada está vazio.);
else
%
cromosIn == varargin{1};
end
else
%
error('A função recebe 1, e só 1, argumento de entrada.');
end
indice = [];
nLin, nCol = size(cromosIn);
%
for k = 1:nLin
if cromosIn(k,2) ~= 0
indice = [indice ];
end
end
[2,0 val] RESPOSTAS
2: % Função que selecciona do argumento de entrada as linhas cuja coluna dois é
% diferente de zero. Argumentos de entrada: varargin. Argumentos de saída:
% vector com os índices correspondentes à segunda coluna diferente de zero
3: if nargin == 1
4: % Teste de robustez que verifica se o argumento de entrada está vazio
6: error('O argumento de entrada está vazio.');
8: % Caso contrário, então atribui o conteúdo da célula 1 à variável cromosIn
9: cromosIn = varargin{1};
12: % Devolve erro se a função for chamada com mais do que um argumento de entrada
16: [nLin, nCol] = size(cromosIn);
17: % Percorre todas as linhas de cromosIn e guarda as que têm conteúdo na 2ª coluna
20: indice = [indice; k];
7/14 Número:________ Primeiro e Último Nome:______________________________________________
função pesquisa.m
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
function pesquisa(cromos,coleccao,palavraChave)
%
indice = selecciona;
campos = fields(cromos); % Devolve um cell array
for k = 1:1:length(indice)
for m = 1:size(campos)
%
texto = eval(sprintf('cromos(indice(%d)).%s',k,campos{m}));
%
if isnumeric(texto)
texto = num2str[texto];
end
%
ocorrencias = strfind(texto,palavraChave);
%
if isempty(ocorrencias)
fprintf('Encontradas: ');
fprintf(%d ocorrências ',length(ocorrencias));
fprintf('no campo ''%s'' ',campos{m});
fprintf('do cromo nº %d \n',k);
end
end
[2,0 val] RESPOSTAS
2: % Função que "pesquisa por palavra chave" nos campos da estrutura cromos
% Argumentos de entrada: cromos,coleccao,palavraChave
% Argumentos de saída: não tem
3: indice = selecciona(coleccao);
7: % Devolve o conteúdo do campo e estrutura especificados
8: % Se o conteúdo do campo for numérico, então converte para string
11: texto = num2str(texto);
13: % Determina as ocorrências da palavra chave no texto do campo e estrutura dados
15: % Apresenta informação relativa às ocorrências da palavra chave
16: if ~isempty(ocorrencias)
18: fprintf('%d ocorrências ',length(ocorrencias));
20: end
8/14
P2 Análise de Problema e Algoritmo (5 valores)
Pretende-se implementar um programa, tipo máquina de Multibanco, que decomponha uma determinada
quantia a levantar em notas dos tipos 200€, 100€, 50€, 20€, 10€ e 5€. Inicialmente o programa pede ao
utilizador a quantia a levantar, de seguida é calculado e apresentado no ecrã o número mínimo de notas de
cada tipo que perfazem essa quantia. Por exemplo, assumindo que a quantia solicitada é 95€, então,
95€ = 0 200€ + 0 100€ + 1 50€ + 2 20€ + 0 10€ + 1 5€
A quantia a levantar deve ser um valor múltiplo de 5€ e menor ou igual a 200€. Assume-se, por
simplificação, que existem infinitas notas de cada tipo.
[0,5 val] 2.a) Descreva as entradas/saídas do programa.
Entradas: montante a levantar (quantia)
Saídas: número de notas de cada tipo (numNotas200, numNotas100, numNotas50,
numNotas20, numNotas10, numNotas5)
[1,0 val] 2.b) Descreva a especificação funcional e os requisitos
Especificação funcional Requisitos
- o utilizador introduz o montante a levantar - o programa determina o menor número de notas em que se pode decompor o montante - o programa apresenta o número de notas de cada tipo
- os montantes são múltiplos de 5€ - o montante mínimo é 0€ - o montante máximo é 200€
[0,5 val] 2.c) Descreva os métodos de processamento
numNotas200 = quantia / 200
quantia = resto(quantia / 200)
numNotas100 = quantia / 100
quantia = resto(quantia / 100)
numNotas50 = quantia / 50
quantia = resto(quantia / 50)
numNotas20 = quantia / 20
quantia = resto(quantia / 20)
numNotas10 = quantia / 10
quantia = resto(quantia / 10)
numNotas5 = quantia / 5
NOTA: o símbolo “/ ” significa divisão inteira e resto(quantia / valor)
significa resto da divisão inteira de quantia por valor.
9/14 Número:________ Primeiro e Último Nome:______________________________________________
[1,0 val] 2.d) Descreva a abordagem Top-down
[2,0 val] 2.e) Escreva o algoritmo
1. Inicializar numNotas200 = 0, numNotas100 = 0, numNotas50 = 0,
numNotas20 = 0, numNotas10 = 0, numNotoas5 = 0
2. Pedir o montante a levantar 3. Ler o valor de quantia 4. Se quantia < 0 ou quantia > 200 ou resto(quantia/5) = 0
a. Mensagem de erro 5. Caso contrário
a. numNotas200 = quantia / 200 b. quantia = resto(quantia / 200) c. numNotas100 = quantia / 100 d. quantia = resto(quantia / 100) e. numNotas50 = quantia / 50 f. quantia = resto(quantia / 50) g. numNotas20 = quantia / 20 h. quantia = resto(quantia / 20) i. numNotas10 = quantia / 10 j. quantia = resto(quantia / 10) k. numNotas5 = quantia / 5
6. Apresentar numNotas200, numNotas100, numNotas50, numNotas20, numNotas10, numNotas5
NOTA: o símbolo “/ ” significa divisão inteira e resto(quantia / valor)
significa resto da divisão inteira de quantia por valor.
10/14
P3 Codificação de Programas em MATLAB (5 valores)
[2,0 val] 3.a) Implemente um script em MATLAB, de acordo com o algoritmo que se apresenta abaixo,
onde se pretende determinar a ordem de um determinado dia no ano para os anos comuns (mês de Fevereiro
tem 28 dias). Por exemplo, o dia 12 do mês 2 é o 43º dia do ano. O funcionamento do programa é o
seguinte: recebe do utilizador o dia e o mês como valores inteiros, depois calcula e apresenta o número de
ordem desse dia, nDia [1, 365].
ALGORITMO:
1) Apresentar mensagem ao utilizador pedindo o dia e o mês.
2) Ler os valores introduzidos para Dia e Mes, respectivamente.
3) Inicializar nDia = Dia
4) Repetir para contador = 1 até Mes-1, com incrementos de 1
a. Caso contador seja 1, 3, 5, 7, 8, 10 ou 12
i. nDia = nDia + 31
b. Caso contador seja 4, 6, 9 ou 11
i. nDia = nDia + 30
c. Caso contador seja 2
i. nDia = nDia + 28
5) Apresentar nDia
Resolução
dia = input('Qual o dia: ');
mes = input('Qual o mês: ');
nDia = dia;
for contador =1:1:mes-1
switch contador
case {1,3,5,7,8,10,12}
nDia = nDia + 31;
case {4,6,9,11}
nDia = nDia + 30;
case 2
nDia = nDia + 28;
end
end
fprintf('Corresponde ao %dº dia do ano.\n',nDia)
11/14 Número:________ Primeiro e Último Nome:______________________________________________
[3,0 val] 3.b) O factorial de , ou seja , pode ser calculado como se segue,
onde . Por exemplo,
0 1 2 3 4 5
1 1 2 6 24 120
Escreva um script em MATLAB que calcule e apresente no monitor o factorial de . O script deve pedir ao
utilizador o valor de , que deverá ser validado com a condição . O programa só deve terminar após
opção do utilizador, caso contrário deverá pedir novo valor de e repetir o cálculo.
Resolução
while true
n = input('Escreva o valor de n: ');
if or(n < 0, round(n) ~= n)
fprintf('n tem que ser Número Natural!\n');
else
factorial = 1;
for k=1:n
factorial = factorial * k;
end
fprintf('%d! = %d \n',n,factorial);
end
opcao = input('(C)ontinuar ou (T)erminar: ','s');
if upper(opcao) == 'T'
break
end
end
12/14
P4 Interface Gráfica do Utilizador - GUI (3 valores)
[1,0 val] 4.a) Descreva o que entende por Interface Gráfica do Utilizador (GUI) e quais são os elementos
típicos que constituem a GUI. Dê exemplos.
Resposta:
Uma GUI é um tipo de interface do utilizador que permite a interacção com dispositivos digitais através de
elementos gráficos como ícones e outros indicadores visuais, em contraste à interface de linha de comando,
que decorre via comandos de texto. A interacção é feita, geralmente, através de um rato ou um teclado, com
os quais o utilizador é capaz de seleccionar símbolos e manipulá-los de forma a obter algum resultado
prático. As componentes que constituem uma GUI tipo incluem:
• Sistema de janelas,
• Ícones e elementos gráficos,
• Menus/grupos de funções,
• Dispositivo de ponteiro, como por exemplo o rato.
[1,0 val] 4.b) Diga o que entende por programação orientada a eventos (event-driven programming).
Resposta:
O fluxo de execução do código na GUI é controlado por indicações externas, i.e. eventos, que esta não pode
controlar. Este modo de funcionamento resulta num tipo de programação denominado por programação
orientada a eventos (event-driven programming) onde a evolução do programa é condicionada por eventos,
como por exemplo o pressionar do botão do rato. A execução do programa desenvolve-se de modo
assíncrono, sendo determinada por acções externas à GUI.
Os eventos incluem acções do utilizador, acções devidas a outros elementos de código ou externas, i.e.
geradas pelo SO, como por exemplo a criação de um ficheiro no sistema de ficheiros ou a ligação de
hardware periférico. O controlo do programa não depende de um fluxo de execução programado no código
mas sim da sequência de elementos de código (callbacks) disparada por reacção aos eventos. O controlo do
fluxo da execução do programa constitui a principal diferença entre programação orientada a eventos e
programação de execução sequencial.
[2,0 val] 4.b) Descreva o que são “componentes” e “controlos” no contexto das GUI. Dê exemplos.
Resposta:
Os elementos da GUI que permitem a interacção com o utilizador são:
componentes, i.e. todos os elementos passivos que constituem a janela. Por exemplo, a componente
Static Text permite apresentar informação de texto na GUI;
controlos, i.e. todos as componentes activas que disparam elementos de código por reacção a
eventos, e que permitem a interacção entre o utilizador e o programa. Por exemplo, o controlo Push
Button fornece um botão que permite executar uma determinada tarefa quando é premido.