• Nenhum resultado encontrado

Assim como a instrução IF condição THEN ação, a instrução IF condição THEN ação1 ELSE ação2 tem por finalidade testar uma condição e tomar uma decisão. Se a condição é verdadeira, um bloco de comandos após o THEN é executado. Se a condição é falsa, um bloco de comandos após o ELSE é executado.

A instrução IF condição THEN ação1 ELSE ação2 pode ser lida assim: SE a condição é verdadeira ENTÃO execute a ação1. EM CASO CONTRÁRIO, execute a ação2. Suponha que no programa da Listagem 21 também fosse necessário informar se o aluno está reprovado. Neste caso tem-se duas vias: Se a nota é maior ou igual a 6, a via 1 é informar ‘Aluno Aprovado’. Senão, se a nota é menor que 6, a via 2 é informar ‘Aluno Reprovado’.

A listagem 21 apresenta um código com seleção com duas vias através de IF .. THEN onde a ação possui múltiplas instruções. Note o bloco de comandos delimitado por BEGIN .. END.

O programa da Listagem 21 é assim descrito: 1. Início do Algoritmo;

a. Declarar uma variável nota do tipo real;

{Sintaxe:}

IF condição THEN

bloco de comandos ELSE

b. Solicitar um valor para a nota;

c. Se a nota for maior ou igual a 6.0, então imprimir: Aluno aprovado. d. Senão, imprimir: Aluno reprovado.

2. Terminar Algoritmo.

Listagem 4.2 – Seleção com 2 Vias – IF .. THEN .. ELSE

Note que o que diferencia as Listagens 20 e 21 é que nesta a linha 10 testa se a nota lida é maior ou igual a 6 e, caso seja, e apenas com esta condição, escreve-se ‘Aluno aprovado’. Em caso contrário - teste da linha 12 - escreve-se se ‘Aluno reprovado’ – linha 13. Início Fim nota Nota >= 6.0 Aluno aprovado SIM Aluno reprovado NÃO

Listagem 4.3 - Fluxograma da seleção com duas Vias

O fluxograma correspondente ao programa da Listagem 21 é apresentado na Figura 4. Através dele deve ficar claro que a mensagem ‘Aluno aprovado’ será apresentada se, e

Observações:

1. Observe que um END antes de um ELSE não deve possuir ponto-e-vírgula ( ; ).

1 program testaNota; 2 uses crt;

3 {Declarar uma variável nota do tipo real;}

4 var nota : real; 5 begin

6 {Solicitar um valor para a nota;}

7 write('Digite uma nota: '); 8 readln(nota);

9 {Se a nota for maior ou igual a 6.0, então imprimir: Aluno aprovado.}

10 if (nota >= 6.0) then

11 writeln('Aluno aprovado.') 12 else

13 writeln('Aluno reprovado.'); 14

15 {Parar o programa até que algo seja pressionado}

16 readkey; 17 end.

somente se, a nota for maior ou igual a seis e que ‘Aluno aprovado’ será apresentada em caso contrário. Estas são as duas vias.

Outro exemplo do uso de IF..THEN..ELSE está no programa da Listagem 22, que simula um débito numa conta corrente. O débito só é possível se há saldo e/ou limite disponíveis para isso. O programa é assim descrito:

1. Início do Algoritmo;

a. Definir as variáveis saldo, limite e valorADebitar como real; b. Atribuir valores a saldo e limite;

c. Solicitar ao usuário o valor a debitar;

d. Se o saldo somado ao limite for maior que o valor a debitar, então: i. subtraia valorADebitar do saldo;

ii. Imprima 'Debito efetuado com sucesso'. e. Senão:

i. Imprima 'Saldo insuficiente'.

f. Imprima: 'Fim da transacao. Pressione Alguma Tecla'; g. Pare o programa até que uma tecla seja pressionada. 2. Fim do algoritmo.

A Listagem 22 exibe o programa que implementa o referido algoritmo.

