A maior rede de estudos do Brasil

Grátis
146 pág.
Programando com PASCAL - Jaime Evaristo

Pré-visualização | Página 19 de 50

valor é do tipo integer, boolean ou char (tipo ordenado) e Listas de 
valores é uma lista de valores, separados por vírgulas, do tipo de dado do valor da Expressão ou uma lista de 
intervalos deste tipo de dado. Neste último caso, os intervalos são dados através dos seus extremos separados 
por ponto ponto (ver exemplo 3 da seção 3.8).
Quando o comando case é executado, a Expressao é avaliada e então a seqüência cuja lista de valores 
contém o seu valor é executada. Se o valor da expressão não se encontra em nenhuma das listas de valores, a 
seqüência x será executada. A opção else é facultativa: se ela não existir e o valor da Expressao não se 
encontrar em nenhuma das listas de valores, nada é executado e o processamento vai para a instrução que 
segue a estrutura case.
No caso do programa que gerencie um caixa eletrônico poderíamos ter um programa que contivesse as 
seguinte declarações e instruções:
program GerenciaCaixaEletronico;
var Opcao : char;
 . . .
begin
writeln('1. Extrato');
writeln('2. Saldo');
writeln('3. Saque');
writeln('4. Depósito');
write(' Digite sua opção> ');
 readln(Opcao);
 case Opcao of
'1' : seqüência de comandos para emissão de um extrato;
'2' : seqüência de comandos para emissão de saldo;
'3' : seqüência de comandos para realização de um saque;
'4' : seqüência de comando para realização de um depósito;
 else 
 writeln(Chr(7), 'Opcao invalida');
 end;
 . . .
Naturalmente, o programa deveria possuir algum "mecanismo" que retornasse ao menu de opções 
quando a opção escolhida não fosse válida. Isto será visto no capítulo 4. Outra observação importante é que 
os sistemas visuais atuais (Delphi, Visual Basic, VisualC++) permitem que (facilmente em termos de 
programação) estes menus sejam apresentados de maneira bem agradável aos olhos, com a utilização de 
botões e banners, de modo que a escolha da opção seja feita através do mause, ou mesmo através de toque na 
tela. Estes formatos de menus podem ser feitos em Pascal através da utilização de funções e procedimentos 
contidos na unit Graph, mas isto foge do escopo deste livro. 
3.8 Exemplos Parte V
1. O exemplo 10 da seção 3.5, que determina o número de dias de um mês dado, ficaria bem mais 
simples com a utilização do comando case:
{Programa que determina o número de dias de um mês dado}
program NumeroDeDias;
var Mes, Ano, NumDias : integer;
begin
writeln('Digite o mes');
readln(Mes);
 case Mes of
 4, 6, 9, 11 : NumDias := 30;
 2 : begin
writeln('Digite o ano');
readln(Ano)
if ((Ano mod 4 = 0) and (Ano mod 100 <> 0)) or (Ano mod 400 <> 0)
 then 
NumDias := 29
 else 
NumDias := 28;
 end;
else
 NumDias := 31;
 end;
 writeln('O Mes ', Mes,' tem ', NumDias, ' dias');
end.
Observe que se o mês de entrada for 2, o programa pede o ano para determinar se ele é bissexto. Observe 
também que se o mês digitado for 1, 3, 5, 7, 8, 10 ou 12, a opção else será executada. Evidentemente, fica 
faltando discutir a possibilidade de uma entrada inválida como, por exemplo, 13. Isto será discutido num dos 
capítulos seguintes. 
2. Um outro exemplo interessante de utilização do comando case é um programa que determine o dia da 
semana de uma data dada. Tomando como base o ano de 1600 (em 1582 o Papa Gregório III instituiu 
mudanças no calendário então vigente) e sabendo que o dia primeiro deste ano foi um sábado, para se 
determinar o dia da semana de uma data dada, basta se calcular o número de dias decorridos entre a tal data e 
o dia 01/01/1600. Como a associação do dia da semana a uma data é periódica, de período 7, o resto da 
divisão do número de dias referido acima por 7 indica a relação entre o dia da semana procurado e o sábado: 
se o tal resto for 1, o dia da semana é sábado; se o resto for 2, o dia da semana é domingo, e assim 
sucessivamente.
Para se calcular o número de dias entre uma data dada e 01/01/1600, basta multiplicar o número de anos 
por 365, acrescentar a quantidade de anos bissextos e o número de dias decorridos no ano corrente.
program DiaDaSemana;
var Dia, Mes, Ano, DiasDoAno, Dias31, AnosBiss : integer;
 Anos, NumDias : longint;
 Biss : boolean;
