Programando_com_Pascal
146 pág.

Programando_com_Pascal


DisciplinaGeometria Analítica15.084 materiais388.322 seguidores
Pré-visualização50 páginas
a necessidade de se utilizar a passagem por referência. 
Um outro aspecto interessante é que a passagem de parâmetros por referência permite que se substitua 
uma função por um procedimento. Basta que se utilize um parâmetro por referência para retornar o valor 
para uma variável global. Por exemplo, um programa para calcular o fatorial de um inteiro dado, utilizando 
um procedimento, poderia ter a seguinte forma:
program Fatoriais;
var n : integer;
 Fat : longint;
 {Procedimento que retorna o fatorial de um inteiro}
procedure Fatorial(m : integer; var f : longint);
var i : integer;
begin
 f := 1;
 for i := 1 to m do
 f := f*i;
end;
{Programa Principal}
begin 
 write('Digite um inteiro'); 
readln(n);
Fatorial(n, Fat);
writeln(n,'! = ', Fat);
end.
Na definição do procedimento Fatorial, se estabelece que o parâmetro m receberá um valor e que o 
parâmetro f receberá uma referência. Na ativação do procedimento, no programa principal, o conteúdo da 
variável global n é passado para o parâmetro m (passagem por valor) e a referência à variável Fat é passada 
para o parâmetro f (passagem por referência). Assim, todas as alterações no conteúdo do parâmetro f se 
refletirão no conteúdo da variável Fat.
A passagem de parâmetros por referência é muito importante quando se pretende que uma função 
retorne mais de um valor. Um destes valores pode ser retornado pelo comando 
Identificador da função := Expressão;
e os demais podem ser retornados para variáveis que foram passadas por referência para parâmetros da 
função. Um exemplo disto ocorre na função Confirma que soluciona o exercício proposto 11 da seção 4.6 
(agora com a utilização de funções). Para lembrar, queríamos um programa para transformar o computador 
numa urna eletrônica para a eleição, em segundo turno, para a presidência de um certo país, à qual 
concorrem dois candidatos: Alibabá, de número 83, e Alcapone, de número 93. A eleição permite ainda o 
voto em branco (número 22) e considera como voto nulo qualquer voto diferente dos anteriores. A função 
Confirma deve retornar dois valores: o primeiro para, no caso de confirmação do voto, permitir sua 
contabilização e o segundo para, ainda no caso de confirmação do voto, interromper a estrutura repeat, o que 
permitirá a recepção do voto seguinte. Observe também a passagem por referência do parâmetro da função 
ComputaVoto. Há necessidade de que seja desta forma, pelo fato de que esta função alterará conteúdos de 
variáveis diferentes.
{Programa que transforma um computador numa urna eletronica}
program UrnaEletronica;
uses Crt;
var Voto, Alibaba, Alcapone, Brancos, Nulos : integer;
 ConfVoto, Cont : char;
{Funcao para confirmacao do voto'}
function Confirma(s: string; var Conf : char): boolean;
begin
writeln('Voce votou em ', s, '! Confirma seu voto(S/N)');
readln(Conf);
if UpCase(Conf) = 'S'
then
Confirma := true
else
begin
writeln('Vote de novo');
Sound(400);
Delay(1000);
NoSound;
Confirma := false;
end;
end;
{Funcao para computar um voto}
function ComputaVoto(var v : integer) : integer;
begin
v := v + 1;
end;
{Programa principal}
begin
Clrscr;
Cont := 'S';
Alibaba := 0; Alcapone := 0; Brancos := 0; Nulos := 0;
while UpCase(Cont) = 'S' do
begin
repeat
writeln('83 - Alibaba 93 - Alcapone 99 - Branco Outro valor - Nulo');
writeln('Digite seu voto');
readln(Voto);
case Voto of
83 : if Confirma('Alibaba', ConfVoto)
then
ComputaVoto(Alibaba);
93 : if Confirma('Alcapone', ConfVoto)
then
ComputaVoto(Alcapone);
00 : if Confirma('Branco', ConfVoto)
then
ComputaVoto(Brancos);
else
if Confirma('Nulo', ConfVoto)
then
ComputaVoto(Nulos);
end;
Clrscr;
until ConfVoto = 's';
writeln('Novo eleitor (S/N)?');
readln(Cont);
end;
Clrscr;
writeln('Resultado da eleicao');
writeln(' Alibaba: ', Alibaba);
writeln(' Alcapone: ', Alcapone);
writeln(' Brancos: ', Brancos);
writeln(' Nulos: ', Nulos);
writeln;
writeln;
write('Candidato eleito: ');
if Alibaba > Alcapone
then
writeln('Alibaba')
else
if Alibaba < Alcapone
then
writeln('Alcapone')
else
writeln('Eleicao empatada');
end.
O procedimento predefinido Sound possui um parâmetro f do tipo word e sua execução faz com que o 
sistema emita um som de freqüência f hertz. O som emitido pelo procedimento Sound só será interrompido 
quando da execução do procedimento NoSound que não tem parâmetros (estes procedimento podem ser 
utilizados para transformar o teclado num instrumento musical; que tal tentar?). O procedimento Delay tem 
um parâmetro m e faz com que o sistema interrompa a execução do programa por m milissegundos. 
Como já foi dito, o tipo string do parâmetro s da função Confirma será estudado no capítulo 7. Para 
compreender o programa acima, basta saber que uma variável do tipo string pode armazenar nomes (de um 
modo geral, um cadeia de caracteres). Desta forma, podemos ativar a função Confirma com os argumentos 
'Alibaba', 'Alcapone', 'Nulo' e 'Branco' para que seja possível dizer ao eleitor (através do comando writeln) 
qual foi o seu voto e ele então possa confirmá-lo ou não. 
5.7 Recursividade
Algumas funções matemáticas clássicas podem ser estabelecidas de tal forma que as suas definições 
utilizem, de modo recorrente, a própria função que se está definindo. Um exemplo trivial (no bom sentido) 
de um caso como este é a função fatorial. Como dissemos no exemplo 2 da seção 5.5, o fatorial de um 
número inteiro não-negativo n é o produto de todos os números naturais de 1 até o referido n ou seja n! = 1 . 
2 . 3 . ... . n, sendo igual a 1 quando n = 0 ou n = 1. Como mostrou o referido exemplo, é muito simples se 
escrever uma função que calcule o fatorial de n:. Basta se inicializar uma variável com 1 e, numa estrutura de 
repetição, calcular os produtos 1 x 2 = 2, 2 x 3 = 6; 6 x 4 = 24; 24 x 5 = 120; ...; etc., até multiplicar todos os 
naturais até n.
Embora o conceito anterior seja de simples compreensão, pode-se obter uma definição mais elegante 
para o fatorial de um inteiro não-negativo n:
n
se n ou n
n n n!
,
. ( )!,
=
= =
\u2212 >
\uf8f1\uf8f2\uf8f3
1 0 1
1 1
 
Desta forma, o fatorial de n é definido a partir dos fatoriais dos naturais menores que n. Isto significa 
que, para o cálculo do fatorial de um determinado número natural, há necessidade de que se recorra aos 
fatoriais dos naturais anteriores. Por exemplo, 
4! = 4 . 3! = 4 . (3 . 2!) = (4 . 3) . (2 . 1!) = 4 . 3 . 2 . 1 = 24. 
Uma definição com estas características é dita uma definição por recorrência ou uma definição 
recursiva.
Um outro exemplo de uma definição recursiva foi dada no exercício 12 da seção 4.6: a seqüência de 
Fibbonaci é a seqüência (an) definida por
a
se n ou n
a a se nn n n
=
= =
+ >
\uf8f1\uf8f2\uf8f3 \u2212 \u2212
1 1 2
21 2
,
,
 
Observe que o termo de ordem n é definido a partir de termos anteriores. Isto significa que, para o 
cálculo de um determinado termo, há necessidade de que se recorra a valores de todos os termos anteriores. 
Por exemplo, para a determinação de a5 necessitamos conhecer a4 e a3; para a determinação destes dois, 
necessitamos conhecer a2 e a1.
Naturalmente, uma definição recursiva deve conter uma condição que interrompa a recorrência. Esta 
condição é chamada condição de escape. No caso do fatorial, a condição de escape é n = 0 ou n = 1; na 
seqüência de Fibbonaci, a condição de escape é n = 1 ou n = 2. A expressão que realiza propriamente a 
recorrência pode ser chamada expressão de recorrência.
O que surpreende a todos que começam a aprendizagem de programação é que, de um modo geral, as 
linguagens de programação oferecem recursos para implementação de funções recursivas da mesma maneira 
que elas são