Listagem 4.3 - Seleção com duas Vias 1 program TesteContaCorrente;

2 {importação da biblioteca CRT}

3 uses crt; 4 var

5 {Definição das variáveis saldo, limite e valorADebitar do tipo real} 6 saldo, limite, valorADebitar : real;

7 begin

8 {limpa a tela} 9 clrscr; 10

11 {Atribuição de valores a saldo e limite}

12 saldo := 200; 13 limite := 500; 14

15 {Solicitar ao usuário o valor a debitar.}

16 writeln('Qual o valor a debitar?'); 17 readln(valorADebitar);

18

19 {Se o saldo somado ao limite for maior que o valor a debitar,

então debite o valorADebitar do saldo} 21 if (saldo + limite > valorADebitar) then 22 begin

23 saldo := saldo - valorADebitar;

24 writeln('Debito efetuado com sucesso.'); 25 end

26 {Senão, imprima: 'Saldo Insuficiente'}

27 else 28 begin

29 writeln('Saldo insuficiente.'); 30 end;

31 writeln('Fim da transacao. Pressione Alguma Tecla'); 32 readkey;

Neste código testa-se na linha 21 se a variável saldo somada à variável limite tem valor maior que a variável valorADebitar. Se isto é verdade, a linha 23 subtrai do saldo o valorADebitar e a linha 24 imprime o sucesso do débito.

Note que as linhas 22 a 25 e 28 a 30 compõem blocos de comandos delimitados por BEGIN .. END. Início Fim valorADebitar saldo + limite > valorADebitar Saldo Insuficiente NÃO SIM saldo = 200 limite = 500

saldo = saldo - valorADebitar

Debito efetuado com sucesso

Fim da transacao. Pressione Alguma

Tecla

Listagem 4.4 - Fluxograma da seleção com duas Vias

O fluxograma correspondente ao programa da Listagem 21 é apresentado na Figura 4.

A instrução IF condição THEN ação1 ELSE ação2 tem uma limitação: ela só oferece dois caminhos alternativos. Se a condição é verdadeira, segue-se o caminho que executa a ação1. Em caso contrário, segue-se o caminho que executa a ação2.

É comum, contudo, a necessidade de aninhamento de IF quando a condição possui múltiplos caminhos alternativos (aninhamento de Seleções de Duas Vias.). Suponha o seguinte problema: uma seguradora dá descontos progressivos no seguro de automóvel em função da faixa etária do cliente. As faixas são as seguintes:

1. 20 a 25 anos: 3% de desconto; 2. 26 a 30 anos: 5% de desconto; 3. 31 a 45 anos: 8 % de desconto;

4. Acima de 45 anos: 10% de desconto.

Uma especificação em Linguagem Natural para o cálculo do desconto concedido pode ser a seguinte, que chamaremos de Algoritmo Calcula Desconto 1:

1. Início do Algoritmo Calcula Desconto1; a. Ler um valor para a variável idade; b. Desconto é de 0%;

c. Se a idade está entre 20 e 25 anos, o desconto é de 3%;

d. Senão, Se a idade está entre 26 e 30 anos, o desconto é de 5%; e. Senão, Se a idade está entre 31 e 45 anos, o desconto é de 8%; f. Senão, Se a idade é maior que 45 anos, o desconto é de 10%; g. Informar o desconto.

2. Fim do algoritmo Calcula Desconto1.

Um erro comum à especificação em Linguagem Natural seria o seguinte, que chamaremos de Algoritmo Calcula Desconto 2:

1. Início do Algoritmo Calcula Desconto2; a. Ler um valor para a variável idade; b. Desconto é de 0%;

c. Se a idade está entre 20 e 25 anos, o desconto é de 3%; d. Se a idade está entre 26 e 30 anos, o desconto é de 5%; e. Se a idade está entre 31 e 45 anos, o desconto é de 8%; f. Se a idade é maior que 45 anos, o desconto é de 10%; g. Informar o desconto.

