Sunteți pe pagina 1din 58

Capítulo 8

Estruturas de Controle
no Nível de Sentença
Conceitos de Linguagens de Programação – Robert W. Sebesta

Tópicos do Capítulo 8
• Introdução
• Sentenças de seleção
• Sentenças de iteração
• Desvio incondicional
• Comandos protegidos
• Conclusões
Conceitos de Linguagens de Programação – Robert W. Sebesta

Níveis de fluxo de controle


• Dentro de expressões (Capítulo 7)
• Entre unidades de programas (Capítulos 9 a 13)
• Entre sentenças de programas (este capítulo)
Conceitos de Linguagens de Programação – Robert W. Sebesta

Níveis de fluxo de controle


• Dentro de expressões (Capítulo 7)
• Entre unidades de programas (Capítulos 9 a 13)
• Entre sentenças de programas (este capítulo)
Conceitos de Linguagens de Programação – Robert W. Sebesta

Sentenças (instruções) de controle: Evolução


• Sentenças de controle em FORTRAN I foram baseados diretamente no
hardware do IBM 704
• Boa parte da pesquisa e da discussão foi devotada às sentenças de
controle nos anos 1960
– Um resultado importante: foi provado que todos os algoritmos que podem
ser expressos por diagramas de fluxo podem ser codificados em uma
linguagem de programação com apenas duas sentenças de controle
• uma para escolher entre dois caminhos de fluxo de controle
• E uma para iterações controladas logicamente
– Outro resultado importante: as instruções de desvio incondicional são
supérfluas (convenientes, mas não essenciais)
Conceitos de Linguagens de Programação – Robert W. Sebesta

Estrutura de controle
• Uma estrutura de controle é uma sentença/instrução de controle e a sua
coleção de sentenças/comandos cuja execução ela controla

• Questão de projeto
– A estrutura de controle deve ter múltiplas entradas?
• As estruturas de controle geralmente controlam a execução de
segmentos de códigos e a questão é se devem iniciar sempre na
primeira instrução desses segmentos
– Multíplas entradas só é possível em linguagens que incluem gotos
e rótulos de instrução
Conceitos de Linguagens de Programação – Robert W. Sebesta

Sentenças de seleção
• Uma sentença de seleção fornece os meios para escolher entre dois ou
mais caminhos de execução em um programa
• Duas categorias gerais:
– Seleção bidirecional (Dois caminhos)
– Seleção múltipla (n caminhos)
Conceitos de Linguagens de Programação – Robert W. Sebesta

Seletor unidirecional do Fortan IV


• Forma primitiva inicial:

if expressão_booleana instrução

Para garantir mais de uma instrução, utilizava lógica


inversa

Ex: IF(FLAG .NE. 1) GO TO 20


I=1
J=2
20 CONTINUE

• Prejudica legibilidade
• Já corrigido em linguagens que vieram depois do ALGOL 60 (Java,
C, C++, Fortan 90)
Conceitos de Linguagens de Programação – Robert W. Sebesta

Dois caminhos
• Forma geral (introduzida no Algol 60):

if expressão_de_controle
cláusula então
cláusula senão

• Questões de projeto:
– Qual é a forma e o tipo da expressão que controla a seleção?
– Como são especificadas as cláusulas então e senão?
– Como o significado dos seletores aninhados deve ser especificado?
Conceitos de Linguagens de Programação – Robert W. Sebesta

A expressão de controle
• Expressões de controle são especificadas entre parênteses se a
palavra reservada then (ou algum outro marcador sintático) não for
usada para introduzir a cláusula então
• Em C89, C99, Python e C++, a expressão de controle pode ser
aritmética
• Em linguagens como Ada, Java, Ruby e C#, a expressão de controle
deve ser booleana
Conceitos de Linguagens de Programação – Robert W. Sebesta

