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