Sei sulla pagina 1di 45

Paradigmas de Linguagens

Aula 4: Estruturas de Controle

Professora Sheila Cceres

Motivao

Paradigmas de Linguagens

No um bom exemplo

Introduo

Alm das instrues de atribuio, so necessrios


pelo menos dois mecanismos lingusticos adicionais:
Selecionar entre caminhos
Instrues de
Execuo repetida de instrues
Controle
Sem elas s haveria uma maneira do programa ser
executado: de cima para baixo, comando por
comando
As estruturas de controle so fundamentais para
qualquer linguagem de programao

Paradigmas de Linguagens

Fluxo de controle ao nvel de instruo

Estrutura de controle uma instruo de


controle e a sua coleo de comandos cuja
execuo ela controla
Nveis de fluxo de controle:

Entre unidades de programa


Entre instrues do programa
Dentro de expresses

Regra de Associatividade
Regra de Precedncia
Paradigmas de Linguagens

Instrues Compostas

Mtodo para abstrair uma coleo de instrues


como uma nica instruo
Foi introduzido no ALGOL 60:
begin
comando 1
...
comando n
end

Um bloco uma Instruo Composta que pode


definir variveis locais.
Paradigmas de Linguagens

Instrues de Seleo

Permite escolher entre dois ou mais caminhos


de execuo em um programa.
Duas categorias:

Seleo bidirecional
Seleo n-dimensional ou mltipla

Paradigmas de Linguagens

Instrues de Seleo Bidirecional

Permitem escolher entre dois ou mais caminhos de


execuo no programa.
Forma geral:

if (expresso booleana)

instruo
else

instruo

Alguns aspectos para serem considerados:

Tipo de expresso que controla o seletor (quem seleciona


caminhos)
Quantas instrues podem ser selecionadas (permitir
sequencias de instrues foi um grande passo na evoluo
das instrues instrues nicas acarretavam
dependncia de gotos)
Paradigmas de Linguagens
7
Possibilidade de adicionar seletores aninhados

Instruo de Seleo Bidirecional

Exemplo em FORTRAN IV (unidirecional):


IF (expresso booleana) instruo

Problema:

seleciona somente uma nico instruo.


Para selecionar mais instrues, deve ser utilizado
um "goto".

Exemplo: queremos inicializar as variveis I e


J somente se FLAG =1
IF (.NOT. condio) GOTO 20
I =1
J=2

20 CONTINUE

lgica negativa (prejudicial ->legibilidade)

Paradigmas de Linguagens

Instruo de Seleo Bidirecional

ALGOL 60 introduziu uma instruo de seleo


unidirecional para executar uma nica instruo ou uma
instruo composta (foi adotada por linguagens posteriores)
if (expresso booleana) then
begin
instruo1
..
instruo n
end

ALGOL 60 introduziu o primeiro seletor bidireccional.


if (expresso booleana) then
instruo
else
instruo

Onde instruo pode ser simples ou composta.


Paradigmas de Linguagens

Instruo de Seleo Bidirecional


Nas linguagens C,C++, C#, Java usamos:

A expresso do lado de if avaliada. Se ela for verdadeira


(diferente de 0), o comando ou bloco que forma o corpo do if
executado; Caso contrrio, o comando ou bloco que o
corpo do else (se existir) executado.
Apenas o cdigo associado ao if ou o cdigo associado ao
else ser executado, nunca ambos;
A forma geral da sentena if :
if(expresso)
{ comando; }

else
{ comando; }
Paradigmas de Linguagens

A clusula else opcional.

10

Aninhando Seletores

Exemplo em Java
if (sum == 0)
if (count == 0)
result = 0;
else result = 1;

O else pertence a qual dos ifs?


Java possui uma regra semntica esttica

O else solto associado ao if mais prximo

Paradigmas de Linguagens

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 prximo.


Paradigmas de Linguagens

12

Aninhando Seletores

Para forar uma semntica alternativa, uma forma sinttica


diferente necessria, na qual o if-else colocado em uma
instruo composta usando chaves { }.
Exemplo original em java
if (sum == 0)
if (count == 0)
result = 0;
else result = 1;
Exemplo usando instrues compostas { }
Else do segundo if
if (sum == 0){
if (count == 0)
result = 0;
else result = 1;
}