begin
writeln('Digite dia, mes e ano ');
readln(Dia, Mes, Ano);
Biss := true;
{Verifica se o ano e bissexto}
if ((Ano mod 4 <> 0) or ((Ano mod 100 = 0) and (Ano mod 400 <> 0)))
then
Biss := false;
Anos := Ano - 1600;
{Numero de meses com 31 dias ate o mes dado}
if (Mes < 9)
then
Dias31 := Mes div 2
else
Dias31 := (Mes + 1) div 2;
{Numero de dias do ano dado, considerando fevereiro com tendo 30 dias}
DiasDoAno := 30*(Mes - 1) + Dia + Dias31;
{Retifica o numero de dias de fevereiro}
if (Mes > 2)
then
if Biss
then
DiasDoAno := DiasDoAno – 1
else
DiasDoAno := DiasDoAno - 2;
{Numero de anos bissextos entre o ano dado (exclusive) e 1600}
if Biss
then
AnosBiss := (Ano div 4 - 400) - (Ano div 100 - 16) + (Ano div 400 - 4)
else
AnosBiss := (Ano div 4 - 400) - (Ano div 100 - 16) + (Ano div 400 - 4) + 1;
{Numero de dias entre a data dada e 01/01/1600}
NumDias := Anos*365 + DiasDoAno + AnosBiss;
{Dia da semana}
write('O dia ', Dia, '/', Mes,'/', Ano, ' caiu(caira) num(a) ');
case NumDias mod 7 of
1 : writeln(' Sabado');
2 : writeln(' Domingo');
3 : writeln(' Segunda');
4 : writeln(' Terca');
5 : writeln(' Quarta');
6 : writeln(' Quinta');
0 : writeln(' Sexta');
end;
end.
Observe que a determinação do numero de anos bissextos entre 1600 e o ano da data dada foi feita de 
forma diferente daquela apresentada no exemplo 3 da seção 3.3.
3. Para exemplificar o comando case quando as listas de valores são listas de intervalos, imaginemos 
uma prova com 100 questões, cada uma valendo um ponto, devendo o resultado ser divulgado através de 
conceito de acordo com a seguinte tabela:
Intervalo da pontuação obtida Conceito
0 a 49 D
50 a 69 C
70 a 89 B
90 a 100 A
Um programa que exibisse o conceito de uma dada pontuação obtida poderia ser o seguinte:
program ConvertePontuacaoEmConceito;
var NPontos: integer;
Conc : char;
begin
writeln('Digite a pontuação obtida');
readln(NPontos);
case NPontos of
0 .. 49: Conc := 'D';
50 .. 69 : Conc := 'C';
70 .. 89 : Conc := 'B';
90 .. 100: Conc := 'A';
end;
writeln('O numero de pontos igual a ', NPontos, 'corresponde a um conceito ', Conc);
end.
4. Para um outro exemplo de listas de intervalos e, complementarmente, para exemplificar a opção else, 
imagine que a empresa que vai atualizar os salários do exemplo 9 da seção 3.5 utilize apenas salários 
"inteiros". Lembramos que a tal empresa decidiu dar um aumento escalonado a seus funcionários de acordo 
com a seguinte regra: 13% para os salários inferiores ou iguais a R$ 200,00; 11% para os salários situados 
entre R$ 200,0 e R$ 400,00 (inclusive); 9 % para os salários entre R$ 400,00 e R$ 800,00 (inclusive) e 7% 
para os demais salários. Nestas condições, o exemplo referido poderia ser modificado para o seguinte 
programa:
{Programa para atualizar salários “inteiros”}
program AtualizaSalarios;
var SalarioAtual, SalarioNovo : integer;
Aumento : real;
begin
writeln('Digite o valor do salário atual');
readln(SalarioAtual);
case SalarioAtual of
1 .. 200: Aumento := 1.13;
201 .. 400 : Aumento := 1.11;
401 .. 800 : Aumento := 1.09;
else Aumento := 1.07;
end;
SalarioNovo := Round(SalarioAtual * Aumento);
writeln('O salário de ', SalarioAtual,',00 será reajustado para ', SalarioNovo,',00');
end.
Observe a utilização da opção else: qualquer salário superior a R$ 800,00 não pertencerá a nenhuma 
das listas de intervalos e então a seqüência vinculada à opção else será executada. Observe também a 
necessidade de que a variável SalarioAtual seja do tipo