A maior rede de estudos do Brasil

Grátis
259 pág.
apostila

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

Programa que imprime os nu´meros da entrada que sa˜o pares.
9.2.2 O programa principal
E´ o co´digo do programa propriamente dito. Tem in´ıcio no begin e te´rmino no end.
No exemplo anterior, sa˜o 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˜o de varia´veis globais.
110 CAPI´TULO 9. FUNC¸O˜ES E PROCEDIMENTOS
9.2.3 Varia´veis globais
Sa˜o todas as varia´veis declaradas logo apo´s o cabec¸alho do programa, antes do begin
do programa principal.
Como sabemos, varia´veis sa˜o abstrac¸o˜es de enderec¸os de memo´ria. As varia´veis
globais sa˜o enderec¸os vis´ıveis 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˜es
No miolo do programa exemplo, existe um trecho onde se leˆ: a mod 2 = 0. Hoje
sabemos que isto e´ uma expressa˜o booleana que calcula o resto da divisa˜o inteira de
a por 2, se o resultado for zero enta˜o a e´ par, sena˜o e´ impar. Mas, esta expressa˜o
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˜o booleana resulta em um valor do tipo booleano.
O mesmo efeito pode ser conseguido com uma func¸a˜o 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ˆmetros). 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˜o for, deve retornar false.
O que acaba de ser escrito estabelece uma espe´cie de “contrato” entre o programa
principal e o subprograma. Em termos de linguagem de programac¸a˜o, este contrato e´
denominado de proto´tipo ou assinatura da func¸a˜o. Ele e´ constitu´ıdo por treˆs coisas:
• O nome da func¸a˜o;
• A lista de paraˆmetros, que sa˜o identificadores tipados (no caso da linguagem
Pascal);
• O tipo do valor de retorno contendo o ca´lculo feito na func¸a˜o.
Para o problema em questa˜o, vamos assumir que poder´ıamos estabelecer o seguinte
proto´tipo para a func¸a˜o 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˜o.
O identificador a eh par procura representar o fato de que a varia´vel a pode ser par.
O co´digo da func¸a˜o na˜o importa muito no momento, mas apenas com o proto´tipo
e´ poss´ıvel reescrever o programa exemplo como apresentado na figura 9.2.
9.2. NOC¸O˜ES FUNDAMENTAIS 111
program imprime pares ;
var a: integer ;
(∗ funcao que calcula se a variavel global a eh par ∗)
function a eh par : boolean;
begin
(∗ codigo da funcao , ainda nao escrito por razoes didaticas ∗)
end;
begin (∗ programa principal ∗)
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˜o pares.
Desde que o co´digo da func¸a˜o seja corretamente implementado, o programa princi-
pal continua funcionando! Ale´m disto e´ um co´gido mais leg´ıvel, 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 “a mod 2 = 0”.
Obviamente e´ necessa´rio em algum momento se escrever o co´digo da func¸a˜o. Vamos
mostrar quatro maneiras diferentes de se devolver o valor correto para o programa
principal.
(∗ primeira versao da funcao ∗)
i f a mod 2 = 0 then
a eh par:= true
else
a eh par:= false ;
(∗ segunda versao da funcao ∗)
i f a mod 2 <> 0 then
a eh par:= false
else
a eh par:= true ;
(∗ terceira versao da funcao ∗)
i f a mod 2 <> 1 then
a eh par:= true
else
a eh par:= false ;
(∗ quarta versao da funcao ∗)
i f a mod 2 = 1 then
a eh par:= false
else
a eh par:= true ;
(∗ quinta versao da funcao ∗)
a eh par:= false ;
i f a mod 2 = 0 then
a eh par:= true
(∗ sexta versao da funcao ∗)
a eh par:= true ;
i f a mod 2 = 1 then
a eh par:= false
112 CAPI´TULO 9. FUNC¸O˜ES E PROCEDIMENTOS
(∗ setima versao da funcao ∗)
a eh par:= true ;
i f a mod 2 <> 1 then
a eh par:= true
(∗ oitava versao da funcao ∗)
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˜o 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˜o aparec¸a pelo
menos uma vez no co´digo da func¸a˜o do lado esquerdo de um comando de atribuic¸a˜o.
Isto funciona diferente em outras linguagens de programac¸a˜o, para isto, se o estudante
resolver mudar de linguagem, deve observar o respectivo guia de refereˆncia.
Ainda um comenta´rio adicional sobre a linguagem Pascal, a func¸a˜o 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ˆmetros por valor
Conforme dissemos, atendemos a questa˜o da modularidade ao usarmos a func¸a˜o
a eh par. Mas na˜o atendemos a outra: a questa˜o 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˜o atual do programa, ter´ıamos que escrever uma outra func¸a˜o de nome prova´vel
b eh par que teria o co´digo absolutamente ideˆntico ao da func¸a˜o a eh par exceto pela
troca da varia´vel a pela varia´vel b. Isto e´ inadmiss´ıvel em programac¸a˜o de alto n´ıvel!
Logo, deve existir uma maneira melhor para se programar a func¸a˜o. Felizmente
existe: basta passar um paraˆmetro, isto e´, basta informar a` func¸a˜o que os ca´lculos
sera˜o feitos para um dado nu´mero inteiro, na˜o 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˜o para o seguinte:
function eh par (n: integer) : boolean;
Em outras palavras, a func¸a˜o 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˜o recebendo paraˆmetros
por valor), da maneira como esta´ apresentado na figura 9.3.
Esta maneira de passar paraˆmetros caracteriza uma passagem por valor, tambe´m
conhecida como passagem de paraˆmetros por co´pia. O que ocorre e´ que o identificador
n da func¸a˜o recebe uma co´pia do valor da varia´vel a do programa principal. As
alterac¸o˜es em n sa˜o 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˜ES FUNDAMENTAIS 113
program imprime pares ;
var a: integer ;
(∗ funcao que calcula se a variavel global a eh par ∗)
function eh par (n: integer) : boolean;
begin
if n mod 2 = 0 then
eh par:= true
else
eh par:= false ;
end;
begin (∗ programa principal ∗)
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˜o pares.
9.2.6 Paraˆmetros por refereˆncia
Para passar paraˆmetros por refereˆncia, o proto´tipo da func¸a˜o difere ligeiramente da-
quele exibido acima. A chamada e´ assim:
function eh par (var n: integer) : boolean;
A diferenc¸a