Você está na página 1de 27

Linguagens de Programao

Captulo VII Estruturas de Controle no Nvel da Instruo


Baseado em Conceitos de Linguagens de Programao 4 Edio Robert W. Sebesta Bookman

Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 1

Tpicos
1. 2. 3. 4. 5. 6. 7. Introduo Instrues Compostas Instrues de Seleco Instrues Iterativas Desvio Incondicional Comandos Protegidos Concluses
Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 2

1. Introduo
int firstBlankLine(vector<vector<int> > & v) { int i = 0; while(i < v.size()) { for(int j=0; j < v[i].size(); j++) { if(v[i][j]!=0) { goto rejeita; } else { continue; } cout << "Esta linha nunca executada"; } cout << "Primeira linha s com zeros: " << i; break; rejeita: i++; } }
Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 3

1. Introduo

(cont.)

Fluxo de controle ao nvel de instruo sequncia de execuo entre as diversas instrues do programa.
Nveis de fluxo de controle:

1. Entre instrues do programa (Cap.7) 2. Dentro de expresses (Cap. 6) 3. Entre unidades de programa (Cap. 8 e 12)

+alto nvel

Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 4

1. Introduo

(cont.)

Evoluo: FORTRAN I - Instrues de controle eram baseados directamente no hardware do IBM 704 (anos 50); Muitas pesquisas/argumentos durante os anos 60; Resultado importante: foi provado que os fluxogramas pode ser codificado somente com instrues de seleco dupla (if ... else ) e laos pr-testados (while).
Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 5

1. Introduo

(cont.)

Instrues de Controle meio de seleccionar um caminho entre diferentes caminhos de execuo, podendo por vezes provocar a repetio de conjunto de instrues (ex.: ifs, ciclos, gotos, switchs, ). Uma estrutura de controle uma instruo de controle e sua coleco de comandos que controla (que fazem parte da estrutura). Problema geral de projecto:

Quais as estruturas de controle que devem estar contidas numa L.P. alm de seleco e laos lgicos pr-testados?
Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 6

2. Instrues Compostas

Instruo Composta mtodo para abstrair uma coleco de instrues como uma nica instruo

introduzido no ALGOL 60 na forma de: begin comando 1 ... comando n end

Um bloco uma Instruo Composta que pode definir um novo escopo (possui variveis locais).
Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 7

3. Instrues de Seleco

Instrues de Seleco Bidirecionais instrues que permitem escolher entre dois caminhos de execuo, tendo em considerao o resultado duma expresso.

Consideraes de Projecto:

1. Qual a forma e o tipo da expresso de controle? 2. O que pode ser seleccionado? (Instrues simples/compostas, sequncia de comandos)? 3. Como deve ser especificado o aninhamento de instrues de seleco?
Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 8

Ex. de Seleco
Exemplo em FORTRAN (unidireccional): IF (expresso booleana) instruo

Problema: selecciona somente uma nico instruo. Para seleccionar mais instrues, deve ser utilizado um "goto" como no seguinte exemplo:

IF (.NOT. condio) GOTO 20 ... ... 20 CONTINUE


Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 9

Ex. de Seleco

(cont.)

Exemplo em ALGOL 60 (unidireccional): if (boolean_expr) then begin


...

end Exemplo em ALGOL 60 (bidireccional): if (boolean_expr) then instruo (Clusula then) else instruo (Clusula else)

"instruo" - um instruo simples ou composta.


Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 10

Ex. de Seleco aninhada


Exemplo em Pascal (aninhamento directo de selectores): if ... then if ... then ... else ... Qual then associa-se com else? Regra do Pascal: else associa-se com o then

mais prximo.
Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 11

Ex. de Seleco aninhada

(cont.)

Ex. em ALGOL 60:


No permite aninhamento directo permite aninhamento indirecto

if ... then begin if ... then


...

else ... end

if ... then begin if ... then ... end else ...


Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 12

Ex. de Seleco com Trmino

Ex. em Ada

Fechamento de seleco com palavra especial (trmino) FORTRAN 77, e Modula-2 tambm contm trminos

if ... then if ... then ... else ... end if end if


Engenharia Informtica Linguagens de Programao 2002/2003

if ... then if ... then ... end if else ... end if


Pg. 13

Ex. de Seleco com Trmino

Em do Modula-2:

Utiliza a mesma palavra especial de trmino "END" para todas as estruturas de controle. Esta construo resulta em legibilidade pobre.

Vantagens da seleco com trmino:


Maior Flexibilidade; Maior Legibilidade.

Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 14

Construes de Seleco Mltipla


Consideraes de Projecto:

Qual o tipo e forma da expresso de seleco? Que instrues so seleccionadas (simples, compostas, sequencias de instrues)? A estrutura de seleco encapsulada numa estrutura sintctica? O fluxo de execuo dentro da estrutura inclui apenas o segmento seleccionado? O que acontece quando o valor da expresso no est representado?
Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 15

Selectores Mltiplos

Primeiro Selector Mltiplo:


FORTRAN IF aritmtico (seleco de trs vias) IF (expresso aritmtica) N1, N2, N3 Ex. IF(valor)10, 20, 30 10 ... 20 ... 30 ...

Aspectos negativos:

No encapsulado (segmento seleccionado pode estar em qualquer lugar). Segmentos necessitam de GOTOs.
Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 16

Selectores Mltiplos

(cont.)

Selectores Mltiplos Modernos


Pascal "case" (contribuio de Hoare e includo no ALGOL-W); Sintaxe:

case expresso of constante_1 : instruo_1; ... constante_n : instruo_n end

Vrios dialectos de Pascal possuem clusula otherwise ou clusula else


Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 17

Selectores Mltiplos

(cont.)

Consideraes de Projecto "case" do Pascal:


Expresso qualquer tipo ordinal (int, boolean, char, enum); Segmentos podem conter instrues simples ou compostas; Construo encapsulada; Somente um segmento pode ser executado por seleco da construo; Em Pascal, valor no representado da expresso de controle gera um valor indefinido (Em 1984 ISO Standard, um erro de execuo - "runtime error")
Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 18

Selectores Mltiplos

(cont.)

Ex. em C/C++ (switch):


Sintaxe: switch (expresso) { constante_1 : instruo_1; ... constante_n : instruo_n; [default: comando_n+1] }

Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 19

Selectores Mltiplos

(cont.)

Consideraes de projecto "switch" do C/C++:

Expresso de controle somente do tipo inteiro; Segmentos seleccionados podem conter instrues simples/compostas ou sequncia de comandos; Construo encapsulada; Vrios segmentos podem ser executados em uma execuo da construo (no existe desvio implcito no final do segmento seleccionado);

Para evitar este efeito o programador deve usar o comando break no fim de cada segmento; um compromisso entre confiabilidade e flexibilidade.

Clusula "default" existe para valores no representados da expresso de controle (se no existe clusula default, o comando no faz nada).
Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 20

10

Selectores Mltiplos

(cont.)

Ex. do Ada (case):

Selector similar ao case de Pascal, excepto que: Lista de constante pode incluir:

Subfaixas ex.: 10..15 Operador Boleano OR ex.: 1..5 | 7 | 15..20

Lista de constante dever ser completa: - Normalmente realizado via clusula others; - Isto torna o comando mais confivel.
Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 21

Selectores Mltiplos

(cont.)

Selectores mltiplos com extenso "else-if":

Existente em ALGOL 68, FORTRAN 77, Modula-2, Ada. Ex. em Ada:

if (condio) then ... elsif (condio) then ... elsif (condio) then ... else ... end if

Muito mais confivel que aninhamento de ifs ; Permite sada de cada grupo seleccionado.
Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 22

11

4. Instrues Iterativas

Instrues Iterativas

Execuo repetida de instrues pode ser realizada por iterao ou recurso. Laos controlados por contador; Laos controlados logicamente;

Tipos de Instrues Iterativas:


De forma iterativa; De forma recursiva.

Laos controlados por iterador.


Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 23

Instrues Iterativas

(cont.)

Consideraes de projecto (para iterao):


Como a iterao controlada? Contador; Expresso lgica (booleana) ou relacional. Onde colocar a condio de controle do lao? No incio do lao (lao pr-testado); No fim do lao (lao ps-testado).
inicio

enquanto(condio)fazer inicio ... lao fim

