Exame de Recurso

De GNU Octave
Revisão em 12h32min de 15 de janeiro de 2014 por Jgrocha (Discussão | contribs) (Programa para calcular o alcance de um míssil)

(dif) ← Revisão anterior | Revisão atual (dif) | Revisão seguinte → (dif)
Ir para: navegação, pesquisa

Exercícios de escolha múltipla

Nome próprio

O nome completo de uma pessoa é geralmente composto por três ou mais nomes. Dado um nome completo guardado na variável nome, escolha das seguintes expressões aquela que usaria para apresentar apenas o primeiro nome.

  1. nome(1:find(nome == " ")(1)-1)
  2. nome(1:find(isspace(nome))(end)-1)
  3. nome(1:find(nome = " ")(end)-1)
  4. nome(find(isspace(nome))(end)+1:end)
Resposta
  1. nome(1:find(nome == " ")(1)-1)

Letras distintas

Um nome de uma pessoa é composto por diferentes letras, algumas das quais se repetem. Por exemplo, no nome "Ana Maria Bastos" a letra 'a' aparece 5 vezes, independentemente de estar em maiúscula ou minúscula.

Escolha, das seguintes expressões aquela que usaria para calcular o número de letras DISTINTAS utilizadas no nome guardado na variável pessoa.

  1. length(unique(tolower(pessoa(pessoa != " "))))
  2. length(unique(tolower(pessoa(isspace(pessoa)))))
  3. length(lower(pessoa(1:end)))
  4. length(lower(unique(pessoa(!isspace(pessoa)))))
Resposta
  1. length(unique(tolower(pessoa(pessoa != " "))))

Funções condicionais simples

Calcular o menor de três números

Defina um função trimenor que recebe três números e devolve o menor dos três.

Exemplo:

>>> trimenor(8, 4, 12)
ans = 4
Resposta
function menor = trimenor(a, b, c)
% trimenor(a, b, c)
%	Recebe 3 números e retorna o menor deles.
%	Exemplo: 
%		x = trimenor(4, 2, 6)
%		x = 2
%
if (a<b & a<c)
	menor = a;
elseif (b<c & b<a)
	menor = b;
else
	menor = c;
endif
endfunction
Resposta (alternativa)

Nesta resposta, usa-se uma função auxiliar.

function res = menor(x, y)
% menor(x, y)
%	Recebe 2 números e retorna o menor deles.
%	Exemplo: 
%		x = menor(4, 2)
%		x = 2
%
  if (x < y)
    res = x;
  else
    res = y;
  endif
endfunction
function menor = trimenor(a, b, c)
% trimenor(a, b, c)
%	Recebe 3 números e retorna o menor deles.
%	Exemplo: 
%		x = trimenor(4, 2, 6)
%		x = 2
%
menor = menor(menor(a, b), c);
endfunction

Calcular o maior de três números

Defina um função trimaior que recebe três números e devolve o maior dos três.

Exemplo:

>>> trimaior(8, 4, 12)
ans = 12
Resposta
function menor = trimenor(a, b, c)
% trimenor(a, b, c)
%	Recebe 3 números e retorna o menor deles.
%	Exemplo: 
%		x = trimenor(4, 2, 6)
%		x = 2
%
if (a<b & a<c)
	menor = a;
elseif (b<c & b<a)
	menor = b;
else
	menor = c;
endif
endfunction

Funções para corrigir

Corrigir função impar

Pretende-se uma função impar em Octave que verifique se um número é ou não ímpar. Se for ímpar, a função retorna 1. Senão, retorna 0.

O professor de informática tentou escrever a função, mas mesmo depois de várias tentativas, não foi capaz de a por a funcionar.

Descarregue a função feita pelo professor, disponível em impar.m e corrija-a de forma a funcionar corretamente.

Depois de devidamente testada, envie a função corrigida.

Resposta
function verdade = impar(num)
% impar(num)
%	Recebe um número e verifica se é ou não ímpar.
%	Se for ímpar, retorna 1.
%	Se for par, retorna 0.
%	Exemplo: 
%		>>> impar(12)
%		ans = 0
%		>>> impar(13)
%		ans = 1
%
if (rem (num, 2) == 0)
   verdade = 0;
else
  verdade = 1;
endif
endfunction

Corrigir função quadrada

Pretende-se uma função quadrada em Octave que verifique se uma dada matriz é ou não quadrada. Se for, a função retorna 1. Senão, retorna 0.

O professor de informática tentou escrever a função, mas mesmo depois de várias tentativas, não foi capaz de a por a funcionar.

Descarregue a função feita pelo professor, disponível em quadrada.m e corrija-a de forma a funcionar corretamente.

Depois de devidamente testada, envie a função corrigida.

Resposta
function resultado = quadrada(mat)
% quadrada(mat)
%	Recebe uma matriz e verifica se é ou não quadrada.
%	Se for quadrada, retorna 1.
%	Se não for, retorna 0.
%	Exemplo: 
%		>>> a = eye(12);
%		>>> quadrada(a)
%		ans = 1
%
%		>>> b = 1:10;
%		>>> quadrada(b)
%		ans = 0
%
if (size(mat)(1) == size(mat)(2))
   resultado = 1;
