Diferenças entre edições de "Exame de Recurso"

De GNU Octave
Ir para: navegação, pesquisa
(Funções condicionais simples)
(Programa para calcular o alcance de um míssil)
 
(Há 3 edições intermédias do mesmo utilizador que não estão a ser apresentadas)
Linha 58: Linha 58:
 
menor = c;
 
menor = c;
 
endif
 
endif
 +
endfunction
 +
</syntaxhighlight>
 +
 +
=====Resposta (alternativa) =====
 +
 +
Nesta resposta, usa-se uma função auxiliar.
 +
 +
<syntaxhighlight>
 +
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
 +
</syntaxhighlight>
 +
 +
<syntaxhighlight>
 +
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
 
endfunction
 
</syntaxhighlight>
 
</syntaxhighlight>
Linha 134: Linha 166:
  
 
Depois de devidamente testada, envie a função corrigida.
 
Depois de devidamente testada, envie a função corrigida.
 +
 +
=====Resposta=====
  
 
<syntaxhighlight>
 
<syntaxhighlight>
Linha 157: Linha 191:
 
endfunction
 
endfunction
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
 +
===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=====
 +
 +
<syntaxhighlight enclose="div">
 +
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 );
 +
</syntaxhighlight>
 +
 +
=====Resposta (alternativa) =====
 +
 +
<syntaxhighlight enclose="div">
 +
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 );
 +
</syntaxhighlight>
 +
 +
====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)
 +
 +
<syntaxhighlight  enclose="div">
 +
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 );
 +
</syntaxhighlight>
 +
 +
===Gráficos===
 +
 +
====Programa para construir gráfico do Sporting Clube de Braga====
 +
 +
No ficheiro [http://octave.di.uminho.pt/images/files/sagres.m 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=====
 +
 +
<syntaxhighlight>
 +
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");
 +
</syntaxhighlight>
 +
 +
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:
 +
 +
[[Ficheiro:Pontos scb.png]]

Edição atual desde as 11h32min de 15 de janeiro de 2014

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