Paradigma Imperativo
Estruturas de Repetição
Paradigmas de Linguagem de Programação
Prof. Dr. Alysson F. Milanez
alysson.milanez@maisunifacisa.com.br
Laços controlados Logicamente
2
Estruturas de Repetição
Laços controlados logicamente são mais gerais do que laços controlados por contador
Todos os laços de contagem podem ser construídos com laços lógicos, mas o inverso não é verdadeiro
3
Estruturas de Repetição
int i;
for(i = 0; i <= 100; i++){
printf(“%d”, i);
}
int i;
while(i <= 100){
printf(“%d”, i);
i++;
}
4
Estruturas de Repetição
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?
5
Estruturas de Repetição
Laço com pré-teste
while (expressão_de_controle)
corpo do laço
6
Estruturas de Repetição
Laço com pós-teste
do
corpo do laço
while (expressão_de_controle);
7
Estruturas de Repetição
Em C#
sum = 0;
indat = Int32.Parse(Console.ReadLine());
while (indat >= 0) {
sum += indat;
indat = Int32.Parse(Console.ReadLine());
}
8
Estruturas de Repetição
Em C#
digits = 0;
value = Int32.Parse(Console.ReadLine());
do {
value /= 10;
digits++;
} while (value > 0);
9
Estruturas de Repetição
A única diferença real entre o do e o while é que o do sempre faz o corpo do laço ser executado ao menos uma vez
10
Estruturas de Repetição
E em Java?
Escrevam versões em Java para o código while e do-while C#
11
Estruturas de Repetição
sum = 0;
indat = Int32.Parse(Console.ReadLine());
while (indat >= 0) {
sum += indat;
indat = Int32.Parse(Console.ReadLine());
}
digits = 0;
value = Int32.Parse(Console.ReadLine());
do {
value /= 10;
digits++;
} while (value > 0);
12
Estruturas de Repetição
Semântica operacional: while
loop:
if expressão_de_controle é falsa goto out
[corpo do laço]
goto loop
out: ...
13
Estruturas de Repetição
Semântica operacional: do-while
loop:
[corpo do laço]
if expressão_de_controle é verdadeira goto loop
14
Estruturas de Repetição
O Fortran 95 não tem um laço lógico, nem com pré-teste, nem com pós-teste
Ada tem um laço lógico com pré-teste, mas nenhuma versão pós-teste do laço lógico
15
Estruturas de Repetição
X : Integer := 0;
begin
while X <= 5 loop
Put(X);
X := X + 1;
New_line(1);
end loop;
end
16
Estruturas de Repetição
Perl e Ruby têm dois laços lógicos com pré-teste: while e until
O until é similar ao while, mas usa o inverso do valor da expressão de controle
17
Estruturas de Repetição
Perl também tem dois laços com pós-teste, que usam while e until como modificadores de sentenças em blocos do
18
Estruturas de Repetição
Laços pós-teste não são usados com frequência e podem ser perigosos, porque os programadores algumas vezes esquecem que o corpo do laço será sempre executado ao menos uma vez
19
Controle de laço posicionado pelo usuário
20
Estruturas de Repetição
Algumas vezes é interessante ao programador definir uma posição para o controle de laço
21
Estruturas de Repetição
São laços infinitos que incluem saídas do laço posicionadas pelos usuários
22
Estruturas de Repetição
A questão mais interessante é se um único laço ou diversos laços aninhados podem ser abandonados
23
Estruturas de Repetição
C, C++, Python, Ruby e C# têm saídas não rotuladas incondicionais (break)
Java e Perl têm saídas incondicionais rotuladas (break em Java, last em Perl)
24
Estruturas de Repetição
outerLoop:
for (row = 0; row < numRows; row++)
for (col = 0; col < numCols; col++) {
sum += mat[row][col];
if (sum > 1000.0)
break outerLoop;
}
25
Estruturas de Repetição
Continue transfere o controle para o mecanismo do menor laço que o envolve
Disponível em C, C++, Python
26
Estruturas de Repetição
Essa não é uma saída, mas uma maneira de pular o resto das sentenças do laço na iteração atual sem terminar a estrutura do laço
27
Estruturas de Repetição
while (sum < 1000) {
getnext(value);
if (value < 0) continue;
sum += value;
}
28
Estruturas de Repetição
Um valor negativo faz a sentença de atribuição ser pulada, e o controle é transferido em vez disso para o condicional no topo do laço
29
Estruturas de Repetição
Java e Perl têm sentenças similares ao continue, exceto que elas podem incluir rótulos que especificam qual laço deve ser continuado
30
Estruturas de Repetição
A motivação para saídas de laços posicionadas pelo usuário é simples: elas atendem a uma necessidade comum de sentenças goto por meio de uma sentença de desvio altamente restrita
31
Iteração baseada em Estrutura de Dados
32
Estruturas de Repetição
Perl, JavaScript, PHP, Java e C# têm tais sentenças: laços controlados pelo número de elementos em uma estrutura de dados
33
Estruturas de Repetição
Uma sentença de iteração baseada em dados usa uma estrutura de dados e uma função definida pelo usuário para navegar nos elementos da estrutura
Tal função é um iterador, chamado no início de cada iteração
34
Estruturas de Repetição
Cada vez que ele é chamado, retorna um elemento de uma estrutura de dados em particular em alguma ordem específica
35
Estruturas de Repetição
A construção for das linguagens baseadas em C, por causa de sua grande flexibilidade, pode ser usada para simular uma sentença de iteração definida pelo usuário
36
Estruturas de Repetição
Iteradores pré-definidos são usados para fornecer acesso iterativo para as matrizes únicas de PHP
37
Estruturas de Repetição
Sentenças de iteração definidas pelo usuário são muito importantes na programação orientada a objetos
38
Estruturas de Repetição
Em C++, iteradores para tipos definidos pelo usuário, ou classes, são implementados como funções amigas (friend functions) à classe ou como classes iteradoras separadas
39
Estruturas de Repetição
Em Java, os elementos de uma coleção definida pelo usuário que implementa a interface Collection pode ser visitada iterativamente com uma implementação da interface Iterator
40
Estruturas de Repetição
A partir de Java5, temos o foreach
ArrayList<String> myList = new ArrayList<String>();
for (String myElement : myList) { ... }
41
Estruturas de Repetição
A sentença foreach do C# itera nos elementos de matrizes e de outras coleções��String[] strList = {"Bob", "Carol", "Ted", "Beelzebub"};�foreach (String name in strList)� Console.WriteLine("Name: {0}", name);
42
Estruturas de Repetição
A notação {0} no parâmetro para Console.WriteLine acima indica a posição na cadeia a ser mostrada quando o valor da primeira variável nomeada, name nesse exemplo, está para ser colocado
43
Estruturas de Repetição
Lua inclui uma sentença de laço chamada de for genérico, uma construção de iteração para estruturas de dados.
44
Estruturas de Repetição
Como Lua tem apenas uma estrutura de dados, a tabela, o for genérico itera sobre essa estrutura
for variável_1 [,variável_2] in iterador(tabela) do
...
end
45
Estruturas de Repetição
Se apenas uma variável for informada, ela recebe as chaves da tabela
Se uma segunda variável é informada, ela recebe os valores da tabela
Então, para obter os valores, duas variáveis devem ser informadas
46
Estruturas de Repetição
As duas funções de iteração pré-definidas mais úteis são pairs e ipairs
Para uma tabela geral, pairs é usada: retorna o próximo elemento da tabela, independentemente do tipo das chaves
47
Estruturas de Repetição
Para uma tabela usada como uma matriz, ipairs é usada: retorna o próximo índice e valor da matriz, até a primeira chave inteira que não está na tabela
48
Referências
49
Referências
SEBESTA, R. Conceitos de Linguagem de Programação.
Capítulo 8
TUCKER, A. B.; NOONAN, R. E. Linguagens de Programação: Princípios e Paradigmas.
Capítulo 12
50
Paradigma Imperativo
Estruturas de Repetição
Paradigmas de Linguagem de Programação
Prof. Dr. Alysson F. Milanez
alysson.milanez@maisunifacisa.com.br