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.