Forma da cláusula
• Em muitas linguagens contemporâneas, as cláusulas então e senão
aparecem ou como sentenças simples ou como sentenças compostas
• Em Perl, todas as cláusulas então e senão devem ser sentenças
compostas
• Em Fortran 95, Ada e Ruby, as cláusulas então e senão são sequências
de sentenças
• Python usa identação para especificar sentenças compostas
if x > y :
x = y
print "case 1"
Conceitos de Linguagens de Programação – Robert W. Sebesta

Aninhando seletores
• Exemplo em Java
if (sum == 0)
if (count == 0)
result = 0;
else result = 1;
• Para qual if a cláusula else está associada?
• Regra de semântica estática de Java: else sempre casa com a if
mais próxima
Conceitos de Linguagens de Programação – Robert W. Sebesta

Aninhando seletores (continuação)


• Para forçar a semântica alternativa em Java, o if interno é colocado em
uma sentença composta, como em:
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 então e senão sejam compostas
(marcadas por { })
Conceitos de Linguagens de Programação – Robert W. Sebesta

Aninhando seletores (continuação)


• Sequências de sentenças como cláusulas: Ruby
if sum == 0 then
if count == 0 then
result = 0
else
result = 1
end
end
Conceitos de Linguagens de Programação – Robert W. Sebesta

Aninhando seletores (continuação)


• Python
if sum == 0 :
if count == 0 :
result = 0
else :
result = 1
Conceitos de Linguagens de Programação – Robert W. Sebesta

Construções de seleção múltipla


• Permite a seleção de uma dentre qualquer número de sentenças ou de
grupos de sentenças
• Questões de projeto:
1. Qual é a forma e o tipo da expressão que controla a seleção?
2. Como são especificados os segmentos selecionáveis?
3. O fluxo de execução por meio da estrutura pode incluir apenas um único
segmento selecionável?
4. Como os valores de cada caso são especificados?
5. Como valores da expressão de seleção que não estão representados
devem ser manipulados, se é que o devem?
Conceitos de Linguagens de Programação – Robert W. Sebesta

Exemplos de seletores múltiplos antigos


• Fortran I – seletor tridirecional – if aritmético
• IF (expressão aritmética) N1, N2, N3
N1,N2 e N3 rótulos de desvio N1 se expressão negativo, N2 se zero, N3
se maior que zero
• Ex:
IF (expressao) 10,20,30
10 …
..
GO TO 40
20 ..
..
GO TO 40
30 ..
..
40 ..
Conceitos de Linguagens de Programação – Robert W. Sebesta

Exemplos de seletores múltiplos


• No Pascal

case expressao of
lista_de_constantes_1: intrucao_1;
..
lista_de_constantes_n: instrucao_n
end

• Expressão é do tipo ordinal (inteiro, booleano,


caractere ou enumeração)
Conceitos de Linguagens de Programação – Robert W. Sebesta

Exemplos de seletores múltiplos


• No Pascal – agora já possuem clausula opcional de
tratamento de ausência de opção

case indice of
1,3:begin
..
end;
2,4: begin
..
end
else writeln ('Erro')
end
Conceitos de Linguagens de Programação – Robert W. Sebesta

Exemplos de seletores múltiplos


• C, C++ e Java

switch (expressão) {
case expressão_constante_1: sentença_1;

case constante_n: sentença_n;
[default: sentença_n+1]
}
Conceitos de Linguagens de Programação – Robert W. Sebesta

Exemplos de seletores múltiplos


• Escolhas de projeto para o switch de C
1. A expressão de controle pode ser apenas do tipo inteiro
2. As sentenças selecionáveis podem ser sequências de sentenças,
sentenças compostas ou blocos
3. Qualquer número de segmentos pode ser executado em uma execução
da construção
4. O segmento opcional default é usado para valores não representados
(se o valor da expressão de controle não é representado e nenhum
segmento padrão está presente, a construção não faz nada)
Conceitos de Linguagens de Programação – Robert W. Sebesta

Exemplos de seletores múltiplos


• C#
– Se difere do C ao ter uma regra de semântica estática que proíbe a
execução implícita de mais de um segmento
– Cada segmento selecionável deve terminar com uma sentença de desvio
incondicional explícita (goto ou break)
– Em C#, expressão de controle e as construções case podem ser cadeias
Conceitos de Linguagens de Programação – Robert W. Sebesta