2. Fim do algoritmo Calcula Desconto2.

Embora as duas especificações dêem o mesmo resultado, a primeira (Algoritmo Calcula Desconto 1) o faz de maneira ótima. Note que uma pessoa encontra-se numa única faixa etária, logo, se uma condição é satisfeita as demais não precisam ser testadas. O desconto sempre inicia em 0%, assumindo-se que não haverá desconto (casos de pessoas com menos de 20 anos).

A segunda especificação (Algoritmo Calcula Desconto 2) obriga a execução de todos os testes de condição, o que é desnecessário. Vejamos os Fluxogramas:

A Figura 6 apresenta o fluxograma do algoritmo Calcula Desconto 1. Como pode ser notado, caso uma condição seja atendida (SIM), o algoritmo determina o novo desconto, informa-o e termina. Caso o teste de uma condição falhe (NÃO), testa-se a próxima condição até que uma seja verdadeira, determinando o novo desconto, informando-o e terminando.

Início Fim idade idade >= 20 e idade <= 25 NÃO SIM SIM Informar Desconto Desconto = 3% idade >= 26 e idade <= 30 Desconto = 5% idade >= 31 e idade <= 45 NÃO Desconto = 8% SIM NÃO idade > 45 Desconto = 10% SIM Desconto = 0%

Listagem 4.5 – Fluxograma do Algoritmo Calcula Desconto 1

A Listagem 23 exibe o programa que implementa o algoritmo Calcula Desconto 1.

Listagem 4.4 - Calcula Desconto 1 1 program CalculaDesconto1;

2 {importação da biblioteca CRT}

3 uses crt; 4 var

5 {Definição das variáveis idade e desconto como inteiras} 6 idade, desconto : integer;

7 begin

8 {limpa a tela} 9 clrscr; 10

11 {Solicitar ao usuário o valor da idade.} 12 writeln('Qual sua idade?');

13 readln(idade); 14

15 {Atribuição de valor inicial ao desconto}

16 desconto := 0; 17

18 {Seleçõe aninhadas}

19 if (idade >= 20) and (idade <= 25) then

20 desconto := 3

21 else

22 if (idade >= 26) and (idade <= 30) then 23 desconto := 5

24 else

25 if (idade >= 31) and (idade <= 45) then 26 desconto := 8

27 else

28 if (idade >= 46) then 29 desconto := 10; 30

31 writeln('O desconto eh de ', desconto, '%'); 32 readkey;

Na Listagem 23, na linha 6 definem-se as variáveis inteiras idade e desconto. Nas linhas 12 e 13 solicita-se o valor da idade. Na linha 16 inicia-se o desconto com 0.

A linha 19 testa se a idade está no limite [20, 25]. Se sim, atribui 3 ao desconto. Senão, inicia um novo teste aninhado na linha 22 verificando se a idade está no limite [26, 30]. Note que o aninhamento de IF fica mais legível graças à endentação do código. O processo da aninhamento e endentação continua para os demais limites de idade.

A Figura 7 apresenta o fluxograma do algoritmo Calcula Desconto 2. Como pode ser notado, mesmo com uma condição sendo atendida (SIM), o algoritmo continua a testar desnecessariamente as demais condições para determinar o novo desconto, informando-o e terminandinformando-o.

Embora o Algoritmo Calcula Desconto 1 seja mais eficiente que o 2, há um problema. Imagine um conjunto com 20 condições. Com ficaria o fluxograma da Figura 6? Para eliminar o problema que surgiria é que existe a seleção com múltiplas vias (vide Apêndice A, e que é implementado com a instrução CASE.

Início Fim idade idade >= 20 e idade <= 25 NÃO SIM SIM Informar Desconto Desconto = 3% idade >= 26 e idade <= 30 Desconto = 5% idade >= 31 e idade <= 45 NÃO Desconto = 8% SIM NÃO idade > 45 Desconto = 10% SIM Desconto = 0% NÃO

Documentos relacionados