ELEMENTOS DE PROGRAMAÇÃO I
Até a presente aula, apenas comandos simples de atribuição e manipulação algébrica de arranjos foram vistas, além da utilização de várias funções do MATLAB. Porém, é possível neste programa criar algoritmos complexos, formando um código estruturado com expressões condicionais e com a realização de iterações. Para alcançar tal objetivo, é necessário a familiarização com a sintaxe utilizada no MATLAB.
A sintaxe utilizada para o desenvolvimento de um código estruturado é sensivelmente diferente da sintaxe empregada na linguagem C, de modo que será necessário algum tempo até que a fluência na linguagem seja obtida.
De modo a permitir o entendimento da sintaxe, é necessário apresentar os operadores que são extensivamente utilizados no controle de fluxo no MATLAB.
As operações relacionais e lógicas elemento a elemento são interpretadas pelo MATLAB da mesma forma do que no C. Ou seja, qualquer número que não seja zero é interpretado como verdadeiro (true), caso contrário é avaliado como falso (false). Após apresentarmos alguns
operadores partiremos para exemplos.
O
PERADORESR
ELACIONAISSão seis os operadores relacionais disponíveis no MATLAB. Eles estão descritos na Tabela 1.
Tabela 1 - Operadores relacionais no MATLAB.
Operador Descrição > Maior do que >= Maior ou igual a < Menor do que <= Menor ou igual a == Igual
~= Diferente
Execute as linhas abaixo na janela de comando e observe a saída.
clear all close all clc
Perceba que as variáveis C e D são da classe logical. Ou seja, são variáveis booleanas, podendo assumir apenas dois possíveis valores: 0 e 1. Da mesma forma que a classe numérica,
pode-se utilizar a função logical() para criar variáveis lógicas.
Os operadores lógicos são capazes de manipular arranjos, com a mesma facilidade com a qual outros operadores são utilizados. Observe a saída das operações na sequência.
A = [-1 -3 3 5]; B = [3 -5 9 -1]; C = A < B;
D = A > B; disp(C) disp(D) whos
Deve-se atentar para a forma como as expressões são avaliadas. Quando operações relacionais são computadas, as operações e testes ocorrem em pares, e problemas podem surgir, como no exemplo abaixo.
A = 10; B = 20; C = 30; r1 = (A < B < C);
r2 = (C > B > A); disp(r1)
disp(r2)
Note que, matematicamente, ambas as expressões devem ser verdadeiras, no entanto, não é isso que o programa retorna. Tente explicar o que ocorre.
Para corrigir tal problema, deve-se fazer uso de operadores lógicos para concatenar expressões relacionais. Os operadores lógicos podem ser operadores elemento a elemento (elementwise) ou bit a bit (bitwise). A diferença será mostrada na sequência.
O
PERADORESL
ÓGICOSE
LEMENTO AE
LEMENTOOs operadores lógicos elemento a elemento são apresentados na Tabela 2
Tabela 2 - Operadores Lógicos elemento a elemento.
Operador Descrição & E lógico (AND) | OU lógico (OR) a ~ Negação lógica (NOT) xor OU Exclusivo (XOR)
Note que, diferentemente do que ocorria com o C, a operação de OU e de E lógico não
uma função. Existem funções análogas para fazer E, OU e a negação lógica. São as funções and(),
or() e not(). Estude os comandos realizados abaixo.
A = 10; B = 20; C = 30; D = 0; r1 = (A < B)&(B < C);
r2 = (C > B)&(B > A); E = [3 ; 2]; F = [0 ; 1]; ~F
and(E,F) or(A,D)
xor([1 1 0],[1 0 0])
F
UNÇÕES PARAL
ÓGICAB
IT AB
ITO MATLAB possui funções que, assim como no C, podem manipular os bits dos dados. Essas funções são apresentadas na Tabela 3.
Tabela 3 - Funções para realizar operações lógicas bit a bit.
Operador Descrição bitand E lógico bit a bit bitor OU lógico bit a bit bitcmp Complemento bitxor OU Exclusivo bit a bit
As operações serão explicadas estudando-se o exemplo em aula. O exemplo faz uso da função dec2bin()para apresentar o resultado em binário.
clear all close all clc
A = 34; B = 43;
disp(dec2bin(A)) disp(dec2bin(B))
disp('--- resultado da op'); R = bitand(A,B);
disp(dec2bin(R))
Modifique o código para realizar outras operações. Notório que a função bitcmp()
C
OMANDOS DED
ESVIO IFO comando if possui uma sintaxe genérica dada pelo exemplo na sequência.
if expressão
comandos
elseif expressão
comandos
else
comandos
end
Perceba que os comandos serão executados somente se o campo expressão possuir parte real não nula. Essa definição é fundamental, uma vez que os operadores lógicos, como visto anteriormente, operam também com matrizes e com vetores. Quando a expressão não resultar em um escalar, TODOS os elementos devem ser não zeros (verdadeiros) para que os comandos sejam executados.
Os comandos elseif e else são opcionais, podendo ou não aparecer na estrutura condicional apresentada.
Além disso, a estrutura pode conter quantos elseif seja necessário. O comando
elseif caracteriza e tem o mesmo funcionamento de comandos if e else alinhados na linguagem C, estrutura também chamada de escada if-else naquela linguagem.
Para entender o funcionamento da estrutura apresentada, crie um script com os seguintes comandos e execute-o.
clear all close all clc
a = input('Digite uma vogal, apenas: '); a = upper(a);
if length(a) ~= 1
disp('Digite apenas uma letra...')
elseif (a == 'A')
disp('Digitaste A');
elseif (a == 'E')
disp('Digitaste E');
elseif (a == 'I')
disp('Digitaste I');
elseif (a == 'O')
disp('Digitaste O');
elseif (a == 'U')
disp('Digitaste U');
else
disp('Não foi vogal a letra digitada...')
end
Estude o script abaixo para melhor compreender o caso onde as expressões não retornam escalares.
clear all close all clc
a = 0+j; b = 1;
A = [1 0;0 1]; B = zeros(2); C = [0 3;2 0];
if b
disp('Opa, b!');
end
if abs(a)
disp('Opa, |a|!');
end
if A
disp('Opa A');
end
if A|~B
disp('Opa A ou ~B');
end
if xor(A,C)
disp('Opa A XOR B');
end
O
C
OMANDOSWITCH
O comando switch possui funcionamento muito similar ao comando utilizado na linguagem C, com algumas sutis diferenças. Em sua sintaxe básica:
switch expressão
case case_exp
comandos
case case_exp
comandos
(...)
otherwise
comandos
end
Perceba que, diferentemente do que ocorria com a linguagem C, não há necessidade da utilização do comando break. Assim que um case for encontrado e executado, outros comandos case não serão sequer verificados.
case {case_exp1, case_exp2, case_exp3 }
Nesse caso, os comandos relacionados a este case serão executados se houver coincidência com qualquer uma das constantes listadas.
Um exemplo clássico da aplicação do comando switch:
a = input('Digite um número: '); b = input('Digite um número: ');
if isnumeric(a)&&isnumeric(b) %testa se ambos são números
c = input('Digite a operação (+-*): ','s'); switch c
case '+'
res = a+b;
disp('foi realizado +'); case '-'
res = a-b;
disp('foi realizado -'); case '*'
res = a*b;
disp('foi realizado *'); otherwise
disp('Caractere inválido'); end
disp(res);
end
Outro exemplo já utilizando alguns conceitos que veremos na próxima aula é apresentado abaixo. Crie um script para rodar o programa.
while 1
a = input('Digite uma letra: ','s'); switch a
case {'a','e','i','o','u'}
disp('É vogal e minúscula'); case {'A','E','I','O','U'}
disp('É vogal e maiúscula'); case {'EXIT','exit'}
disp('Terminando programa...'); return
otherwise
disp('Não é vogal...'); end
end
E
XERCÍCIOSExercício 1 Crie um script gere randomicamente uma operação de multiplicação (inteira) e apresenta a operação ao usuário. O programa deve corrigir a resposta dada ao usuário, e informar, em caso de erro, o quão distante da resposta correta está da respostada dada. Utilize os critérios que desejar. Caso necessário, execute o comando help rand.
Exercício 2 A equação característica de segunda ordem para um sistema segue, entre outras formas, a forma padrão 2 2
2 n n
s + ζω s+ω da qual pode-se facilmente inferir o tipo da resposta e a
localização das raízes: 2
1,2 n n 1
diferencias, faça um script que leia os termos referentes à equação de segunda ordem e imprima o tipo da resposta e a localização das raízes da equação.
Exercício 3 Escreva um programa que calcula a potência dissipada em uma resistência. A potência dissipada em uma resistência, basicamente, pode ser calculada de três maneiras diferentes, apresentadas na expressão abaixo:
2
2 V
P VI P RI P
R
= = =