1 of 51

Paradigma Imperativo

Estruturas de Repetição

Paradigmas de Linguagem de Programação

Prof. Dr. Alysson F. Milanez

alysson.milanez@maisunifacisa.com.br

2 of 51

Laços controlados Logicamente

2

3 of 51

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

4 of 51

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

5 of 51

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

6 of 51

Estruturas de Repetição

Laço com pré-teste

while (expressão_de_controle)

corpo do laço

6

7 of 51

Estruturas de Repetição

Laço com pós-teste

do

corpo do laço

while (expressão_de_controle);

7

8 of 51

Estruturas de Repetição

Em C#

sum = 0;

indat = Int32.Parse(Console.ReadLine());

while (indat >= 0) {

sum += indat;

indat = Int32.Parse(Console.ReadLine());

}

8

9 of 51

Estruturas de Repetição

Em C#

digits = 0;

value = Int32.Parse(Console.ReadLine());

do {

value /= 10;

digits++;

} while (value > 0);

9

10 of 51

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

11 of 51

Estruturas de Repetição

E em Java?

Escrevam versões em Java para o código while e do-while C#

11

12 of 51

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

13 of 51

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

14 of 51

Estruturas de Repetição

Semântica operacional: do-while

loop:

[corpo do laço]

if expressão_de_controle é verdadeira goto loop

14

15 of 51

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

16 of 51

Estruturas de Repetição

X : Integer := 0;

begin

while X <= 5 loop

Put(X);

X := X + 1;

New_line(1);

end loop;

end

16

17 of 51

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

18 of 51

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

19 of 51

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

20 of 51

Controle de laço posicionado pelo usuário

20

21 of 51

Estruturas de Repetição

Algumas vezes é interessante ao programador definir uma posição para o controle de laço

21

22 of 51

Estruturas de Repetição

São laços infinitos que incluem saídas do laço posicionadas pelos usuários

22

23 of 51

Estruturas de Repetição

A questão mais interessante é se um único laço ou diversos laços aninhados podem ser abandonados

23

24 of 51

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

25 of 51

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

26 of 51

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

27 of 51

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

28 of 51

Estruturas de Repetição

while (sum < 1000) {

getnext(value);

if (value < 0) continue;

sum += value;

}

28

29 of 51

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

30 of 51

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

31 of 51

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

32 of 51

Iteração baseada em Estrutura de Dados

32

33 of 51

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

34 of 51

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

35 of 51

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

36 of 51

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

37 of 51

Estruturas de Repetição

Iteradores pré-definidos são usados para fornecer acesso iterativo para as matrizes únicas de PHP

37

38 of 51

Estruturas de Repetição

Sentenças de iteração definidas pelo usuário são muito importantes na programação orientada a objetos

38

39 of 51

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

40 of 51

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

41 of 51

Estruturas de Repetição

A partir de Java5, temos o foreach

ArrayList<String> myList = new ArrayList<String>();

for (String myElement : myList) { ... }

41

42 of 51

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

43 of 51

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

44 of 51

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

45 of 51

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

46 of 51

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

47 of 51

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

48 of 51

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

49 of 51

Referências

49

50 of 51

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

51 of 51

Paradigma Imperativo

Estruturas de Repetição

Paradigmas de Linguagem de Programação

Prof. Dr. Alysson F. Milanez

alysson.milanez@maisunifacisa.com.br