apostila
259 pág.

apostila

Disciplina:Algoritmos e Estrutura de Dados I542 materiais7.956 seguidores
Pré-visualização50 páginas
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