estruturas de controle entre instruções

51
Estruturas de Controle entre Instruções Paradigmas de Programação Prof. Gláucya Carreiro Boechat [email protected] Universidade Federal Rural de Pernambuco Departamento de Estatística e Informática

Upload: loren

Post on 15-Jan-2016

25 views

Category:

Documents


0 download

DESCRIPTION

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. Fluxo de controle ao nível de instrução. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Estruturas de Controle entre Instruções

Estruturas de Controle entre Instruções

Paradigmas de Programação

Prof. Gláucya Carreiro Boechat

[email protected]

Universidade Federal Rural de PernambucoDepartamento de Estatística e Informática

Page 2: Estruturas de Controle entre Instruções

Paradigmas de Programação - prof Gláucya Carreiro

Boechat 2

Exemplo de Estruturas de Controle

Page 3: Estruturas de Controle entre Instruções

Paradigmas de Programação - prof Gláucya Carreiro

Boechat 3

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

Page 4: Estruturas de Controle entre Instruções

Paradigmas de Programação - prof Gláucya Carreiro

Boechat 4

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)

Page 5: Estruturas de Controle entre Instruções

Paradigmas de Programação - prof Gláucya Carreiro

Boechat 5

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:

begincomando 1...comando n

end

Um bloco é uma Instrução Composta que pode definir um novo escopo (possui variáveis locais).

Page 6: Estruturas de Controle entre Instruções

Paradigmas de Programação - prof Gláucya Carreiro

Boechat 6

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

Page 7: Estruturas de Controle entre Instruções

Paradigmas de Programação - prof Gláucya Carreiro

Boechat 7

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?

Page 8: Estruturas de Controle entre Instruções

Paradigmas de Programação - prof Gláucya Carreiro

Boechat 8

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 20I = 1J = 2

20 CONTINUE

Page 9: Estruturas de Controle entre Instruções

Paradigmas de Programação - prof Gláucya Carreiro

Boechat 9

Exemplo Bidirecionais ALGOL 60 (unidireccional):

if (expressão booleana) thenbegin

...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.

Page 10: Estruturas de Controle entre Instruções

Paradigmas de Programação - prof Gláucya Carreiro

Boechat 10

Aninhando Seletores

Exemplo em Javaif (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

Page 11: Estruturas de Controle entre Instruções

Paradigmas de Programação - prof Gláucya Carreiro

Boechat 11

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.

Page 12: Estruturas de Controle entre Instruções

Paradigmas de Programação - prof Gláucya Carreiro

Boechat 12

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

Page 13: Estruturas de Controle entre Instruções

Paradigmas de Programação - prof Gláucya Carreiro

Boechat 13

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 …

Page 14: Estruturas de Controle entre Instruções

Paradigmas de Programação - prof Gláucya Carreiro

Boechat 14

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?

Page 15: Estruturas de Controle entre Instruções

Paradigmas de Programação - prof Gláucya Carreiro

Boechat 15

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, 3010 ... ...GO TO 4020 ... ...GO TO 4030 ... ...40 ...

Aspectos negativos Segmentos requerem GOTOs Sem encapsulamento, ou seja, os segmentos selecionáveis

podem estar em qualquer lugar no código

Page 16: Estruturas de Controle entre Instruções

Paradigmas de Programação - prof Gláucya Carreiro

Boechat 16

Seletores Múltiplos Modernos Pascal "case" Sintaxe:

case expressão of

constante_1 : instrução_1;

...

constante_n : instrução_n

end

Page 17: Estruturas de Controle entre Instruções

Paradigmas de Programação - prof Gláucya Carreiro

Boechat 17

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]

Page 18: Estruturas de Controle entre Instruções

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

Page 19: Estruturas de Controle entre Instruções

Seletores Múltiplos:

Instrução case na Adacase 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

Page 20: Estruturas de Controle entre Instruções

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 ifParadigmas de Programação -

prof Gláucya Carreiro Boechat 20

Page 21: Estruturas de Controle entre Instruções

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

Page 22: Estruturas de Controle entre Instruções

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

Page 23: Estruturas de Controle entre Instruções

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

Page 24: Estruturas de Controle entre Instruções

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

Page 25: Estruturas de Controle entre Instruções

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

Page 26: Estruturas de Controle entre Instruções

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

Page 27: Estruturas de Controle entre Instruções

Laços controlados por contador Instrução for do C, do C++ e do Java

for ([expr_1] ; [expr_2] ; [expr_3])

comandoExemplo

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

Page 28: Estruturas de Controle entre Instruções

Laços controlados por contador

Paradigmas de Programação - prof Gláucya Carreiro

Boechat 28

Page 29: Estruturas de Controle entre Instruções

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

Page 30: Estruturas de Controle entre Instruções

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

Page 31: Estruturas de Controle entre Instruções

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

Page 32: Estruturas de Controle entre Instruções

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 32

Page 33: Estruturas de Controle entre Instruções

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

Page 34: Estruturas de Controle entre Instruções

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çoParadigmas de Programação -

prof Gláucya Carreiro Boechat 34

Page 35: Estruturas de Controle entre Instruções

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

Page 36: Estruturas de Controle entre Instruções

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

Page 37: Estruturas de Controle entre Instruções

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

Page 38: Estruturas de Controle entre Instruções

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

Page 39: Estruturas de Controle entre Instruções

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

Page 40: Estruturas de Controle entre Instruções

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

Page 41: Estruturas de Controle entre Instruções

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

Page 42: Estruturas de Controle entre Instruções

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

Page 43: Estruturas de Controle entre Instruções

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

Page 44: Estruturas de Controle entre Instruções

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

Page 45: Estruturas de Controle entre Instruções

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

Page 46: Estruturas de Controle entre Instruções

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

Page 47: Estruturas de Controle entre Instruções

Comandos Protegidos: instrução de seleção

Paradigmas de Programação - prof Gláucya Carreiro

Boechat 47

Page 48: Estruturas de Controle entre Instruções

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

Page 49: Estruturas de Controle entre Instruções

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

Page 50: Estruturas de Controle entre Instruções

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

Page 51: Estruturas de Controle entre Instruções

Paradigmas de Programação - prof Gláucya Carreiro

Boechat 51

Comandos Protegidos: instrução de laço