Upload
phungnhi
View
215
Download
0
Embed Size (px)
Citation preview
Sumário
• Instrução IF.
• Operadores relacionais e lógicos.
• Avaliação de conjunções e de disjunções.
• Matrizes.
• Criação de matrizes.
• Relações entre vetores e matrizes.
• Percursos em matrizes.
• Exemplos
27Março2017 InstruçãoIF;Matrizes 2
Exemplo 1: Equação do 2º Grau
• Problema: Obtenha as raízes de uma equação do 2º grau, dados os seus parâmetros a, b, e c.
ax2 + bx +c = 0
• A função é suficientemente simples para não ser necessário decompor este problema em problemas mais simples, usando uma função com assinatura
function raizes = equacao2(a,b,c)
• No entanto a solução depende do valor do discriminante, e portanto exige uma instrução para controlar um execução condicional: o IF.
27Março2017 InstruçãoIF;Matrizes 3
Equação do 2º Grau - Algoritmo
• Algoritmo: O algoritmo para resolver a equação do 2º grau é bem conhecido:
ax2 + bx +c = 0 • Informalmente
d = b2 – 4ac se d < 0 então não há raízes senão se d = 0 então uma só raíz: -b / 2a senão duas raízes: (-b ± sqrt(d)) / 2a
27Março2017 InstruçãoIF;Matrizes 4
Exemplo 1: Equação do 2º Grau
• Apesar de muito simples, este algoritmo levanta duas questões que vamos agora abordar:
1. Como implementar a execução condicional de instruções • Resposta: Instrução IF.
2. Como determinar o valor das condições que determinam essa execução condicionada
• Resposta: Através de operadores relacionais e lógicos.
27Março2017 InstruçãoIF;Matrizes 5
Sumário
27Março2017 InstruçãoIF;Matrizes 6
• Instrução IF.
• Operadores relacionais e lógicos.
• Avaliação de conjunções e de disjunções.
• Matrizes.
• Criação de matrizes.
• Relações entre vetores e matrizes.
• Percursos em matrizes.
• Exemplos
Implementação – Que questões?
1. Como é que se executam blocos de instruções distintos conforme seja o resultado da avaliação de uma condição? No problema: se ... então ... senão ... .
2. Como é que se escrevem condições? No problema: d > 0 e d = 0.
27Março2017 InstruçãoIF;Matrizes 7
A instrução IF [1]
27Março2017 InstruçãoIF;Matrizes 8
Sintaxe: if condição1
instruções1
end
Exemplo:
if sopa está insossa
adicione sal
end
Operacionalmente:
1. A condição1 é avaliada. • Se for verdadeira, executam-se as instruções1. • (Se for falsa, não se faz mais nada.)
A instrução IF [2]
27Março2017 InstruçãoIF;Matrizes 9
Sintaxe:
if condição1 instruções1 else instruções2 end
Operacionalmente:
1. A condição1 é avaliada. • Se for verdadeira, executam-se as instruções1. • Se for falsa, executam-se as instruções2s
Exemplo: if está sol e calor
almoce no terraço else
almoce na sala end
• O número de condições pode ser arbitrário
• Neste caso existem 2 condições alternativas, mas poderiam ser
consideradas mais com blocos ele if adicionais.
A instrução IF [3]
27Março2017 InstruçãoIF;Matrizes 10
Sintaxe: if condição1 instruções1 elseif condição2 instruções2 else instruções3 end
Exemplo: if semáforo está verde avance elseif semáforo está vermelho páre else % semáforo amarelo acelere end
A instrução IF [4]
27Março2017 InstruçãoIF;Matrizes 11
Sintaxe:if condição1 instruções1 elseif condição2 instruções2 else instruções3 end
Exemplo: if semáforo está verde avance elseif semáforo está vermelho páre else % semáforo amarelo acelere end Operacionalmente:
1. A condição1 é avaliada. 2. Se for verdadeira, executam-se as instruções1. 3. Se for falsa, avalia-se a condição2 4. Se for verdadeira, executam-se as instruções2. 5. Se for falsa executam-se as instruções3
Sumário
27Março2017 InstruçãoIF;Matrizes 12
• Instrução IF.
• Operadores relacionais e lógicos.
• Avaliação de conjunções e de disjunções.
• Matrizes.
• Criação de matrizes.
• Relações entre vetores e matrizes.
• Percursos em matrizes.
• Exemplos
Implementação – Que questões?
1. Como é que se executam blocos de instruções distintos conforme seja o resultado da avaliação de uma condição? No problema: se ... então ... senão ... .
2. Como é que se escrevem condições? No problema: d > 0 e d = 0.
• Comecemos pelo caso das condições simples, que podem ser avaliadas comum só operador relacional
27Março2017 InstruçãoIF;Matrizes 13
Operadores relacionais
• Operadores relacionais: == (igual) ~= ou != (diferente: til ou exclamação igual) > (maior) >= (maior ou igual) < (menor) <= (menor ou igual)
• O resultado de uma operação relacional é um valor lógico (verdade ou falso)
Exemplo: x == 10 é uma expressão lógica que vale: • 1 (verdade), se o valor da variável x for (igual a) 10; • 0 (falso), se o valor da variável x não for (igual a) 10.
Nota: Em Matlab, todo o valor diferente de 0 é considerado lógicamente como verdade.
27Março2017 InstruçãoIF;Matrizes 14
Constantes e operadores lógicos
• Funções que retornam as constantes lógicas: • true (vale 1) false (vale 0)
• As condições podem ser mais complexas e exigir a utilização de:
• Operadores lógicos: • && (conjunção, “e”) || (disjunção, “ou”) • ~ ou ! (negação: til ou exclamação)
• ~ tem precedência sobre && e ||; • && tem precedência sobre ||
27Março2017 InstruçãoIF;Matrizes 15
Constantes e operadores lógicos
Exemplos:
• x >= 10 && x < 20 é uma expressão lógica que vale: • 1, se o valor da variável x pertence ao intervalo [10,20[; • 0, se o valor da variável x não pertence a [10,20[.
• x < 10 || x >= 20 é uma expressão lógica que vale: • 1, se o valor da variável x não pertence ao intervalo [10,20[; • 0, se o valor da variável x pertence a [10,20[.
27Março2017 InstruçãoIF;Matrizes 16
O operador && (conjunção) [1]
• Operacionalmente:
expr1 && expr2
1. A expressão expr1 é sempre avaliada.
2. Se o valor de expr1 for 1 (verdade), a expr2 é avaliada (porque ainda não se sabe o resultado da conjunção):
1 ∧ 1 vale 1 1 ∧ 0 vale 0
3. Se o valor de expr1 for 0 (falso), a expr2 não é avaliada (porque já se sabe o resultado da conjunção, que é 0):
0 ∧ 1 vale 0 0 ∧ 0 vale 0
27Março2017 InstruçãoIF;Matrizes 17
O operador || (disjunção)
• Operacionalmente:
expr1 || expr2
1. A expressão expr1 é sempre avaliada.
2. Se o valor de expr1 for 0 (falso), a expr2 é avaliada (porque ainda não se sabe o resultado da disjunção):
0 ∨ 1 vale 1 0 ∨ 0 vale 0
3. Se o valor de expr1 for 1 (verdadeiro), a expr2 não é avaliada (porque já se sabe o resultado da disjunção, que é 1):
1 ∨ 1 vale 1 1 ∨ 0 vale 1
27Março2017 InstruçãoIF;Matrizes 18
O operador && (conjunção) [2]
• Exemplos:
27Março2017 InstruçãoIF;Matrizes 19
>> x = 15 >> y = 20 >> x >= 12 && y < 15 ans = 0 >> x >= 25 || y < 25 ans = 1 >> clear y >> x > 25 && y < 15 ans = 0 >> x > 25 || y < 15 error: 'y' undefined near line 1 column 12 >> x > 12 && y < 15 error: 'y' undefined near line 1 column 12
Equação do 2º Grau - Função
27Março2017 InstruçãoIF;Matrizes 20
function raizes = equacao2( a, b, c )!% raizes = equacao2( a, b, c )!% Calcula as raizes da equação !% ax^2 + bx + c = 0! d = b^2 – 4*a*c;! if d < 0! raizes = [];! elseif d == 0! raizes = [-b/(2*a)];! else! raizes = [(-b + sqrt(d))/(2*a),! (-b - sqrt(d))/(2*a)];! end!end!
ax2 + bx +c = 0 d = b2 – 4ac se d < 0 então não há raízes senão se d = 0 então uma só raíz: -b / 2ª senão duas raízes: (-b ± sqrt(d)) / 2a
• Podemosagoraimplementarafunçãoparacalcularasraízesdaequaçãodo2ºgrau,paratodososcasos:
Equação do 2º Grau - Teste
• Podemos agora fazer alguns testes, com valores conhecidos, para avaliar a correcção da implementação:
27Março2017 InstruçãoIF;Matrizes 21
>> equacao2( 1, 0, 0 )!ans = 0 >> equacao2( 1, 1, 0 )!ans = 0 -1 >> equacao2( 1, 1, 4 )!ans = [](0x0) >>
x2=0
x2+x=0
x2+x+4=0
Exemplo 2: conteúdo GC
• No ADN, a fracção de GC • determina a temperatura de desnaturação
• (C e G formam 3 pontes de H)
• varia conforme a espécie • é maior em regiões que codificam proteínas
• Problema: • Dada uma sequência de ADN numa string
• adnSeq = 'ACAAGATGCCATTGTCCCCCGGC ... ’
• determinar a fracção de GC nessa sequência
29Março2017 InstruçãoIF;Matrizes 22
Exemplo 2: conteúdo GC
• Algoritmo - Ideia base • Contar número de c’s na string (nc) • Contar número de g’s na string (ng) • Obter a fracção f = (nc+ng)/ n
• em que n é o comprimento da sequência
• O problema é suficientemente simples para poder ser resolvido por uma função com assinatura
function f = fraccaogc(sequencia)
• que requer a solução de um sub-problema: • contar os caracteres, ‘c’ e ‘g’, na string
29Março2017 InstruçãoIF;Matrizes 23
Exemplo 2: conteúdo GC
• Sub-problema: como contar? • através de uma outra função ! • que deve ser genérica:
• contar ocorrências de um qualquer caracter numa string
• que como uma string é um vetor, se pode generalizar para • contar ocorrências de um qualquer elemento num vetor
• Este sub-problema pode assim ser resolvido por uma função com assinatura
function tot = conta(elemento,vetor)
29Março2017 InstruçãoIF;Matrizes 24
Exemplo 2: conteúdo GC
Algoritmo - Ideia base
• Inicializar a variável de contagem a 0
• Considerar todos os elementos do vetor • instrução FOR
• Incrementar a variável de contagem se o elemento for o pretendido.
• Instrução IF
• A função pode pois ser implementada com uma instrução IF, dentro de um ciclo FOR.
29Março2017 InstruçãoIF;Matrizes 25
Exemplo 2: conteúdo GC
• A função pode pois ser implementada como:
29Março2017 InstruçãoIF;Matrizes 26
function c = conta(elemento, vetor)!% conta( elemento, vetor)!% Conta o numero de ocorrencias do elemento no vetor! c = 0;! for e = vetor! if e == elemento! c = c + 1! end! end!end!
Exemplo 2: conteúdo GC
• A função pode deve ser testada anntes de ser utilizada na função principal:
29Março2017 InstruçãoIF;Matrizes 27
>> conta( 2, [1,2,3,2,1])!c = 0!c = 1!c = 2!ans = 2 >> x = conta( 9, [1,2,3,2,1])!c = 0!x = 0 >> nb = conta( ‘b’, ‘abcbabdbe’)!nb = 4
c = conta(elemento, vetor)! c = 0! for e = vetor! if e == elemento! c = c + 1! end! end!end!
c = conta(elemento, vetor)! c = 0;! for e = vetor! if e == elemento! c = c + 1;! end! end!end!
Exemplo 2: conteúdo GC
• A função principal pode então ser implementada e testada
29Março2017 InstruçãoIF;Matrizes 28
function f = fraccaogc(sequencia)!% fraccaogc(sequencia)!% Determina a percentagem de g’s e c’s na sequencia! ng = conta(‘g’, sequencia)! nc = conta(‘c’, sequencia)! n = length(sequencia)! f = (nc+ng)/ n;!end!
>> fr = fracaogc('ACAAGATGCCATCAGTGTCCCCCGGC’)!ng = 6!nc = 10!n = 26!ans = 0.61538!>>!
Problema da Pauta de ICE
• Problema: Faça um programa que produz a pauta com as notas finais de ICE por avaliação contínua. • O programa recebe, por cada aluno, o número e as notas
dos dois exercícios, do projecto e dos dois testes do aluno (E1, E2, P, T1 e T2), arredondadas às décimas.
• Por cada aluno, a pauta tem o número e a nota final por avaliação contínua do aluno.
• Os dados de entrada e os resultados estão em tabelas.
27Março2017 InstruçãoIF;Matrizes 29
Resolução – Problema [1]
• Os dados de entrada e os resultados estão em tabelas, do tipo:
• Uma primeira questão se coloca: como representar tabelas em Matlab? • Resposta: em matrizes
27Março2017 InstruçãoIF;Matrizes 30
Notas: Pauta:
Implementação – Que questões?
1. Como é que se executam blocos de instruções distintos conforme seja o resultado da avaliação de uma condição? No problema: se ... então ... senão ... .
2. Como é que se escrevem condições? No problema: CompL >= 8.5 e CompTP >= 8.5.
3. Como é que se manipula uma tabela? No problema: as tabelas Notas e Pauta.
27Março2017 InstruçãoIF;Matrizes 31
✓
✓
è
Matrizes [1]
• Uma matriz é uma estrutura de dados que guarda um número pré-definido de dados do mesmo tipo (tal como um vetor).
• Uma matriz corresponde a uma sequência de posições de memória (tal como um vetor). Essas posições de memória estão agrupadas como numa tabela com L linhas e C colunas.
• Acede-se a uma posição da matriz através de dois índices, que são inteiros positivos. O primeiro índice (entre 1 e L) indica a linha; o segundo índice (entre 1 e C) indica a coluna.
-3.5 5 -18 6 6.7 -20 0
41 89 3.1 3.1 0 44 7
27Março2017 InstruçãoIF;Matrizes 32
Matrizes – Criação
• Uma matriz pode ser criada através da enumeração de todos os seus elementos.
• Os elementos de cada linha são separados por vírgulas ou espaços.
• As diferentes linhas são separadas por ponto e vírgula. • Exemplo:
27Março2017 InstruçãoIF;Matrizes 33
>> M = [1 2 3 4; 5,6,7,8; 9 10,11,12] M = 1 2 3 4 5 6 7 8 9 10 11 12 >>
Matrizes – Funções de criação
• Tal como no caso dos vetores uma matriz pode ser inicializada a zeros ou uns com as funções • M = zeros(nºLinhas, nºColunas) • M = ones(nºLinhas, nºColunas)
• em que M é uma matriz de nºLinhas por nºColunas, criada com zeros ou uns em todas as posições
• Em Matlab, um vetor é uma matriz!
• Assim as funções de inicialização de vetores zeros(1, c) e ones(1, c) ,
criam de facto matrizes com 1 linha e c colunas.
27Março2017 InstruçãoIF;Matrizes 34
Matrizes – Funções de Informação
• O comprimento de cada uma das dimensões de uma matriz M pode ser obtido pela função size • nl = size(M, 1) % nl é o nº de linhas de M • nc= size(M, 2) % nc é o nº de linhas de M • [ nc, nl] = size(M) % idem para nl e nc
27Março2017 InstruçãoIF;Matrizes 35
>> M = [1 2 3 4; 5,6,7,8; 9 10,11,12]; >> nl = size(M,1), nc = size(M,2) nl = 3 nc = 4 >> size(M) ans = 3 4
>> [a, b] = size(M) a = 3 b = 4
Matrizes – Acesso a uma posição
• Os elementos de uma matriz vetor podem ser acedidos individualmente,
• Sintaxe: nomeMatriz( expressão1, expressão2 ) • O valor da expressão1 é um inteiro positivo inferior ou igual
ao numero de linhas da matriz, i.e. size(nomeMatriz, 1). • O valor da expressão2 é um inteiro positivo inferior ou igual
ao número de colunas da matriz, i.e. size(nomeMatriz, 2). • Exemplo:
27Março2017 InstruçãoIF;Matrizes 36
>> M = [1 2 3 4; 5,6,7,8; 9 10,11,12]; >> a = M(2,3) a = 7 >>
Matrizes - Acesso & criação
• Em Matlab, uma sub-matriz pode ser obtido de outra através de um dois vetores que indexam as linhas e colunas a extrair. • É muito comum usarem-se sequências para indexação de linhas e
colunas (incluindo números simples para linhas/colunas “simples”). • Nota: O identificador end representa até ao fim, no devido contexto.
20Março2017 ICE-cAula3:Vetores;ciclosFOR 37
>> M = [1 2 3 4; 5,6,7,8; 9 10,11,12]; >> M(1:2, 3:4) ans = 3 4 7 8
>> X = M(2:end, 4) ans = 8
12
Matrizes – Acesso a uma posição
• O acesso a uma ou mais posições pode ser feita quer para leitura quer para escrita.
• Exemplos:
27Março2017 InstruçãoIF;Matrizes 38
>> M = [1 2 3 4; 5,6,7,8; 9 10,11,12]; >> M(1,3) = 0 M = 1 2 0 4 5 6 7 8 9 10 11 12 >> M(2:3, 3:end) = [20 21 ; 22 23] M = 1 2 0 4 5 6 20 21 9 10 22 23
Matrizes– Erros Típico de Acesso
• Tal como nos vetores, não é possível ler um valor de uma posição inexistente de uma matriz.
27Março2017 InstruçãoIF;Matrizes 39
>> M = [1 2 3 4; 5,6,7,8; 9 10,11,12]; >> M(4,4) % indice maior que o número de linhas ??? error: A(I,J): row index out of bounds; value 4 out of
bound 3 >> M(3,-1) % indice de coluna negativo ??? error: subscript indices must be either positive integers
less than 2^31 or logicals >> V(1.5, 3.2) % indice não inteiro ??? error: subscript indices must be either positive integers
less than 2^31 or logicals
Matlab – Escrita numa posição
• Tal como nos vetores, as matrizes podem “crescer” se se atribuirem valores a posições não existentes.
• Eficiência: Como nos vetores, as matrizes devem ser criada com o nº de linhas e o nº de colunas necessários para que nunca se escreva numa posição inexistente.
27Março2017 InstruçãoIF;Matrizes 40
>> M = [1 2 3 4; 5,6,7,8; 9 10,11,12]; >> M(5,7) = 33 M = 1 2 3 4 0 0 0 5 6 7 8 0 0 0 9 10 11 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 33 >>
Resolução – Problema [1]
Problema: Faça um programa que produz a pauta com as notas finais de ICE por avaliação contínua.
1. Compreender totalmente o problema.
• Os dados de entrada e os resultados estão em tabelas:
27Março2017 InstruçãoIF;Matrizes 41
Notas: Pauta:
Resolução – Problema [2]
1. Compreender totalmente o problema.
• Seja CompL = 20% E1 + 20% E2 + 60% P (arredondada às décimas)
• Se não tem frequência (CompL < 8.5), NF = −1.
• Se tem frequência (CompL ≥ 8.5)
• Seja CompTP = (T1 + T2)/2 (arredondada às décimas)
• Se CompTP < 8.5,
• NF = CompTP (arredondada às unidades).
• Se CompTP ≥ 8.5,
• NF = 0.6 CompTP + 0.4 CompL (arredondada às unidades).
27Março2017 InstruçãoIF;Matrizes 42
Resolução – Problema [3]
2. Caracterizar o problema.
• Problema: Pauta de ICE.
• Entrada: Uma tabela de números, com uma linha por aluno e seis colunas (nº, E1, E2, P, T1, T2).
• Saída: Uma tabela de números, com uma linha por aluno e duas colunas (nº e NF).
3. Generalizar o problema (sempre que for possível).
• Não é possível generalizar este problema.
27Março2017 InstruçãoIF;Matrizes 43
Resolução – Algoritmo [1]
4. Desenhar o algoritmo para resolver o problema. a) Conceber o algoritmo, decompondo o problema em sub-problemas. • Como calcular a pauta de ICE com a tabela E (L×6)?
• Cria-se a tabela Pauta (L×2). • Para cada linha i de Notas (abreviada por N abaixo)
• Pautai1 ç Ni1; % copia-se o nº de aluno • Pautai2 ç Nota final de ICE (Ni2, Ni3, Ni4, Ni5, Ni6).
27Março2017 InstruçãoIF;Matrizes 44
è
Notas: Pauta:
Resolução – Algoritmo [2]
b) Identificar, caracterizar e generalizar cada sub-problema.
• Problema: nota final de ICE.
• Entrada: vetor (com E1, E2, P, T1, T2).
• Saída: a nota final de ICE.
27Março2017 InstruçãoIF;Matrizes 45
Resolução – Algoritmo [3]
c) Conceber o algoritmo, assumindo que os sub-problemas estão resolvidos.
• Pauta de ICE E (L×6) : • Cria-se a tabela Pauta (L×2). • Para cada linha i de N (Notas):
• Pautai1 ç Ni1; • Pautai2 ç Nota final de ICE (vetor) em que
² Vetor = [Ni2, Ni3, Ni4, Ni5, Ni6).
27Março2017 InstruçãoIF;Matrizes 46
è
Notas: Pauta:
Resolução – Algoritmo [4]
5. Para cada sub-problema, desenhar o algoritmo para o resolver.
Nota final de ICE (vetor com E1, E2, P, T1, T2) :
(no próximo slide)
27Março2017 InstruçãoIF;Matrizes 47
Resolução – Algoritmo [5]
• Nota final de ICE (vetor com E1, E2, P, T1, T2) : CompL = 20% E1 + 20% E2 + 60% P (arredondada às décimas) se CompL< 8.5 então notaFinal ç −1 senão compTP ç (T1 + T2)/2 (arredondada às décimas) se compTP < 8.5 então notaFinal ç round(compTP) senão compL ç Arredonda às décimas( compL) notaFinal ç round(0.6*compTP + 0.4*compL)
27Março2017 InstruçãoIF;Matrizes 48
Resolução – Algoritmo [6]
5. Para cada sub-problema, identificar, caracterizar e generalizar cada sub-sub-problema e desenhar o algoritmo para o resolver.
• Problema: Arredonda às décimas.
• Entrada: real valor.
• Saída: o valor arredondado às décimas.
• Arredonda às décimas (valor) :
valorArredondado ç round(valor * 10) / 10
27Março2017 InstruçãoIF;Matrizes 49
Resolução – Programa
6. Para cada sub-problema (começando pelos mais simples), implementar o respetivo algoritmo e testar o “sub-programa”. • Arredonda às décimas (valor) • Nota final de ICE (vetor com E1, E2, P, T1, T2)
7. Implementar o algoritmo que resolve o problema e testar o programa pedido. • Pauta de ICE (E)
27Março2017 InstruçãoIF;Matrizes 50
Resolução – Programa [1]
• Comecemos pelas funções mais simples
• que devemos testar, antes de utilizar
27Março2017 InstruçãoIF;Matrizes 51
function res = arredondaDec(valor)!% res = arredondaDec(valor)!% Arredonda as decimas o valor real dado.! res = round(valor * 10) / 10;!end!
>> arredondaDec(5.3000001) ans = 5.3000 >> arredondaDec(2.4500001) ans = 2.5000 >>
Resolução – Programa [2]
27Março2017 InstruçãoIF;Matrizes 52
• Passemos agora à implementação da função notaFinalICE, começando pela sua documentação
function res = notaFinalICE(notasAC)!% res = notaFinalICE(notas)!% Calcula a nota final de ICE por avaliacao continua.!% O vetor notasAC tem as notas dos dois exercicios, !% do trabalho e dos dois testes:!% (exer1, exer2, trab, teste1, teste2).!% Sejam:!% compTP = 0.4 teste1 + 0.6 teste2 e!% compL = (trab1 + trab2) / 2,!% ambas arredondadas `as decimas.!
!...!end!
Resolução – Programa [2]
27Março2017 InstruçãoIF;Matrizes 53
• E terminando a documentação antes de passar para o código.
function res = notaFinalICE(notasAC)!% pauta = notaFinalICE(notas)!% ...!% O resultado é: !% −1, !% se o aluno nao tem frequencia;!% compTP (arredondada as unidades), !% se o aluno tem frequencia e compTP < 8.5;!% 60% compTP + 40% compL (arredondada as unidades), !% nos restantes casos.!
!...!end!
Resolução – Programa [4]
27Março2017 InstruçãoIF;Matrizes 54
• E agora o código da função notaFinalICE, condicionada pela obtenção ou não de frequência.
• Começando no caso do aluno não ter frequência function res = notaFinalICE(notasAC)!% ...! notaL = 0.2*notasAC(1)+0.2*notasAC(2)+0.6*notasAC(3);! compL = arredondaDec(notaL);! if compL < 8.5 ! !! % O aluno nao tem frequencia.! res = -1;!
!else!! !% O aluno tem frequencia.!! !...!!end!
end!
Resolução – Programa [4]
27Março2017 InstruçãoIF;Matrizes 55
• E agora o código da função notaFinalICE, condicionada pela obtenção ou não de frequência. • Começando no caso do aluno não ter frequência
function res = notaFinalICE(notasAC)!% ...! notaL = 0.2*notas(1) + 0.2*notas(2) + 0.6*notas(3)! if notaL < 8.5!
! !% O aluno nao tem frequencia.!! !res = −1;!!else!! !% O aluno tem frequencia.!! !...!!end!
end!
Resolução – Programa [5]
27Março2017 InstruçãoIF;Matrizes 56
• E acabando no caso em que o aluno obtém frequência function res = notaFinalICE(notasAC)!% ...!
... else % O aluno tem frequencia notaTP = (notasAC(4)+notasAC(5))/2; compTP = arredondaDec(notaTP); if compTP < 8.5 res = round(compTP); else res = round(0.6 * compTP + 0.4 * compL); end
end end
Resolução – Teste Unitário
• A função notaFinalICE pode ser testada para os vários casos
27Março2017 InstruçãoIF;Matrizes 57
>> notaFinalICE([15.5, 16.4, 18.0, 15.7, 14.8]) notaL = 17.18 notaTP = 15.25 compTP = 15.3 % nota teorico-pratica arredondada compL = 17.2 % nota laboratorial arredondada res = 16 % arredondademnto de 16.06 >> >> notaFinalICE([12.3, 9.2, 9.4, 8.7, 7.2]) notaL = 9.94 notaTP = 7.95 compTP = 8 % nota teorico-pratica insuficiente! res = 8 >> notaFinalICE([8.0, 4.5, 7.2, 8.1, 10.2]) notaL = 6.82 % não tem frequencia ! res = -1
• Finalmente a função principal, pautaICE, começando pela sua documentação
Resolução – Programa [6]
27Março2017 InstruçãoIF;Matrizes 58
function pauta = pautaICE(notasAC)!% pauta = pautaICE(notasAC)!% Produz a pauta de ICE por avaliacao continua.!% A matriz notasAC tem uma linha por aluno, com!% o numero e as notas dos dois exercícios!% do trabalhos e dos dois testes do aluno!% (numero, exer1, exer2, trab, teste1, teste2).!% A matriz pauta tem uma linha por aluno, com!% o numero e a nota final por avaliacao continua!% do aluno (numero, notaFinal)! ...!end!
• E terminando no código da função principal, pautaICE, que utiliza as funções implementadas anteriormente
Resolução – Programa [7]
27Março2017 InstruçãoIF;Matrizes 59
function pauta = pautaICE(notasAC)!% ...! numAlunos = size(notasAC, 1);! pauta = zeros(numAlunos,2);! for i = 1:numAlunos! pauta(i, 1) = notasAC(i, 1);! notasAluno = notasAC(i, 2 : end);! pauta(i, 2) = notaFinalICE(notasAluno);! end!
end!
Resolução – Teste Final
• A função pautaICE pode ser testada para os vários casos. • Para isso basta criar uma matriz de entrada com as notas
testadas anteriormente e chamar a função pautaICE com esse argumento. Por exemplo:
27Março2017 InstruçãoIF;Matrizes 60
>> E = zeros(2,6); >> E(1,:) = [58322, 15.5, 16.4, 18.0, 15.7, 14.8]; >> E(2:3,:) = [57413, 12.3, 9.2, 9.4, 8.7, 7.2; 55064, 8.0, 4.5, 7.2, 8.1, 10.2]; >> pauta = pautaICE(E) pauta = 58322 16 57413 8 55064 -1 >>
Operações sobre Matrizes
• As operações operações entre escalo nome indica, Matlab (MATrix LABoratory) é uma linguagem especialmente desenhada para cálculo matricial. Neste sentido, em Matlab • Todas as variáveis numéricas são implementadas como matrizes.
• Em particular, números (escalares) correspondem a matrizes de uma linha por uma coluna.
• Todas as operações definidas na álgebra matricial são suportadas em Matlab.
• Em particular são suportadas operações • Operações algébricas entre matrizes (+, -, *, e \ e /) • Operações algébricas entre matrizes e escalares (as mesmas e ^) • Operações ponto a ponto entre matrizes.
27Março2017 InstruçãoIF;Matrizes 61
Operações sobre Matrizes
• As operações algébricas entre matrizes (e vectores) incluem • a soma e diferença de matrizes; • o produto de matrizes e vetores (produto interno); • divisão entre matrizes (produto pela inversa de uma matriz).
• Exemplos:
27Março2017 InstruçãoIF;Matrizes 62
>> V = [1 2 3]; >> M = [3 1 2; 4 5 6; 7,0,9] >> V * M ans = 32 11 41 >> M * V error: operator *:nonconformant arguments (op1 is 3x3,op2 is 1x3) >> M * V’ % V’ é a transposta de V ans = 11 32 34 >>
Operações sobre Matrizes
• Em Matlab, as funções pre-definidas estão (normalmente) preparadas para reveber vetores/matrizes como argumentos, distribuindo as funções pelos elementos individuias e retornando os resultados na estrutura apropriada.
27Março2017 InstruçãoIF;Matrizes 63
>> raiz = sqrt([1:3;4:6;7:9]) raiz = 1.0000 1.4142 1.7321 2.0000 2.2361 2.4495 2.6458 2.8284 3.0000
>> AngG = [0 15 30 45 60]; >> AngR = Ang * 180/pi AngR = 0.00000 0.26180 0.52360 0.78540 1.04720 >> tg = tan(AngR) tg = 0.0000e+00 2.6795e-01 5.7735e-01 1.0000e+00 1.7321e+00
Operações sobre Matrizes
• Problema: a. Determinar o comprimento do vetor (3D) delimitado pelos
pontos P1 = (3,5,7) e P2 = (4,0.3) . b. Que ângulo faz esse vetor com o vetor (2,5,7)
27Março2017 InstruçãoIF;Matrizes 64
>> P1 = [3 6 7]; >> P2 = [4,5,8]; >> V1 = P2 – P1 V1 = 1 -1 1 >> c = sqrt(V1*V1´) % raiz quadrada do produto interno c = 1.7321 % sqrt(3) >> V2 = [2,4,7]; >> cosv1v2 = V1*V2’ / (sqrt(V1*V1’) * sqrt(V2*V2’)) cosv1v2 = 0.34752 >> ang = acos(cosv1v2) * 180 / pi % convertido em graus ang = 69.664
Operações sobre Matrizes
• Problema: • Resolver o sistema de 2 equações a 2 incógnitas • Em termos algébricos AX = B com
• Portanto X = A-1 B
27Março2017 InstruçãoIF;Matrizes 65
>> A = [2 4; 3 -2]; >> B = [8; 4] >> Ainv = A^(-1) % ou Ainv = inv(A) Ainv = 0.12500 0.25000 0.18750 -0.12500 >> X = Ainv * B X = 1 2 >> Y = A \ B % Multiplicação pela inversa (à esquerda) Y = 1 2 >> Z = B / A % Multiplicação pela inversa (à direita) error: operator /: nonconformant arguments (op1 is 2x1, op2 is 2x2)
2x + 4y = 8 3x – 2y = 4
A=24eB=83-24
Operações sobre Matrizes
• Problema: • Quais as posições do vetor V em que ocorre o valor a.
• Exemplo:
• Desafio: • Escrever uma função que devolva as posições de um vetor V
em que ocorre o valor a. 27Março2017 InstruçãoIF;Matrizes 66
>> V = [3 5 7 -2 9 -1 0 -5 7 8 -6 4]; >> a = 7 >> V == a ans = 0 0 1 0 0 0 0 0 1 0 0 0 >> n = length(V) n = 12 >> pos = (1:n) .* (V == a) % atenção: produto ponto a ponto 0 0 3 0 0 0 0 0 9 0 0 0