Diferenças entre edições de "Exame de Recurso"
(→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
Índice
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.
- nome(1:find(nome == " ")(1)-1)
- nome(1:find(isspace(nome))(end)-1)
- nome(1:find(nome = " ")(end)-1)
- nome(find(isspace(nome))(end)+1:end)
Resposta
- 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.
- length(unique(tolower(pessoa(pessoa != " "))))
- length(unique(tolower(pessoa(isspace(pessoa)))))
- length(lower(pessoa(1:end)))
- length(lower(unique(pessoa(!isspace(pessoa)))))
Resposta
- 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
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)
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)
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: