67
Informática para Ciências e Engenharias (B) 2016/17 Teórica 4

Informática para Ciências e Engenharias (B) 2016/17iceb.ssdi.di.fct.unl.pt/1617/teoricas/T04/iceb_t04.pdf · • Incrementar a variável de contagem se o elemento for o pretendido

Embed Size (px)

Citation preview

Informática para Ciências e Engenharias (B)

2016/17

Teórica4

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

Para estudar esta aula

•  Physical Modeling in MATLAB

•  Capítulo 4

•  Consultar o manual Octave •  If (10.1)

•  funções para caracteres e strings (5.7)