terça-feira, 31 de julho de 2012

Functions




Definição

As funções são muito parecidas com as procedures. A principal diferença é que o identificador de uma função assume o valor de retorno da função. Uma função deve sempre  retornar um valor e em Turbo Pascal, este valor é retornado no nome da função.

Declaração de funções

A declaração de uma função é muito parecida com de uma procedure que por sua vez é parecida com a de um programa, senão vejamos:

Function Nome_da_função(parâmetros) : Tipo_da_função;
        < área de declarações >
        Begin
                corpo da função
        End;
A formação do nome da função deve seguir as mesmas regras para formação de identificadores em Turbo Pascal. Dentro dos parênteses devemos declarar os parâmetros e seus respectivos tipos dos quais a função depende. O tipo de valor retornado pela função também deve ser declarado.
Na  área de declarações, podemos declarar labels, constantes, variáveis e até mesmo Procedures e Functions. Devemos lembrar que tais elementos só poderão ser utilizados dentro do corpo da função, pois são locais a ela. Abaixo, temos o exemplo de uma função.

        Program Exemplo;
        Uses CRT;
        Var x,y : Real;                   (* variáveis globais *)
        Function Soma(a,b:real):real;     (* Soma é uma função que depende de dois parâmetros reais e devolve um valor real *)
        Begin
           Soma:=a+b;                     (* reparem que o valor da funçåo é retornado p. seu nome *)
        End;
        Begin
           ClrScr;
           x:=Soma(4,5);
           y:=Soma(3,6)-Soma(45.5,5.6);
           Writeln(x:10:2,y:10:2);
           Writeln;
           Write('Valor de x --> ');
           Readln(x);
           Write('Valor de y --> ');
           Readln(y);
           Writeln;
           Writeln(Soma(x,y):10:2);
        End.

Devemos  lembrar que o Turbo Pascal possui inúmeras funções de procedures pré-definidas, que iremos ver no decorrer do curso.

        Exemplos:

        Program Fat;
        Uses CRT;
{Programa para calcular o fatorial de um número lido do teclado, usando o conceito de Function}
        Label inicio,fim;
        Var n : Integer;
            tecla : char;
        Function Fatorial(numero:integer) : Real;
        Var i   : Integer;
            Fat : Real;
        Begin (* da função Fatorial *)
           Fat:=1;
           If numero>1
              Then Begin
                      i:=1;
                      Repeat
                         i:=i+1;
                         Fat:=Fat*i;
                      Until i=numero;
                   End;
           Fatorial:=Fat;
        End; (* da função fatorial *)
        Begin  (* do programa *)
           ClrScr;
        inicio:
           Write('Valor de n (menor que 0 = fim) --> ');
           Readln(n);
           Writeln;
           If n<0
              Then Begin
                      Write('Não existe fatorial de numeros negativos');
                      Goto fim;
                   End
              Else Writeln('Fatorial de n = ',fatorial(n):10:0);
           Writeln;
           Goto inicio;
        Fim:
        End. (* do programa *)


        Program Fibonacci;
        Uses CRT;

{Programa para determinar um determinado elemento da seqüência de Fibonacci. A seqüência de Fibonacci é definida como

                        Fib(0)  =  0
                        Fib(1)  =  1
                        Fib(n)  =  Fib(n-1) + Fib(n-2)}

{Como podemos ver, o elemento atual é determinado pela soma dos dois elementos anteriores}

        Label inicio;
        Var numero:integer;
            tecla : char;
        Function Fib(n:integer):integer;
        Var  a1,a2,i,pe : Integer;
        Begin
           if n=0
              Then Fib:=0
              Else If n=1
                      Then Fib:=1
                      Else Begin
                              a1:=0;
                              a2:=1;
                              i:=1;
                              Repeat
                                 pe:=a1+a2;
                                 i:=i+1;
                                 a1:=a2;
                                 a2:=pe;
                              Until i=n;
                              Fib:=a2;
                           End;
        End;
        Begin
           ClrScr;
        inicio:
           Write('Fib(');
           Read(numero);
           Writeln(') = ',fib(numero));
           Writeln;
           Write('Deseja continuar ? --> ');
           Readln(tecla);
           writeln;
           writeln;
           If tecla='s' Then goto inicio;
        End.

Recursividade

A linguagem Pascal e o Turbo Pascal permitem a utilização de funções recursivas. Uma função é dita recursiva quando ela chama a si mesma. Devemos tomar cuidado ao lidar com esse tipo de função, pois podemos criar loops infinitos. Existem pessoas que têm facilidade para  pensar  recursivamente e outras não. A recursividade permite criar funções elegantes e torna os programas mais fáceis de serem entendidos. Abaixo, temos os mesmos programas anteriores, só que utilizando o conceito de recursividade.

        Program Fatorial;
        Uses CRT;
        Label inicio,fim;
        Var n : Integer;
            tecla : char;
        Function Fat(n:integer):real;
        Begin
           if n=0
              Then Fat:=1
              Else Fat:=n*Fat(n-1);   (* repare que estamos chamando novamente a funçåo Fat *)
        End;
        Begin
           ClrScr;
        inicio:
           Write('Valor de n (menor que 0 = fim) --> ');
           Readln(n);
           Writeln;
           If n<0
              Then Begin
                      Write('Não existe fatorial de números negativos');
                      Goto fim;
                   End
              Else Writeln('Fatorial de n = ',fat(n):10:0);
           Writeln;
           Goto inicio;
        Fim:
        End.


        Program Fibonacci;
        Uses CRT;
        Label inicio;
        Var numero:integer;
            tecla : char;
        Function Fib(n:integer):integer;
        Begin
           If n=0
           Then Fib:=0
           Else If n=1
                   Then Fib:=1
                   Else Fib:=Fib(n-1)+fib(n-2);
        End;
        Begin
           ClrScr;
        inicio:
           Write('Fib(');
           Read(numero);
           Writeln(') = ',fib(numero));
           Writeln;
           Write('Deseja continuar ? --> ');
           Readln(tecla);
           writeln;
           writeln;
           If tecla='s' Then goto inicio;
        End.

Nenhum comentário:

Postar um comentário