...
enquanto(condio)

Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 24

12

Lao controlado por contador

Consideraes de projecto:

Qual o tipo e o escopo da varivel do lao? Qual o valor da varivel de controle no final do comando? vlido alterar a varivel de controle do lao no corpo do comando? Em caso afirmativo o controle do lao afectado? Os parmetros do lao so somente avaliado uma nica vez ou a cada iterao?
Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 25

Lao controlado por contador

Ex. em FORTRAN 77 e FORTRAN 90

Sintaxe: Varivel de lao pode ser do tipo INTEGER, REAL, DOUBLE

DO label var = incio, fim [, incremento]

Ex. em FORTRAN 90 (outro DO)

Sintaxe: [nome:] DO var = inicio, trmino [,incremento] ... END DO [nome]

Varivel de lao tem que ser do tipo INTEGER; Incremento pode ser qualquer valor diferente de zero; Parmetros (incio, fim) podem ser expresses.
Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 26

13

Lao controlado por contador

Consideraes de Projecto "DO" do Fortran:


Varivel de lao pode ser INTEGER, REAL, ou DOUBLE; Varivel de lao retm o seu ltimo valor; A varivel de lao no pode ser alterada no lao, mas os parmetros podem e, uma vez que so avaliados uma nica vez a alterao no afecta o controle do lao; Parmetros do lao so avaliados uma nica vez.

Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 27

Lao controlado por contador

Ex. em ALGOL 60:

Sintaxe (descrio EBNF):


<for_stmt> for var := <el_lista> {,<el_lista>} do <comando> <el_lista> <expresso> | <expresso> step <expresso> until <expresso> | <expresso> while <expresso_booleana>

Lao pode ser controlado ao mesmo tempo por contador e expresso booleana.

Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 28

14

Lao controlado por contador

Exemplos:
for index:=1, 2, 3, 4, 5 do //(index lista[index] = 0 for index:=1 step 2 until 100 do lista[index] = 0

= 1,2,3,4,5)

//(index = 1,3,5, ..., 99,101)

Consideraes de Projecto "FOR" ALGOL 60:


Expresso de controle pode ser int ou real; Varivel de controle retm o seu ltimo valor que lhe foi atribudo, aps o termino do lao; A varivel de lao no pode ser modificada no lao; Parmetros so avaliados em cada iterao, tornando-os complexos e de difcil leitura.
Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 29

Lao controlado por contador

Ex. em Pascal:

Sintaxe: for var := inicio (to | downto) final do comando Varivel do lao deve ser do tipo ordinal, de escopo visvel (local ou no local); Aps terminar de forma normal, o valor da varivel do lao indefinido; A varivel do lao no pode ser alterada no corpo do lao; Parmetros do lao so avaliados uma nica vez.
Engenharia Informtica Linguagens de Programao 2002/2003

Questes de Projecto "for" do Pascal:

Pg. 30

15

Lao controlado por contador

Ex. em Ada: Sintaxe:


for var in [reverse] discrete_range loop ... end loop

Consideraes de Projecto:

Varivel de lao deve ser do tipo inteiro ou enumerao; A varivel de lao no existe fora do corpo do lao; A varivel de lao no pode ser alterada no lao; Varivel de lao avaliada uma nica vez.
Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 31

Lao controlado por contador

Ex. em C: Sintaxe:
for ([expr_1] ; [expr_2] ; [expr_3]) corpo do lao

As expresses [expr_1] e [expr_3]podem ser uma instrues simples, ou sequncia de instrues separadas por vrgulas; Todas as expresses so opcionais (podem ser nulas); A segunda expresso [expr_2] se omitida, gera um lao infinito.
Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 32

16

Lao controlado por contador

ex.: for (i = 0, j = 10; j == i; i++) ... No existe varivel de lao explcita; Valor da varivel de lao irrelevante; Tudo pode ser alterado no lao; Lao pr-testado; A 1 expresso avaliada uma nica vez, as restantes so avaliadas em cada iterao. Este comando iterativo o mais flexvel.
Engenharia Informtica Linguagens de Programao 2002/2003

Consideraes de Projecto "for" do C:


Pg. 33

Lao controlado por contador

Ex. do C++:

