Estruturas de Controle - DI PUC-Rio

Propaganda
Estruturas de Controle
Linguagens de Programacão I
[email protected]
1
Expressões
Expressões são as construções básicas de
qualquer LP.
São utilizadas para a atribuição de valores a
variáveis, ou em estruturas de controle
condicionais.
Uma expressão geralmente consiste de:
um objeto (uma variável ou uma constante);
um operando ou função aplicados a um conjunto
de objetos e expressões.
Linguagens de Programacão I
[email protected]
2
1
Expressões
Exemplos:
(* (+2 4) 7) Î Lisp usa notação polonesa
a = b < c Î O significado depende da precedência
a = b = c = 0 Î O significado depende da associação
a = sin(b+c)
a = (b > c) ? x : y Î O mesmo que Î if (b>c)
then (a=x) else (a=y)
a is b Î Atribuição em Prolog
a,b,c = 1,2,3 Î Algumas LPs permitem expressões
com vários valores (Lua, Perl, etc).
Linguagens de Programacão I
[email protected]
3
Expressões
A avaliação de expressões depende das regras de
precedência e associação da LP.
Regras de precedência indicam quais operadores
tem precedência sobre quais.
a + b * c Î a + (b * c)
Regras de associação indicam como os termos de
uma expressão são associados durante a avaliação
da expressão:
a = b = c Î a = b Î b = c
a = b = c Î
b = c Î a = b
Linguagens de Programacão I
[email protected]
4
2
Expressões
A avaliação de expressões em alguns casos implica
em efeitos colaterais. Em C a expressão abaixo faz
uma atribuição, e testa se o seu valor é igual a zero:
if (a=b)
Î atribui b a a e testa se a é diferente de 0
Em algumas LPs a avaliação é feita em curtocurtocircuito:
if (a>b) and (c>d) then
Î (c>d) só é testado se (a>b)
Linguagens de Programacão I
[email protected]
5
Estruturas de Controle
As estruturas de controle de um programa
geralmente podem ser classificadas nas
seguintes categorias:
Desvio explícito;
Seleção;
Repetição;
Recursão.
Linguagens de Programacão I
[email protected]
6
3
Desvio Explícito
Faz com que a linha de execução seja desviada de
forma unilateral para um outro trecho do programa.
O exemplo mais comum é o comando goto.
goto.
Em Pascal o goto é bastante empregado para
interromper a execução de uma procedure, já que
nestes casos não é possível executar um return.
return.
Outro uso comum é na interrupção de loops.
Linguagens de Programacão I
[email protected]
7
Desvio Explícito
Exemplo em Pascal
procedute do_something( x: int)
...
begin
for i:= 1 to n do
begin
...
if y = 0 then goto 100;
...
end;
100;
...
end;
Linguagens de Programacão I
[email protected]
8
4
Desvio Explícito
Um outro exemplo seria o if aritmético de Fortran que
possui a seguinte sintaxe:
IF (expressão) rótulo1, rótulo2, rótulo3
Exemplo:
IF (K-100) 10,20,30
PRINT *,'K is less than 100.'
GO TO 40
20
PRINT *,'K equals 100.'
GO TO 40
30
PRINT *,'K is greater than 100.'
40
CONTINUE
10
Linguagens de Programacão I
[email protected]
9
Desvio Explícito
Diversas linguagens permitem a interrupção
de uma repetição através do comando break,
break,
que desvia a linha de execução para o
comando seguinte ao comando de repetição.
Java suporta ainda o comando continue que
faz com que a execução do corpo da
repetição seja desviada imediatamente para
o começo da repetição.
Linguagens de Programacão I
[email protected]
10
5
Desvio Explícito
Exemplo em Java
while(true) { // equivalente a for(;;)
i++;
int j = i * 27;
if(j == 1269) break; // Sai do loop
if(i % 10 != 0) continue; // Volta para
// início do loop
System.out.println(i);
}
System.out.println(“fim”); // break executa
// este comando
Linguagens de Programacão I
[email protected]
11
Seleção
O exemplo mais comum é o comando ifif-thenthen-else
disponível na maioria das LPs imperativas.
Um problema comum na utilização deste comando
ocorre quando é necessário fazer um aninhamento:
if (a>b) then
if (c>d) then
...
else
...
Em Pascal e C o else pertence ao if mais próximo.
Em Algol, Ada e Modula 2 sempre é necessário usar
um end para eliminar a ambiguidade.
Linguagens de Programacão I
[email protected]
12
6
Seleção
Modula 2 e Lua oferecem o comando elseif
que permite a construção de estruturas
conhecidas como pentes:
if a<0 then
...
elseif a=0 then
...
elseif a=1 then
...
else
...
Linguagens de Programacão I
[email protected]
13
Seleção
Outro comando de seleção bastante comum é o switch:
switch:
switch ( e ) {
case v1: s1;
case v2: s2;
case v3: s3;break;
case v4: s4;break;
default: s5;
}
O primeiro comando a ser executado é aquele rotulado pelo
valor da expressão, ou por default se o valor da expressão não
corresponde a nenhuma alternativa.
O comando break,
break, quando encontrado, encerra a execução do
comando switch inteiro.
Linguagens de Programacão I
[email protected]
14
7
Repetição
Nos comandos de repetição desejamos a execução
repetida, de forma controlada, de uma ação ou série
de ações.
A ação indicada é executada enquanto se mantiver
verdadeira uma condição de continuação,
continuação, ou
enquanto uma condição de término se mantiver
falsa.
Os principais exemplos de repetição são o while,
while,
repeat,
repeat, loop e for.
for.
Linguagens de Programacão I
[email protected]
15
Repetição
O comando for usualmente tem a seguinte forma
(Pascal e Modula 2):
for i: = first to last by step do
...
end;
Nem todas as linguagens permitem que os índices
ou os limites do loop possam ser mudados dentro do
corpo da repetição.
Em LPs como Pascal Fortran, Algol, Ada e Lua a
expressão é avaliada apenas uma vez, quando o
comando é encontrado.
Linguagens de Programacão I
[email protected]
16
8
Repetição
Em C/C++ e Java a estrutura for tem a seguinte
forma:
for (i = first; i<= last; i+= last){
...
}
Em Lua temos:
for i=first,last,step do
...
end
Em C/C++ e Java os índices e limites são tratados
como variáveis comuns, podendo ser modificados a
qualquer tempo.
Linguagens de Programacão I
[email protected]
17
Repetição
Nem sempre o for usa valores numéricos. Um
exemplo importante são os iteradores, construções
que permitem atravessar todos os elementos de uma
estrutura de dados qualquer.
Em Lua podepode-se usar um iterador para percorrer
todos os elementos de uma tabela:
table = {x=1, y= 3, z= 5}
for index,value in table do
print (index..’=‘..value)
end
Linguagens de Programacão I
[email protected]
18
9
Repetição
Perl e C# suportam iterações através do comando
foreach.
foreach.
Um exemplo em Perl:
@a = (1,2,3,4)
foreach $b (@a){
print $b;
}
Um exemplo em C#
int[] arr = new int [] {0,1,2,5,7,8,11};
foreach (int i in arr) {
x = x+i;
}
Linguagens de Programacão I
[email protected]
19
Repetição
O comando loop disponível em Modula 2 e
Ada cria um loop contínuo que só pode ser
interrompido através de um comando exit.
exit.
Exemplo:
LOOP
c1;
IF e THEN
EXIT;
c2;
END;
Linguagens de Programacão I
[email protected]
20
10
Repetição
Os comandos while e repeat fazem com que
comandos sejam executados repetidamente
enquanto existir uma determinada condição
lógica.
No caso de while a condição é testada antes
de ser executado o código da iteração,
enquanto no caso de repeat o teste ocorre
após a execução.
Linguagens de Programacão I
[email protected]
21
Repetição
Exemplos em Pascal:
i:=1;
While i<6 do
begin
writeln(i);
i:=i+1;
end;
i:=1;
Repeat
writeln(i);
i:=i+1;
Until i>5;
Linguagens de Programacão I
[email protected]
22
11
Repetição
C\C++ e Java suportam as seguintes
construções:
while (condição) {
comandos;
}
do {
comandos;
} while (condição)
Linguagens de Programacão I
[email protected]
23
Recursão
Em LPs que suportam recursividade, este
mecanismo sempre é implementado através de
subrotinas.
Em Prolog podemos definir uma função para calcular
o número de Fibonacci da seguinte forma:
fib(1,1).
fib(0,1).
fib(X,R):fib(X,R):- A is X - 1,
B is X -2,
fib(A,R1),fib(B,R2),
R is R1 + R2.
R2.
Linguagens de Programacão I
[email protected]
24
12
Recursão
A definição recursiva de funções pode
implicar num desempenho computacional
menos eficiente, já que para cada invocação
pode ser necessário adicionar um novo
registro de ativação na pilha de memória.
Na maioria dos casos é possível definir
funções recursivas através de estrutura de
repetições tradicionais.
Linguagens de Programacão I
[email protected]
25
Recursão
Exemplo MDC
int mdc (int a, int b){
if (a == b) return a;
else if (a > b) return mdc (a(a-b, b);
else return mdc (a, bb-a);
}
int mdc (int a, int b){
while (a != b){
if (a>b) a= aa-b;
else b= bb-a;
}
return a;
}
Linguagens de Programacão I
[email protected]
26
13
Exceções
Exceções são quaisquer eventos registrados durante a
execução de um programa que impedem a continuação
“normal” da execução.
Exemplos simples são divisão por zero, erro de leitura em um
arquivo, a passagem de um parâmetro com um tipo incorreto
durante a execução, o acesso a um elemento de um array com
índice acima do limite, overflow, etc.
LPs modernas suportam o tratamento explícito de exceções,
permitindo que o programador defina ações corretivas ou então
interrompa a execução de forma apropriada.
Linguagens de Programacão I
[email protected]
27
Tratamento de Exceções
Exceções usualmente são representadas por objetos
de um tipo específico que são lançados durante a
execução do programa e se propagam respeitando
as regras de escopo.
O tratamento de exceções é feito através de rotinas
(handlers) responsáveis por capturar as exceções e
executar as ações apropriadas.
Em algumas LPs exceções podem carregar
informações específicas sobre a “anormalidade”
detectada.
Linguagens de Programacão I
[email protected]
28
14
Execeções em Ada
procedure consulta(in val:integer;
out nome:string100)is
begin
if (val<min) or (val>max) then
raise invalido;
nome:=tab(val);
if nome='' then
raise vazio;
exception
when vazio =>
nome:= "indefinido";
end consulta;
Linguagens de Programacão I
[email protected]
29
Exceções em Java
Em Java o bloco de um programa sujeito a
exceções deve ser protegido através da
declaração try.
try.
Exceções são tratadas por blocos iniciados
com o delimitador catch.
catch.
É possível declarar uma sequência de
comandos que deve ser executada em caso
de erro através da declaração finally.
finally.
Linguagens de Programacão I
[email protected]
30
15
Exceções em Java
public void writeList() throws IOException{
try {
...
} catch (ArrayIndexOutOfBoundsException e) {
...
} catch (IOException e) {
...
trow e;
} finally {
...
}
lança novamente
}
a exceção
}
Linguagens de Programacão I
[email protected]
31
Exceções em Java
public void writeList() {
PrintWriter out = null;
try {
System.out.println("Entering try statement");
out = new PrintWriter(
new FileWriter("OutFile.txt"));
for (int i = 0; i < size; i++)
out.println("Value at: " + i + " = " + victor.elementAt(i));
} catch (ArrayIndexOutOfBoundsException e) {
System.err.println("Caught ArrayIndexOutOfBoundsException: " +
e.getMessage());
} catch (IOException e) {
System.err.println("Caught IOException: " + e.getMessage());
} finally {
if (out != null) {
System.out.println("Closing PrintWriter");
out.close();
} else
System.out.println("PrintWriter not open");
}
}
Linguagens de Programacão I
[email protected]
32
16
Exceções em Java
O programador pode definir novas exceções
específicas a sua aplicação.
Exceções podem ser lançadas em qualquer
momento através do comando throw:
public Object pop() throws EmptyStackException
{
...
if (size == 0)
throw new EmptyStackException();
...
}
Linguagens de Programacão I
[email protected]
33
Exceções em Java
Um método sempre deve declarar todas as
exceções que podem ser lançadas.
No exemplo anterior teríamos:
public void writeList() throws
IOException, ArrayIndexOutOfBoundsException {
PrintWriter out = null;
out = new PrintWriter(
new FileWriter("OutFile.txt"));
for (int i = 0; i < size; i++)
out.println("Value at: " + i + " = " +
victor.elementAt(i));
}
Linguagens de Programacão I
[email protected]
34
17
Tratamento de Exceções
O que acontece com a linha de execução do
programa após o tratamento da exceção?
Existem duas possibilidades:
Continuar a execução a partir do comando que
levantou a exceção.
Terminar a execução da rotina em que foi
levantada a exceção. Î Esta é a opção mais
comum adotada pelas principais LPs.
Linguagens de Programacão I
[email protected]
35
Tratamento de Exceções
void method A (){
...
x = B();
...
}
int method B (){
...
try {
a=C();
return a+5;
} catch (DivideByZero e) {
return 0;
}
}
int method C(){
...
y = m/n;
...
return r;
}
Se n=0 a execução de C é
interropida e o erro se
propaga até B.
Como B sabe como tratar a
exceção, a exceção é
capturada e tratada.
O fluxo de execução é
retomado em B, e
posteriormente retorna para
A.
Linguagens de Programacão I
[email protected]
36
18
Download