Livro
Livro com dois capítulos (cada capítulo com 1 sub-capítulos)
2. Capítulo 2
5.7 - Procedures e Funções
5.7.1 - Procedures
Procedures e Functions permitem incluir blocos adicionais no bloco do programa principal. Cada procedure ou function tem um cabeçalho seguido por um bloco. A qual faz parte do programa principal.
Procedure inicia;
begin
x := 10;
y := 2.5;
n := ´Sistema Inicializado´;
end;
Sua chamada no programa principal é feito da seguinte maneira
Program Teste_procedimento;
var
x : integer;
y : real;
n : string;
Procedure inicia;
begin
.....
end;
begin (programa principal )
writeln(´Chamada a rotina INICIA : ´);
inicia;
writeln(´Rotina INICIA terminada. ´);
end.
Ex.:
Program simples;
var
x : integer;
Procedure troca;
begin
x :=1;
end;
begin
x :=0;
troca;
write(x);
end.
No programa anterior a variável x, foi definida como global, por este motivo posso alterar seu conteúdo dentro da procedure Troca.
Considere agora:
Program simples;
var
x : integer;
Procedure troca;
var
x : integer;
begin
x := 1;
end;
begin
x :=0;
troca;
write(x);
end.
Temos duas variáveis, ambas denominadas x. A primeira é uma variável global e a outra (definida na Procedure) é local à procedure. O comando de atribuição x:=1 atribui o valor 1 à variável local x. Portanto x:=1 não tem efeito sobre a variável global x que continua igual a zero.
Ao declarar sua variável local com o mesmo nome de uma variável global, inibe ao procedimento o acesso àquela variável global.
5.7.1.1 - Parâmetros de uma Procedure
Tanto uma Procedure como uma Function podem receber uma lista de parâmetros. Obeserve o programa abaixo.
Program teste_var;
var
x : integer;
y ; real;
Procedure calcula;
var
y : integer;
z : real;
begin
y := 10;
z := 1.5;
x := trunc(x*y*z);
end;
begin
y := 2.5;
x := 4;
calcula;
writeln(x:10,y:10:4);
end.
Resposta: 60 2.5000
Neste exemplo a variável x utilizada pela rotina é global (Visível de qualquer bloco do programa). Podemos declarar a variável x como argumento da rotina:
Procedure calcula(var x:integer);
Desta maneira criou-se uma nova variável local à procedure que será utilizada para fazer a passagem de um parâmetro do programa principal para a rotina. O programa principal ficaria assim.
begin
y := 2.5;
x := 4;
calcula(x);
writeln(x:10,y:10:4);
end.
O nome da variável do parâmetro mão precisa ser o mesmo do programa principal.
5.7.1.2 - Passagem de Parâmetros
Há dois tipos de passagem de parâmetros: por referência e por valor.
5.7.1.2.1 - Passagem por Valor
É passada para a sub rotina somente o valor dos argumentos. A variável declara no cabeçalho da rotina é uma nova variável que recebe o valor do argumento. A alteração do valor desta variável não implica na alteração do argumento no bloco que chamou a rotina. Exemplo:
Ex.: Program raizes;
var
x : real;
Procedure raiz(x:real);
begin
x := sqrt(x);
writeln(‘A raiz e’’ :’,x);
end;
begin
write(‘Digite um numero :’);
readln(x);
raiz(x);
writeln(‘X = ‘, x);
end.
Resposta : Digite um numero : 4
A raiz é: 2
X = 4
5.7.1.2.2 - Passagem por referência
Neste caso a variável declarada no cabeçalho da rotina passa a ocupar a mesma posição de memória do argumento. Desta forma, qualquer alteração da variável dentro da rotina implicará na alteração do argumento.
Procedure raiz(var x:real);
Ex.: Program raizes;
var
x : real;
Procedure raiz(var x:real);
begin
x := sqrt(x);
writeln(‘A raiz e’’ :’,x);
end;
begin
write(‘Digite um numero :’);
readln(x);
raiz(x);
writeln(‘X = ‘, x);
end.
Resposta : Digite um numero : 4
A raiz é: 2
X = 2
5.7.1.3 - Variáveis Globais e Locais
As variáveis globais são visíveis em qualquer bloco do programa ! São declaradas no programa principal.
As variáveis locais podemos declarar interna a um bloco. Ela não é visível a blocos externos e só é alocada na chamada do bloco.
Ex.:
Programa vari;
var
x : integer;
y : real;
procedure calculo;
var
y : integer;
z : real;
begin
y :=10;
z :=1.5;
x := x*y*z;
end;
begin
y :=2.5;
x :=4;
calculo;
writeln(x:10, y:10:4);
end.
5.7.1.4 - Exercícios Resolvidos
1. Escreva um programa para calcular a média aritmética para n valores.
program serie1;
var
n : integer;
i : integer;
a : integer;
soma : real;
begin
writeln('Programa para calcular a media arimética para n valores');
writeln;
writeln('Entre com o numero de valores');
readln(n);
i := 1;
while (i <= n) do
begin
write('Elemento ',i,' = ');
readln(a);
soma := soma + a;
i := i + 1;
end;
writeln;
soma :=(soma / n);
writeln('A media dos ',n,' elementos eh ',soma:10:4);
readln(a);
end.
2. Escreva um programa para ler dois caracteres e verificar qual deles é o maior , menor ou igual.
program serie2;
var
a : char;
b : char;
menor , igual , maior : boolean;
begin
writeln('Programa para comparar caracteres');
writeln;
write('Entre com o primeiro caractere: ');
readln(a);
write('Entre com o segundo caractere: ');
readln(b);
writeln;
menor := a < b;
igual := a= b;
maior := a > b;
writeln('O primeiro caractere e'' menor do que o segundo - ',menor);
writeln('O primeiro caractere e'' igual ao segundo - ',igual);
writeln('O primeiro caractere e'' maior do que o segundo - ', maior);
writeln(' - executado -');
readln(a);
end.
3. Escreva um programa para ler dois caracteres e calcular o maior entre eles usando uma procedure.
program serie2a;
var
a : char;
b : char;
procedure compute;
var
menor , igual , maior : boolean;
begin
menor := a < b;
igual := a= b;
maior := a > b;
writeln('O primeiro caractere e'' menor do que o segundo - ',menor);
writeln('O primeiro caractere e'' igual ao segundo - ',igual);
writeln('O primeiro caractere e'' maior do que o segundo - ', maior);
end;
begin
writeln('Programa para comparar caracteres');
writeln;
write('Entre com o primeiro caractere: ');
readln(a);
write('Entre com o segundo caractere: ');
readln(b);
writeln;
compute;
writeln(' - executado -');
readln(a);
end.
4. Escreva um programa para calcular a equação .
{*** o programa calcula a equacao f(x) = Somatoria Y * x2 - srq(x) ****}
program serie3;
var
x : real;
y : real;
somay : integer;
func : real;
a : integer;
begin
writeln('Programa para resolver equacao');
writeln;
x:=100;
while (x <= 150) do
begin
y := 100;
while (y <= 200) do
begin
somay := somay + 1;
y := y + 0.5;
end;
func := (somay * (x*x) - sqr(x));
writeln('Para x = ',x,' f(x) = ',func);
x := x + 0.3;
end;
writeln(' - executado -');
readln(a);
end.
5. Escreva um programa para calcular o fatorial de um numero.
{*** o programa calcula o fatorial de um numero ****}
program serie4;
var
num : integer;
i : integer;
res : integer;
a : integer;
t : boolean;
begin
t:= true;
while (t) do
begin
writeln('Programa para calcular o fatorial');
writeln;
res:=1;
i:=1;
write('Entre com o numero ');
readln(num);
while(i <= num) do
begin
res := res * i;
i := i + 1;
end;
writeln('O fatorial de ',num,' eh = ',res);
writeln(' - executado -');
end;
end.
6. Escreva um programa para resolver a equação do segundo grau.
{*** o programa calcula a equacao do 2 grau ****}
program serie5;
var
a : integer;
b : integer;
c : integer;
x1: real;
x2: real;
d : integer;
begin
writeln('Programa para resolver a equacao do 2 grau');
writeln;
write('Entre com o valor de a ');
readln(a);
write('Entre com o valor de b ');
readln(b);
write('Entre com o valor de c ');
readln(c);
writeln;
d := ((sqr(b)-(4*a*c));
if(d >= 0) then
begin
x1:=((-b+(sqrt(d))/(2*a)));
writeln('Valor de x1 = ',x1:5:2);
x2:=((-b-(sqrt(d))/(2*a)));
writeln('Valor de x2 = ',x2:5:2);
end
else
writeln('Impossivel calcular raiz quadrada de numero negativo !');
writeln(' - executado -');
readln(a);
end.
7 - Escreva um programa para converte centimetros em metros .
{*** o programa converte centimetros em metros ****}
program serie6;
var
a : real;
metros : real;
begin
writeln('Programa para converter centímetro em metro');
writeln;
write('Entre com o valor em centimetros ');
readln(a);
metros := (a / 100);
writeln(a:5:2,' centimetros eh = ',metros:5:2,' metros');
writeln(' - executado -');
readln(a);
end.
5.7.2 - Functions
É um tipo especial de procedimento que calcula um valor.
Como as Procedures as Funções em Pascal são programas completos que atuam guando seus nomes são referenciados no texto dos programas. Existem muitos deles que já vêm pré-programadas, como READ, WRITE. Mas é possivel também ao programador fazer os seus próprios programas.
Toda função resulta num único valor de resposta !
Possui um nome e zero ou mais argumentos, que são colocados entre parênteses.
Ex.
Program Fcubo;
var
num :integer;
function cubo(x:integer):integer;
begin
cubo:= x*x*x;
end;
begin
readln(num);
writeln(‘O cubo de ‘,num,’eh’,cubo(num));
end.
O importante nas funções, é que elas sempre retornam um valor, o que significa que as funções devem ter um tipo: Assim, podemos ler a declaração acima da seguinte maneira: A função cubo tem um parâmetro x que é do tipo inteiro e que dá resultado do tipo inteiro.