Universidade Federal Rural de Pernambuco Departamento de Estatística e Informática Estruturas de Controle entre Instruções Paradigmas de Programação Prof. Gláucya Carreiro Boechat [email protected] Exemplo de Estruturas de Controle Paradigmas de Programação prof Gláucya Carreiro Boechat 2 Fluxo de controle ao nível de instrução Estrutura de controle é uma instrução de controle e sua coleção de comandos cuja execução ela controla Níveis de fluxo de controle: Entre unidades de programa Entre instruções do programa Dentro de expressões Regra de Associatividade Regra de Precedência Paradigmas de Programação prof Gláucya Carreiro Boechat 3 Evolução FORTRAN I – Instruções de controle eram baseados diretamente no hardware do IBM 704 (anos 50); Muita pesquisa e discussão acerca desse assunto nos anos 60 Resultado importante : Foi aprovado que todos os algoritmos representados por um fluxograma podem ser codificados usando apenas duas instruções de controle: Somente com instrução dupla (if ... else ...) Laços pré-testados (while) Paradigmas de Programação prof Gláucya Carreiro Boechat 4 Instruções Compostas Questão de projeto Uma estrutura de controle pode ter múltiplas entradas? Instrução Composta – método para abstrair uma coleção de instruções como uma única instrução introduzido no ALGOL 60 na forma de: begin comando 1 ... comando n end Um bloco é uma Instrução Composta que pode definir um novo escopo (possui variáveis locais). Paradigmas de Programação prof Gláucya Carreiro Boechat 5 Instruções de Seleção Uma instrução de seleção oferece os meios de escolher entre dois ou mais caminhos de execução em um programa Duas categorias gerais: Seleção bidirecional Seleção n-dimensional ou múltipla Paradigmas de Programação prof Gláucya Carreiro Boechat 6 Instruções de Seleção Bidirecional Permitem escolher entre dois ou mais caminhos de execução em programa. Forma geral: if (expressão booleana) instrução Else instrução Questões de projeto: Qual é a forma e o tipo da expressão que controla a seleção? O que pode ser selecionado? (Instruções simples/compostas, seqüência de instruções)? Como o significado de seletores aninhados pode ser especificado? Paradigmas de Programação prof Gláucya Carreiro Boechat 7 Exemplo Bidirecionais Exemplo em FORTRAN (unidirecional): IF (expressão booleana) instrução Problema: seleciona somente uma único instrução. Para selecionar mais instruções, deve ser utilizado um "goto" como no seguinte exemplo: IF (.NOT. condição) GOTO 20 I =1 J=2 20 CONTINUE Paradigmas de Programação prof Gláucya Carreiro Boechat 8 Exemplo Bidirecionais ALGOL 60 (unidireccional): if (expressão booleana) then begin ... end ALGOL 60 (bidireccional): if (expressão booleana) then instrução (Cláusula then) else instrução (Cláusula else) A Instrução poderia ser simples ou composta. Paradigmas de Programação prof Gláucya Carreiro Boechat 9 Aninhando Seletores Exemplo em Java if (sum == 0) if (count == 0) result = 0; else result = 1; O else pertence a qual dos ifs? Java possui uma regra semântica estática O else é associado ao if mais próximo Paradigmas de Programação prof Gláucya Carreiro Boechat 10 Aninhando Seletores Exemplo em Pascal (aninhamento direto de seletores): if ... then if ... then ... else ... Qual then associa-se com else? Regra do Pascal: else associa-se com o then mais próximo. Paradigmas de Programação prof Gláucya Carreiro Boechat 11 Aninhando Seletores Para forçar uma semântica alternativa, uma forma sintática diferente é necessária, na qual o if-then é colocado em uma instrução composta: if (sum == 0) { if (sum == 0) { if (count == 0) result = 0; } else result = 1; A solução acima é usada em C, C++ e C# Perl requer que todas as cláusulas then e else sejam compostas Paradigmas de Programação prof Gláucya Carreiro Boechat 12 Ex. em ALGOL 60: Não permite aninhamento direto É preciso ser colocado em uma instrução composta Aninhado ao 2º if if ... then begin if ... then ... else … end Aninhado ao 1º if if ... then begin if ... then … end else … Paradigmas de Programação prof Gláucya Carreiro Boechat 13 Construções de Seleção Múltipla Permite a seleção de uma instrução, dentre qualquer número de instruções ou de grupos de instruções Questões de Projeto: Qual é a forma e o tipo da expressão que controla que controla a seleção? Que instruções são selecionadas (simples, compostas, seqüências de instruções)? O fluxo de execução através da estrutura limita-se a incluir apenas um único segmento selecionável? O que é acontece quando o valor da expressão não está representado? Paradigmas de Programação prof Gláucya Carreiro Boechat 14 Seletores Múltiplos Antigos FORTRAN - IF aritmético IF (expressão aritmética) N1, N2, N3 Exemplo – Determinar valor númerico é > 0 , = 0, < 0 IF (expressão) 10, 20, 30 10 ... ... GO TO 40 20 ... ... GO TO 40 30 ... ... 40 ... Aspectos negativos Segmentos requerem GOTOs Sem encapsulamento, ou seja, os segmentos selecionáveis podem estar em qualquer lugar no código Paradigmas de Programação prof Gláucya Carreiro Boechat 15 Seletores Múltiplos Modernos Pascal "case" Sintaxe: case expressão of constante_1 : instrução_1; ... constante_n : instrução_n end Paradigmas de Programação prof Gláucya Carreiro Boechat 16 Seletores Múltiplos Modernos C switch switch (expression) { switch (expression) { case const_expr_1: stmt_1; ... case const_expr_n: stmt_n; [default: stmt_n+1] Paradigmas de Programação prof Gláucya Carreiro Boechat 17 Seletores Múltiplos Modernos Escolhas de projeto para o switch do C / C++ A expressão de controle pode ser apenas do tipo inteiro As instruções selecionáveis podem ser seqüências de instruções ou blocos de Seletores Múltiplos não existe desvio implícito no final do segmento selecionado Deve usado o comando break no final de cada segmento; A cláusula default serve para valores que não foram representados (se não existir default, nada é feito) Paradigmas de Programação prof Gláucya Carreiro Boechat 18 Seletores Múltiplos: Instrução case na Ada case expression is when choice list => stmt_sequence; … when choice list => stmt_sequence; when others => stmt_sequence;] end case; Paradigmas de Programação prof Gláucya Carreiro Boechat 19 Seletores Múltiplos usando if Seletores múltiplos podem ser construídos como extensões diretas de seletores bidirecionais, usando cláusulas else-if, por exemplo em Ada: if ... then ... elsif ... then ... else ... end if Paradigmas de Programação prof Gláucya Carreiro Boechat 20 Instruções Iterativas Execução de zero ou mais repetição de uma instrução ou bloco de instrução Realizada através de: Iteração recursão Paradigmas de Programação prof Gláucya Carreiro Boechat 21 Instruções Iterativas Tipos de Instruções Iterativas: Laços controlados por contador; Laços controlados logicamente; De forma iterativa; De forma recursiva. Laços controlados por iterador. Paradigmas de Programação prof Gláucya Carreiro Boechat 22 Instruções Iterativas Considerações de projeto (para iteração): Como a iteração é controlada? Contador; Expressão lógica (booleana) ou relacional. Onde colocar a condição de controle do laço? No início do laço (laço pré-testado); No fim do laço (laço pós-testado). Paradigmas de Programação prof Gláucya Carreiro Boechat 23 Laços controlados por contador Uma instrução iterativa de contagem possui uma variável do laço, e meios de especificar os valores inicial e terminal, e o tamanho do passo Questões de projeto: Qual é o tipo e o escopo da variável do laço? Que valor a variável do laço tem na sua finalização? Deve ser legal que a variável de laço ou os seus parâmetros sejam mudados no laço e, se assim for, a mudança afeta o seu controle? Os parâmetros do laço devem ser avaliados somente uma vez, ou uma vez para cada iteração? Paradigmas de Programação prof Gláucya Carreiro Boechat 24 Laços controlados por contador Instrução for do Pascal for variavel := inicial (to | downto) final do comando Questões de Projeto "for" do Pascal: Variável do laço deve ser do tipo ordinal, de escopo visível (local ou não local); Após terminar de forma normal, o valor da variável do laço é indefinido; A variável do laço não pode ser alterada no corpo do laço; Parâmetros do laço são avaliados uma única vez. Paradigmas de Programação prof Gláucya Carreiro Boechat 25 Laços controlados por contador Ex. em FORTRAN 77 e FORTRAN 90 Sintaxe: do label var = início, fim [, incremento] Variável de laço pode ser do tipo INTEGER, REAL,DOUBLE Ex. em FORTRAN 90 (outro DO) Sintaxe: [nome:] DO var = inicio, término [,incremento] ... END DO [nome] Variável de laço tem que ser do tipo INTEGER; Incremento pode ser qualquer valor diferente de zero; Parâmetros (início, fim) podem ser expressões. Paradigmas de Programação prof Gláucya Carreiro Boechat 26 Laços controlados por contador Instrução for do C, do C++ e do Java for ([expr_1] ; [expr_2] ; [expr_3]) comando Exemplo for (int cont = 0; cont < comp; cont++) {…} Todas as variáveis envolvidas podem ser alteradas no corpo do laço A primeira expressão é avaliada apenas uma vez, mas as outras duas são avaliadas em cada iteração Paradigmas de Programação prof Gláucya Carreiro Boechat 27 Laços controlados por contador Paradigmas de Programação prof Gláucya Carreiro Boechat 28 Laços Controlados Logicamente O controle da repetição baseia-se em uma expressão booleana e não em um contador Considerações de Projeto: O teste do laço é efetuado: No início da instrução (pré-teste)? No fim da instrução (pós-teste)? O laço controlado logicamente deve ser uma forma especial do laço controlado por contador, ou uma nova instrução de iterativa? Paradigmas de Programação prof Gláucya Carreiro Boechat 29 Laços Controlados Logicamente Exemplos em Pascal: Pascal possui instruções separadas para pré-teste pós-teste Paradigmas de Programação prof Gláucya Carreiro Boechat 30 Laços Controlados Logicamente C e C++ também possuem, mas a expressão de controle para o pós-teste é tratada como no pré-teste While (condição == true) corpo do laço; do corpo do laço; while (condição == true); Paradigmas de Programação prof Gláucya Carreiro Boechat 31 Laços Controlados Logicamente Ex. do Ada: Possui a versão de pré-teste mas não a pósteste. Ex. do FORTRAN 77 e 90: Não possui este tipo de instruções (laços lógicos). Paradigmas de Programação prof Gláucya Carreiro Boechat 32 Mecanismo de Controle de Laços Localizados pelo Usuário programador deve escolher a localização do controle do laço (outra que não o topo ou a base) Considerações de Projeto: O mecanismo condicional deve ser uma parte integrante da saída do laço? Pode este mecanismo estar presente num laço já controlado? Pode o controle ser transferido para fora de mais de um laço? Paradigmas de Programação prof Gláucya Carreiro Boechat 33 Mecanismo de Controle de Laços Localizados pelo Usuário (break e continue) C , C++ e Java: break Java e C# possuem uma instrução break rotulada: incondicional; para qualquer laço ou switch; um nível apenas o controle é transferido para o rótulo Uma alternativa: continue ela pula o resto das instruções da iteração, mas não sai do laço Paradigmas de Programação prof Gláucya Carreiro Boechat 34 Mecanismo de Controle de Laços Localizados pelo Usuário Exemplo da instrução "break": while ( soma < 1000) { getnext(valor); if (valor < 0 ) break; soma += valor } se valor for negativo o laço é finalizado. Paradigmas de Programação prof Gláucya Carreiro Boechat 35 Mecanismo de Controle de Laços Localizados pelo Usuário Exemplo do FORTRAN 90 (EXIT): Término incondicional para qualquer laço, e qualquer número de níveis. FORTRAN 90 possui a instrução "CYCLE“ Possui a mesma semântica do "continue" do C). Paradigmas de Programação prof Gláucya Carreiro Boechat 36 Iteração baseada em Estruturas de Dados A iteração está associada a uma estrutura de dados; A ordem dos elementos depende do iterador; O mecanismo de controle é uma chamada de função que retorna o próximo elemento, em alguma ordem, desde que exista elementos, caso contrário o laço termina. Paradigmas de Programação prof Gláucya Carreiro Boechat 37 Iteração baseada em Estruturas de Dados O for do C, do C++ e do Java pode ser usado para simular uma instrução de Instruções iterativas: for (p=root; p==NULL; traverse(p)){ ... } Paradigmas de Programação prof Gláucya Carreiro Boechat 38 Iteração baseada em Estruturas de Dados Ex. em C++ (mostrar todos os elementos de um array): A instrução "for" do C++ pode ser utilizada para percorrer toda a estrutura de dados. char * nomes[]={"José","João","Joca",0}; for(char ** p = nomes; *p!= 0; p++) { cout << *p << end; } Paradigmas de Programação prof Gláucya Carreiro Boechat 39 Iteração baseada em Estruturas de Dados Ex. em Perl (mostrar todos os elementos de um array): Perl possui um iterador implícito para arrays e hashes. $nomes = {"José","João","Joca"}; foreach $nome (@nomes) { print $nome } Paradigmas de Programação prof Gláucya Carreiro Boechat 40 Iteração baseada em Estruturas de Dados A instrução foreach do C# itera nos elementos de vetores: Strings[] = strList = {“Bob”, “Carol”, “Ted”}; Instruções iterativas: Iteração baseada em Estruturas de Dados foreach (Strings name in strList) Console.WriteLine (“Name: {0}”, name); Paradigmas de Programação prof Gláucya Carreiro Boechat 41 Desvio Incondicional Uma instrução de desvio incondicional transfere o controle para outra posição do programa. Mecanismo mais conhecido: instrução goto Problema -> Legibilidade Paradigmas de Programação prof Gláucya Carreiro Boechat 42 Desvio Incondicional Algumas linguagens não têm instruções de desvio incondicional Modula-2 Java. Linguagem que permitem "goto" mas desaconselham a sua utilização. Algol Pascal C C++ Paradigmas de Programação prof Gláucya Carreiro Boechat 43 Desvio Incondicional Exemplo de "goto" em C: printf("Enter m for mesg, or e to end:"); scanf("%c",&letter); if(letter=='m') goto A; else goto B; A: printf("\nHello!, you pressed m"); goto FIM; B: printf("\nBye!, ending program"); FIM: Paradigmas de Programação prof Gláucya Carreiro Boechat 44 Comandos Protegidos Propósito Fornecer instruções de controle que suportem uma metodologia de projeto que assegure a exatidão d Sugeridos por Dijkstra Commun. ACM 18 (1975), 8: 453–457 http://www.cs.utexas.edu/users/EWD/ewd04xx/EWD472.PDFur Paradigmas de Programação prof Gláucya Carreiro Boechat 45 Comandos Protegidos Semântica da instrução de seleção: Avalie todas as expressões booleanas Se mais de uma for verdadeira escolha uma de forma não determinística Se nenhuma for verdadeira um erro em tempo de execução é gerado Paradigmas de Programação prof Gláucya Carreiro Boechat 46 Comandos Protegidos: instrução de seleção Paradigmas de Programação prof Gláucya Carreiro Boechat 47 Comandos Protegidos Exemplo em Ada: if i =0 -> soma := soma + i [] i > j -> soma := soma + j [] j > i -> soma := soma + i fi Se i = 0 e j > i, a construção escolhe não deterministicamente a primeira ou a terceira instrução para ser executada; Se i for igual a j e diferente de zero, temos um erro pois nenhuma das expressões é válida. Paradigmas de Programação prof Gláucya Carreiro Boechat 48 Comandos Protegidos Semântica da instrução de laço: Avaliar todas as expressões lógicas; Se mais de uma for verdadeira, escolher uma, não deterministicamente; em seguida reinicia o laço novamente; Se nenhuma for verdadeira, finaliza o laço. Paradigmas de Programação prof Gláucya Carreiro Boechat 49 Comandos Protegidos Instrução de Laço: do <boolean> -> <instrução> [] <boolean> -> <instrução> ... [] <boolean> -> <instrução> od Exemplo em ADA: (ordenar: n1 < n2 < n3) do n1 > n2 -> max:= n1; n1:=n2; n2:=max; [] n3 > n2 -> max:= n3; n2:=n3; n3:=max; od Paradigmas de Programação prof Gláucya Carreiro Boechat 50 Comandos Protegidos: instrução de laço Paradigmas de Programação prof Gláucya Carreiro Boechat 51