(2010/2011 - 1º semestre) - técnico lisboa - autenticação · 2º exame: 12.2.2011 duraÇÃo: 2...

14
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

Upload: trandang

Post on 21-Sep-2018

212 views

Category:

Documents


0 download

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

borges
Rectangle

2/14

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.

13/14 Número:________ Primeiro e Último Nome:______________________________________________

14/14