510 likes | 646 Views
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 glaucyacboechat@gmail.com. Exemplo de Estruturas de Controle. Fluxo de controle ao nível de instrução.
E N D
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 glaucyacboechat@gmail.com
Exemplo de Estruturas de Controle Paradigmas de Programação - prof Gláucya Carreiro Boechat
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
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
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
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
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
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
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
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
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
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
Ex. em ALGOL 60: • Não permite aninhamento direto • É preciso ser colocado em uma instrução composta Aninhado ao 2º if Aninhado ao 1º if if ... then if ... then begin begin if ... then if ... then ... … else … end end else … Paradigmas de Programação - prof Gláucya Carreiro Boechat
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
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
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
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
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
Seletores Múltiplos: • Instrução case na Ada case expression is whenchoicelist => stmt_sequence; … whenchoicelist => stmt_sequence; whenothers => stmt_sequence;] end case; Paradigmas de Programação - prof Gláucya Carreiro Boechat
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 ... endif Paradigmas de Programação - prof Gláucya Carreiro Boechat
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
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
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 - profGláucya Carreiro Boechat
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
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
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
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
Laços controlados por contador Paradigmas de Programação - prof Gláucya Carreiro Boechat
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
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
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
Laços Controlados Logicamente • Ex. do Ada: • Possui a versão de pré-teste mas não a pós-teste. • 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
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
Mecanismo de Controle de Laços Localizados pelo Usuário (break e continue) • C , C++ e Java: break • incondicional; • para qualquer laço ou switch; um nível apenas • Java e C# possuem uma instrução break rotulada: • 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
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
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
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
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
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
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
Iteração baseada em Estruturas de Dados • A instrução foreachdo 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
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
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
Desvio Incondicional • Exemplo de "goto" em C: printf("Enterm 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!, endingprogram"); FIM: Paradigmas de Programação - prof Gláucya Carreiro Boechat
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
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
Comandos Protegidos: instrução de seleção Paradigmas de Programação - prof Gláucya Carreiro Boechat
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
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
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