Difere de C em dois modos: 1. A expresso de controle pode ser lgica; 2. A expresso inicial pode incluir definio de varivel (com escopo vlido at o fim da funo em que a instruo est definida). Difere de C++ em dois modos: 1. Expresso de controle deve ser lgica; 2. Escopo de variveis definidas na expresso inicial somente o corpo da instruo.
Engenharia Informtica Linguagens de Programao 2002/2003

Ex. do Java:

Pg. 34

17

Lao controlado por contador


RESUMO: Linguagem Tipo Var. de controle do lao int int, float, double int, float int, enumerado int,enumerado Teste Valor da Var. do no fim do lao lao ps ps pr pr pr pr mais recente mais recente mais recente mais recente eliminado mais recente Var. lao pode ser alterada? no no no sim no sim
Pg. 35

FORTRAN I FORTRAN 77 Algol 60 Pascal Ada

C/C++/Java n/ tem var.

Engenharia Informtica Linguagens de Programao 2002/2003

Lao controlado logicamente

Consideraes de Projecto:

O teste do lao efectuado: No incio da instruo (pr-teste)? No fim da instruo (ps-teste)? O lao controlado logicamente deve ser uma forma especial do lao controlado por contador, ou uma nova instruo de iterativa?

Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 36

18

Lao controlado logicamente

Pascal possui instrues separadas para pr-teste e ps-teste. while(condio=true) do n

Exemplos em Pascal:

begin ... end repeat o do p ... ... until(condio=false) while(condio=true)


Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 37

Lao controlado logicamente

Ex. do C/C++: Possuem as formas n e p: nwhile(condio==true) corpo do lao; pdo corpo do lao; while(condio==true); Ex. do Java:

Ex. do Ada:

como o C, excepto que a expresso de controle deve ser lgica. Possui a verso de pr-teste mas no a ps-teste. No possui este tipo de instrues (laos lgicos).
Engenharia Informtica Linguagens de Programao 2002/2003

Ex. do FORTRAN 77 e 90:

Pg. 38

19

Mecanismos de Controle Lao

Mecanismos de Controle de Lao:

O programador deve poder escolher onde colocar o controle do lao, como por exemplo no meio do corpo do lao. O mecanismo condicional deve ser uma parte integrante da sada do lao? Pode este mecanismo estar presente num lao j controlado? Pode o controle ser transferido para fora de mais de um lao?
Engenharia Informtica Linguagens de Programao 2002/2003

Consideraes de Projecto:

Pg. 39

Mecanismos de Controle Lao

Exemplo em Ada

Trmino condicional ou incondicional, para qualquer lao e para qualquer quantidade de nveis. Trmino incondicional
for ... loop ... if soma > 1 then exit; ... end loop

Trmino condicional
for ... loop ... exit when soma > 1; ... end loop

Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 40

20

Mecanismos de Controle Lao

Exemplo em C, C++ e Java (break):

Trmino incondicional no rotulado, para qualquer lao ou "switch", em apenas um nvel. Em C/C++ existe tambm a instruo "continue" que termina as instrues e volta para o controle do lao.
while(soma < 1000) { getnext(valor); if (valor < 0 ) continue; soma += valor } Nota: Se valor for negativo a instruo de atribuio no executada.
Engenharia Informtica Linguagens de Programao 2002/2003

Ex. da instruo "continue":

Pg. 41

Mecanismos de Controle Lao

Exemplo da instruo "break":


while ( soma < 1000) { getnext(valor); if (valor < 0 ) break; soma += valor } Nota: Neste caso se valor for negativo o lao finalizado.

Exemplo do FORTRAN 90 (EXIT):

Trmino incondicional para qualquer lao, e qualquer nmero de nveis. FORTRAN 90 possui a instruo "CYCLE" (que tem a mesma semntica do "continue" do C).
Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 42

21

Controle por iterador

Iterao Baseada em Estrutura de Dados

A iterao est associada a uma estrutura de dados; A ordem dos elementos depende do iterador; O controle do lao dado pela existncia ou no de mais elementos na estrutura de dados; O mecanismo de controle uma chamada de funo que retorna o prximo elemento, em alguma ordem, desde que exista elementos, caso contrrio o lao termina.
Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 43