Else do primeiro if
if (sum == 0){
if (count == 0)
result = 0;
}
else result = 1;

A soluo acima usada


emdeC,
C++ e C#, Perl requer que
Paradigmas
Linguagens
todas as clusulas then e else sejam compostas

13

Ex. em ALGOL 60:

No permite aninhamento direto


preciso ser colocado em uma instruo composta

Aninhado ao 2 if
if ... then
begin
if ... then
...
else
end

Aninhado ao 1 if
if ... then
begin
if ... then

end
else
Paradigmas de Linguagens

14

Construes de Seleo Mltipla

Permite a seleo de uma instruo, dentre qualquer


nmero de instrues ou de grupos de instrues
(generaliza{ao de um seletor).
Suas origens pertencem ao FORTRAN.
Questes de Projeto:

Qual a forma e o tipo da expresso que controla que controla a


seleo?
Que instrues so selecionadas (simples, compostas, seqncias
de instrues)?
O fluxo de execuo atravs da estrutura limita-se a incluir apenas
um nico segmento selecionvel?
O que acontece quando o valor da expresso no est
representado?
Paradigmas de Linguagens

15

Seletores Mltiplos Antigos

FORTRAN - IF aritmtico (seletor tridirecional)


Escolhe entre trs caminhos de desvio baseando-se no valor de
uma expresso aritmtica
Forma : O desvio baseia-se no resultado da expresso aritmtica
considerando que ela pode ser > 0 , = 0, < 0 (nessa ordem)
IF (expresso aritmtica) N1, N2, N3: .

Exemplo Determinar se o valor numrico


IF (expresso) 10, 20, 30
10 ...
...
GO TO 40
20 ...
...
GO TO 40
30 ...
...
40 ...

Aspectos negativos
Segmentos requerem GOTOs. Os segmentos selecionveis podem
Paradigmas
de Linguagens
estar em qualquer lugar
no cdigo

16

Seletores Mltiplos Modernos


(switch)

O switch um comando de seleo mltipla


O switch testa sucessivamente o valor de uma expresso
contra uma lista de constantes inteiras ou de caracteres.
Existe na linguagem C,C++, C#, java, etc

Paradigmas de Linguagens

17

Seletores Mltiplos Modernos


(switch)

Paradigmas de Linguagens

18

Seletores Mltiplos usando if

Seletores mltiplos podem ser construdos


como extenses diretas de seletores
bidirecionais, usando clusulas else-if, por
exemplo em Ada:
if ...
then ...
elsif ...
then ...
elseif
then
else .
end if

Paradigmas de Linguagens

19

Instrues Iterativas (repetio)

Execuo de zero, uma ou mais vezes de


uma instruo ou bloco de instrues
Realizada atravs de:

Iterao
recurso

Paradigmas de Linguagens

20

Instrues Iterativas

Tipos de Instrues Iterativas:

Laos controlados por contador;


Laos controlados logicamente;
Laos controlados pelo usurio.

Paradigmas de Linguagens

21

Instrues Iterativas

Consideraes de projeto (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).

Paradigmas de Linguagens

22

Laos controlados por contador

Uma instruo iterativa de contagem possui uma


varivel do lao, na qual o valor da varivel mantido.
Essa instruo possui meios de especificar os valores
inicial e terminal da varivel, e o tamanho do passo
Instruo for do Pascal

for variavel := valor-inicial (to | downto) valor-final do


instruo

Paradigmas de Linguagens

23

Laos controlados por contador

Instruo for do C, do C++ e do Java


for(inicializao; condio; incremento)
{
comandos;

}
Exemplo
for (int cont = 0; cont < comp; cont++) {}

Todas as variveis envolvidas podem ser alteradas


no corpo do lao
A primeira expresso avaliada apenas uma vez,
mas as outras duas
so avaliadas em cada iterao
Paradigmas de Linguagens
24

Comando For

Inicializao , geralmente, um comando de


atribuio que usado para colocar um valor
na varivel de controle do lao;
A condio uma expresso relacional que
determina quando o lao acaba;
O incremento define como a varivel de
controle do lao varia cada vez que o lao
repetido;
Paradigmas de Linguagens

25

Exemplo

Paradigmas de Linguagens

26

Laos controlados por contador

Paradigmas de Linguagens

27

Laos Controlados Logicamente

O controle da repetio baseia-se em uma


expresso booleana e no em um contador
Exemplos em Pascal:

Pascal possui instrues separadas para

pr-teste

ps-teste
Paradigmas de Linguagens

28

Laos Controlados Logicamente

C e C++ tambm possuem


while (condio == true)
corpo do lao;

do
corpo do lao;
while (condio == true);
Paradigmas de Linguagens

29

Comando while

A segunda estrutura de repetio em C o


lao while. A sua forma geral :

Paradigmas de Linguagens

30

Exemplo while

Paradigmas de Linguagens

31

Comando do while

Ao contrrio dos laos for e while, que testam a condio do lao


no comeo, o lao do-while verifica a condio ao final do lao;
Portanto, o lao do-while ser executado ao menos uma vez;
Forma geral:
do{
comando;
} while(condio);

O lao do-while repete at que a condio se torne falsa.

Paradigmas de Linguagens

32

while versus do while

Vejamos a principal diferena entre o lao dowhile e o lao while:

do-while executa pelo menos uma vez.


Paradigmas de Linguagens

33

Comando do while

Um uso mais comum do lao do-while uma


rotina de seleo por menu, vejamos:

Paradigmas de Linguagens

34

Laos Controlados Logicamente

Ex. do Ada:

Possui a verso de pr-teste mas no a ps-teste.

Ex. do FORTRAN 77 e 90:

No possui este tipo de instrues (laos lgicos).

Paradigmas de Linguagens

35

Mecanismo de Controle de Laos pelo


Usurio

Programador deve escolher a localizao do controle do lao (outra


diferente do inicio ou fim).
C , C++ e Java: break

incondicional;

para qualquer lao ou switch; um nvel apenas

Exemplo da instruo "break":


while ( true)
{ getnext(valor); // le um valor ingressado pelo usurio
if (valor < 0 ) break;
soma += valor
}

se valor for negativo o lao finalizado.

Java e C# possuem uma instruo break rotulada. O controle


transferido para o rtulo
Uma alternativa para no sair do lao: continue. Ela pula o resto
Paradigmas de Linguagens
das instrues da iterao, mas no sai do lao

36

Iterao baseada em Estruturas de Dados

A iterao est associada a uma estrutura de dados;

A ordem dos elementos depende do iterador;

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.

Paradigmas de Linguagens

37

Iterao baseada em Estruturas de Dados

A instruo foreach do C# itera nos


elementos de vetores:
Strings[] = strList = {Bob, Carol, Ted};

Instrues iterativas: Iterao baseada em


Estruturas de Dados

foreach (Strings name in strList){


Console.WriteLine (Name: {0}, name);

Paradigmas de Linguagens

38

Iterao baseada em Estruturas de Dados

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
}
Paradigmas de Linguagens

39

Iterao baseada em Estruturas de Dados

Ex. em C++ (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 << end;

}
Paradigmas de Linguagens

40

Iterao baseada em Estruturas de Dados

O for do C, do C++ e do Java pode ser usado


para simular uma instruo de Instrues
iterativas:
for (p=root; p==NULL; traverse(p)){
...
}

Paradigmas de Linguagens

41

Desvio Incondicional

Uma instruo de desvio incondicional


transfere o controle para outra posio do
programa.
Mecanismo mais conhecido:

instruo goto

Problema -> Legibilidade


Paradigmas de Linguagens

42

Desvio Incondicional

Algumas linguagens no tm instrues de


desvio incondicional

Modula-2
Java.

Linguagem que permitem "goto" mas


desaconselham a sua utilizao.

Algol
Pascal
C
C++
Paradigmas de Linguagens

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 Linguagens

44

Referncias Bibliogrficas
O material para a realizao desta apresentao
foram extraidos de:
* Sebesta, Linguagens de programao, 4ta
edio.
* VAREJO, Flavio. Linguagens de Programao,
2004.
* Slides da Prof. Glucya Carreiro Boechat

Paradigmas de Linguagens

45

Potrebbero piacerti anche