else
  resultado = 0;
endif
endfunction

Programas

Programa para calcular o alcance de um míssil

Queremos calcular a trajetória de um míssil, lançado na posição x,y = 0,0, com um determinado ângulo theta e uma determinada velocidade inicial V.

O ângulo theta de lançamento pode variar entre ]0º, 90º]. Se o ângulo for 0º, significa um lançamento na horizonal. Se o ângulo for 90º, significa um lançamento na vertical.

A aceleração da gravidade na Terra (g) ao nível do mar e à latitude de 45° é aproximadamente igual a 9,80665 m/s².

Escreva um programa missil.m em Octave que peça um ângulo em graus, e uma velocidade inicial em m/s, para depois calcular:

  • a distância alcançada pelo míssil (Xmax)
  • o instante em que alcança a distância máxima (Txmax)

Recorra às seguintes fórmulas:

  • Xmax = 2 * ( V²/g) * sin(theta) * cos(theta)
  • Txmax = 2 * (V/g) * sin(theta)
Resposta
angulo = input("Angulo de lançamento?");
velocidade = input("Velocidade inicial?");
g = 9.80665;
# converte-se de graus para radianos
# em alternativa, podia-se usar as funções sind e cosd que trabalhos em graus
theta = angulo*pi/180;
Xmax = 2 * ( velocidade^2/g) * sin(theta) * cos(theta);
Txmax = 2 * (velocidade/g) * sin(theta);
printf("Um míssil lançado a %.2f graus a uma velocidade de %.2f m/s, atinge o solo a uma distância de %.2f m passados %.2f segundos", angulo, velocidade, Xmax, Txmax );
Resposta (alternativa)
angulo = input("Angulo de lançamento?");
velocidade = input("Velocidade inicial?");
g = 9.80665;
Xmax = 2 * ( velocidade^2/g) * sind(angulo) * cosd(angulo);
Txmax = 2 * (velocidade/g) * sind(angulo);
printf("Um míssil lançado a %.2f graus a uma velocidade de %.2f m/s, atinge o solo a uma distância de %.2f m passados %.2f segundos", angulo, velocidade, Xmax, Txmax );

Programa para calcular o alcance de uma bola de golfe

Queremos calcular a trajetória de uma bola de golfe, lançada na posição x,y = 0,0, com um determinado ângulo theta e uma determinada velocidade inicial V.

O ângulo theta de lançamento pode variar entre ]0º, 90º]. Se o ângulo for 0º, significa um lançamento na horizonal. Se o ângulo for 90º, significa um lançamento na vertical.

A aceleração da gravidade na Terra (g) ao nível do mar e à latitude de 45° é aproximadamente igual a 9,80665 m/s².

Escreva um programa golf.m em Octave que peça um ângulo em graus, e uma velocidade inicial em m/s, para depois calcular:

  • a distância alcançada pela bola (Xmax)
  • o instante em que alcança a distância máxima (Txmax)
Resposta

Recorra às seguintes fórmulas:

  • Xmax = 2 * ( V²/g) * sin(theta) * cos(theta)
  • Txmax = 2 * (V/g) * sin(theta)
angulo = input("Angulo de lançamento?");
velocidade = input("Velocidade inicial?");
g = 9.80665;
# converte-se de graus para radianos
# em alternativa, podia-se usar as funções sind e cosd que trabalhos em graus
theta = angulo*pi/180;
Xmax = 2 * ( velocidade^2/g) * sin(theta) * cos(theta);
Txmax = 2 * (velocidade/g) * sin(theta);
printf("Uma bola de golf lançada a %.2f graus a uma velocidade de %.2f m/s, atinge o solo a uma distância de %.2f m passados %.2f segundos", angulo, velocidade, Xmax, Txmax );

Gráficos

Programa para construir gráfico do Sporting Clube de Braga

No ficheiro sagres.m estão guardados 3 vetores com os resultados das primeiras 15 jornadas de 3 equipas da Liga Sagres.

Os pontos obtidos em cada jogo pelo Sporting Clube de Braga estão guardados na variável pontos_scb.

Escreva um programa Octave grafico.m para apresentar para cada uma das 15 jornadas num único gráfico:

  • os pontos (0, 1 ou 3) de cada jogo; formate estes valores com pontos do tipo '*' a magenta, unidos por linhas
  • os pontos acumulados ao longo das 15 jornadas; formate estes valores com pontos do tipo 'o' a vermelho, unidos por linhas
  • intitule o gráfico: Sporting Clube de Braga
  • legende o eixo dos x com: Jornadas da Liga Zon Sagres

Para calcular os pontos acumulados, use a função cumsum.

É pedido o programa que gera o gráfico, e não este propriamente dito. Tem que enviar o ficheiro grafico.m e apenas este.

Resposta
load sagres.m
jornadas = 1:15
plot(jornadas, pontos_scb, 'm*-', jornadas, cumsum(pontos_scb), 'ro-');
title("Sporting Clube de Braga");
xlabel("Jornadas da Liga Zon Sagres");

Como estava claro na pergunta, tinham que enviar apenas esta sequência de comandos.

Para ilustrar o resultado, o gráfico gerado teria o aspecto seguinte:

Pontos scb.png