Ex. em C++

Controle por iterador

(mostrar todos os elementos de um array):

A instruo "for" do C++ pode ser utilizada para percorrer toda a estrutura de dados. char * nomes[]={"Jos","Joo","Joca",0}; for(char ** p = nomes; *p!= 0; p++) { cout << *p << endl; }

Ex. em Perl

(mostrar todos os elementos de um array):

Perl possui um iterador implcito para arrays e hashes. $nomes = {"Jos","Joo","Joca"}; foreach $nome (@nomes) { print $nome }
Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 44

22

5. Desvio Incondicional

Uma instruo de desvio incondicional transfere o controle para outra posio do programa. A instruo de desvio incondicional (goto) a instruo mais poderosa para controle do fluxo de execuo (esta nasceu no FORTRAN). Problema:

Baixa Legibilidade Baixa Confiabilidade;

Algumas linguagens no tm instrues de desvio incondicional, como por ex. Modula-2 e Java. Algol, Pascal, C e C++ permitem "goto" mas desaconselham a sua utilizao.
Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 45

Desvio Incondicional

Forma dos Rtulos (Label):

Constantes inteiras sem sinal, seguido de dois-pontos.

Utilizado em Pascal. Ex. "100:" Utilizado em FORTRAN. Ex. "100" Utilizado em ALGOL 60, C e C++. Ex. "FIM:" Utilizado em Ada. Ex. "<<FIM>>" Utilizado em PL/I.
Engenharia Informtica Linguagens de Programao 2002/2003

Constantes inteiras sem sinal (no possui dois pontos).

Identificadores com dois-pontos.

Identificador em << ... >>

Variveis como rtulo.

Pg. 46

23

Restries aos Desvios

Restries do "goto" em Pascal:

O alvo de um goto no pode ser uma instruo, num grupo de instrues que no esteja activo (no iniciado). Pela razo anterior, o alvo no pode ser uma instruo de um grupo que esteja no mesmo nvel ou em nvel mais profundo que o nvel do goto. O alvo pode ser qualquer subprograma do escopo corrente (de qualquer nvel), desde que a instruo no seja uma instruo de grupo. O comando goto pode terminar qualquer nmero de subprogramas (neste caso, um goto para fora desses subprogramas) .
Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 47

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:
Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 48

24

6. Comandos Protegidos

Formas alternativas de estruturas de seleco e de lao foram sugeridas por Dijkstra (1975). Motivao: suportar uma metodologia de projecto de programao (verificao durante o desenvolvimento do programa).

Instruo de Seleco:

if <boolean> -> <instruo> ... [] <boolean> -> <instruo> fi

Exemplo em ADA:
if x >= y -> max := x [] y >= x -> max := y fi
Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 49

Comandos Protegidos

Semntica da instruo de seleco:

Avaliar todas as expresses lgicas; Se mais de uma for verdadeira, escolher uma no deterministicamente; Se nenhuma for verdadeira temos um erro de execuo.
Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 50

25

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 construo escolhe nodeterministicamente a primeira ou a terceira instruo para ser executada; Se i for igual a j e diferente de zero, temos um erro pois nenhuma das expresses vlida.
Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 51

Comandos Protegidos

Instruo de Lao:
<boolean> -> <instruo> <boolean> -> <instruo> ... <boolean> -> <instruo>
(ordenar: n1 < n2 < n3)

do [] [] od

Exemplo em ADA:

do n1 > n2 -> max:= n1; n1:=n2; n2:=max; [] n3 > n2 -> max:= n3; n2:=n3; n3:=max; od
Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 52

26

Comandos Protegidos

Semntica da instruo de lao: Avaliar todas as expresses lgicas; Se mais de uma for verdadeira, escolher uma, nodeterministicamente; em seguida reinicia o lao novamente; Se nenhuma for verdadeira, finaliza o lao.
Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 53

7. Concluso

Concluses do Captulo:

A escolha das instrues de seleco e laos lgicos de pr-teste um compromisso entre tamanho da linguagem e escritabilidade. Ainda no existe um concordncia sobre a utilizao ou no de instrues de controle incondicional "goto" numa linguagem.

Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 54

27

Você também pode gostar