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
Download

Estruturas de Controle entre Instruções