apostila
259 pág.

apostila


DisciplinaAlgoritmos e Estrutura de Dados I674 materiais7.931 seguidores
Pré-visualização50 páginas
Programa que imprime os nu´meros da entrada que sa\u2dco pares.
9.2.2 O programa principal
E´ o co´digo do programa propriamente dito. Tem in´\u131cio no begin e te´rmino no end.
No exemplo anterior, sa\u2dco todos os comandos que aparecem no programa, desde
o de leitura da varia´vel a ate´ o end ; do comando while. O resto que la´ aparece e´ o
cabec¸alho do programa e a declarac¸a\u2dco de varia´veis globais.
110 CAPI´TULO 9. FUNC¸O\u2dcES E PROCEDIMENTOS
9.2.3 Varia´veis globais
Sa\u2dco todas as varia´veis declaradas logo apo´s o cabec¸alho do programa, antes do begin
do programa principal.
Como sabemos, varia´veis sa\u2dco abstrac¸o\u2dces de enderec¸os de memo´ria. As varia´veis
globais sa\u2dco enderec¸os vis´\u131veis em todo o programa, mesmo nos subprogramas, como
veremos logo mais.
No exemplo acima, existe uma u´nica varia´vel global, ela tem o identificador a e e´
do tipo integer.
9.2.4 Func¸o\u2dces
No miolo do programa exemplo, existe um trecho onde se le\u2c6: a mod 2 = 0. Hoje
sabemos que isto e´ uma expressa\u2dco booleana que calcula o resto da divisa\u2dco inteira de
a por 2, se o resultado for zero enta\u2dco a e´ par, sena\u2dco e´ impar. Mas, esta expressa\u2dco
poderia ser bem mais complexa, exigindo muitas linhas de co´digo, por exemplo, se
quise´ssemos imprimir os nu´meros que fossem primos ao inve´s dos pares.
O importante e´ que a expressa\u2dco booleana resulta em um valor do tipo booleano.
O mesmo efeito pode ser conseguido com uma func¸a\u2dco que resulta em um valor do tipo
booleano.
Isto pode ser feito definindo-se um subprograma que e´ chamado pelo programa
principal e que recebe os dados necessa´rios para os ca´lculos (os para\u2c6metros). Os
ca´lculos devem computar corretamente se o nu´mero enviado pelo programa principal
e´ par. Se for, de alguma maneira deve retornar um valor true para quem chamou. Se
na\u2dco for, deve retornar false.
O que acaba de ser escrito estabelece uma espe´cie de \u201ccontrato\u201d entre o programa
principal e o subprograma. Em termos de linguagem de programac¸a\u2dco, este contrato e´
denominado de proto´tipo ou assinatura da func¸a\u2dco. Ele e´ constitu´\u131do por tre\u2c6s coisas:
\u2022 O nome da func¸a\u2dco;
\u2022 A lista de para\u2c6metros, que sa\u2dco identificadores tipados (no caso da linguagem
Pascal);
\u2022 O tipo do valor de retorno contendo o ca´lculo feito na func¸a\u2dco.
Para o problema em questa\u2dco, vamos assumir que poder´\u131amos estabelecer o seguinte
proto´tipo para a func¸a\u2dco que calcula se um dado nu´mero e´ par retornando true em
caso positivo e false em caso contra´rio. Vejamos como fica:
function a eh par : boolean;
A palavra reservada function e´ para avisar o programa que se trata de uma func¸a\u2dco.
O identificador a eh par procura representar o fato de que a varia´vel a pode ser par.
O co´digo da func¸a\u2dco na\u2dco importa muito no momento, mas apenas com o proto´tipo
e´ poss´\u131vel reescrever o programa exemplo como apresentado na figura 9.2.
9.2. NOC¸O\u2dcES FUNDAMENTAIS 111
program imprime pares ;
var a: integer ;
(\u2217 funcao que calcula se a variavel global a eh par \u2217)
function a eh par : boolean;
begin
(\u2217 codigo da funcao , ainda nao escrito por razoes didaticas \u2217)
end;
begin (\u2217 programa principal \u2217)
read (a) ;
while a <> 0 do
begin
if a eh par then
writeln (a) ;
read (a) ;
end;
end.
Figura 9.2: Programa que imprime os nu´meros da entrada que sa\u2dco pares.
Desde que o co´digo da func¸a\u2dco seja corretamente implementado, o programa princi-
pal continua funcionando! Ale´m disto e´ um co´gido mais leg´\u131vel, ja´ que e´ mais simples
para algue´m ler o programa principal e perceber o significado do identificador deno-
minado a eh par ao inve´s do obscuro \u201ca mod 2 = 0\u201d.
Obviamente e´ necessa´rio em algum momento se escrever o co´digo da func¸a\u2dco. Vamos
mostrar quatro maneiras diferentes de se devolver o valor correto para o programa
principal.
(\u2217 primeira versao da funcao \u2217)
i f a mod 2 = 0 then
a eh par:= true
else
a eh par:= false ;
(\u2217 segunda versao da funcao \u2217)
i f a mod 2 <> 0 then
a eh par:= false
else
a eh par:= true ;
(\u2217 terceira versao da funcao \u2217)
i f a mod 2 <> 1 then
a eh par:= true
else
a eh par:= false ;
(\u2217 quarta versao da funcao \u2217)
i f a mod 2 = 1 then
a eh par:= false
else
a eh par:= true ;
(\u2217 quinta versao da funcao \u2217)
a eh par:= false ;
i f a mod 2 = 0 then
a eh par:= true
(\u2217 sexta versao da funcao \u2217)
a eh par:= true ;
i f a mod 2 = 1 then
a eh par:= false
112 CAPI´TULO 9. FUNC¸O\u2dcES E PROCEDIMENTOS
(\u2217 setima versao da funcao \u2217)
a eh par:= true ;
i f a mod 2 <> 1 then
a eh par:= true
(\u2217 oitava versao da funcao \u2217)
a eh par:= true ;
i f a mod 2 <> 0 then
a eh par:= false
Em tempo, um detalhe da linguagem Pascal. Segundo a definic¸a\u2dco da linguagem,
estabelecida por seu autor Niklaus Wirth ainda nos anos 1970, a maneira como o valor
do retorno e´ feita para o programa principal exige que o nome da func¸a\u2dco aparec¸a pelo
menos uma vez no co´digo da func¸a\u2dco do lado esquerdo de um comando de atribuic¸a\u2dco.
Isto funciona diferente em outras linguagens de programac¸a\u2dco, para isto, se o estudante
resolver mudar de linguagem, deve observar o respectivo guia de refere\u2c6ncia.
Ainda um comenta´rio adicional sobre a linguagem Pascal, a func¸a\u2dco e´ executada ate´
o final, isto e´, ate´ encontrar o comando end; que a termina. Isto pode ser diferente
em outras linguagens.
9.2.5 Para\u2c6metros por valor
Conforme dissemos, atendemos a questa\u2dco da modularidade ao usarmos a func¸a\u2dco
a eh par. Mas na\u2dco atendemos a outra: a questa\u2dco do reaproveitamento de co´digo.
De fato, suponhamos que o enunciado tivesse estabelecido que seriam dados como
entrada pares de nu´meros a e b e para imprimir apenas os que fossem pares. Na
versa\u2dco atual do programa, ter´\u131amos que escrever uma outra func¸a\u2dco de nome prova´vel
b eh par que teria o co´digo absolutamente ide\u2c6ntico ao da func¸a\u2dco a eh par exceto pela
troca da varia´vel a pela varia´vel b. Isto e´ inadmiss´\u131vel em programac¸a\u2dco de alto n´\u131vel!
Logo, deve existir uma maneira melhor para se programar a func¸a\u2dco. Felizmente
existe: basta passar um para\u2c6metro, isto e´, basta informar a` func¸a\u2dco que os ca´lculos
sera\u2dco feitos para um dado nu´mero inteiro, na\u2dco importando o nome da varia´vel que
conte´m o valor sobre o qual sera´ feito o ca´lculo da paridade. Isto e´ conseguido
mudando-se o proto´tipo da func¸a\u2dco para o seguinte:
function eh par (n: integer) : boolean;
Em outras palavras, a func¸a\u2dco vai receber um nu´mero inteiro, no caso denominado
n (mas poderia ser a, b ou qualquer outro identificador, o importante e´ que seja do
tipo integer. O tipo do retorno e´ o mesmo, isto e´, boolean.
Com isto, conseguimos escrever o programa (ja´ com a func¸a\u2dco recebendo para\u2c6metros
por valor), da maneira como esta´ apresentado na figura 9.3.
Esta maneira de passar para\u2c6metros caracteriza uma passagem por valor, tambe´m
conhecida como passagem de para\u2c6metros por co´pia. O que ocorre e´ que o identificador
n da func¸a\u2dco recebe uma co´pia do valor da varia´vel a do programa principal. As
alterac¸o\u2dces em n sa\u2dco feitas nesta co´pia, mantendo-se intactos os dados da varia´vel a no
programa principal. Isto ocorre pois esta co´pia e´ feita em a´rea separada de memo´ria,
denominada pilha.
9.2. NOC¸O\u2dcES FUNDAMENTAIS 113
program imprime pares ;
var a: integer ;
(\u2217 funcao que calcula se a variavel global a eh par \u2217)
function eh par (n: integer) : boolean;
begin
if n mod 2 = 0 then
eh par:= true
else
eh par:= false ;
end;
begin (\u2217 programa principal \u2217)
read (a) ;
while a <> 0 do
begin
if eh par (a) then
writeln (a) ;
read (a) ;
end;
end.
Figura 9.3: Programa que imprime os nu´meros da entrada que sa\u2dco pares.
9.2.6 Para\u2c6metros por refere\u2c6ncia
Para passar para\u2c6metros por refere\u2c6ncia, o proto´tipo da func¸a\u2dco difere ligeiramente da-
quele exibido acima. A chamada e´ assim:
function eh par (var n: integer) : boolean;
A diferenc¸a