Exemplos de seletores múltiplos


• Ada
case expressão is
when lista de escolhas => sequência_de_sentenças;

when lista de escolhas => sequência_de_sentenças;
[when others => sequência_de_sentenças;]
end case;

• Mais confiável do que o switch de C (uma vez que a execução da


sequência_de_sentenças é completa, o controle é passado à primeira
sentença após case
Conceitos de Linguagens de Programação – Robert W. Sebesta

Exemplos de seletores múltiplos


• Escolhas de design em Ada:
1. Expressão pode ser qualquer tipo ordinal
2. Segmentos podem ser simples ou compostos
3. Apenas um segmento pode ser executado por execução de construção
4. Valores não representados não são permitidos
• Listas de escolhas das sentenças:
1. Uma lista de constantes
2. Pode incluir:
• Subfaixas
• Operador booleano OU (|)
Conceitos de Linguagens de Programação – Robert W. Sebesta

Exemplos de seletores múltiplos


• Ruby tem duas formas de construções de seleção múltipla
1. Uma forma usa when
leap = case
when year % 400 == 0 then true
when year % 100 == 0 then false
else year % 4 == 0
end
2. A outra usa case e when
case in_val
when -1 then neg_count++
when 0 then zero_count++
when 1 then pos_count++
else puts "Error – in_val is out of range"
end
Conceitos de Linguagens de Programação – Robert W. Sebesta

Seleção múltipla usando if


• Seletores múltiplos podem aparecer diretamente como extensões de
seletores de dois caminhos, usando cláusulas else-if. Por exemplo,
em Python:
if count < 10 :
bag1 = True
elif count < 100 :
bag2 = True
elif count < 1000 :
bag3 = True
Conceitos de Linguagens de Programação – Robert W. Sebesta

Seleção múltipla usando if


• O exemplo de Python pode ser escrito como a sentença case de Ruby
case
when count < 10 then bag1 = true
when count < 100 then bag2 = true
when count < 1000 then bag3 = true
end
Conceitos de Linguagens de Programação – Robert W. Sebesta

Sentenças de iteração
• Sentenças que fazem com que uma sentença ou uma coleção de
sentenças seja executada zero, uma ou mais vezes. Uma construção de
iteração é frequentemente chamada de um laço
• Questões de projeto:
1. Como a iteração é controlada?
2. Onde o mecanismo de controle deve aparecer na construção de laço?
Conceitos de Linguagens de Programação – Robert W. Sebesta

Laços controlados por contador


• Uma sentença de controle iterativa de contagem tem uma variável de
laço, que inclui os valores inicial e final e o tamanho do passo
• Questões de projeto:
1. Qual é o tipo e o escopo da variável de laço?
2. Deve ser legal para a variável ou para os parâmetros de laço serem
modificados nele, e, se isso for possível, essa mudança afeta o controle
do laço?
3. Os parâmetros de laço devem ser avaliados apenas uma vez ou uma vez
para cada iteração?
Conceitos de Linguagens de Programação – Robert W. Sebesta

Exemplos de sentenças de iteração


• Sintaxe de FORTRAN 95
DO rótulo variável = inicial, final [, tamanho do passo]
• Tamanho do passo pode ser qualquer valor, menos zero
• Parâmetros podem ser expressões
• Questões de projeto:
1. A variável de laço deve ser do tipo INTEGER
2. A variável de laço não pode ser mudada no laço, mas os parâmetros
podem; porque eles são avaliados apenas uma vez, isso não afeta o
controle do laço
3. Parâmetros do laço são avaliados apenas uma vez
Conceitos de Linguagens de Programação – Robert W. Sebesta

Exemplos de sentenças de iteração


• FORTRAN 95: uma segunda forma:
[name:] Do variable = initial, terminal [,stepsize]

End Do [name]
Conceitos de Linguagens de Programação – Robert W. Sebesta

Exemplos de sentenças de iteração


• Ada
for variável in [reverse] faixa_discreta loop
...
end loop
• Questões de projeto:
– Uma faixa discreta é uma subfaixa de um tipo inteiro ou de enumeração
– Variáveis de laço não existem fora do laço
– A variável de laço não pode ser mudada no laço, mas a faixa discreta
pode; isso não afeta o controle do laço
– A faixa discreta é avaliada apenas uma vez
Conceitos de Linguagens de Programação – Robert W. Sebesta

Exemplos de sentenças de iteração


• Ada

for CONT in 1..10 loop


SOMA := SOMA + CONT;
end loop

- Obs: A faixa de 1..10 é avaliada apenas uma vez


Conceitos de Linguagens de Programação – Robert W. Sebesta

Exemplos de sentenças de iteração


• Linguagem Pascal
for variavel := valor_inicial (to | downto) valor_final
do instrucao

Opções de Projeto
- A variável de laço deve ser tipo ordinal e tem o escopo
de sua declaração
- Se o laço for finalizado prematuramente, ele terá seu
ultimo valor
- A variável de laço não pode ser mudada no corpo do laço
- Os valores inicial e final podem ser mudados, no
entanto são avaliadas para o controle somente uma vez
Conceitos de Linguagens de Programação – Robert W. Sebesta

Exemplos de sentenças de iteração


• Linguagens baseadas em C
for ([expr_1] ; [expr_2] ; [expr_3]) statement
– Expr1 é a inicialização – é avaliada somente uma vez,
no início do for
– Expr_2 é o controle do laço, avaliada antes de cada
execução do corpo deste. Se = 0 (falso) a instrução for
é finalizada
– Expr_3 é executada após cada execução do corpo do laço.
Muitas vezes utilizada como incremento para um contador
de laços.
Conceitos de Linguagens de Programação – Robert W. Sebesta

Exemplos de sentenças de iteração


• Linguagens baseadas em C
for ([expr_1] ; [expr_2] ; [expr_3]) statement

Semântica
expr_1
laço:
if expr_2 = 0 goto for a
[corpo do laço]
expr_3
goto laço
fora:
Conceitos de Linguagens de Programação – Robert W. Sebesta

Exemplos de sentenças de iteração


• Linguagens baseadas em C
for ([expr_1] ; [expr_2] ; [expr_3]) statement
– O corpo do laço pode ser uma única sentença, uma sentença composta
ou uma sentença nula
– O valor de uma expressão de sentenças múltiplas é o valor da última
sentença na expressão
– Se a segunda expressão está ausente, é um laço infinito
• Escolhas de projeto:
– Não há nenhuma variável de laço explícita
– Tudo pode ser mudado no laço
– A primeira expressão é avaliada uma vez, mas as outras duas são
avaliadas com cada iteração
Conceitos de Linguagens de Programação – Robert W. Sebesta

Exemplos de sentenças de iteração


• O comando for do C pode conter instruções múltiplas

Ex:

for (cont1=0, cont2=0.0; cont1<=10 && cont2<=100.0;


soma = ++cont1 + cont2, cont2 *= 2.5);

Qual a semântica desse comando?


Observe que a instrução for não tem corpo!
Conceitos de Linguagens de Programação – Robert W. Sebesta

Exemplos de sentenças de iteração


• C++ se difere de C de duas maneiras:
1. A expressão de controle pode ser booleana
2. A primeira expressão pode incluir definições de variáveis (o escopo de
uma variável definida na sentença for é a partir de sua definição até o final
do corpo do laço)
for (int cont=0; cont<comp; cont++) {..}
o escopo de uma variavel definida no for vale de sua definição até o final
do corpo do laço
• Java e C#
– Diferem de C++ porque a expressão de controle de laço é restrita a
valores booleanos
Conceitos de Linguagens de Programação – Robert W. Sebesta

Exemplos de sentenças de iteração


• Python
for variável_do_laço in objeto:
- corpo do laço
[else:
- cláusula senão]

– O objeto é frequentemente uma faixa, uma lista de valores em colchetes


([2, 4, 6]), ou uma chamada à função range (range(5), which returns 0, 1,
2, 3, 4)
– A variável de laço assume os valores especificados na faixa dada, um
para cada iteração
– A cláusula else, que é opcional, é executada se o laço termina
normalmente
Conceitos de Linguagens de Programação – Robert W. Sebesta

Sentenças de iteração: laços controlados


logicamente
• Controle de repetição é baseado em uma expressão booleana
• Questões de projeto:
– O controle deve ser de pré ou pós-teste?
– O laço controlado logicamente deve ser uma forma especial de um laço
de contagem ou uma sentença separada?
Conceitos de Linguagens de Programação – Robert W. Sebesta

Sentenças de iteração: laços controlados


logicamente
• C e C++ incluem tanto laços controlados logicamente com pré-teste
quanto com pós-teste:
while (expr) do
corpo do laço corpo do laço
while (expr)
• Java é semelhante a C e C++, exceto que a expressão de controle deve
ser booleana (e o corpo de laço deve ser acessado no início - Java não
tem goto )
Conceitos de Linguagens de Programação – Robert W. Sebesta

Sentenças de iteração: laços controlados


logicamente
while (expr)
corpo do laço

Semântica deste commando:


laço:
if expr=0 goto fora
[corpo]
goto laço
fora: ..
Conceitos de Linguagens de Programação – Robert W. Sebesta

Sentenças de iteração: laços controlados


logicamente

do
corpo do laço
while (expr)

Semântica deste commando:


laço:
[corpo]
if expr<>0 goto laco
Conceitos de Linguagens de Programação – Robert W. Sebesta

Sentenças de iteração: laços controlados


logicamente
• Ada tem um laço lógico com pré-teste, mas nenhuma versão pós-teste
• FORTRAN 95 não tem um laço lógico, nem com pré-teste, nem com
pós-teste
• Perl e Ruby têm dois laços lógicos com pré--teste: while e until. Perl
também tem dois laços com pós-teste
Conceitos de Linguagens de Programação – Robert W. Sebesta

Mecanismos de controle de laços


posicionados pelo usuário
• Em algumas situações, é conveniente para um programador escolher
uma posição para o controle do laço em vez do início ou o final do laço

• Questões de projeto
1. O mecanismo condicional deve ser uma parte integral da saída?
2. E possível sair apenas de um corpo de laço ou e possível sair também
dos laços que o envolvem?
Conceitos de Linguagens de Programação – Robert W. Sebesta

Mecanismos de controle de laços


posicionados pelo usuário: break e continue
• C , C++, Python, Ruby e C# tem saídas não rotuladas incondicionais
(break)
• Java e Perl tem saídas incondicionais rotuladas (break em Java, last
em Perl)
• C, C++ e Python incluem uma sentença de controle não rotulada,
continue, que transfere o controle para o mecanismo de controle do
menor laço que o envolve
• Java e Perl têm sentenças similares ao continue

Atividade – dê exemplos de sequencia de códigos e de


semântica de cada um desses tópicos
Conceitos de Linguagens de Programação – Robert W. Sebesta

Iteração baseada em estruturas


de dados
• Laços controlados pelo número de elementos em uma estrutura de
dados
• Um iterador é chamado no início de cada iteração, e cada vez que ele é
chamado, retorna um elemento de uma estrutura de dados em particular
em alguma ordem específica
• A construção for das linguagens baseadas em C pode ser usada para
simular uma sentença de iteração definida pelo usuário:
for (p=root; p==NULL; traverse(p)){ .. }
Percorre a árvore a partir da raiz
A função traverse pega o próximo nó – é o iterador
Conceitos de Linguagens de Programação – Robert W. Sebesta

Iteração baseada em estruturas de


dados (continuação)
PHP
– current aponta para o elemento que foi acessado pela última vez
pelo iterador
– next move current para o próximo elemento na matriz
– reset move current para o primeiro elemento
• Java
– Para qualquer coleção que implementa a interface Iterator
– next move o ponteiro para a coleção
– hasNext é um predicado
– remove deleta um elemento
• Perl tem um iterador embutido, foreach
@nomes=(“Maria”,”José”,”Joao”);
foreach $nome (@nomes){ ..}
Conceitos de Linguagens de Programação – Robert W. Sebesta

Iteração baseada em estruturas de


dados (continuação)
• Java 5.0 (usa for, embora chamado de foreach)
– Para matrizes ou outra classe que implemente a interface
Iterable, por exemplo, ArrayList
for (String myElement : myList) { … }

• Sentença foreach de C# itera nos elementos de matrizes e de outras


coleções:
Strings[] = strList = {"Bob", "Carol", "Ted"};
foreach (Strings name in strList)
Console.WriteLine ("Name: {0}", name);
A notação {0} indica a posição na cadeia a ser mostrada
Conceitos de Linguagens de Programação – Robert W. Sebesta

Iteração baseada em estruturas de


dados (continuação)
• Lua
– Lua tem duas formas de sentença iterativa, uma como o Do do Fortran e
uma mais geral:
for variable_1 [, variable_2] in iterator(table) do

end
– Os iteradores mais comumente usados são pairs e ipairs
Conceitos de Linguagens de Programação – Robert W. Sebesta

Desvio incondicional
• Transfere o controle da execução para uma posição especificada
no programa
• Representou um dos principais debates mais aquecidos nos anos 1960
e 1970
• Maior preocupação: legibilidade
• Algumas linguagens não têm suporte para goto (por exemplo, Java)
• C# oferece goto (pode ser usado em sentenças switch)
• Sentenças de saída de laços são restritas e camuflam sentenças goto
Conceitos de Linguagens de Programação – Robert W. Sebesta

Comandos protegidos
• Sugeridos por Dijkstra
• Finalidade: fornecer sentenças de controle que suportariam uma
metodologia de projeto de programas que garantisse a corretude
durante o desenvolvimento
• Base para dois mecanismos linguísticos para programação concorrente
(em CSP e Ada)
• Ideia básica: se a ordem de avaliação não é importante, o programa não
deve especificar uma
Conceitos de Linguagens de Programação – Robert W. Sebesta

Seleção de comandos protegidos


• Forma
if <expressão booleana> -> <sentença>
[] <expressão booleana> -> <sentença>
...
[] <expressão booleana> -> <sentença>
fi
• Semântica: quando a construção é alcançada,
– Avalia todas as expressões booleanas
– Se mais de uma é verdadeira, escolhe uma de maneira não determinística
– Se nenhuma é verdadeira, ocorre um erro em tempo de execução

Exemplo
if x >= y -> max := x
[ ] y >= x -> max := y
fi
Conceitos de Linguagens de Programação – Robert W. Sebesta

Laço de comandos protegidos


• Forma
do <expressão booleana> -> <sentença>
[] < expressão booleana > -> <sentença>
...
[] < expressão booleana > -> <sentença>
od
• Semântica: para cada iteração
– Avalia todas as expressões booleanas
– Se mais de uma for verdadeira, uma é não deterministicamente escolhida
para execução; depois são avaliadas novamente
– Se nenhuma é verdadeira, o laço termina
Conceitos de Linguagens de Programação – Robert W. Sebesta

Comandos protegidos
• A conexão entre sentenças de controle e verificação de programas
é grande
• A verificação é impossível com sentenças goto
• A verificação é simplificada com apenas laços lógicos e seleções ou
apenas comandos protegidos
Conceitos de Linguagens de Programação – Robert W. Sebesta

Conclusões
• Variedade de estruturas no nível de sentença
• Programas escritos com apenas seleção e laços lógicos com pré-teste
são geralmente menos naturais em sua estrutura, mais complexos e,
dessa forma, mais difíceis de serem escritos e de serem lidos
• As estruturas de controle das linguagens de programação funcionais e
programação lógica são todas bastante diferentes