estruturas de controle entre instruções paradigmas de programação prof. gláucya carreiro...
Post on 19-Apr-2015
113 Views
Preview:
TRANSCRIPT
Estruturas de Controle entre Instruções
Paradigmas de Programação
Prof. Gláucya Carreiro Boechat
glaucyacboechat@gmail.com
Universidade Federal Rural de PernambucoDepartamento de Estatística e Informática
Paradigmas de Programação - prof Gláucya Carreiro
Boechat 2
Exemplo de Estruturas de Controle
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
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)
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).
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
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?
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
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.
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
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.
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
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 …
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?
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
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
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]
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 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
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
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])
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
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ó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
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
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
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
Paradigmas de Programação - prof Gláucya Carreiro
Boechat 51
Comandos Protegidos: instrução de laço
top related