Diferenças entre edições de "Teste de Avaliação de 22 de janeiro"
(→Pergunta 6 (Escolha múltipla): Resolução de equações) |
(→Pergunta 4 (Responder numa linha): Matrizes mágicas) |
||
(Há uma edição intermédia do mesmo utilizador que não estão a ser apresentadas) | |||
Linha 159: | Linha 159: | ||
</math> | </math> | ||
− | A soma das linhas de M, das colunas | + | A soma das linhas de M, das colunas e de cada uma das diagonais dá sempre 15. Da mesma forma, a soma das linhas de N, das colunas e das diagonais dá sempre 34. Ambas são matrizes mágicas. |
Verifica-se o também a seguinte propriedade: a soma de cada linha, coluna ou diagonal é igual à soma de todos os elementos da matriz a dividir pela dimensão da mesma. Ou seja, na matriz M todas as linhas, colunas e diagonais somam 15 que é igual a 45 (soma de todos os elementos da matriz) a dividir por 3 (a dimensão da matriz). De igual modo, todos os elementos da matriz N somam 136, que dividindo por 4, dá 34, que é a soma das linhas, colunas e diagonais. | Verifica-se o também a seguinte propriedade: a soma de cada linha, coluna ou diagonal é igual à soma de todos os elementos da matriz a dividir pela dimensão da mesma. Ou seja, na matriz M todas as linhas, colunas e diagonais somam 15 que é igual a 45 (soma de todos os elementos da matriz) a dividir por 3 (a dimensão da matriz). De igual modo, todos os elementos da matriz N somam 136, que dividindo por 4, dá 34, que é a soma das linhas, colunas e diagonais. | ||
Linha 287: | Linha 287: | ||
# <span style="color: red;">Errada</span><syntaxhighlight enclose="none"> lisboa = [8 9 9 11 13 16 17 17 17 14 11 9]; lisboa(lisboa<16)</syntaxhighlight> | # <span style="color: red;">Errada</span><syntaxhighlight enclose="none"> lisboa = [8 9 9 11 13 16 17 17 17 14 11 9]; lisboa(lisboa<16)</syntaxhighlight> | ||
# <span style="color: red;">Errada</span><syntaxhighlight enclose="none"> fresco(lisboa, 16)</syntaxhighlight> | # <span style="color: red;">Errada</span><syntaxhighlight enclose="none"> fresco(lisboa, 16)</syntaxhighlight> | ||
+ | |||
+ | ==== Pergunta 8 (Enviar resposta): Corrigir e melhorar função ==== | ||
+ | |||
+ | Pretende-se uma função somamatriz que soma todos os elementos de uma matriz maiores do que zero. | ||
+ | |||
+ | Fez-se uma versão inicial da função mas tem dois problemas: não corre (dá um erro qualquer) e está a somar elementos positivos e negativos. A função que apresenta problemas é a seguinte: | ||
+ | |||
+ | <syntaxhighlight> | ||
+ | function soma = somamatriz(m) | ||
+ | for i = 1:size(m)(2) | ||
+ | for j = 1:size(m)(1) | ||
+ | soma = soma + m(j,i); | ||
+ | end | ||
+ | end | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | Por favor envie uma versão corrigida da função '''somamatriz.m''', que não dê erro e que some apenas os elementos positivos da matriz. | ||
+ | |||
+ | ''Teste a função antes de enviar a resposta.'' | ||
+ | |||
+ | ===== Resposta (corrigir para não dar erro) ===== | ||
+ | |||
+ | Bastaria acrescentar: <syntaxhighlight enclose="none">soma = 0;</syntaxhighlight> antes do ciclo. | ||
+ | |||
+ | <syntaxhighlight> | ||
+ | function soma = somamatriz(m) | ||
+ | soma = 0; | ||
+ | for i = 1:size(m)(2) | ||
+ | for j = 1:size(m)(1) | ||
+ | soma = soma + m(j,i); | ||
+ | endfor | ||
+ | endfor | ||
+ | endfunction | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | ===== Resposta completa ===== | ||
+ | |||
+ | Além de se acrescentar <syntaxhighlight enclose="none">soma = 0;</syntaxhighlight> antes do ciclo, era necessário só efetuar a soma, caso o valor de <syntaxhighlight enclose="none">m(j,i)</syntaxhighlight> seja maior do que zero. Pra tal, usa-se uma condição <syntaxhighlight enclose="none">if</syntaxhighlight>. | ||
+ | |||
+ | <syntaxhighlight> | ||
+ | function soma = somamatriz(m) | ||
+ | soma = 0; | ||
+ | for i = 1:size(m)(2) | ||
+ | for j = 1:size(m)(1) | ||
+ | if (m(j,i) > 0) | ||
+ | soma = soma + m(j,i); | ||
+ | endif | ||
+ | endfor | ||
+ | endfor | ||
+ | endfunction | ||
+ | </syntaxhighlight> |
Revisão das 01h22min de 5 de fevereiro de 2014
Índice
- 1 Pergunta 1 (Escolha múltipla): Gerar triângulos de pitágoras
- 2 Pergunta 2 (Escolha múltipla): Sequência de Fibonacci
- 3 Pergunta 3 (Escolha múltipla): Gerar matriz
- 4 Pergunta 4 (Responder numa linha): Matrizes mágicas
- 5 Pergunta 5 (Escolha múltipla): Passar um programa para função
- 6 Pergunta 6 (Escolha múltipla): Resolução de equações
- 7 Pergunta 7 (Escolha múltipla): Invocar função
- 8 Pergunta 8 (Enviar resposta): Corrigir e melhorar função
Pergunta 1 (Escolha múltipla): Gerar triângulos de pitágoras
O teorema de Pitágoras estabelece a seguinte propriedade: se os lados a e b de um triângulo formam um ângulo reto, então verifica-se que a²+b²=h², em que h é o lado oposto ao ângulo reto, designado hipotenusa.
Considere o seguinte algoritmo para gerar um triângulo de Pitágoras:
- Comece por um número ímpar, x.
- Seja y igual a esse número mais 2, sendo que y é também ímpar.
- Crie duas frações unitárias, com x e y no denominador (1/x e 1/y), e some-as.
- A fração obtida tem no numerador e no denominador os dois lados de um triângulo de pitágoras, a e b
- A hipotenusa ser calculada com a fórmula: h = √(a² + b²)
Este algoritmo pode ser ilustrado, começando por escolher 3
- x = 3
- y = 5
- 1/3 + 1/5 = 8/15
- a = 8 (numerador), b= 15 (denominador)
- h = √(8² + 15²) = 17
Resulta, nesta ilustração do algoritmo, o rectângulo com os lados 8, 15 e 17.
Diga qual dos seguintes programas melhor implementa o referido algoritmo?
- Correta
do x = input("Numero impar?"); until (rem(x, 2) != 0); y = x + 2; a = lcm(x,y)/x + lcm(x,y)/y; b = lcm(x,y); h = sqrt(a^2 + b^2); printf("O triangulo de pitagoras tem os lados %d, %d e %d\n", a, b, h);
- Errada
do x = input("Numero impar?"); until (rem(x, 2) != 0); do y = input("Numero impar?"); until (rem(y, 2) != 0); if (y-x != 2) disp("y tem que ser igual a x mais 2"); else a = lcm(x,y)/x + lcm(x,y)/y; b = lcm(x,y); h = sqrt(a^2 + b^2); printf("O triangulo de pitagoras tem os lados %d, %d e %d\n", a, b, h); endif
- Errada
x = input("Numero impar?"); y = input("Numero impar?"); if (y-x != 2 & rem(x,2)!= 0) disp("y tem que ser igual a x mais 2"); else n1 = lcm(x,y)/x; n2 = lcm(x,y)/y; a = n1 + n2; b = lcm(x,y); h = sqrt(a^2 + b^2); printf("O triangulo de pitagoras tem os lados %d, %d e %d\n", a, b, h); endif
- Errada porque a expressão rem(x,0) dá sempre x
x = input("Numero impar?"); y = x+2; if (rem(x,0)==0) disp("x tem que ser impar"); else mmc = lcm(x,y); a = mmc/x + mmc/y; b = mmc; h = sqrt(a^2 + b^2); printf("O triangulo de pitagoras tem os lados %d, %d e %d\n", a, b, h); endif
Pergunta 2 (Escolha múltipla): Sequência de Fibonacci
Considere a seguinte função que gera uma sequência de Fibonacci:
function f = fibonacci(n) f = zeros(n,1); f(1) = 1; f(2) = 1; for k = 3:n f(k) = f(k-1) + f(k-2); end endfunction
Diga qual das seguintes sequências é gerada com a invocação:
fibonacci(8)
- Correta 1 1 2 3 5 8 13 21
- Errada 1 2 3 5 8 13 21 34
- Errada 1 2 3 4 5 6 7 8
- Errada 1 1 1 2 3 5 8 13
Pergunta 3 (Escolha múltipla): Gerar matriz
Considere a seguinte matriz:
Diga qual das seguintes expressões poderia ser utilizada para gerar a matriz C.
- Correta
C = [3:3:27; repmat([-1 0 1], 1, 3); linspace(0, 2, 9)]'
- Errada
C = [3 -1 0; 6 0 0.25; 9 1 0.5; 12 -1 0.75; 15 0 1; 18 1 1.25; 21 -1 1.5; 24 0 1.25; 27 1 2]
- Errada
C1 = [3:3:27]; C2 = [-1 0 1 -1 0 1 -1 0 1]; C3 = 0:0.25:2; C = vertcat(vertcat(C1', C2'), C3');
- Errada
[3:3:27; [-1 0 1 -1 0 1 -1 0 1]; 0:0.25:2]
Pergunta 4 (Responder numa linha): Matrizes mágicas
Uma matriz de n por n contendo os números de 1 até n² diz-se uma matriz mágica, se cada uma das colunas, cada uma das linhas e as duas diagonais principais tiverem a mesma soma.
Considere a matriz M e a matriz N.
A soma das linhas de M, das colunas e de cada uma das diagonais dá sempre 15. Da mesma forma, a soma das linhas de N, das colunas e das diagonais dá sempre 34. Ambas são matrizes mágicas.
Verifica-se o também a seguinte propriedade: a soma de cada linha, coluna ou diagonal é igual à soma de todos os elementos da matriz a dividir pela dimensão da mesma. Ou seja, na matriz M todas as linhas, colunas e diagonais somam 15 que é igual a 45 (soma de todos os elementos da matriz) a dividir por 3 (a dimensão da matriz). De igual modo, todos os elementos da matriz N somam 136, que dividindo por 4, dá 34, que é a soma das linhas, colunas e diagonais.
Escreva numa única linha um predicado (uma expressão que dá 1 ou 0, consoante seja verdade ou falso) que diga se uma dada matriz M verifica a seguinte propriedade:
a soma das colunas e a soma das linhas dão o mesmo valor
O predicado anterior tem que dar 1 (verdadeiro) aplicado a qualquer uma das matrizes anteriores.
Aplicado a uma matriz , tem que dar 0 (falso).
Resposta
range([sum(N) sum(N')]) == 0
ou
length(unique([sum(N) sum(N')])) == 1
Pergunta 5 (Escolha múltipla): Passar um programa para função
Num exame anterior, foi pedido que escrevesse um programa para calcular o alcance e o tempo de viagem de uma bola de golf. Esse mesmo exercício está resolvido no wiki da disciplina, em Exame de Recurso#Programa para calcular o alcance de uma bola de golfe.
Pretende-se uma função que faça apenas o cálculo da distância alcançada pela bola de golf, sabendo os mesmos dados: o ângulo e a velocidade inicial.
Escolha a implementação que lhe parece melhor conseguida.
- Correta
function Xmax = golf(angulo, velocidade) g = 9.80665; Xmax = 2 * ( velocidade^2/g) * sind(angulo) * cosd(angulo); endfunction
- Errada
function golf(angulo, velocidade) angulo = input("Angulo de lançamento?"); velocidade = input("Velocidade inicial?"); g = 9.80665; theta = angulo*pi/180; Xmax = 2 * ( velocidade^2/g) * sin(theta) * cos(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", angulo, velocidade, Xmax ); endfunction
- Errada
function golf(angulo, velocidade) angulo = input("Angulo de lançamento?"); velocidade = input("Velocidade inicial?"); g = 9.80665; theta = angulo*pi/180; Xmax = 2 * ( velocidade^2/g) * sin(theta) * cos(theta); disp(Xmax); endfunction
- Errada
function res = golf(angulo, velocidade) g = 9.80665; theta = angulo*pi/180; Xmax = 2 * ( velocidade^2/g) * sin(theta) * cos(theta); disp(res); endfunction
Pergunta 6 (Escolha múltipla): Resolução de equações
Os alunos de eletromagnetismo foram fazer compras. O André comprou uma resistência, dois condensadores e dois transístores por 3,95 €. Por sua vez, o Gustavo, comprou três resistências e um condensador por 1,50 €. O Daniel levou uma resistência, quatro condensadores, um díodo e dois transístores por 5,85 €. Por fim, o Afonso adquiriu duas resistências, três condensadores e um díodo por 3,15 €.
Qual o preço unitário de cada um dos componentes adquiridos?
Para resolver este problema, escreveram-se as quatro equações seguintes, em que temos igualmente quatro variáveis, que são o preço unitário de cada componente.
Recorrendo a matrizes, podemos escrever estas equações da forma: , cuja solução é .
Indique, portanto, o resultado desta equação.
- Errada x = [0.50; 0.50; 0.50; 0.50];
- Correta x = [ 0.25; 0.75; 0.40; 1.10];
- Errada x = [0.25; 0.50; 0.75; 1.00];
- Errada x = [0.50; 0.75; 0.75; 0.75];
- Errada x = [0.12; 0.35; 1.25; 0.20];
- Errada x = [0.95; 0.75; 0.25; 0.75];
Pergunta 7 (Escolha múltipla): Invocar função
Considere as temperaturas mínimas mensais observados em Lisboa, em 2012.
jan | fev | mar | abr | mai | jun | jul | ago | set | out | nov | dez |
8 | 9 | 9 | 11 | 13 | 16 | 17 | 17 | 17 | 14 | 11 | 9 |
Considere a seguinte função fresco que indica o número de meses em que a temperatura mínima esteve abaixo de um determinado valor.
function n = fresco(t,v) n = length(t(t<v)); endfunction
Qual das seguintes expressões usaria para calcular, para Lisboa, quantos meses tiveram temperaturas mínimas inferiores a 16º, recorrendo à função fresco?
- Errada fresco([8 9 9 11 13 16 17 17 17 14 11 9], 16)
- Correta lisboa = 8 9 9 11 13 16 17 17 17 14 11 9; fresco(lisboa, 16)
- Errada fresco(8, 9, 9, 11, 13, 16, 17, 17, 17, 14, 11, 9, 16)
- Errada fresco(1:12, 16)
- Errada lisboa = [8 9 9 11 13 16 17 17 17 14 11 9]; lisboa(lisboa<16)
- Errada fresco(lisboa, 16)
Pergunta 8 (Enviar resposta): Corrigir e melhorar função
Pretende-se uma função somamatriz que soma todos os elementos de uma matriz maiores do que zero.
Fez-se uma versão inicial da função mas tem dois problemas: não corre (dá um erro qualquer) e está a somar elementos positivos e negativos. A função que apresenta problemas é a seguinte:
function soma = somamatriz(m) for i = 1:size(m)(2) for j = 1:size(m)(1) soma = soma + m(j,i); end end
Por favor envie uma versão corrigida da função somamatriz.m, que não dê erro e que some apenas os elementos positivos da matriz.
Teste a função antes de enviar a resposta.
Resposta (corrigir para não dar erro)
Bastaria acrescentar: soma = 0; antes do ciclo.
function soma = somamatriz(m) soma = 0; for i = 1:size(m)(2) for j = 1:size(m)(1) soma = soma + m(j,i); endfor endfor endfunction
Resposta completa
Além de se acrescentar soma = 0; antes do ciclo, era necessário só efetuar a soma, caso o valor de m(j,i) seja maior do que zero. Pra tal, usa-se uma condição if.
function soma = somamatriz(m) soma = 0; for i = 1:size(m)(2) for j = 1:size(m)(1) if (m(j,i) > 0) soma = soma + m(j,i); endif endfor endfor endfunction